【机器学习】神经网络及BP推导

来源:互联网 发布:淘宝上买的车衣不耐用 编辑:程序博客网 时间:2024/04/20 09:14

参考 https://www.zybuluo.com/Feiteng/note/20154

1 前向传播

这里的推导都用矩阵和向量的形式,计算单个变量写起来太麻烦。矩阵、向量求导可参见上面参考的博客,个人觉得解释得很直接很好。

前向传播每一层的计算如下:

z(l+1)=W(l,l+1)a(l)+b(l,l+1)(1.1)

a(l+1)=f(z(l+1))(1.2)

f 是激活函数。一般有sigmoid、tanh、relu等。

这里写图片描述

2 反向传播

为了得到好的模型,我们要更新参数 W,b ,这里就用到了反向传播。

我们将神经网络的损失函数记为 J(W,b) ,这里的 W,b 是指网络中所有的参数。损失函数可以是均方误差、交叉熵等等。总之是衡量网络输出的结果与真实标记之间的差异。

之后,就要计算 J(W,b) 对每一层 W,b 的梯度,对 W,b 进行更新。所有参数更新完成后,再进行前向传播。循环往复,直到达到要求为止。

反向传播之所以和正向传播这么对比着说,是因为反向传播也是一层一层地计算。首先看最后一层(假设最后一层没有激活):

JW(n1,n)=Jz(n)z(n)W(n1,n)(2.1)

Jb(n1,n)=Jz(n)z(n)b(n1,n)(2.2)

我们记:

δ(n)=Jz(n)(2.3)

通过(1.1)和(1.2)我们可以得出:

z(n)W(n1,n)=a(n1)(2.4)

z(n)b(n1,n)=1(2.5)

将(2.3)-(2.5)代入(2.1)、(2.2)得:

JW(n1,n)=δ(n)a(n1)T(2.6)

Jb(n1,n)=δ(n)(2.7)

下面我们看倒数第二层:

JW(n2,n1)=Jz(n1)z(n1)W(n2,n1)=δ(n1)a(n2)T(2.8)

Jb(n2,n1)=Jz(n1)z(n1)b(n2,n1)=δ(n1)(2.9)

观察(2.6)-(2.9)可以发现,形式都是相同的,所以问题就是, δ(n1) 怎么求。还是用链式法则:

δ(n1)=Jz(n1)=Jz(n)z(n)a(n1)a(n1)z(n1)=W(n1,n)Tδ(n)f(z(n1))(2.10)

由(2.10)可以看出,粉色部分是上轮更新后固定的,蓝色部分是反向传播时上一层计算好的,只有本层的棕色部分需要计算。

这样,一层接着一层,直到将所有的 JW,Jb 都计算完毕,用负梯度更新所有的参数。再正向传播,再反向传播……循环……直到达到要求。

同时也可以看出,在计算梯度的时候,(2.10)中棕色的部分是导数,如果这个导数部分过大,则会产生所谓的“梯度爆炸”的问题,如果过小,则会出现“梯度弥散”的问题。比如 f 取 sigmoid函数,其导数值最大是0.25,如果网络很深,那导数项连乘,就会使得梯度变得很小,参数更新不动,这就是梯度弥散。

原创粉丝点击