Backpropagation
反向传播Backpropagation
在构造神经网络的时候我们需要知道如何进行训练。反向传播是常用的用来训练神经网络的技术。
总览
本文以一个三层的神经网络来说明反向传播:
- 有两个神经元的输入层
- 有两个神经元的隐层
- 有单个神经元的输出层
权重
神经网络的训练就是找到最佳的权重使得预测误差最小。权重通常用一些随机数来进行初始化。然后再用反向传播不断地更新权重使得预测值和真实值的差距越来越小。
本文我们给权重的初始化数据为:w1 = 0.11, w2 = 0.21, w3 = 0.12, w4 = 0.08, w5 = 0.14, w6 = 0.15。
数据集
我们的输入数据是两维的,输出数据是一维的。
我们示例使用的输入数据是inputs=[2,3],输出数据是output=[1]。
前向传播过程
我们根据给定的输入去预测输出。利用输入乘以对应的权重,得到中间结果之后,再用中间结果乘以后续的权重,如此进行直到输出。
计算误差
紧接着我们计算网络的预测值(输出)与真实值之间的差异。如图7可知,目前的预测值与输出值相差甚远。图7展示了误差的计算方法。
如何减少误差
我们的目标是通过训练减少预测值与真实值之间的差异。由于真实值是不变的,因此减少误差的唯一途径就是改变预测值。现在的问题就是,如何去改变预测值?通过分析前向运算的预测过程我们可知预测值是权重的函数。想要改变预测值我们需要改变权重值。
现在的问题是如何改变(更新)权重来减少预测值与真实值之间的误差呢?
答案就是反向传播!
反向传播
反向传播(即误差的反向传播)是用梯度下降法更新权重的一种机制。反向传播需要计算损失函数对权重的导数。这种求导是贯穿整个神经网络的。
梯度下降是一种迭代性的优化算法,用以找到函数的最小值;在这里我们需要通过梯度下降最小化损失函数。利用梯度下降找最小值的过程需要更新权重,权重的更新方法如图9所示:
比如,为了更新w6,我们需要用w6减去损失函数对w6的导数。一般情况下我们还需要用该导数乘以一个超参数——学习率a。
损失函数的求导遵循链式法则:
由图11的推导我们可知,w6可由下式进行更新:
类似的w5可由下式进行更新:
现在还需要对输入层和隐层之间的w1,w2,w3,w4进行更新。损失函数对w1的偏导如下:
类似于w1的更新方式,我们同样的可对w2,w3,w4进行更新:
可以以矩阵乘法的形式重新描述上述更新公式:
反向传播过程
利用上面推导出的公式我们可以计算出新的权重。
学习率是可以通过交叉验证得到的超参数。
现在用更新后的权重重新计算前向传播:
由图18可知现在的预测值是0.26,比之前预测的0.191更靠近真实值。我们可以重复上述过程直到预测值和真实值之间的差异为零。
参考文献
更多资料请移步github:
https://github.com/GarryLau/MachineLearning