• 梯度下降法原理及小结


      在机器学习的核心内容就是把数据喂给一个人工设计的模型,然后让模型自动的“学习”,从而优化模型自身的各种参数,最终使得在某一组参数下该模型能够最佳的匹配该学习任务。那么这个“学习”的过程就是机器学习算法的关键。梯度下降法就是实现该“学习”过程的一种最常见的方式,尤其是在深度学习(神经网络)模型中,BP反向传播方法的核心就是对每层的权重参数不断使用梯度下降来进行优化。另一种常用的方法是最小二乘法。本文详细介绍梯度下降法。

    一、 梯度下降法算法详解

      1.1 梯度下降的直观解释

      首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

        从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

      1.2 梯度下降的相关概念

      在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

      1、步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

      2、特征(feature):指的是样本中输入部分,比如2个单特征的样本(x(0),y(0)),(x(1),y(1)),则第一个样本特征为x(0),第一个样本输出为y(0)

      3、假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为$h_{ heta }(x)$。比如对于单个特征的m个样本(x(i),y(i))(i=1,2,...m),可以采用拟合函数如下:$h_{ heta }(x)= heta _{0}+ heta _{1}x$ 

      4、损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本(xi,yi)(i=1,2,..m),采用线性回归,损失函数为:

                 $J( heta _{0}, heta _{1})=sum_{i=1}^{m}(h_{ heta }(x_{i})-y_{i})^{2}$

        其中xi表示第i个样本特征,yi表示第i个样本对应的输出,$h_{ heta }(x_{i})$为假设函数。 

      1.3 梯度下降的详细算法

      梯度下降法的算法可以有代数法和矩阵法(也称向量法)两种表示,如果对矩阵分析不熟悉,则代数法更加容易理解。不过矩阵法更加的简洁,且由于使用了矩阵,实现逻辑更加的一目了然。这里先介绍代数法,后介绍矩阵法。 

      1.3.1 梯度下降法的代数方式描述

        1、先决条件: 确认优化模型的假设函数和损失函数。

        比如对于线性回归,假设函数表示为$h_{ heta }(x_{1},x_{2},...x_{n})= heta _{0}+ heta _{1}x_{1}+...+ heta _{n}x_{n}$,其中$ heta _{i}(i=0,1,2...n)$为模型参数,$x _{i}(i=0,1,2...n)$为每个样本的n个特征值。我们增加一个特征$x _{0}=1$,这样$h_{ heta }(x_{0},x_{1},...x_{n})=sum_{i=0}^{n} heta _{i}x_{i}$。

        同样是线性回归,对应于上面的假设函数,损失函数为:

        $J( heta _{0}, heta _{1}..., heta _{n})=frac{1}{2m}sum_{j=1}^{m}(h_{ heta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)}-y_{j})^{2}$         

        2、算法相关参数初始化:主要是初始化$ heta _{0}, heta _{1}..., heta _{n}$,算法终止距离$varepsilon $以及步长$alpha$。在没有任何先验知识的时候,将所有$ heta _{0}$初始化为0,将步长初始化为1,在调优的时候再优化。

        3、 算法过程:

          1)确定当前位置的损失函数的梯度,对于$ heta _{i}$,其梯度表达式如下:

            $frac{partial }{partial heta _{i}}J( heta _{0}, heta _{1}..., heta _{n})$

          2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即$afrac{partial }{partial heta _{i}}J( heta _{0}, heta _{1}..., heta _{n})$对应前面登山例子中的某一步。

          3)确定是否所有的$ heta _{i}$,梯度下降的距离都小于$varepsilon $,如果小于$varepsilon $则算法终止,当前所有的$ heta _{i}(i=0,1,2...n)$即为最终结果。否则进入步骤4.

          4)更新所有的$ heta $,对于$ heta _{i}$,其更新表达式如下。更新完毕后继续转入步骤1.

            $J( heta _{0}, heta _{1}..., heta _{n})=frac{1}{2m}sum_{j=1}^{m}(h_{ heta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)})-y_{j})^{2}$

      下面用线性回归的例子来具体描述梯度下降。假设我们的样本是$(x_{1}^{(0)},x_{2}^{(0)},...x_{n}^{(0)},y_{0})$,$(x_{1}^{(1)},x_{2}^{(1)},...x_{n}^{(1)},y_{1})$,...$(x_{1}^{(m)},x_{2}^{(m)},...x_{n}^{(m)},y_{m})$,损失函数如前面先决条件所述:

      $J( heta _{0}, heta _{1}..., heta _{n})=frac{1}{m}sum_{j=1}^{m}(h_{ heta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)}-y_{j})^{2}$

      则在算法过程步骤1中对于$ heta _{i}$的偏导数计算如下:

      $frac{partial }{partial heta _{t}}J( heta _{0}, heta _{1}..., heta _{n})=frac{1}{m}sum_{j=1}^{m}(h_{ heta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)})-y_{j})x_{i}^{(j)}$

      由于样本中没有$x_{0}$上式中令所有$x_{0}^{j}$为1.

      步骤4中$ heta _{i}$的更新表达式如下:

      $ heta _{i}= heta _{i}-afrac{1}{m}sum_{j=1}^{m}(h_{ heta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)})-y_{j})x_{i}^{(j)}$

      从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加$frac{1}{m}$是为了好理解。由于步长也为常数,他们的乘积也为常数,所以这里$afrac{1}{m}$可以用一个常数表示。

      1.3.2 梯度下降法的矩阵方式描述

        这一部分主要讲解梯度下降法的矩阵方式表述,相对于1.3.1的代数法,要求有一定的矩阵分析的基础知识,尤其是矩阵求导的知识。

        1、 先决条件: 和1.3.1类似, 需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数$h_{ heta }(x_{1},x_{2},...x_{n})= heta _{0}+ heta _{1}x_{1}+...+ heta _{n}x_{n}$的矩阵表达方式为:$h_{ heta }(X)=X heta $,其中,假设函数$h_{ heta }(X)$为m*1的向量,$h_{ heta }$为(n+1)*1的向量,里面n+1个代数法的模型参数。X为m*(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。

        损失函数的表达式为:$J( heta )=frac{1}{2}(X heta -Y)^{T}(X heta -Y)$,其中Y是样本的输出向量,维度为m*1.

        2、算法相关参数初始化: $ heta $向量可以初始化为默认值,或者调优后的值。算法终止距离$varepsilon $,步长$alpha$和1.3.1比没有变化。

        3、算法过程:

          1)确定当前位置的损失函数的梯度,对于$ heta $向量,其梯度表达式如下:

            $frac{partial }{partial heta }J( heta )$

          2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即$afrac{partial }{partial heta }J( heta )$对应于前面登山例子中的某一步。

          3)确定$ heta $向量里面的每个值,梯度下降的距离都小于$varepsilon $,如果小于$varepsilon $则算法终止,当前$ heta $向量即为最终结果。否则进入步骤4.

          4)更新$ heta $向量,其更新表达式如下。更新完毕后继续转入步骤1.

          $ heta = heta -afrac{partial }{partial heta }J( heta )$

        还是用线性回归的例子来描述具体的算法过程。

        损失函数对于$ heta $向量的偏导数计算如下:

        $frac{partial }{partial heta }J( heta )=X^{T}(X heta -Y)$

        步骤4中$ heta $向量的更新表达式如下:$ heta = heta -aX^{T}(X heta -Y)$

        对于3.3.1的代数法,可以看到矩阵法要简洁很多。这里面用到了矩阵求导链式法则,和两个矩阵求导的公式。 

        这里面用到了矩阵求导链式法则,和两个个矩阵求导的公式。

          公式1:$frac{partial }{partial x}(X^{T}X)=2X$ x为向量

          公式2:$igtriangledown _{chi }f(AX+B)=A^{T}igtriangledown _{Y}f$,$Y=AX+B$,$f(Y)$为标量

        如果需要熟悉矩阵求导建议参考张贤达的《矩阵分析与应用》一书。 

      1.4 梯度下降的算法调优

        在使用梯度下降时,需要进行调优。哪些地方需要调优呢?

        1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

        2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

        3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征$x$,求出它的期望$ar{x}$和标准差std(x),然后转化为:

        $frac{x-ar{x}}{std(x)}$

        这样特征的新期望为0,新方差为1,迭代速度可以大大加快。

    二、梯度下降法的分类与对比

      根据梯度下降时使用数据量的不同,梯度下降可以分为3类:批量梯度下降(Batch Gradient Descent,BGD)随机梯度下降(Stochastic Gradient Descent, SGD)小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

      批量梯度下降(SGD)

      批量梯度下降每次都使用训练集中的所有样本来更新参数,也就是

      $L(w)=frac{1}{2N}sum_{i=1}^{N}(f_{M}(x,w)-y)^{2}$ 

      更新方法为

      $w^{(k+1)}=w^{k}-a*frac{partial L(w)}{partial w}$ 

      当样本数据集很大时,批量梯度下降的速度就会非常慢。
      优点可以得到全局最优解
      缺点训练时间长

      随机梯度下降(SGD)

      每次梯度下降过程都使用全部的样本数据可能会造成训练过慢,随机梯度下降(SGD)每次只从样本中选择1组数据进行梯度下降,这样经过足够多的迭代次数,SGD也可以发挥作用,但过程会非常杂乱。“随机”的含义是每次从全部数据中中随机抽取一个样本。这样损失函数就变为:

      $L(w)=frac{1}{2}(f_{M}(x,w)-y)^{2}$ 

      参数更新方法同上:

      $w^{(k+1)}=w^{k}-a*frac{partial L(w)}{partial w}$ 

      优点训练速度快
      缺点准确度下降,得到的可能只是局部最优解

      小批量梯度下降(MBGD)

      小批量梯度下降是 BGD 和 SGD 之间的折中,MBGD 通常包含 10-1000 个随机选择的样本。MBGD降低了了SGD训练过程的杂乱程度,同时也保证了速度。

    三、总结

      梯度下降法是一种常用的优化器,梯度可以理解为多元函数偏导数组成的向量(一元函数就是导数),沿着梯度方向函数增加最快,在梯度下降中要沿着梯度相反的方向。根据训练周期使用的数据量的不同,梯度下降可以分为批量梯度下降(BGD)、随机梯度下降(SGD)和小批量梯度下降(MBGD)。

      在机器学习中的无约束优化算法,除了梯度下降以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。

      梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。

      梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。

    参考:

    https://zhuanlan.zhihu.com/p/36564434

    https://www.jianshu.com/p/c7e642877b0e

    https://blog.csdn.net/qq_41800366/article/details/86583789

    https://www.cnblogs.com/pinard/p/5970503.html

  • 相关阅读:
    memset 还可以这样用
    搜索(DFS)
    搜索(BFS)
    最大流之sap算法
    最大流之sap算法
    String VS Cstring(字符串)
    String VS Cstring(字符串)
    Set 与 Multiset
    deque(双端队列)
    枚举 TODO
  • 原文地址:https://www.cnblogs.com/liuxiaochong/p/14086698.html
Copyright © 2020-2023  润新知