优化
探索梯度下降算法的不同变体。
优化是从一组可用的备选方案中,根据某种准则选择最优元素的过程。
在最简单的情况下,优化问题通过在允许范围内系统地选择输入值,并计算函数输出值,来实现对某个实函数的最大化或最小化。
在机器学习中,优化指的是通过系统地更新网络权重来最小化损失函数。数学上可表示为:
其中 是损失函数, 是模型权重。
直观上,这可以类比为在一个高维地形中下山。如果我们将其投影到二维平面图上,地形的高度代表损失函数的值,横轴则表示权重 的取值。最终目标是通过不断探索周围空间,逐步到达地形的最低点。
梯度下降
梯度下降基于一个基本思想:沿着当前所处位置地形的局部坡度行进。我们相当于引入了物理学中的重力概念。微积分为我们提供了一种优雅的方法来计算该点处地形的坡度,即函数关于权重的导数(也称为梯度)。
学习率()是一个常数,用于控制每次迭代中向损失函数最小值移动的步长。
从算法角度,上述过程可用如下 Python 代码表示:
1for t in range(steps): 2 dw = gradient(loss, data, w) 3 w = w - learning_rate *dw
从可视化角度看,我们可以想象以下对应于二维空间的示意图:
在实际的深度学习应用中,梯度下降主要有三种变体。
批量梯度下降
前面提到的公式和代码实际上描述的是批量梯度下降。在这种方法中,我们在每一步训练时都先计算整个数据集上的梯度,然后再更新权重。
由于需要对所有训练样本的损失求和,计算代价随着数据量增加迅速上升,因此对于大规模数据集而言并不实用。
随机梯度下降
随机梯度下降(SGD)正是为解决这一问题而提出的。与在全部样本上计算梯度并更新权重不同,SGD 对每个训练样本 单独进行权重更新。
在 Python 中可表示为:
1for t in range(steps): 2 for example in data: 3 dw = gradient(loss, example, w) 4 w = w - learning_rate *dw
因此,SGD 的计算速度更快、效率更高,但其梯度估计存在噪声。由于权重频繁更新,可能导致较大的振荡,从而使训练过程变得不稳定。
我们会以锯齿状的方式在地形中下行,反复越过最低点而无法精确收敛。然而也正是由于这种波动,我们更容易跳出局部极小值,继续寻找更优的解。
小批量随机梯度下降
小批量随机梯度下降(Mini-batch SGD)介于前两种方法之间,结合了二者的优势。它从整个数据集中随机选取 个训练样本——即所谓的小批量(mini-batch),并仅基于这些样本来计算梯度。本质上是通过对数据子集采样来近似批量梯度下降。数学表达式为:
实践中,小批量 SGD 是最常用的版本,因为它既具有较低的计算开销,又能实现更稳定的收敛。
1for t in range(steps): 2 for mini_batch in get_batches(data, batch_size): 3 dw = gradient(loss, mini_batch, w) 4 w = w - learning_rate *dw
注意,在文献和各类框架中,“SGD”一词通常指代小批量 SGD。此后我们也采用相同的术语约定。