梯度下降

来源:互联网 发布:平板电脑win10系统优化 编辑:程序博客网 时间:2024/05/16 12:04

在阅读Skip-Gram模型源码的时候涉及到了梯度下降,翻阅之前做的笔记,不理解为什么用步长*梯度来更新θ?难道不能用其他的参数进行更新吗?它的依据是什么?问了实验室的博士后恍然大悟,在此做个笔记,补充欠缺知识。对上述疑问在文章最后解答,有相同疑问的同学可以参考。】

       在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。这里对梯度下降法做一个完整的总结。

1.梯度

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

       在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(fx,fy)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(fx,fy)T,.或者f(x0,y0),如果是3个参数的向量梯度,就是(fx,fy)T,,以此类推。

       那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(fx,fy)T,的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是(fx,fy)T,的方向,梯度减少最快,也就是更加容易找到函数的最小值。

2.梯度下降与梯度上升

       在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。

       梯度下降法和梯度上升法是可以互相转化的。比如我们需要求解损失函数f(θ)的最小值,这时我们需要用梯度下降法来迭代求解。但是实际上,我们可以反过来求解损失函数 -f(θ)的最大值,这时梯度上升法就派上用场了。
       
下面来详细总结下梯度下降法。

3.梯度下降算法详解

3.1直观解释

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

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

3.2概念

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

  2. 特征(feature):指的是样本中输入部分,比如样本x0,y0,x1,y1,则样本特征为x,样本输出为y。

  3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)。比如对于样本xi,yi(i=1,2,…n),可以采用拟合函数如下: hθ(x)=θ0+θ1x

  4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本xi,yi(i=1,2,…n),采用线性回归,损失函数为:J(θ0,θ1)=mi=1(hθ(xi)yi)2 其中xi表示样本特征x的第i个元素,yi表示样本输出y的第i个元素,hθ(xi)为假设函数。

3.3详细算法

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

3.3.1梯度下降法的代数描述

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

    e.g.:对于线性回归
    (1)假设函数表示为 hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 其中θi(i = 0,1,2… n)为模型参数,xi(i = 0,1,2… n)为每个样本的n个特征值。
    (2)这个表示可以简化,我们增加一个特征x0=1,这样,同样是线性回归,对应于上面的假设函数,损失函数为: J(θ0,θ1...,θn)=12mmi=0(hθ(x0,x1,...xn)yi)2

  2. 参数初始化:主要初始化 参数θ0,θ1...,θn算法终止距离ε步长α。在没有任何先验知识的时候,可将所有的θ初始化为0, 将步长初始化为1。在调优的时候再优化。

  3. 算法过程:
    1)确定当前位置的损失函数的梯度,对于θi,其梯度表达式如下:θiJ(θ0,θ1...,θn)
    2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即αθiJ(θ0,θ1...,θn)
    对应于前面登山例子中的某一步。(这里不是很理解为什么步长乘以损失函数的梯度就是下降的距离???)
    3)确定是否所有的θi,梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的θi(i=0,1,…n)即为最终结果。否则进入步骤4。
    4)更新所有的θ,对于θi,其更新表达式如下。更新完毕后继续转入步骤1。
    θi=θiαθiJ(θ0,θ1...,θn)

e.g.:线性规划的例子
(1)假设我们的样本是
(x(0)1,x(0)2,...x(0)n,y0),(x(1)1,x(1)2,...x(1)n,y1)...(x(m)1,x(m)2,...x(m)n,ym),损失函数如前面先决条件所述:J(θ0,θ1...,θn)=12mmj=0(hθ(xj0,xj1,...xjn)yj)2
(2)则在算法过程步骤1中对于θi的偏导数计算如下:
θiJ(θ0,θ1...,θn)=1mmj=0(hθ(xj0,xj1,...xjn)yj)xji 由于样本中没有x0上式中令所有的xj0为1。
(3)步骤4中θi的更新表达式如下:
θi=θiα1mmj=0(hθ(xj0,xj1,...xjn)yj)xji

