Machine Learning —— Backpropagation
Gradient Descent
gradient descent的使用方法,跟前面讲到的linear Regression或者是Logistic Regression是一模一样的,唯一的区别就在于当它用在neural network的时候,neural network的parameter θ ∗ = w 1 , w 2 , . . . , b 1 , b 2 , . . \theta^*=w_1,w_2,...,b_1,b_2,.. θ∗=w1,w2,...,b1,b2,..,可能会有将近million个参数,如何有效地把这个近百万维的vector给计算出来,这就是Backpropagation要做的事情
Backpropagation并不是一个和gradient descent不同的training的方法,它就是gradient descent,它只是一个比较有效率的算法,让你在计算这个gradient的vector的时候更有效率
Chain Rule(链式法则)
对整个neural network,我们定义了一个loss function:
L
(
θ
)
=
∑
n
=
1
N
l
n
(
θ
)
L(\theta)=\sum\limits_{n=1}^Nl^n(\theta)
L(θ)=n=1∑Nln(θ)
用
L
(
θ
)
L(\theta)
L(θ)对某一个参数w做偏微分,表达式如下:
∂ L ( θ ) ∂ w = ∑ n = 1 N ∂ l n ( θ ) ∂ w \frac{\partial L(\theta)}{\partial w}=\sum\limits_{n=1}^N\frac{\partial l^n(\theta)}{\partial w} ∂w∂L(θ)=n=1∑N∂w∂ln(θ)
我们先考虑某一个neuron,先拿出上图中被红色三角形圈住的neuron,假设只有两个input x 1 , x 2 x_1,x_2 x1,x2,通过这个neural,可以得到 z = b + w 1 x 1 + w 2 x 2 z=b+w_1x_1+w_2x_2 z=b+w1x1+w2x2,然后经过activation function从这个neuron中output出来,作为后续neuron的input,再经过了非常非常多的事情以后,会得到最终的output y 1 , y 2 y_1,y_2 y1,y2
按照chain rule,可以把拆分成两项 ∂ l ( θ ) ∂ w \frac{\partial l(\theta)}{\partial w} ∂w∂l(θ)拆分成两项, ∂ l ( θ ) ∂ w = ∂ z ∂ w ∂ l ∂ z \frac{\partial l(\theta)}{\partial w}=\frac{\partial z}{\partial w}\frac{\partial l}{\partial z} ∂w∂l(θ)=∂w∂z∂z∂l
计算前面这一项
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z的过程我们称之为Forward pass;计算后一项
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l的过程称之为Backward pass
Forward pass
求
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z就是看w前连接的input是什么,微分后的
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z就是什么,因此只要计算出neural network里面每一个neuron的output就可以知道任意的z对w的偏微分
Backward pass
计算 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l这项会比较复杂
公式推导
z通过activation function得到a,这个neural的output是 a = σ ( z ) a=\sigma(z) a=σ(z),接下来a会乘上某一个weight w 3 w_3 w3,再加上其它一堆value得到 z ′ z' z′, z ′ z' z′是下一个neural activation function的input,然后a又会乘上某一个weight w 4 w_4 w4,再加上其它一堆value得到 z ′ ′ z'' z′′,我们在考虑下一步:
∂ l ∂ z = ∂ a ∂ z ∂ l ∂ a \frac{\partial l}{\partial z}=\frac{\partial a}{\partial z}\frac{\partial l}{\partial a} ∂z∂l=∂z∂a∂a∂l
这里的 ∂ a ∂ z \frac{\partial a}{\partial z} ∂z∂a实际上是activation function的微分(在这里就是sigmoid function的微分),接下来就是计算 ∂ l ∂ a \frac{\partial l}{\partial a} ∂a∂l,根据chain rule可以得到:
∂ l ∂ a = ∂ z ′ ∂ a ∂ l ∂ z ′ + ∂ z ′ ′ ∂ a ∂ l ∂ z ′ ′ \frac{\partial l}{\partial a}=\frac{\partial z'}{\partial a}\frac{\partial l}{\partial z'}+\frac{\partial z''}{\partial a}\frac{\partial l}{\partial z''} ∂a∂l=∂a∂z′∂z′∂l+∂a∂z′′∂z′′∂l
上式中 ∂ z ′ ∂ a = w 3 , ∂ z ′ ‘ ’ ∂ a = w 4 \frac{\partial z'}{\partial a}=w_3,\frac{\partial z'‘’}{\partial a}=w_4 ∂a∂z′=w3,∂a∂z′‘’=w4,但是如何计算 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} ∂z′∂l和 ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} ∂z′′∂l?
首先我们假设已通过某种方法把 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} ∂z′∂l和 ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} ∂z′′∂l计算出来了,然后回过头去就可以把 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l给轻易计算出:
∂ l ∂ z = ∂ a ∂ z ∂ l ∂ a = σ ′ ( z ) [ w 3 ∂ l ∂ z ′ + w 4 ∂ l ∂ z ′ ′ ] \frac{\partial l}{\partial z}=\frac{\partial a}{\partial z}\frac{\partial l}{\partial a}=\sigma'(z)[w_3\frac{\partial l}{\partial z'}+w_4\frac{\partial l}{\partial z''}] ∂z∂l=∂z∂a∂a∂l=σ′(z)[w3∂z′∂l+w4∂z′′∂l]
另一种观点
我们可以从另外一个观点来看待这个式子
现在有另外一个neuron,它不在我们原来的network里面,在下图中它被画成三角形,这个neuron的input就是
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l和
∂
l
∂
z
′
′
\frac{\partial l}{\partial z''}
∂z′′∂l,那input
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l乘上
w
3
w_3
w3,
∂
l
∂
z
′
′
\frac{\partial l}{\partial z''}
∂z′′∂l乘上
w
4
w_4
w4,两者相加再乘上activation function的微分
σ
′
(
z
)
\sigma'(z)
σ′(z),就可以得到output
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l
两种情况
现在我们需要解决的问题是,怎么计算 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} ∂z′∂l和 ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} ∂z′′∂l,假设有两个不同的case:
case1:Output Layer
假设蓝色的这个neuron已经是hidden layer的最后一层了,也就是说连接在 ∂ z ′ \partial z' ∂z′和 ∂ z ′ ′ \partial z'' ∂z′′后的两个红色的neuron已经是output layer,它的output就已经是整个network的output了,这个时候计算就比较简单:
∂ l ∂ z ′ = ∂ y 1 ∂ z ′ ∂ l ∂ y 1 \frac{\partial l}{\partial z'}=\frac{\partial y_1}{\partial z'}\frac{\partial l}{\partial y_1} ∂z′∂l=∂z′∂y1∂y1∂l
- ∂ y 1 ∂ z ′ \frac{\partial y_1}{\partial z'} ∂z′∂y1就是output layer的activation function(softmax)对 z ′ z' z′的偏微分
- ∂ l ∂ y 1 \frac{\partial l}{\partial y_1} ∂y1∂l是loss对 y 1 y_1 y1的偏微分,取决于loss function怎么定义,也就是output和target之间是怎么evaluate的,可以用cross entropy,用不同的定义得到的值不一样
这时就可以把
l
l
l对
w
1
w_1
w1和
w
2
w_2
w2的偏微分计算出来了
case2:Not Output Layer
假设现在红色的neural并不是整个network的output,那么
z
′
z'
z′经过红色neuron的activation function得到
a
′
a'
a′,然后output
a
′
a'
a′和
w
5
、
w
6
w_5、w_6
w5、w6相乘并加上一堆其它东西分别得到
z
a
z_a
za和
z
b
z_b
zb,如下图所示
根据之前的推导证明类比,如果知道
∂
l
∂
z
a
\frac{\partial l}{\partial z_a}
∂za∂l和
∂
l
∂
z
b
\frac{\partial l}{\partial z_b}
∂zb∂l,我们可以计算
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l即:
∂
l
∂
z
′
=
σ
′
(
z
′
)
[
w
5
∂
l
∂
z
a
+
w
6
∂
l
∂
z
b
]
\frac{\partial l}{\partial z'}=\sigma'(z')[w_5\frac{\partial l}{\partial z_a}+w_6\frac{\partial l}{\partial z_b}]
∂z′∂l=σ′(z′)[w5∂za∂l+w6∂zb∂l]
知道
z
′
z'
z′和
z
′
′
z''
z′′就可以知道
z
z
z,知道
z
a
z_a
za和
z
b
z_b
zb就可以知道
z
′
z'
z′…以此类推,直到找到output layer
当我们从output layer的 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l开始计算,可以发现它的计算量和network的Feedforward path一样
假设现在有6个neural,每一个neuron的activation function的input分别是
z
1
、
z
2
、
z
3
、
z
4
、
z
5
、
z
6
z_1、z_2、z_3、z_4、z_5、z_6
z1、z2、z3、z4、z5、z6,如果我们反过来先计算
z
5
、
z
6
z_5、z_6
z5、z6的偏微分的话
∂
l
∂
z
5
、
∂
l
∂
z
6
\frac{\partial l}{\partial z_5}、\frac{\partial l}{\partial z_6}
∂z5∂l、∂z6∂l,然后就可以计算
∂
l
∂
z
3
、
∂
l
∂
z
4
\frac{\partial l}{\partial z_3}、\frac{\partial l}{\partial z_4}
∂z3∂l、∂z4∂l,最后可以得到
∂
l
∂
z
1
、
∂
l
∂
z
2
\frac{\partial l}{\partial z_1}、\frac{\partial l}{\partial z_2}
∂z1∂l、∂z2∂l,这个过程就叫做Backward pass
Summary
-
Forward pass:每一个neuron的activation function的output,就是它所连接的weight的 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z
-
Backward pass:建立一个与原来方向相反的neural network,它的三角形neuron的output就是 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l
-
把通过forward pass得到的 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z和通过backforward pass得到的 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l相乘即可得到 ∂ l ∂ w \frac{\partial l}{\partial w} ∂w∂l
∂ l ∂ w = ∂ l ∂ z ∣ f o r w a r d p a s s ⋅ ∂ l ∂ z ∣ b a c k w a r d p a s s \frac{\partial l}{\partial w}=\frac{\partial l}{\partial z}|_{forward pass}\cdot\frac{\partial l}{\partial z}|_{backward pass} ∂w∂l=∂z∂l∣forwardpass⋅∂z∂l∣backwardpass
参考
https://sakura-gh.github.io/ML-notes/ML-notes-html/9_Backpropagation.html