(1)为网络中每个神经元的错误量的计算公式,上标l代表第几层 ,下标j代表该层的第几个神经元,z代表神经元的加权输入,这个公式可以这样理解:某个神经元的错误量为损失函数对它的加权输入的偏导数,也就是损失函数对它的加权输入的变化率,如果损失函数对某个神经元的加权输入的改变而变化得很大,说明该神经元的错误量很大,也就意味着该神经元还需要学习(调整连接它的权重值的大小)。
(2)为输出层神经元的错误量的计算公式,其中,a就是网络的最终输出,根据损失函数的形式可以很容易求得公式的第一项,也就是C对a的偏导数,第二项就是神经元激活函数的导数。
(3)为隐藏层神经元的错误量的计算公式,可以看到,误差是从后面的层像前面的层传播,这一层的误差值的计算要考虑后面几层的误差值。
(4)为某个神经元的偏置b的梯度,可以看到,某个神经元的偏置的梯度,直接等于该神经元的错误量
(5)为连接某个神经元的权重w的梯度
总结:
从(4)(5)可以看出,参数的梯度大小总体来说都是取决于错误量,错误两越大,梯度就越大,错误量越小,梯度就越小。而从(2)和(3)可以看出,错误量的计算公式中都含有激活函数的导数这一项,如果使用sigmoid或者tanh等非线性激活函数,则会出现错误量非常小,也就是梯度消失的问题,原因有两个:
1、sigmoid的导数范围为0~0.25,从(3)可以看出,某层的错误量,是要乘上后面几层传播过来的错误量,假设激活函数取能取到最大值0.25,错误量往前传4层,则该层的错误量的值会乘0.25^4,也就是此时的错误量已经很小了,也可以说这一层的梯度很小了,如果在更深层的网络中,这种情况会更加严重。
2、如果加权输入z很大,那么sigmoid函数的导数值会接近于0,这也是导致一个神经元的错误量很小的原因,也就是梯度很小(消失)。