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