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