累积误差反向传播是什么?攒够一整轮的误差再更新一次
累积误差反向传播(Accumulated Error Backpropagation),也叫累积 BP 算法,是训练神经网络的一种方式:它不是每看一个训练样本就更新一次网络的参数,而是先把所有训练样本上的误差累积起来,等读完整个训练集之后,再根据累积的误差统一地更新一次参数。周志华的《机器学习》一书中把它与“标准 BP 算法”进行了对比。
标准反向传播与累积反向传播
反向传播算法是训练神经网络的基本方法:把一个样本输入网络,计算出输出和误差,再把误差从输出层往回传,计算出每个参数的梯度,然后据此调整参数。根据更新参数的时机不同,可以分为两种做法。
标准反向传播:每输入一个训练样本,就计算一次误差、更新一次参数。它的更新非常频繁。由于每次只根据一个样本来调整,而不同的样本可能会把参数往不同的方向拉,前一个样本带来的调整可能会被后一个样本抵消,所以参数的变化轨迹比较曲折,需要进行更多次的迭代。它对应的是随机梯度下降。
累积反向传播:它直接针对的是整个训练集上的累积误差,也就是所有样本误差的总和或平均值。在读取完全部的训练样本、把所有样本的梯度都累积起来之后,才对参数进行一次更新。读取一遍完整的训练集叫作一轮,所以累积反向传播每一轮只更新一次参数。它对应的是批量梯度下降。
两者的优缺点
累积反向传播每次更新时使用的是整个训练集的信息,计算出的方向是真实的梯度方向,所以更新的方向更准确、更稳定,参数的更新频率也低得多。但问题在于:当训练集非常大时,每更新一次都要把所有的数据都处理一遍,速度很慢;而且当累积误差下降到一定程度之后,进一步下降可能会变得非常缓慢。这时,标准反向传播往往能更快地得到较好的解,尤其是在训练集非常大的时候。此外,标准反向传播每次更新带来的随机波动,还有助于帮助模型跳出不好的局部区域。
今天的做法:小批量
在现代的深度学习实践中,最常用的是介于两者之间的折中方案:小批量梯度下降。每次取一小批样本,比如 32 个、256 个或者更多,累积它们的梯度并求平均,然后更新一次参数。这样既比逐个样本更新更稳定,又不需要等待整个训练集都处理完,还能充分利用 GPU 并行计算的能力,同时处理一批数据。可以说,小批量方法在一个批次之内进行了“累积”,在批次之间又保持了频繁的更新。
在大模型的训练和微调中,还有一种叫“梯度累积”的技巧,它也体现了累积的思想:当显存不足以放下一个很大的批次时,就把它拆成几个小批次,依次计算每个小批次的梯度并累加起来,等累积了足够多个小批次后再更新一次参数。这样就能在有限的显存下,达到与大批次训练相当的效果。