平均梯度是什么?把多个样本的梯度平均起来更新参数
平均梯度(Average Gradient)在机器学习中通常指的是:对多个样本分别计算出的梯度求平均值,用这个平均值来更新模型的参数。它是梯度下降类优化算法中的一个基本概念。在图像处理领域,平均梯度还有另外一个含义,是衡量图像清晰程度的一个指标。
为什么要对梯度求平均
训练模型时,我们要最小化的是整个训练集上的平均损失。根据求导的性质,平均损失的梯度,正好等于每个样本损失的梯度的平均值。因此,在批量梯度下降中,每一步都要计算所有样本的梯度并求平均,得到最准确的下降方向。但当数据量很大时,这样做的计算代价太高。小批量随机梯度下降则在每一步只随机地取一小批样本,比如 64 个,计算这一批样本梯度的平均值,用它来近似整个数据集的平均梯度。批次越大,这个平均值越接近真实的梯度,波动越小;批次越小,计算越快,但估计的噪声越大。
使用平均值而不是总和还有一个好处:更新的幅度与批次的大小无关。如果直接把梯度加起来,批次大小翻倍,梯度也会翻倍,学习率就要相应地调整;而使用平均值,就不需要随批次大小大幅地调整学习率了,虽然在实践中,改变批次大小时往往仍会适当调整学习率。
梯度累积
当显存不够大,无法一次放下很大的批次时,可以使用梯度累积:把一个大的批次拆成几个小的批次,依次计算每个小批次的梯度并累加起来,等累积了足够多个小批次之后,再求平均并更新一次参数。这样就能在有限的显存下,达到与大批次训练等效的效果,在大模型的训练和微调中很常用。
分布式训练中的梯度平均
在使用多块 GPU 进行数据并行训练时,每块 GPU 都持有一份完整的模型,各自处理不同的一部分数据,计算出各自的梯度。然后,所有 GPU 需要通过通信,把各自的梯度求平均,这一步通常使用名为 All-Reduce 的通信操作来完成。每块 GPU 都用这个平均后的梯度来更新自己的模型,从而保证所有 GPU 上的模型始终保持一致。梯度的通信是分布式训练中的主要开销之一。
随机平均梯度算法
在优化算法中,还有一类专门利用梯度平均来加速的方法,比如随机平均梯度算法(SAG),由 Nicolas Le Roux、Mark Schmidt 和 Francis Bach 在 2012 年提出。它在每一步只计算一个样本的新梯度,但会保存之前计算过的所有样本的梯度,并用所有样本最近一次梯度的平均值来更新参数。这样既保持了随机梯度下降每步计算量小的优点,又减小了梯度估计的波动,在凸优化问题上能比普通的随机梯度下降收敛得更快。类似的方法还有 SAGA、SVRG 等方差缩减方法。
图像处理中的平均梯度
在图像处理中,平均梯度是衡量图像清晰度的一个常用指标:它计算图像中每个像素在水平和垂直方向上的灰度变化,再对整幅图像取平均。图像越清晰,边缘和细节越丰富,灰度变化越剧烈,平均梯度就越大;图像越模糊,平均梯度就越小。它常被用于评价图像融合、去噪、超分辨率等处理的效果。