【机器学习】神经网络及BP推导
2017-11-03 22:50
363 查看
参考 https://www.zybuluo.com/Feiteng/note/20154
前向传播每一层的计算如下:
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等。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/6f8765ec9639546b65e3f49c037c6f84)
我们将神经网络的损失函数记为 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,如果网络很深,那导数项连乘,就会使得梯度变得很小,参数更新不动,这就是梯度弥散。
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,如果网络很深,那导数项连乘,就会使得梯度变得很小,参数更新不动,这就是梯度弥散。
相关文章推荐
- 机器学习之五:神经网络、反向传播算法推导
- 机器学习笔记(XVI)神经网络(III)误差逆传播(BP)算法
- 【机器学习】反向传播神经网络推导
- 机器学习——神经网络、深度学习 知识点总结 及 面试题汇总
- 加州理工学院公开课:机器学习与数据挖掘_神经网络(第十课)
- Stanford机器学习---第四讲. 神经网络的表示 Neural Networks representation
- ANN 人工神经前馈网络BP实现
- Google发布机器学习平台Tensorflow游乐场~带你玩神经网络
- Stanford机器学习---第4讲. 神经网络的表示 Neural Networks representation
- 机器学习(一):梯度下降、神经网络、BP神经网络
- BP 神经网络精彩讲解(收藏了)
- 4 机器学习实践之手写数字识别- 神经网络识别
- 神经网络中的反向传播的推导和python实现
- 数据分析、数据挖掘、机器学习、神经网络、深度学习和人工智能概念区别(入门级别)
- Matlab与机器学习 -- BP网络神经元上的转移函数
- 基于Tensorflow的机器学习(5) -- 全连接神经网络
- 斯坦福机器学习第四周(神经网络及其应用)
- 机器学习实验(十一):基于WiFi fingerprints用自编码器(Autoencoders)和神经网络(Neural Network)进行定位_2(keras版)
- 【R的机器学习】模型性能提升探索:R的其他神经网络包-neuralnet
- 数学之路(3)-机器学习(3)-机器学习算法-神经网络[17]