概述
以前一直以为反向传播的过程是这样的,由Softmax计算得出分类loss,然后在加上L2正则项得出总的total_loss,然后再利用total_loss进行反向梯度的计算,而正则项会在每层的Forward函数中计算并返回,表面上感觉很对,但是实际分析就会发现这样想法不合理的地方,
对正则项的计算,不同的solver是不一样的,而且正则项的方法也是有L2和L1, 每层layer的Forward函数在不知道正则方法和solver类型的情况下是不可能计算出正则结果的。
对于用total_loss进行反向梯度传播,我们知道total_loss在每一层只和该层的权值有关系,而total_loss中包含着所有权值的正则化结果,这时候,如果我想把反向误差传播转化为矩阵运算,显然不行。
caffe中处理方法
首先需要声明的是,每一个layer的Forward函数的确有返回loss,但是这个loss函数不是表示正则项的结果,而是应付可能出现的如下情况:就是有些网络并不是在最后才进行Softmax的分类计算,有时候会在网络的中间插入Softmax分类,例如googLeNet。
所以在caffe中,loss和正则项的计算过程是下面的叙述这样的
计算Softmax分类loss
Softmax分类loss是在Network的最后一层SoftmaxWithLossLa