Backpropagation

反向传播Backpropagation

Backpropagation
图1

在构造神经网络的时候我们需要知道如何进行训练。反向传播是常用的用来训练神经网络的技术。

总览

本文以一个三层的神经网络来说明反向传播:

  • 有两个神经元的输入层
  • 有两个神经元的隐层
  • 有单个神经元的输出层
Backpropagation
图2

权重

神经网络的训练就是找到最佳的权重使得预测误差最小。权重通常用一些随机数来进行初始化。然后再用反向传播不断地更新权重使得预测值和真实值的差距越来越小。
本文我们给权重的初始化数据为:w1 = 0.11, w2 = 0.21, w3 = 0.12, w4 = 0.08, w5 = 0.14, w6 = 0.15

Backpropagation
图3

数据集

我们的输入数据是两维的,输出数据是一维的。

Backpropagation
图4

我们示例使用的输入数据是inputs=[2,3],输出数据是output=[1]

Backpropagation
图5

前向传播过程

我们根据给定的输入去预测输出。利用输入乘以对应的权重,得到中间结果之后,再用中间结果乘以后续的权重,如此进行直到输出。

Backpropagation
图6

计算误差

紧接着我们计算网络的预测值(输出)与真实值之间的差异。如图7可知,目前的预测值与输出值相差甚远。图7展示了误差的计算方法。

Backpropagation
图7

如何减少误差

我们的目标是通过训练减少预测值与真实值之间的差异。由于真实值是不变的,因此减少误差的唯一途径就是改变预测值。现在的问题就是,如何去改变预测值?通过分析前向运算的预测过程我们可知预测值是权重的函数。想要改变预测值我们需要改变权重值。

Backpropagation
图8

现在的问题是如何改变(更新)权重来减少预测值与真实值之间的误差呢?
答案就是反向传播!

反向传播

反向传播(即误差的反向传播)是用梯度下降法更新权重的一种机制。反向传播需要计算损失函数对权重的导数。这种求导是贯穿整个神经网络的。

梯度下降是一种迭代性的优化算法,用以找到函数的最小值;在这里我们需要通过梯度下降最小化损失函数。利用梯度下降找最小值的过程需要更新权重,权重的更新方法如图9所示:

Backpropagation
图9

比如,为了更新w6,我们需要用w6减去损失函数对w6的导数。一般情况下我们还需要用该导数乘以一个超参数——学习率a

Backpropagation
图10

损失函数的求导遵循链式法则:

Backpropagation
图11

由图11的推导我们可知,w6可由下式进行更新:

Backpropagation
图12

类似的w5可由下式进行更新:

Backpropagation
图13

现在还需要对输入层和隐层之间的w1w2w3w4进行更新。损失函数对w1的偏导如下:

Backpropagation
图14

类似于w1的更新方式,我们同样的可对w2w3w4进行更新:

Backpropagation
图15

可以以矩阵乘法的形式重新描述上述更新公式:

Backpropagation
图16

反向传播过程

利用上面推导出的公式我们可以计算出新的权重。

学习率是可以通过交叉验证得到的超参数。

Backpropagation
图17

现在用更新后的权重重新计算前向传播:

Backpropagation
图18

由图18可知现在的预测值是0.26,比之前预测的0.191更靠近真实值。我们可以重复上述过程直到预测值和真实值之间的差异为零。

参考文献

Backpropagation Step by Step

Backpropagation

更多资料请移步github:
https://github.com/GarryLau/MachineLearning