BP算法从原理到实践
反向传播算法Backpropagation的python实现
觉得有用的话,欢迎一起讨论相互学习~Follow Me
博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自己对于反向传播算法理解的并不是十分的透彻,现在想通过这篇博文缕清一下思路.自身才疏学浅欢迎各位批评指正.
参考文献
李宏毅深度学习视频
The original location of the code
关于反向传播算法的用途在此不再赘述,这篇博文主要是理解形象化理解反向传播算法与python进行实践的.
反向传播是一种有效率进行梯度下降的方法
- 在神经网络中,我们往往有很多参数,每一个神经元与另一个神经元的连接都有一个权重(weight),每一个神经元都有一个偏置(bias).在梯度下降减小loss function的值时我们会对所有的参数进行更新.
- 我们设所有的参数为θ
θ ,初始化的θ
θ 记为θ 0
θ 0 .其经过梯度下降后的取值设为θ 1 ,θ 2 ,θ 3 .. .θn
θ 1 ,θ 2 ,θ 3 .. .θ n - η
η 表示学习率,L(θ)
L (θ) 表示Lossfunction,∇
∇ 表示梯度.
- 假设我们需要做语音辨识,有7-8层神经层,每层有1000个神经元,这时我们的梯度向量∇ L(θ)
∇ L(θ) 是一个有上百万维度的向量,这时候我们使用反向传播算法有效率的计算参数的梯度下降值.
BP算法数学原理直观表示
Chain Rule 链式法则
- 我们将训练数据的正确值(理想值)称为ˆ y
y ^ 而把模型的实际输出值记作y
y .Cost function是对于一个训练数据y 和ˆ y 距离 的函 数 .则Lost function是所有训练数据的Cost function值的加和. - 即若我们想计算Loss function对w的偏导数,只要计算训练集上所有训练数据对w的偏导数之和即可.
L(θ) =N ∑ n= 1 Cn (θ)
∂ L(θ ) ∂ w =N ∑ n= 1 ∂C n (θ)∂ w
Backpropagation 实现
- 假设我们取一个简单神经网络的输入层作考虑.
Forward pass前向传播
- 对于前向传播,∂ z ∂ wn =X n [即前向传播中的连接输入值(也是连接中上一个神经元的输出值)即是激活函数对该边权值的偏导数]
也就是说只要我们算出每一个神经元的输出就能知道与其相连的边的cost function 对权值的偏微分.
Backward pass反向传播
对于此处的 ∂ C ∂ z′ 和∂ C ∂ z″ 是结 构十 分复 杂的 表达 式在 接下 来我 们会 进行 计算 ,现 在假 设其 已经 计算 出来
则此时有∂ C ∂ z =σ ′ (z) [w3 ∂C ∂ z′ +w 4 ∂C ∂ z″ ]
此时我们注意到,要计算∂ C ∂ z 我们除了需要这个神经元的输出之外,还需要知道和这个神经元连接的神经元的所有权值和cost function对于这些神经元输入值的偏导
case1 output layer
- 假设此神经元已经是最后一层隐藏层神经元,其后连接的是输出层,有输出y1和y2.
case2 not output layer
- 假设此神经元不是最后一层隐藏层的神经元,即其后还有许多层的神经元.
- 根据前面的模型我们知道,如果我们已知∂ C ∂ Za 和∂C∂ Zb 那么 我们 可以 求出 ∂C∂ z′
- ∂ C ∂ Z′ =( W5 ∗∂ C ∂ Za +W 6 ∗∂ C ∂ Zb )∗ σ′ (Z′)
- 我们使用这个方法已知持续到最后一层隐藏层,我们可以按照最后一层为隐藏层的方法从后向前进行推导
summary
- BP算法可以理解为逆向的建立一个神经网络,这个神经网络的激励函数是σ ′ (Z n ) ,这需要通过神经网络的Forward pass前向传播才能得到.
- 接下来我们可以通过最后一个隐层求得∂ C ∂ Z5 和∂C∂ z6
- 接下来和普通的神经网络一样对其进行运算求得结果
空说无凭,来看代码
1 | 复制代码`import random` |
本文转载自: 掘金