神经网络反向传播Backpropagation
一、深度学习三部曲:
- 定义一个函数model
- 评估这个函数model
- 选出最好的函数
二、定义神经网络
本次学习使用的是全连接前馈神经网络(Fully Connect Feedforward Network)
以上图为例,此处所采用的sigmoid函数是
1
+
1
/
e
−
z
1+1/e^{-z}
1+1/e−z。也就是节点的activation是sigmoid函数。从上图可以看出我们输入1对应的权重为1和-1,下一层节点对应的bias(偏置值)为1,输入-1对应的权重为-2和1,下一层节点对应的偏置值为0。我们可以通过11+(-1)(-2)+1=4,然后对sigmoid(4)进行计算得到0.98.
依次类推,第二个节点也可以这样计算。因此我们将其写成如上的矩阵表示形式。
由此一来,我们可以将算出的激活值当作下一层的输入进行类似的计算。即可以得到y=f(x)=
σ
\sigma
σ(
w
1
x
+
b
1
w_{1}x+b_{1}
w1x+b1)。对于多层运算,我们将
σ
(
w
2
(
w
1
+
b
1
)
+
b
2
)
\sigma(w_{2}(w_{1}+b_{1})+b_{2})
σ(w2(w1+b1)+b2)依次类推得到上图所示。
三、评估函数好坏
这里,我们定义交叉熵(Cross Entropy)来评估。
首先定义真实值(target)和训练值的交叉熵:
l
(
y
,
y
^
)
l(y,\hat{y})
l(y,y^)=-
∑
i
=
1
10
\sum_{i=1}^{10}
∑i=110
y
i
^
\hat{y_{i}}
yi^ln
y
i
y_{i}
yi
对于整个网络来说,total loss:L=
∑
n
=
1
N
l
n
\sum_{n=1}^{N} l^{n}
∑n=1Nln
在这里,我们通过最小化total loss来求得评估model。如何评估呢,我们就通过梯度下降(Gradient Descent)
四、选择最好的函数Model
通过梯度下降最小化total loss选择最好的函数。
这里,我们需要计算梯度:
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l。
也就是后向传播(Backpropagation)的问题。根据链式法则(chain rule),我们将求解
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l的问题进行分解:
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l=
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z。显然,我们就可以分成两部分进行求解:首先是forward pass(前向传播),也就是对于
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z的求解。对于
z
=
w
1
x
+
b
1
z=w_{1}x+b_{1}
z=w1x+b1来说,z是第一层sigmoid函数的输入。那么
∂
z
∂
w
1
=
x
1
\frac{\partial z}{\partial w_{1}}=x_{1}
∂w1∂z=x1,也就是输入,那么我们很容易可以计算出
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z,也就是每个权重的那个输入端的值。
计算完
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z,我们开始计算
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l,也就是后向传播(backford pass)
相比之下,
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l的计算就要难很多。首先我们利用链式法则,进行分解:
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l=
∂
a
∂
z
\frac{\partial a}{\partial z}
∂z∂a
∂
l
∂
a
\frac{\partial l}{\partial a}
∂a∂l其中a=sigmoid(z)=
σ
(
z
)
\sigma{(z)}
σ(z)。同样,我们分别对每个部分进行求解。
∂
a
∂
z
\frac{\partial a}{\partial z}
∂z∂a=
σ
(
z
)
ˊ
\acute{\sigma(z)}
σ(z)ˊ(
σ
(
z
)
\sigma{(z)}
σ(z)d的一阶导数)。
∂
l
∂
a
\frac{\partial l}{\partial a}
∂a∂l则就比较复杂。我们再次利用链式法则,
∂
l
∂
a
\frac{\partial l}{\partial a}
∂a∂l=
∂
z
ˊ
∂
a
\frac{\partial \acute{z}}{\partial a}
∂a∂zˊ
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l+
∂
z
ˊ
ˊ
∂
a
\frac{\partial \acute{\acute{z}}}{\partial a}
∂a∂zˊˊ
∂
l
∂
z
ˊ
ˊ
\frac{\partial l}{\partial \acute{\acute{z}}}
∂zˊˊ∂l。而
∂
z
ˊ
∂
a
\frac{\partial \acute{z}}{\partial a}
∂a∂zˊ其实就是w,因此
z
ˊ
=
w
3
a
+
b
3
\acute{z}=w_{3}a+b_{3}
zˊ=w3a+b3,
∂
z
ˊ
ˊ
∂
a
\frac{\partial \acute{\acute{z}}}{\partial a}
∂a∂zˊˊ同理。因此
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l=
σ
(
z
)
ˊ
\acute{\sigma(z)}
σ(z)ˊ(
w
3
w_{3}
w3
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l+
w
4
w_{4}
w4
∂
l
∂
z
ˊ
ˊ
\frac{\partial l}{\partial \acute{\acute{z}}}
∂zˊˊ∂l)。
为了理解这个过程,我们可以假设
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l和
∂
l
∂
z
ˊ
ˊ
\frac{\partial l}{\partial \acute{\acute{z}}}
∂zˊˊ∂l都是已知的,那么我们就可以得到
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l,根据Forward pass我们已经计算得出了
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z,两者相乘,我们就可以得到
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l了。
但事实是
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l和
∂
l
∂
z
ˊ
ˊ
\frac{\partial l}{\partial \acute{\acute{z}}}
∂zˊˊ∂l都是并不是已知的。那如何求解呢。我们分两种情况:第一种情况是
z
ˊ
\acute{z}
zˊ和
z
ˊ
ˊ
\acute{\acute{z}}
zˊˊ对应的是输出层,也就是说经过一个sigmoid函数就可以输出结果了。这个情况,我们可以再次进行链式法则:
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l=
∂
l
∂
y
1
\frac{\partial l}{\partial y_{1}}
∂y1∂l
∂
y
1
∂
z
ˊ
\frac{\partial y_{1}}{\partial \acute{z}}
∂zˊ∂y1。我们可以简单快速的计算出
∂
l
∂
y
1
\frac{\partial l}{\partial y_{1}}
∂y1∂l,而
∂
y
1
∂
z
ˊ
\frac{\partial y_{1}}{\partial \acute{z}}
∂zˊ∂y1就是一个
σ
(
z
ˊ
)
ˊ
\acute{\sigma( \acute{z})}
σ(zˊ)ˊ。这样我们就可以计算出最终答案。
第二种情况就比较复杂,我们需要一步步展开。就是一层一层计算,和第一种情况一样,我们算出结果来之后:
∂
l
∂
z
ˊ
\frac{\partial l}{\partial \acute{z}}
∂zˊ∂l=
σ
(
z
ˊ
)
ˊ
\acute{\sigma(\acute{z})}
σ(zˊ)ˊ(
w
5
w_{5}
w5
∂
l
∂
z
a
\frac{\partial l}{\partial z_{a}}
∂za∂l+
w
6
w_{6}
w6
∂
l
∂
z
b
)
\frac{\partial l}{\partial z_{b}})
∂zb∂l)。依次类推计算。
这样计算非常麻烦,于是我们想到可以采用第一种情况的方法进行计算。也就是如下倒推:
也就是从末尾计算出相应的值,然后累乘就可以。
五、总结
当我们使用Backpropagation计算出所有的
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l就可以采用梯度下降的办法进行计算。利用梯度值更新参数w,直到收敛。