这就是所谓的梯度下降(gradient descent),你可能会很频繁地看到它,因为在机器学习中,实际上是要最小化损失。 为什么梯度指向最陡的上升方向? 在这种情况下,要知道为什么梯度给出的是最陡峭的上升方向。为了给出精确的解释,还要做一些数学计算。除了用垂直于 x 轴或 y 轴的垂直平面切割曲面外,还可以用 (a,b) 任意方向的垂直平面切割曲面。对于偏导数,有:
式中的 |.| 表示向量长度,α是两向量间的夹角(这在任意维数上都是成立的,不只是二维)。显而易见,当 cosα=1,即 α=0 时,表达式取最大值。这就意味着这两个向量是平行的,所以 e 的方向和梯度方向是相同的。 训练神经网络 现在要从理论转战实践了,了解如何训练神经网络。假设任务是将有 n 维特征向量的图像分成 c 类。从数学角度看,神经网络代表将 n 维特征空间映射到 c 维空间的函数 f:
神经网络本身是参数化的函数。方便起见,将参数标记为 m 维向量:
为了表现出对参数的依赖,习惯记为:
将神经网络的参数空间映射为实数。损失函数记为:
式中的是观测值为的第 i 个数据点 L 是损失函数项。例如,如果 J 是交叉熵损失,则:
式中
这看似简单,但难以计算。在真实世界中有数百万个数据点 N,更别说参数 m 的数量了。所以,一共有数百万项,因此要计算数百万个导数来求最小值。那么在实践中该如何解决这一问题? 随机梯度下降 要用梯度下降,得先计算:
如果 N 很大,那么计算量就很大,而一般都希望 N 大一点(因为想要尽量多的数据)。可以化简吗?一种方式是忽略一部分。尽管这看起来像个不靠谱的方案,但却有坚实的理论基础。要理解这一点,首先注意 J 其实可以写成期望值:
图像来源:Hao Li 等人所著《Visualizing the Loss Landscape of Neural Nets》(https://arxiv.org/pdf/1712.09913.pdf)。 无论残差连接做出了多显著的改善,我在这里主要是想说明多维优化的难度。在图中的第一部分可以看出,有多个局部最小值、峰值和平稳值等。好的架构可以让优化变得更容易,但完善的优化实践,可以处理更复杂的损失情况。架构和优化器是相辅相成的。 总结 我们在前文中已经了解了梯度背后的直观理解,并从数学角度以精确的方式定义了梯度。可以看出,对于任何可微函数,无论变量数量如何,梯度总是指向最陡的方向。从概念上来讲非常简单,但当应用在有数百万变量的函数上时,存在着很大的计算困难。随机梯度下降可以缓解这个问题,但还存在陷入局部最优、选择学习率等诸多问题。因此,优化问题还是很困难的,需要研究人员和从业人员多加关注。事实上,有一个非常活跃的社区在不断地进行改善,并取得了非常惊人的成绩!