【问题标题】:How does Caffe updates gradients of a blob with more than one output branch?Caffe 如何更新具有多个输出分支的 blob 的梯度?
【发布时间】:2018-05-28 09:03:02
【问题描述】:

Caffe 支持多重损失。然后对于反向传播阶段,一些 blob 可能具有来自不同损失的多个梯度。 Caffe 如何处理这个 blob 的渐变?

据我所知,在设计网络时这可能不是问题。但是当我尝试编写一个新层时,这个问题真的让我很困惑。感谢您的任何想法!

【问题讨论】:

    标签: machine-learning neural-network deep-learning caffe gradient-descent


    【解决方案1】:

    这不是 caffe 或任何其他深度学习工具的问题。这纯粹是一个数学问题:当您有多个损失时,您将 loss_weight 分配给每个损失,并且网络的整体损失是所有损失的加权和。因此,为网络计算的梯度是损失的加权和的梯度:没有需要积分的每个损失的梯度,而是单个损失,它是损失层的加权和。

    Caffe 在将层的"top" 定向到多个层时通常使用"Split" 层(在您的示例中,"conv2" 的输出是"Split""bottom""bottom""ip1") .
    查看"Split" layer的反向传播代码可以看到,所有top.diffs相加为bottom.diff

    【讨论】:

    • 感谢您的回答。我知道有一个loss_weight 可以控制每次损失的权重。但我仍然不知道 Caffe 究竟是如何实现的。我认为在 Caffe 中,每一层都接受其顶部 blob 的 diff,进行计算,并通过 mutable_cpu_diff() 将结果传递给其底部 blob 的 diff。以上图为例。 conv2 的顶部 blob(按约定命名为 conv2)是 auxiliarypool2 的底部 blob。 auxiliarypool2 都将在反向传播期间更改其底部 blob 的 diff。那么conv2 blob 的diff 怎么更新呢?
    • @C.Li 它将按照梯度链规则的要求进行更新
    • 我明白了梯度链式法则。但我仍然不清楚 Caffe 何时何地实现它。任何想法?非常感谢!
    • @C.Li 看看在转换层之后插入的拆分层 caffe。当 caffe 加载网络时,您应该在日志中看到它
    • 谢谢!现在我知道梯度在反向传播阶段是如何流动的。 P.S 抱歉回复晚了。我访问 Stack Overflow 有点不方便。
    猜你喜欢
    • 2019-08-10
    • 2018-11-18
    • 1970-01-01
    • 2023-03-19
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多