您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-03 22:50 363 查看
参考 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 进行更新。所有参数更新完成后,再进行前向传播。循环往复,直到达到要求为止。

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

∂J∂W(n−1,n)=∂J∂z(n)∂z(n)∂W(n−1,n)(2.1)

∂J∂b(n−1,n)=∂J∂z(n)∂z(n)∂b(n−1,n)(2.2)

我们记:

δ(n)=∂J∂z(n)(2.3)

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

∂z(n)∂W(n−1,n)=a(n−1)(2.4)

∂z(n)∂b(n−1,n)=1(2.5)

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

∂J∂W(n−1,n)=δ(n)a(n−1)T(2.6)

∂J∂b(n−1,n)=δ(n)(2.7)

下面我们看倒数第二层:

∂J∂W(n−2,n−1)=∂J∂z(n−1)∂z(n−1)∂W(n−2,n−1)=δ(n−1)a(n−2)T(2.8)

∂J∂b(n−2,n−1)=∂J∂z(n−1)∂z(n−1)∂b(n−2,n−1)=δ(n−1)(2.9)

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

δ(n−1)=∂J∂z(n−1)=∂J∂z(n)∂z(n)∂a(n−1)∂a(n−1)∂z(n−1)=W(n−1,n)Tδ(n)⋅f′(z(n−1))(2.10)

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

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

同时也可以看出,在计算梯度的时候,(2.10)中棕色的部分是导数,如果这个导数部分过大,则会产生所谓的“梯度爆炸”的问题,如果过小,则会出现“梯度弥散”的问题。比如 f 取 sigmoid函数,其导数值最大是0.25,如果网络很深,那导数项连乘,就会使得梯度变得很小,参数更新不动,这就是梯度弥散。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息