Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

机器学习中常常需要通过求某个模型的极致来确定参数,本文讨论一下比较常用的梯度下降法

背景

学习线性回归算法,求解模型参数时,涉及到利用最值确定模型参数的方法。而梯度下降法求极值的方法被较多的提及,本文将梳理一下梯度下降法的思想。

思路

梯度gradient

所谓梯度,即为一个向量(矢量),用以表示某一函数在该点处的方向导数沿着该方向取得最大值。即函数在该点处沿着该方向变化最快,变化率最大(为梯度的模)

通俗来说就是爬山时,当你身处山上的某一点时,从该点出发,上山或下山的最快方向(并不考虑体力,耐力)。

梯度下降

梯度下降法,用梯度的思想来求解函数的最小值

例如在山顶放了一个小球,松手后它会随着山坡最陡峭的地方滚落到山谷。

动机

就本科阶段学习的高等数学知识而言,我们也经常会接触到求函数极值的问题,我们通常会使用另倒数等于0的方法来讨论函数的极值点。例如二维凸函数(此处凸函数是指高数中的凹函数和凸函数的总称)

f(x)=x2f(x) = x^2

通过另倒数等于0,我们可以得到如下结论:

f(x)=2x=0f'(x) = 2x = 0

x=0x = 0

即在0出取得最小值。

而对于如下这个二元函数:

f(w0,w1)=16[ln(1+ew0+2w1)+ln(1+ew07w1)f(w_0,w_1) = \frac{1}{6}[ln(1+e^{w_0+2w_1}) + ln(1+e^{-w_0-7w_1})

+ln(1+ew04w1)+ln(1+ew0+w1)+ ln(1+e^{-w_0-4w_1})+ ln(1+e^{w_0+w_1})

+ln(1+ew05w1)+ln(1+ew0+4.5w1)]+ ln(1+e^{-w_0-5w_1}) + ln(1+e^{w_0+4.5w_1})]

用导数法来求他的最小值会变得异常困难。而事实上,该函数是逻辑回归的经验误差函数,我们需要通过求这个函数的最小值来确定两个参数。

通过绘制该函数的图像,我们可以得到一个类似山谷的图像。那么我们思考能否使用梯度下降法。

简单例子

学习的过程通常是有简入繁的过程,接下来我们使用之前提到的相对简单的列子f(x)=x2f(x) = x^2来引出梯度下降法。

梯度

根据梯度下降法的思路,在进行梯度下降法时,我们首先需要一个“小球”。例如,我们一开始将这个二维的”小球“放置在x=10的位置上,则小球的初始坐标为(10,f(10)=100)(10,f(10)=100)

”小球“由于受力不平衡,那么他会向山坡下移动,一些物理学知识我们可以预测,小球将会向坡度最陡峭的那个方向移动,这就与梯度的概念不谋而合。由于此处我们需要讨论向量,为了方便,我们规定标量+括号,如:(x)(x)表示一个向量

于是我们求该点处的梯度:

Δf(x0)=f(x0)(i)=(f(x0))=(2xx0=10)=(20)\Delta f(x_0) = f'(x_0)(i) = (f'(x_0)) = (2x|_{x_0 = 10}) = (20)

可见在二位坐标系下,梯度向量是一个以为向量,反应到坐标上的变化,也就是x的变化率。

那么我们将“小球”所在的位置加上梯度方向,则就可以得到小球移动后的向量(x1)(x_1)

(x1)=(x0)η(Δf(x0))(x_1) = (x_0) - \eta(\Delta f(x_0))

其中η\eta成为步长,用于控制每次滚动的距离标量。此处我们使用η=0.2\eta = 0.2,那么:

(x1)=(x0)0.2×(Δf(x0))=(6)(x_1) = (x_0) - 0.2\times (\Delta f(x_0)) = (6)

迭代

至此我们完成了”小球”的一步滚动,但是要完整实现我们的思路,还需要使小球连续运动直到它到达谷底。一个很常规的思路就是得到每一步的终点后,以该点为基础继续进行移动,也就是迭代。

x1x_1的梯度为:

Δf(x1)=f(x1)(i)=(f(x1))=(2xx1=6)=(12)\Delta f(x_1) = f'(x_1)(i) = (f'(x_1)) = (2x|_{x_1=6}) = (12)

则下一步“小球”将移动到:

(x2)=(x1)ηΔf(x1)=(6)0.2×(12)=(3.6)(x_2) = (x_1) - \eta \Delta f(x_1) = (6) - 0.2 \times (12) = (3.6)

在迭代到第10次时,我们得到x100x_{10} \approx 0

总结

此时我们把每次求得的梯度的模长Δf||\Delta f||,归纳起来,可以得到下面的表格:

x0x_0 x1x_1 x2x_2 x3x_3 x4x_4 x5x_5 x6x_6 x7x_7 x8x_8 x9x_9 x10x_{10}
|| Δf\Delta f || 20 12 7.2 4.32 2.59 1.56 0.93 0.56 0.34 0.2 0.12

观察可以发现,随着迭代次数的增加有:

Δf=0Δf=0f(x)=0||\Delta f|| = 0 \to \Delta f = 0 \to f'(x) = 0

最终我们得到与另倒数等于0的这种方法相似的效果。但同样可以知道使用此法测算出的结果是一个接近于极值点的情况,并不是真正的极值点。这也体现了我们在将理论进行实际引应用中,为了解决种种问题而在最终结果上做出妥协的思考方式。

关于步长

上文提到,步长可以由我们自由设置,但是如果步长设置不够合理,将会导致无法找到最大或最小值的情况。

例如在测算f(x)=x2f(x) = x^2时,令η=1.1\eta = 1.1,那么随着迭代的增加f(x)f(x)的值会越来越大。换句话说,就是小球某一步直接滚过了最小值,导致小球在无摩擦力的情况下每次获得了更大的重力势能,导致其越滚越高。

通常步长不当可根据f(x)f(x)的变化趋势,分为以下三种情况:

  1. f(x)f(x)越来越大,则η\eta过大
  2. f(x)f(x)一开始急剧下降,到达某一值时几乎不变,则η\eta较大
  3. f(x)f(x)几乎是线性变化,即变化过于缓慢,则η\eta较小,可适当提高

总结

至此,梯度下降法的基本思想和操作方式讲解已经结束了,为我们提供了一种新的求极值的思路,并且让我们回顾了科学技术在实际应用中的适应思路。之后需要多多练习。对于更高纬的情况,例如:

f(x)=x12+2x22f(x) = x_1^2 + 2x_2^2

可以使用梯度下降法自行求解。

评论