神经网络设计与实现
上QQ阅读APP看书,第一时间看更新

2.3.1 反向传播介绍

在了解数学原理之前,先对训练过程进行直观了解会很有用。回顾学过的感知器类,我们只是利用实际输出与预测之间的差来测量误差。如果要预测连续输出而不是二元输出,因为正误差和负误差可能会相互抵消,所以必须使用不同的方法来测量。

避免此类问题的常见方法是通过使用均方根误差(RMSE)来测量误差,其定义如下:

E=(t-y)2

如果让我们的预测发生变化并绘制平方误差,将获得抛物线曲线(见图2-7)。

图2-7 单个神经元的误差曲线

实际上,我们的预测结果受到权重和偏置项控制,我们通过更改它们来减少误差。通过改变权重和偏置项,可以获得更复杂的曲线,其复杂性将取决于我们的权重和偏置项数量。对于权重个数为n的通用神经元,我们将具有n+1维度的椭圆抛物面(见图2-8),因为我们也需要改变偏置项。

曲线的最低点被称为全局最小值,也就是损失最小的地方,这意味着我们的误差不会低于这个数。在这种简单情况下,全局最小值也是仅有的最小值,但是在复杂函数中,还会有一些局部最小值。局部最小值定义为周围任意的小间隔内的最低点,因此不一定是全局的最低点。

图2-8 线性感知器的误差曲面

这样,我们可以将训练过程视为一个优化问题,即以有效的方式寻找曲线的最低点。探索误差曲面的便捷方法是使用梯度下降法。梯度下降法使用平方误差函数相对于网络权重的导数,并且遵循向下方向。方向由梯度给出。为方便起见,在查看函数的导数时,我们将考虑与之前看到的方法相比略有不同的测量平方误差的方法:

为了消除求导将要添加的系数,我们决定将平方误差除以2。这不会影响我们的误差曲面,甚至会让误差曲面变得更大,因为稍后,我们会将误差函数乘以另一个称为学习率的系数。

网络的训练通常使用反向传播进行,反向传播用于计算最陡的下降方向。如果单独看每个神经元,可以看到与感知器相同的公式。唯一的区别是,现在,一个神经元的输入是另一神经元的输出。让我们以神经元j为例,它会运行其激活函数以及之前所有网络的结果:

如果神经元在输入层之后的第一层中,那么输入层就是网络的输入。n表示神经元j的输入单位数,wkj表示神经元k的输出和神经元j之间的权重。

我们希望其激活函数是非线性且可微的,用希腊字母φ表示。因为如果它是线性的,则一系列线性神经元的组合仍将是线性的。并且我们希望它是可微的,因为我们要计算梯度。

逻辑函数是一种非常常见的激活函数,也称为sigmoid函数,由以下公式定义:

它的导数形式如下:

反向传播的特殊之处在于,不仅输入会到达输出以调整权重,而且输出也会返回到输入,如图2-9所示。

图2-9 一个简单的二元分类FFNN示意图