深度学习:模型更新步骤【初始化参数、前向传播(ForwardPropagation)得到模型输出值、计算输出值与目标值之间损失、反向传播(BackPropagation)梯度下降更新参数 】
一、单层、单一输出“感知机”梯度
二、单层、多输出“感知机”梯度
三、多层、多输出“感知机”梯度
二、反向传播算法-链式法则
1、计算图和反向传播
计算图:通过图的方式来描述函数的图形
已知 J ( a , b , c ) = 3 ( a + b c ) , 令 v = b c , u = a + v J(a,b,c) = 3(a+bc),令v = bc, u=a+v J(a,b,c)=3(a+bc),令v=bc,u=a+v,求a,b,c各自的偏导数。
令 : a + b c = u , 即: J = 3 u d J d a = d J d u × d u d a = 3 × 1 d J d b = d J d u × d u d v × d v d b = 3 × 1 × c d J d c = d J d u × d u d v × d v d c = 3 × 1 × b \begin{aligned} 令:&a+bc=u, 即: J = 3u\\ \frac{dJ}{da} &=\frac{dJ}{du} \times \frac{du}{da} = 3\times1 \\ \frac{dJ}{db} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{db} = 3\times1\times c \\ \frac{dJ}{dc} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{dc} = 3\times1\times b \\ \end{aligned} 令:dadJdbdJdcdJa+bc=u,即:J=3u=dudJ×dadu=3×1=dudJ×dvdu×dbdv=3×1×c=dudJ×dvdu×dcdv=3×1×b
把 J = 3 ( a + b c ) , 令 v = b c , u = a + v J = 3(a+bc),令v = bc, u=a+v J=3(a+bc),令v=bc,u=a+v绘制成计算图可以表示为:
绘制成为计算图之后,可以清楚的看到向前计算的过程
之后,对每个节点求偏导可有:
那么反向传播的过程就是一个上图的从右往左的过程,自变量 a , b , c a,b,c a,b,c各自的偏导就是连线上的梯度的乘积:
d J d a = 3 × 1 d J d b = 3 × 1 × c d J d c = 3 × 1 × b \begin{aligned} \frac{dJ}{da} &= 3 \times 1 \\ \frac{dJ}{db} &= 3 \times 1 \times c \\ \frac{dJ}{dc} &= 3 \times 1 \times b \end{aligned} dadJdbdJdcdJ=3×1=3×1×c=3×1×b
2、 神经网络中的反向传播
2.1 神经网络的示意图
W 1 , W 2 , . . . . W n W1,W2,....Wn W1,W2,....Wn表示网络第n层权重
W n [ i , j ] Wn[i,j] Wn[i,j]表示第 n n n 层第 i i i 个神经元,连接到第 n + 1 n+1 n+1 层第 j j j 个神经元的权重。
2.2 神经网络的计算图
其中:
- ∇ o u t \nabla out ∇out是根据损失函数对预测值进行求导得到的结果
- f f f 函数可以理解为激活函数
问题:那么此时 W 1 [ 1 , 2 ] W_1[1,2] W1[1,2]的偏导该如何求解呢?
通过观察,发现从 o u t out out 到 W 1 [ 1 , 2 ] W_1[1,2] W1[1,2]的来连接线有两条
结果如下:
d o u t d W 1 [ 1 , 2 ] = x 1 ∗ f ′ ( a 2 ) ∗ { W 2 [ 2 , 1 ] ∗ f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t + W 2 [ 2 , 2 ] ∗ f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t } \frac{dout}{dW_1[1,2]} = x1*f^{'}(a2)*\left\{W_2[2,1]*f^{'}(b1)*W_3[1,1]*\nabla out +W_2[2,2]*f^{'}(b2)*W_3[2,1]*\nabla out\right\} dW1[1,2]dout=x1∗f′(a2)∗{
W2[2,1]∗f′(b1)∗W3[1,1]∗∇out+W2[2,2]∗f′(b2)∗W3[2,1]∗∇out}
公式分为两部分:
- 括号外:左边红线部分
- 括号内
- 加号左边:右边红线部分
- 加号右边:蓝线部分
但是这样做,当模型很大的时候,计算量非常大
所以反向传播的思想就是对其中的某一个参数单独求梯度,之后更新,如下图所示:
计算过程如下
∇ W 3 [ 1 , 1 ] = f ( b 1 ) ∗ ∇ o u t (计算 W 3 [ 1 , 1 ] 梯度) ∇ W 3 [ 2 , 1 ] = f ( b 2 ) ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) ∇ b 1 = f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) ∇ b 2 = f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) \begin{aligned} &\nabla W_3[1,1] = f(b_1)*\nabla out & (计算W_3[1,1]梯度)\\ &\nabla W_3[2,1] = f(b_2)*\nabla out & (计算W_3[2,1]梯度)\\ \\ &\nabla b_1= f^{'}(b_1)*W_3[1,1]*\nabla out & (计算W_3[2,1]梯度)\\ &\nabla b_2= f^{'}(b_2)*W_3[2,1]*\nabla out & (计算W_3[2,1]梯度)\\ \end{aligned} ∇W3[1,1]=f(b1)∗∇out∇W3[2,1]=f(b2)∗∇out∇b1=f′(b1)∗W3[1,1]∗∇out∇b2=f′(b2)∗W3[2,1]∗∇out(计算W3[1,1]梯度)(计算W3[2,1]梯度)(计算W3[2,1]梯度)(计算W3[2,1]梯度)
更新参数之后,继续反向传播
计算过程如下:
∇ W 2 [ 1 , 2 ] = f ( a 1 ) ∗ ∇ b 2 ∇ a 2 = f ′ ( a 2 ) ∗ ( w 2 [ 2 , 1 ] ∇ b 1 + W 2 [ 2 , 2 ] ∇ b 2 ) \begin{aligned} &\nabla W_2[1,2] = f(a_1)* \nabla b_2 \\ &\nabla a_2 = f^{'}(a_2)*(w_2[2,1]\nabla b_1 +W_2[2,2] \nabla b_2) \end{aligned} ∇W2[1,2]=f(a1)∗∇b2∇a2=f′(a2)∗(w2[2,1]∇b1+W2[2,2]∇b2)
继续反向传播
计算过程如下:
▽ W 1 [ 1 , 2 ] = x 1 ∗ ▽ a 2 ▽ x 1 = ( W 1 [ 1 , 1 ] ∗ ▽ a 1 + w 1 [ 1 , 2 ] ∗ ▽ a 2 ) ∗ x 1 ’ \begin{aligned} &▽W_1[1,2]= x_1*▽a_2\\ &▽x_1= (W_1[1,1]*▽a_1+w_1[1,2]*▽a_2)*x_1’ \end{aligned} ▽W1[1,2]=x1∗▽a2▽x1=(W1[1,1]∗▽a1+w1[1,2]∗▽a2)∗x1’
通用的描述如下
∇ w i , j l = f ( a i l ) ∗ ∇ a j i + 1 ∇ a i l = f ′ ( a i l ) ∗ ( ∑ j = 1 m w i , j ∗ ∇ a j l + 1 ) \nabla w^{l}_{i,j} = f(a^l_i)* \nabla a^{i+1}_{j}\\ \nabla a^{l}_i = f'(a^l_i)*(\sum_{j=1}^{m}w_{i,j}*\nabla a_j^{l+1}) ∇wi,jl=f(ail)∗∇aji+1∇ail=f′(ail)∗(j=1∑mwi,j∗∇ajl+1)
2.3 反向传播算法-链式法则
反向传播算法-链式法则:
- ∂ l ∂ w 11 ( 1 ) = \color{red}{\cfrac{\partial l}{\partial w^{(1)}_{11}}}= ∂w11(1)∂l=
- ∂ l ∂ w 11 ( 2 ) = \color{red}{\cfrac{\partial l}{\partial w^{(2)}_{11}}}= ∂w11(2)∂l=
- ∂ l ∂ w 11 ( 3 ) = \color{red}{\cfrac{\partial l}{\partial w^{(3)}_{11}}}= ∂w11(3)∂l=