TensorFlow与自然语言处理应用
上QQ阅读APP看书,第一时间看更新

2.8 随机梯度下降

几乎所有优化问题的解决方案都是梯度下降算法。它是一种迭代算法,通过随后更新函数的参数来最小化损失函数。

从图2-13中可以看到,我们首先把函数想象成一种山谷,想象一个球滚下山谷斜坡的情形。日常生活经验告诉我们,球最终会滚到谷底。也许我们可以用这个方法求出损失函数的最小值。

我们这里使用的函数依赖于两个变量:v1和v2。这可能是显而易见的,因为我们的损失函数看起来像前面的那个。为了达到这样一个平滑的损失函数,我们取二次损失:

图2-13 球滚下斜坡示意图

同样,我们应该注意到二次损失函数只是一种方法,其实还有许多其他方法来定义损失。但不管选择哪种方法,最终,我们选择不同损失函数的目的是为了得到:

(1)对权重值的平滑偏导数。

(2)一个良好的凸曲线,可以达到全局最小值。然而,在寻找全局最小值时,还有许多其他因素也在发挥作用。

我们随机选择一个(假想的)球的起点,然后模拟球在向下滚动到山谷底部时的运动。与之类比的情景中,假设我们初始化网络的权重值,或者一般来说,在曲线上的某个任意点上初始化函数的参数(就像在斜坡的任何一点上放一个球),然后检查附近的斜率(导数)。

我们知道,由于重力的作用,球会朝着最大坡度的方向下落。同样,在该点沿导数方向移动权重值,并根据以下规则更新权重值:

J(w)=成本作为权重值的函数,w =网络参数(v1和v2),wi=初始权重值集(随机初始化)。

这里,dJ(w)/dw为权重值wJ(w)的偏导数,η是学习率(Learning Rate)。

学习率更多的是一个超参数,这里虽然没有固定的方法来找到最合适的学习率,但是我们总是可以通过批量损失来找到它。

一种方法是看到损失并分析损失的模式。一般来说,较差的学习率会导致小批量的不稳定损失。它(损失)可以递归地上升和下降,而不需要稳定。

图2-14给出了一个更直观的解释。

图2-14 小型和大型学习率影响的示意图

在图2-14中,有两种情况:情景1,小的学习速率;情景2,大的学习速率。我们的目标是为了达到图2-14中的最小值,所以必须达到谷底(就像图2-13中球的情况那样)。学习率则与球滚下山时的跳跃幅度有关。

首先考虑情景1(图2-14中的左侧部分),我们在其中进行小的跳跃,逐渐继续向下滚动,慢慢地,最终达到最小值,而球有可能卡在路上的一些小缝隙中,并且由于无法进行大跳跃而无法逃脱它。

在情景2(图的右侧部分)中,与曲线的斜率相比,学习速率更大。这是一个次优的策略,实际上可能将我们从山谷中驱逐出去,在某些情况下,这可能是一个良好的开端,可以摆脱局部极小的范围,但如果我们跳过全局最小值,就会让人对其感到失望。

在图2-14中,我们实现了局部最小值,但这只是一个例子。这意味着权重值会停留在局部最小值上而错过全局最小值。梯度下降或随机梯度下降不保证能够收敛到神经网络的全局最小值(假设隐藏单元不是线性的),因为损失函数是非凸性的。理想情况是阶跃(步长)继续变化并且拥有更具适应性的特点,在起初时可以略高,然后在一段时间内逐渐减小,直到收敛为止。