如果要到达山峰,该往哪个方向走?当然,应该向斜率增加的地方前进。这个概念对应的是函数的导数。在数学上,导数定义为: 乍看之下,导数非常神秘,但它的几何意义非常简单。仔细看一下求导的点: 对任何 x 和 y,通过 f(x) 和 f(y) 的这条线定义为: 一般而言,如果用 at+b 定义一条直线,那称 a 为这条线的斜率。这个值既可以是正值也可以是负值,斜率为正,直线向上走;斜率为负,直线向下走。绝对值越大,直线越陡。如果像导数定义中一样,让 y 越来越接近 x,那么这条线就会成为 x 处的切线。
这就是所谓的梯度下降(gradient descent),你可能会很频繁地看到它,因为在机器学习中,实际上是要最小化损失。 为什么梯度指向最陡的上升方向? 在这种情况下,要知道为什么梯度给出的是最陡峭的上升方向。为了给出精确的解释,还要做一些数学计算。除了用垂直于 x 轴或 y 轴的垂直平面切割曲面外,还可以用 (a,b) 任意方向的垂直平面切割曲面。对于偏导数,有: 可以将它们视为 f(x,y) 沿 (1,0) 和(0,1)方向的导数。尽管这些方向特别重要,但也可以任意规定这些方向。也就是说,假设方向为: 这个方向的导数定义为:
注意,最后一个等式就是方向向量和梯度的点积,这可能和高中几何课堂上遇到的点积是相同的。所以: 问题是,哪个方向的方向导数最大?答案是上升程度最陡峭的方向,所以如果要优化,得先知道这个特定的方向。这个方向就是之前提过的梯度,点积可以写作: 式中的 |.| 表示向量长度,α是两向量间的夹角(这在任意维数上都是成立的,不只是二维)。显而易见,当 cosα=1,即 α=0 时,表达式取最大值。这就意味着这两个向量是平行的,所以 e 的方向和梯度方向是相同的。 训练神经网络 现在要从理论转战实践了,了解如何训练神经网络。假设任务是将有 n 维特征向量的图像分成 c 类。从数学角度看,神经网络代表将 n 维特征空间映射到 c 维空间的函数 f: 神经网络本身是参数化的函数。方便起见,将参数标记为 m 维向量: 为了表现出对参数的依赖,习惯记为: 将神经网络的参数空间映射为实数。损失函数记为: 式中的是观测值为的第 i 个数据点 L 是损失函数项。例如,如果 J 是交叉熵损失,则:
式中 这看似简单,但难以计算。在真实世界中有数百万个数据点 N,更别说参数 m 的数量了。所以,一共有数百万项,因此要计算数百万个导数来求最小值。那么在实践中该如何解决这一问题? 随机梯度下降 要用梯度下降,得先计算:
如果 N 很大,那么计算量就很大,而一般都希望 N 大一点(因为想要尽量多的数据)。可以化简吗?一种方式是忽略一部分。尽管这看起来像个不靠谱的方案,但却有坚实的理论基础。要理解这一点,首先注意 J 其实可以写成期望值: 式中的是训练数据给出的(经验)概率分布。可以将序列写成: 这样就成了独立同分布的随机变量。根据大数定律: 式中是真正的总体分布(这是未知的)。再详细点说,因为增加了训练数据,损失函数收敛到真实损失。因此,如果对数据二次采样,并计算梯度: