写在最前面的话:今天要梳理的知识点是深度学习中的前/反向传播的计算,所需要的知识点涉及高等数学中的导数运算。
在深度学习中,一个神经网络其实就是多个复合函数组成。函数的本质就是将输入x映射到输出y中,即 f ( x ) = y f(x)=y f(x)=y,而函数中的系数就是我们通过训练确定下来的,那么如何训练这些函数从而确定参数呢?这就涉及网络中的两个计算:前向传播和反向传播。
前向传播
前向传播(Forward Propagation)的理解较为简单,从输入经过一层层隐层计算得到输出的过程即为前向过程,也称前向传播。举个栗子,假设网络中只有一个神经元,
单个神经元网络中,正向传播是:(公式1)
y = W ∗ x + B y=W*x+B y=W∗x+B
而反向传播则是根据(标签值Y-预测值y),来调整W和B。
反向传播
反向传播(Backward Propagation)则是与前向传播的计算方向相反,它是通过输出值与真实值之间的误差,来更新训练参数,具体来说反向传播是根据损失函数,通过网络反向流动来计算每一层参数的梯度(偏导数),从而更新参数。反向传播解决了神经网络中训练模型时参数的更新问题,所以理解反向传播较为重要!对于上面单个神经元网络的栗子,它的损失函数假设为(标签值Y-预测值y)不考虑正则化问题,即:
L = Y − ( W ∗ x + B ) L=Y-(W*x+B) L=Y−(W∗x+B)
如果我们想要知道参数W和B对y做了多少贡献(即当W和B改变时,y如何变化),分别对(公式1)中W和B求导。可得到W的贡献为x,而B的贡献为1,因此,我们可以得到 △ W = ϑ L ϑ W = x \bigtriangleup W=\frac{\vartheta L}{\vartheta W}=x △W=ϑWϑL=x, △ B = ϑ L ϑ B = 1 \bigtriangleup B=\frac{\vartheta L}{\vartheta B}=1 △B=ϑBϑL=1,因此可得更新参数 W ′ = W + △ W , B ′ = B + △ B W'=W+\bigtriangleup W, B'=B+\bigtriangleup B W′=W+△W,B′=B+△B:
最后通过观察W,B与loss之间的关系:
- 如果正比关系,那么需要降低W/B值,来减少损失值loss
- 如果反比关系,那么需要增大W/B值,来减少损失值loss
以上就是简单的单个神经元网络中的反向传播。如果神经网络较为复杂,我们需要用到链式法则: ϑ L ϑ x = ϑ L ϑ y ϑ y ϑ x \frac{\vartheta L}{\vartheta x}=\frac{\vartheta L}{\vartheta y}\frac{\vartheta y}{\vartheta x } ϑxϑL=ϑyϑLϑxϑy。
太简单的例子相对比较好理解。为了加深上面的理解,我们再举一个多层神经网络,先借用一幅图:
上图显示了多层网络中的L1、L2和L3层,经过L2层的输出为 a i ( 2 ) a_i^{(2)} ai(2),经过L3层后的输出为 h W , b h_{W,b} hW,b,其中每一层对应的表达式为: