zoukankan      html  css  js  c++  java
  • 李宏毅机器学习课程笔记-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-lrfrac{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):@绝版臭咸鱼

    微信公众号:@臭咸鱼的快乐生活

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


  • 相关阅读:
    Spring(03)Spring IOC 概述
    Spring IoC Bean 创建方法总结
    Spring Boot 目录
    Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖
    Spring(02)重新认识 IoC
    极客时间
    Spring(01)特性总览
    Spring 核心编程思想目录
    Spring IOC 前世今生之 JDNI
    sharding-jdbc-core 源码分析
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/14198053.html
Copyright © 2011-2022 走看看