【发布时间】:2018-05-28 09:03:02
【问题描述】:
Caffe 支持多重损失。然后对于反向传播阶段,一些 blob 可能具有来自不同损失的多个梯度。 Caffe 如何处理这个 blob 的渐变?
【问题讨论】:
标签: machine-learning neural-network deep-learning caffe gradient-descent
Caffe 支持多重损失。然后对于反向传播阶段,一些 blob 可能具有来自不同损失的多个梯度。 Caffe 如何处理这个 blob 的渐变?
【问题讨论】:
标签: machine-learning neural-network deep-learning caffe gradient-descent
这不是 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)是 auxiliary 和 pool2 的底部 blob。 auxiliary 和 pool2 都将在反向传播期间更改其底部 blob 的 diff。那么conv2 blob 的diff 怎么更新呢?