本文基于Caffe Tutorial 之 Loss编写。
在Caffe中,如同大多数机器学习算法一样,学习是通过损失(loss,也被称为误差、代价、或者目标函数)进行驱动。损失函数将参数设置(即,当前网络权重)映射为一个预示参数好坏程度的标量来指定学习目标。因此,学习的目标就是寻找一组使损失函数取值最小的参数值。
Caffe中,损失通过网络的前向传播进行计算。每层从输入(低层)中获取数据,同时产生输出(顶层)块。这些层输出的一部分可能被用于计算损失。在一对所有的分类任务中,损失函数的典型选择是SoftmaxWithLoss函数,其调用方式如下:
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" }在SoftmaxWithLoss函数中,顶端块为整个最小批(mini-batch)损失值(预测标签pred与实际标签label计算所得)的均值(shape为空)。
对于多层产生一个损失值的网络(例如,一个使用SoftmaxWithLoss对输入进行分类且同时使用EuclideanLoss对其重建的网络),损失权重用于度量各层损失的相对重要性。
根据惯例,后标为Loss的Caffe层用于计算损失函数,其它层被假定为只用于中间计算。然而,任何层都可产生损失通过向层定义中添加loss_weight: <float>,从而为上一层产生损失。后标为Loss的层默认对于直接顶层包含loss_weight: 1,而对其他顶层包含loss_weight: 0。因此,对于以上的SoftmaxWithLoss层与以下书写方式等价。
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" loss_weight: 1 }Caffe中允许任意loss_weight不为零的层进行反向传播,这可以用于正规化网络中某些中间层的激活值。对于权重非零的非单独输出,损失可以简单地通过求块中所有元素之和而求得,其伪代码如下:
loss := 0 for layer in layers: for top, loss_weight in layer.tops, layer.loss_weights: loss += loss_weight * sum(top)