深度学习优化策略,梯度下降( 二 )


在曲面的任何一点,我们都能够定义一个与其相切的平面 。在更高维度,我们总能够定义一个超平面,但在这里我们还是坚持使用 3 维空间 。然后,在这个平面上有无限个方向 。其中,准确来说只有一个使函数上升最快的方向,这个方向由梯度给出,与之相反的方向就是下降最快的方向 。这就是算法名称的来源,我们沿着梯度的方向进行下降,所以就叫做梯度下降 。
现在,既然已经有了前进方向,我们必须决定需要采取步子的大小,而控制下降步幅大小的参数即学习率 。为了保证降到最小值,我们必须谨慎地选择学习率 。如果移动得太快,我们可能越过最小值,沿着「山谷」的山脊蹦蹦跳跳,永远都不可能到达最小值 。如果移动太慢,训练可能花费太长的时间,根本就不可行,此外太慢的学习率也容易让算法陷入极小值,我们会在本文后面的部分讨论 。
【深度学习优化策略,梯度下降】一旦有了梯度和学习率,我们就开始行动,然后在最终到达的任何位置重新计算梯度,然后重复这个过程 。梯度的方向告诉我们哪个方向上升的最快,它的幅值则表示最陡峭的上升/下降有多陡 。所以,在最小值的地方,曲面轮廓几乎是平坦的,我们期望得到几乎为零的梯度 。事实上,最小值点的梯度就是 0 。梯度下降过程使用太大的学习率在实践中,我们可能永远无法精确地达到最小值,但是我们能够在最小值附近的平坦区域震荡 。
当我们在这个区域震荡时,损失值几乎是我们能够达到的最小值,并且不会有很大的变化,因为我们是在真实的最小值附近跳动 。通常,当损失值在预定的数字内没有提升的时候我们会停止迭代,例如 10 次或者 20 次迭代 。当这种情况发生时,我们就说训练已经收敛了,或者说收敛已经实现了 。常见的错误让我稍微偏离主题一会 。
如果搜索梯度下降的可视化图,你很可能会看到一个起于一个点、终于最小值点的轨迹,就像前文动画所展示的一样 。然而,这个关于梯度下降的描述并不准确 。我们得到的轨迹完全局限在 x-y 平面内,这个平面包含权重 。正如上面的动画所描述的,梯度下降并不涉及在 z 轴方向上的移动 。因为仅由 x 轴和 y 轴方向描述的权重是自由参数 。
实际得到的轨迹是定义在 x-y 平面中的,如下图所示:实际的梯度下降轨迹x-y 平面中的每一个点代表着一个唯一的权重组合,而我们希望有一组由最小值描述的权重 。基本方程描述梯度下降更新规则的基本方程是:每一次迭代中都执行更新 。此处,w 是权重向量,它位于 x-y 平面 。我们从这个向量中减去学习率α乘上损失函数相对于权重的梯度 。
梯度是一个向量,它给出了损失函数上升最快的方向 。下降最快的方向恰好和梯度方向相反,这就是为什么要从权重向量中减去梯度向量的原因 。如果想象向量对你来说有一些难度,那么,几乎同样的更新规则同时适用于网络的每一个权重 。唯一的变化是,我们现在对每个权重单独执行更新,上述方程中的梯度被替换为梯度向量沿着特定权重方向的投影 。
对所有的权重同时执行更新 。在做减法之前,我们用学习率与梯度向量相乘 。这是我们之前讨论过的步骤 。要知道,即使我们保持学习率不变,步长也会因为梯度大小,即损失函数轮廓的陡峭性变化而变化 。随着我们接近最小值点,梯度会接近于 0,我们会以越来越小的步长接近最小值点 。理论上而言,这样很好,因为我们希望当接近一个最小值的时候算法能够采取更小的步长 。
步长太大有可能导致跳过最小值,并且在最小值脊梁之间来回跳动 。梯度下降中常用的一个技术是采用可变的学习率,而不是固定的学习率 。初始时,我们可以使用较大的学习率 。但是到了后来,随着接近最小值点,我们需要慢下来 。实现这种策略的一种方法就是模拟退火,也就是衰减的学习率 。在这种情况下,学习率在股东能够数量的迭代次数中逐渐减小 。

推荐阅读