李宏毅机器学习课程笔记-3.梯度下降精讲

梯度下降伪代码

梯度下降可以优化损失函数的值,使其尽量小,即可找到最好(在数据集上拟合效果最好)的模型参数。

现在假设模型$f$中只有一个参数$w$,则损失函数为$L(f)=L(w)$,梯度下降算法如下(若模型有多个参数,按相同方法更新各参数)

  1. 初始化参数

    随机选取一个$w^0$($w^0$并不一定是随机选取),令$w=w^0$。

  2. 计算梯度

    $\frac{dL(f)}{dw}|_{w=w^0}$

    如果小于0,此时$w$增大则$L(f)$会减小;如果大于0,此时$w$减小则$L(w)$会减小。

    如果模型有多个参数,则计算损失函数在各个参数方向上的偏导数。

  3. 更新模型参数

    $w^1=w^0-lr\frac{dL(f)}{dw}|_{w=w^0}$

    $w$的变化量取决于梯度和学习率(Learning Rate)的大小:梯度绝对值或学习率越大,则$w$变化量越大。

    如果模型有多个参数,则用上一步计算出的偏导数对应更新各参数。

  4. 重复第2步和第3步

    经过多次参数更新/迭代(iteration),可以使损失函数的值达到局部最小(即局部最优,Local Optimal),但不一定是全局最优。

自适应学习率(Adaptive Learning Rate)

梯度下降过程中,固定学习率并不合理。学习率太大,可能导致loss不减小反而增大;学习率太小,loss会减小得很慢。

基本原则是随着参数迭代更新,学习率应该越来越小,比如$\eta^{t}=\frac{\eta}{\sqrt{t+1}}$。

更好的方法:每个参数有各自的学习率,比如Adagrad。

Adagrad

Adaptive Gradient Descent,自适应梯度下降。2011年提出,核心是每个参数(parameter)有不同的学习率

定义

每次迭代中,学习率要除以它对应参数的之前梯度的均方根(RMS) 。

即$w^{t+1}=w^t-\frac{\eta}{\sqrt{\sum_{i=0}^t(g^i)^2}}g^t$,其中$t$是迭代次数,$w$是参数,$g$是梯度,$\eta$是初始学习率。

随着参数迭代,$t$越来越大,$\sqrt{\sum_{i=0}^t(g^i)^2}$也越来越大,因此学习率的变化趋势是越来越小。

Adagrad的矛盾(Contradiction)

一般的梯度下降方法$w^{t+1}=w^t-\eta^tg^t$中,$\eta^t$是常量,梯度越大时,则参数更新的步幅越大,这是由$g^t$项决定的。

在Adagrad中,$\eta$是常量,梯度$g^t$越大时会使得参数更新的步幅越大,但$\sqrt{\sum_{i=0}^t(g^i)^2}$越大会使得参数更新的步幅越小,这是一个矛盾吗?

为什么要除以之前梯度的均方根?

  • 一种直观的解释:增强参数更新步幅变化的惯性

    与之前梯度相比如果现在的梯度更大,则现在梯度除以之前梯度会使参数更新的步幅更大;如果现在的梯度更小,则会使步幅更新的步幅更小。

    这样就相当于增强了参数更新步幅变化的惯性,即如果参数更新的步幅突然变大或变小,就扩大这个趋势。

  • 同时考虑一次梯度和二次梯度

    在Adagrad中,之前梯度的均方根是用来通过一次梯度估计二次梯度(虽然可以直接使用二次梯度,但其很难计算)。

    • 只考虑一个参数

      当参数只有一个或只考虑一个参数时,梯度越大,离最优点就越远,参数更新的步幅应该越大。

    • 考虑多个参数

      当参数有多个或者考虑多个参数时,上述内容不一定成立。如果参数1的梯度比参数2的梯度大,但如果损失函数关于参数1的曲线比关于参数2的曲线更陡峭(即二次梯度更大),那参数1离最优点的距离可能比参数2更近。

      所以当参数有多个或者考虑多个参数时,我们既要考虑一次梯度又要考虑二次梯度。

      结论是一次梯度越大、二次梯度越小,离最优点就越远,参数更新的步幅应该越大。

SGD

Stochastic Gradient Descent,随机梯度下降,1847年提出,可以让训练过程更快。

普通梯度下降中需要计算所有样本的Loss,而SGD只计算一个样本的Loss,然后进行梯度下降。

梯度下降的数学理论

建议直接看李宏毅老师的本节视频,从42分27秒开始看,老师讲得很好。

  1. 初始化一组参数后,我们找到邻域中另一个使损失函数值最小的一组参数并更新参数(然后不断重复这一步骤)。
  2. 在极小的邻域中,可以利用泰勒级数将损失函数简化,然后求其最小值,损失函数简化后,要使其最小即是让其中两个向量的內积最小,由此可以得出新的一组参数的值(具体过程略),这就是梯度下降。
  3. 学习率的作用是限制邻域大小,学习率太大可能使邻域太大,导致损失函数展开成泰勒级数时的误差较大。
  4. 当然也可以将损失函数展开成2次(比如牛顿迭代法),但这并不实用,因为要计算二次微分,甚至可能要求出海森矩阵(Hessian Matrix)逆矩阵等等,这些在做深度学习时是不实用的。

梯度下降的局限性

梯度下降过程中,每次参数更新不一定都会使损失函数的值更小。

求出的只是局部最小值(Local Minima)甚至是鞍点(Saddle Point),不一定是全局最优解。


Github(github.com):@chouxianyu

Github Pages(github.io):@臭咸鱼

知乎(zhihu.com):@臭咸鱼

博客园(cnblogs.com):@臭咸鱼

B站(bilibili.com):@绝版臭咸鱼

微信公众号:@臭咸鱼

转载请注明出处,欢迎讨论和交流!