1.4 实现反向传播
在前向传播中,将输入层连接到隐藏层,隐藏层再连接到输出层。在第一次迭代中,随机初始化权重,然后计算这些权重造成的损失。在反向传播中,我们采用相反的方法。从前向传播中得到的损失值开始,更新网络的权重,使损失值尽可能小。
我们执行以下步骤来减小损失值:
1.少量改变神经网络中的每个权重——每次一个。
2.当权重值改变(δW)时,度量损失的变化(δL)。
3.将权重更新为(其中k是某个正值,是一个称为学习率的超参数)。
注意,对特定权重所做的更新与通过对其进行少量更改而减少的损失量成正比。从直观上看,如果改变某个权重减少了很大的损失,就可以对该权重进行较大的更新。但是,如果通过改变权重而减少的损失很小,那么就进行较小的更新。
如果在整个数据集上执行n次上述步骤(完成前向传播和反向传播),就会实现对模型n轮(epoch)的训练。
由于一个典型的神经网络包含数千或数百万(如果不是数十亿)个权重,改变每个权重的值,并检查损失是增加还是减少并不是最优的做法。上述列表中的核心步骤是权重变化时对“损失变化”的度量。正如你可能在微积分中学习过的那样,这个度量和计算权重相关的损失梯度是一样的。在下一节讨论反向传播链式法则时,将有更多关于利用微积分中的偏导数来计算与权重相关的损失梯度的内容。
在本节中,我们将通过每次对一个权重进行少量更新的方式来实现梯度下降,这在本节开始部分已经进行了详细介绍。不过,在实现反向传播之前,需要先了解神经网络的另一个细节:学习率。
直观地说,学习率有助于在算法中建立信任。例如,在决定权重更新大小的时候,可能不会一次性改变权重值,而是进行较慢的更新。
模型通过学习率获得了稳定性,将在1.6节中具体讨论学习率如何有助于提高稳定性。
通过更新权重来减少误差的整个过程称为梯度下降。
随机梯度下降是最小化前述误差的一种具体实现方法。如前所述,梯度表示差异(即权重值被少量更新时损失值的差异),下降表示减少。随机表示对随机样本的选择,并在此基础上做出决定。
除了随机梯度下降之外,还有许多其他类似的优化器可以帮助最小化损失值。下一章将讨论这些不同的优化器。
在接下来的两节中,我们将学习如何使用Python从头开始编写反向传播算法的代码,并简要讨论如何使用链式法则进行反向传播。