神经网络反向传播Backpropagation(李弘毅机器学习)

神经网络反向传播Backpropagation

一、深度学习三部曲:

  1. 定义一个函数model
  2. 评估这个函数model
  3. 选出最好的函数

二、定义神经网络
本次学习使用的是全连接前馈神经网络(Fully Connect Feedforward Network)
神经网络反向传播Backpropagation(李弘毅机器学习)
以上图为例,此处所采用的sigmoid函数是1+1/ez1+1/e^{-z}。也就是节点的activation是sigmoid函数。从上图可以看出我们输入1对应的权重为1和-1,下一层节点对应的bias(偏置值)为1,输入-1对应的权重为-2和1,下一层节点对应的偏置值为0。我们可以通过11+(-1)(-2)+1=4,然后对sigmoid(4)进行计算得到0.98.
依次类推,第二个节点也可以这样计算。因此我们将其写成如上的矩阵表示形式。
神经网络反向传播Backpropagation(李弘毅机器学习)
由此一来,我们可以将算出的**值当作下一层的输入进行类似的计算。即可以得到y=f(x)=σ\sigma(w1x+b1w_{1}x+b_{1})。对于多层运算,我们将σ(w2(w1+b1)+b2)\sigma(w_{2}(w_{1}+b_{1})+b_{2})依次类推得到上图所示。
三、评估函数好坏
这里,我们定义交叉熵(Cross Entropy)来评估。
首先定义真实值(target)和训练值的交叉熵:
l(y,y^)l(y,\hat{y})=-i=110\sum_{i=1}^{10} yi^\hat{y_{i}}ln yiy_{i}
对于整个网络来说,total loss:L=n=1Nln\sum_{n=1}^{N} l^{n}
神经网络反向传播Backpropagation(李弘毅机器学习)
在这里,我们通过最小化total loss来求得评估model。如何评估呢,我们就通过梯度下降(Gradient Descent)
四、选择最好的函数Model
通过梯度下降最小化total loss选择最好的函数。
神经网络反向传播Backpropagation(李弘毅机器学习)

这里,我们需要计算梯度: lw\frac{\partial l}{\partial w}
也就是后向传播(Backpropagation)的问题。根据链式法则(chain rule),我们将求解 lw\frac{\partial l}{\partial w}的问题进行分解: lw\frac{\partial l}{\partial w}= lz\frac{\partial l}{\partial z} zw\frac{\partial z}{\partial w}。显然,我们就可以分成两部分进行求解:首先是forward pass(前向传播),也就是对于 zw\frac{\partial z}{\partial w}的求解。对于z=w1x+b1z=w_{1}x+b_{1}来说,z是第一层sigmoid函数的输入。那么 zw1=x1\frac{\partial z}{\partial w_{1}}=x_{1},也就是输入,那么我们很容易可以计算出zw\frac{\partial z}{\partial w},也就是每个权重的那个输入端的值。
神经网络反向传播Backpropagation(李弘毅机器学习)
计算完zw\frac{\partial z}{\partial w},我们开始计算lz\frac{\partial l}{\partial z},也就是后向传播(backford pass)
相比之下,lz\frac{\partial l}{\partial z}的计算就要难很多。首先我们利用链式法则,进行分解:lz\frac{\partial l}{\partial z}=az\frac{\partial a}{\partial z}la\frac{\partial l}{\partial a}其中a=sigmoid(z)=σ(z)\sigma{(z)}。同样,我们分别对每个部分进行求解。az\frac{\partial a}{\partial z}=σ(z)ˊ\acute{\sigma(z)}(σ(z)\sigma{(z)}d的一阶导数)。la\frac{\partial l}{\partial a}则就比较复杂。我们再次利用链式法则,la\frac{\partial l}{\partial a}=zˊa\frac{\partial \acute{z}}{\partial a}lzˊ\frac{\partial l}{\partial \acute{z}}+zˊˊa\frac{\partial \acute{\acute{z}}}{\partial a}lzˊˊ\frac{\partial l}{\partial \acute{\acute{z}}}。而zˊa\frac{\partial \acute{z}}{\partial a}其实就是w,因此zˊ=w3a+b3\acute{z}=w_{3}a+b_{3},zˊˊa\frac{\partial \acute{\acute{z}}}{\partial a}同理。因此lz\frac{\partial l}{\partial z}=σ(z)ˊ\acute{\sigma(z)}w3w_{3}lzˊ\frac{\partial l}{\partial \acute{z}}+w4w_{4}lzˊˊ\frac{\partial l}{\partial \acute{\acute{z}}})。
神经网络反向传播Backpropagation(李弘毅机器学习)
为了理解这个过程,我们可以假设lzˊ\frac{\partial l}{\partial \acute{z}}lzˊˊ\frac{\partial l}{\partial \acute{\acute{z}}}都是已知的,那么我们就可以得到lz\frac{\partial l}{\partial z},根据Forward pass我们已经计算得出了zw\frac{\partial z}{\partial w},两者相乘,我们就可以得到 lw\frac{\partial l}{\partial w}了。
神经网络反向传播Backpropagation(李弘毅机器学习)
但事实是lzˊ\frac{\partial l}{\partial \acute{z}}lzˊˊ\frac{\partial l}{\partial \acute{\acute{z}}}都是并不是已知的。那如何求解呢。我们分两种情况:第一种情况是zˊ\acute{z}zˊˊ\acute{\acute{z}}对应的是输出层,也就是说经过一个sigmoid函数就可以输出结果了。这个情况,我们可以再次进行链式法则:lzˊ\frac{\partial l}{\partial \acute{z}}=ly1\frac{\partial l}{\partial y_{1}} y1zˊ\frac{\partial y_{1}}{\partial \acute{z}}。我们可以简单快速的计算出ly1\frac{\partial l}{\partial y_{1}},而y1zˊ\frac{\partial y_{1}}{\partial \acute{z}}就是一个σ(zˊ)ˊ\acute{\sigma( \acute{z})}。这样我们就可以计算出最终答案。
神经网络反向传播Backpropagation(李弘毅机器学习)
第二种情况就比较复杂,我们需要一步步展开。就是一层一层计算,和第一种情况一样,我们算出结果来之后:lzˊ\frac{\partial l}{\partial \acute{z}}=σ(zˊ)ˊ\acute{\sigma(\acute{z})}w5w_{5}lza\frac{\partial l}{\partial z_{a}}+w6w_{6}lzb)\frac{\partial l}{\partial z_{b}})。依次类推计算。
神经网络反向传播Backpropagation(李弘毅机器学习)
这样计算非常麻烦,于是我们想到可以采用第一种情况的方法进行计算。也就是如下倒推:
神经网络反向传播Backpropagation(李弘毅机器学习)
也就是从末尾计算出相应的值,然后累乘就可以。
五、总结
当我们使用Backpropagation计算出所有的 lw\frac{\partial l}{\partial w}就可以采用梯度下降的办法进行计算。利用梯度值更新参数w,直到收敛。
神经网络反向传播Backpropagation(李弘毅机器学习)