以三层的BP神经网络为例:

深度学习 数据权重 偏差值 误差权重_图像处理


输出如下:最后一层的激活函数统一用softmax,所以单独拎出来并没有写在里面。为什么要用softmax这个激活函数呢?因为输出的y1、y2并不属于任何一个分布,我们想让输出满足一个概率分布,就要进行softmax处理,计算公式如下图:可以看出o1+o2是等于1的。

深度学习 数据权重 偏差值 误差权重_神经网络_02


深度学习 数据权重 偏差值 误差权重_图像处理_03


对损失的计算一般选择是交叉熵,针对不同的分类问题,最后层的激活函数不同,导致交叉熵的计算公式略有差别:

深度学习 数据权重 偏差值 误差权重_激活函数_04


将o1和o2带入交叉熵计算公式:

深度学习 数据权重 偏差值 误差权重_激活函数_05

误差的反向传播

深度学习 数据权重 偏差值 误差权重_深度学习_06


以求w11(2)为例来说明,根据链式求导法则可得如图结论,继续对每一个偏导求值:

深度学习 数据权重 偏差值 误差权重_图像处理_07


下图中右边就是求解出来每一项的偏导数,左边就是w11(2)的损失梯度:

深度学习 数据权重 偏差值 误差权重_深度学习 数据权重 偏差值_08


权重的更新:

深度学习 数据权重 偏差值 误差权重_深度学习_09


那么所求的损失梯度的方式是不是指向全局最优(损失减小最快)的方向?

下图给出了明确的说明:分批次训练会指向局部最优,但不会指向全局最优

深度学习 数据权重 偏差值 误差权重_神经网络_10


优化器:使网络得到更快的收敛,通过动态调整学习率来确定如何更新网络权重

刚才说的分批次进行训练,每一个批次进行一个损失的计算及误差的反向传播其实就是常说的SGD优化器。

深度学习 数据权重 偏差值 误差权重_激活函数_11


这里给出SGD优化器更新参数的表达式:wt+1是更新后的参数,wt是更新前的参数,但SGD优化器的缺点也很明显,比如训练集中有些标注是错误的,那么求出来的损失梯度肯定就会有问题。另外,理想的情况是沿着图中黑色路径达到最优解,但分批次的话有可能梯度的方向不会这么理想,而跑偏,陷入局部最优。那么如何解决呢,引入SGD+Momentum优化器即可。

深度学习 数据权重 偏差值 误差权重_神经网络_12


引入SGD+动量进行优化:除了计算当前的梯度之外,还会将之前的梯度加入进来,引入动量之后,会考虑上一次的梯度方向,如左下角所示,这样可以有效的抑制样本噪声的干扰。动量系数一般取0.9.

深度学习 数据权重 偏差值 误差权重_深度学习 数据权重 偏差值_13


另外一个优化器:Adagrad优化器,其主要是在学习率上面做手脚,St是对损失梯度平方求和,这样会使得分母在训练过程中越来越大,从而导致学习率越来越小,这样就会达到一个自适应学习率的目的。但是其也有一个问题,就是学习率下降的太快,解决办法:引入RMSProp优化器。

深度学习 数据权重 偏差值 误差权重_深度学习_14


相对于Adagrad优化器,RMSProp优化器多增加了两个系数,其目的就是用来控制衰减速度。

深度学习 数据权重 偏差值 误差权重_图像处理_15


最后一个Adam优化器,其相对于前几个优化器看起来更复杂一点,包含一阶动量和二阶动量,

深度学习 数据权重 偏差值 误差权重_图像处理_16


如何选择合适的优化器,博主只说一句话:实践是检验真理的唯一标准。