3.3.2梯度下降法的矩阵方法描述

  1. 先决条件: 和3.3.1类似, 需要确认优化模型的假设函数和损失函数。

    e.g.:对于线性回归
    (1)假设函数hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn的矩阵表达方式为: hθ(x)=Xθ ,其中,假设函数hθ(X)为m*1的向量,θ为n*1的向量,里面有n个代数法的模型参数。X为m*n维的矩阵。m代表样本的个数,n代表样本的特征数。
    (2)损失函数的表达式为:J(θ)=12(XθY)T(XθY), 其中Y是样本的输出向量,维度为m*1。

  2. 参数初始化: θ向量可以初始化为默认值,或者调优后的值。算法终止距离ε,步长α和3.3.1比没有变化。

  3. 算法过程:
    1)确定当前位置的损失函数的梯度,对于θ向量,其梯度表达式如下:θJ(θ)
    2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即αθJ(θ)对应于前面登山例子中的某一步。
    3)确定θ向量里面的每个值,梯度下降的距离都小于ε,如果小于ε则算法终止,当前θ向量即为最终结果。否则进入步骤4。
    4)更新θ向量,其更新表达式如下。更新完毕后继续转入步骤1。θ=θαθJ(θ)

e.g.:线性规划的例子
(1)损失函数对于θ向量的偏导数计算如下: θJ(θ)=XT(XθY)
(2)步骤4中θ向量的更新表达式如下:θ=θαXT(XθY)
【这里用到了矩阵求导链式法则和两个矩阵求导公式(1)公式1:X(XXT)=2X(2)公式2:θ(Xθ)=XT

3.4梯度下降算法调优

  1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
  2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
  3. 归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望x和标准差std(x),然后转化为:xxstd(x) 这样特征的新期望为0,新方差为1,迭代次数可以大大加快。

4.梯度下降法优化版本

4.1批量梯度下降(BGD)

       批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,这个方法对应于前面3.3.1的线性回归的梯度下降算法,也就是说3.3.1的梯度下降算法就是批量梯度下降法。对应的更新公式是:θi=θiαmj=0(hθ(xj0,xj1,...xjn)yj)xji

       这里求梯度的时候就用了所有m个样本的梯度数据。

4.2随机梯度下降(SGD)

       随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:
                            θi=θiα(hθ(xj0,xj1,...xjn)yj)xji

       随机梯度下降法,和4.1的批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

4.3小批量梯度下降法(Mini-batch GD)

       小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样本来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:θi=θiαt+x1j=t(hθ(xj0,xj1,...xjn)yj)xji

5.梯度下降法和其他无约束优化算法的比较

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

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

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

以上内容转载自http://www.cnblogs.com/pinard/p/5970503.html

6.对文章开头疑问解答

这里写图片描述
如图所示,采用步长*梯度更新θ原因有两个:
(1)控制更新方向:首先看第一张图,当J(θ)从初始值往下降的时候,通过梯度的方向控制下降的方向(向左);再看第二张图,当下降过多,跳到最低点的左端的时候,梯度方向改变,下降方向也发生改变(向右)。能保证最终结果收敛到最优点(局部最优或者全局最优,当函数是凸函数的时候一定收敛到全局最优)。
(2)控制更新距离:由于步长α是不变的,此时梯度控制下降的距离,在上图的情况中,当越接近最小值时,梯度越小,此时更新的距离也变小,直到梯度小于某个值的时候停止更新。

7.需避免的错误

更新θ0,θ1,...,θn的时候,需要保证是同时更新。

正确的更新顺序:

temp0=θ0αθJ(θ0,θ1)
temp1=θ1αθJ(θ0,θ1)
θ0=temp0
θ1=temp1

错误的更新顺序:

temp0=θ0αθJ(θ0,θ1)
θ0=temp0
temp1=θ1αθJ(θ0,θ1)(使用了新的θ0计算梯度)
θ1=temp1

原创粉丝点击