反向传播算法之数学原理
一. 数学原理
反向传播从数学的角度考虑,就是利用了链式法则求导,其中的梯度下降算法也是微分学的一个知识点。以一层神经元为例。
输出层的激活值 a^(L) ,L表示输出层,前一层的激活值为a^(L-1)。
单一训练样本,已知训练值为y。计算损失函数。
整体的流程是
• 先使用前一个激活值和权重 w 以及偏置 b 计算出 z
• 再将 z 传入激活函数计算出 a
• 最后利用 a 和目标值 y 计算出损失
实践中需要对mini-batch中所有的样本求平均损失
进一步,∂C/∂w^(L) 只是梯度向量 ▽C 的一个分量;梯度向量本身是由损失函数对每个参数偏导构成。
1. 反向传播的四个基本公式:
第一个是损失函数对输出层神经元的激活值的偏导数。
第二个是损失函数对其它层神经元的激活值的偏导数,这一步是重要的,需要理解求和的作用,因为其它层的神经元激活值作用在后一层所有的神经元上,所以需要将后一层所有的损失函数对此神经元的偏导数求到一起,进行求和。
第三个是权重的偏导。
第四个是偏置的偏导。
我们的目标是将损失函数降到最低,从几何学讲,就是在图像上找到极小值点,那就需要找到图像的下降最快的方向,也就是上升最快的方向求反,常用的就是求导,因为是多元函数,所以对不同的参数,求他们的下降方向,就需要用到梯度,也就是偏导数。
二. 实例计算
下面将以实际的例子,运算一遍反向传播算法。使用2个输入神经元,2个隐藏层神经元,2个输出神经元,还有偏置。初始训练时都会对权重和偏置设置随机初始值。
可以看到,上图的输入,0.05和0.10,希望的输出为0.01和0.99。
1. 前向传播
1)隐藏层计算
首先计算隐藏层h1的输入值:
然后使用的激活函数是sigmoid,对输入值进行激活:
同理隐藏层h2激活值:
2)输出层计算
这时计算输出层,使用隐藏层计算好的激活值作为输入:
同理输出层o2的激活值:
3)计算总误差
损失函数使用平方误差函数,计算每一个输出节点的激活值与真实值的误差,将所有的输出节点相加得到总误差。
因为o1的激活值为0.75136507,目标值是0.01。其损失值为:
同理o2的损失值为:
总误差为:
2. 反向传播
1)输出层
我们需要求w5权重的梯度
根据链式法则:
下图我们可以更好的理解目前做的事情。
一个部分一个部分去求解:
整体:
最后为了减少误差,应该从当前的权重值,减去梯度*学习率。
同理:
2)隐藏层:
接下来将继续为新的计算值,向后传递w1,w2,w3,w4。
继续向前计算,我们将和输出层方式一致,不过有一些微小的不同。因为outh1的偏导数需要求和,因为outh1对输出层的两个神经元都有作用。
现在更新权重w1:
最后更新所有的参数变量,进行输出层到隐藏层之间权重梯度下降时,使用的隐藏层到输出层的权重仍然是正向传播时的权重,整体更新完成后,再完成迭代。