【深度学习】前向传播和反向传播(四)
写在最前面的话:今天要梳理的知识点是深度学习中的前/反向传播的计算,所需要的知识点涉及高等数学中的导数运算。
在深度学习中,一个神经网络其实就是多个复合函数组成。函数的本质就是将输入x映射到输出y中,即f(x)=y,而函数中的系数就是我们通过训练确定下来的,那么如何训练这些函数从而确定参数呢?这就涉及网络中的两个计算:前向传播和反向传播。
前向传播
前向传播(Forward Propagation)的理解较为简单,从输入经过一层层隐层计算得到输出的过程即为前向过程,也称前向传播。举个栗子,假设网络中只有一个神经元,

单个神经元网络中,正向传播是:(公式1)
y=W∗x+B
而反向传播则是根据(标签值Y-预测值y),来调整W和B。
反向传播
反向传播(Backward Propagation)则是与前向传播的计算方向相反,它是通过输出值与真实值之间的误差,来更新训练参数,具体来说反向传播是根据损失函数,通过网络反向流动来计算每一层参数的梯度(偏导数),从而更新参数。反向传播解决了神经网络中训练模型时参数的更新问题,所以理解反向传播较为重要!对于上面单个神经元网络的栗子,它的损失函数假设为(标签值Y-预测值y)不考虑正则化问题,即:
L=Y−(W∗x+B)
如果我们想要知道参数W和B对y做了多少贡献(即当W和B改变时,y如何变化),分别对(公式1)中W和B求导。可得到W的贡献为x,而B的贡献为1,因此,我们可以得到△W=ϑWϑL=x,△B=ϑBϑL=1,因此可得更新参数W′=W+△W,B′=B+△B:
最后通过观察W,B与loss之间的关系:
- 如果正比关系,那么需要降低W/B值,来减少损失值loss
- 如果反比关系,那么需要增大W/B值,来减少损失值loss
以上就是简单的单个神经元网络中的反向传播。如果神经网络较为复杂,我们需要用到链式法则:ϑxϑL=ϑyϑLϑxϑy。
太简单的例子相对比较好理解。为了加深上面的理解,我们再举一个多层神经网络,先借用一幅图:

上图显示了多层网络中的L1、L2和L3层,经过L2层的输出为ai(2),经过L3层后的输出为hW,b,其中每一层对应的表达式为:
a1(2)=f(u11(1)x1+u12(1)x2+u13(1)x3+v1(1))
a2(2)=f(u21(1)x1+u22(1)x2+u23(1)x3+v2(1))
a3(2)=f(u31(1)x1+u32(1)x2+u33(1)x3+v3(1))
hW,b(x)=f(W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)+b1(2))
其中Wi,j和ui,j是相邻两层神经元之间的权重(对应图中的相邻两层之间的每一条连线),为深度学习中训练的参数。为了简化上面表达式,我们将上角标去掉,得到:
ai=f(ui1x1+ui2x2+ui3x3+vi)=f(UiXi+Vi)
hW,b=f(Wi1a1+Wi2a2+Wi3a3+bi)=f(Wiai+bi)
通常我们采用误差的平方来衡量损失,因此损失函数为:
Error=(h−y),Cost=(Error)2=(h−y)2
根据链式法则,我们可以得到:
ϑWϑCost=ϑhϑCϑWϑh=2×(h−y)⋅a
ϑUϑCost=ϑhϑCϑaϑhϑUϑa=2×(h−y)⋅w⋅x
因此,可以得到参数更新的差值△W=ϑWϑCost,△U=ϑUϑCost。
总结
本文简单梳理了前向传播和反向传播,以及相关计算。梳理得有点简单,往后想到再继续补充吧~
参考文章:
https://www.cnblogs.com/cation/p/11664741.html
https://blog.****.net/qq_16137569/article/details/81449209
https://www.zhihu.com/question/27239198?rf=24827633