梯度下降算法

原文地址:https://kasheemlew.github.io/…

梯度下降(gradient descent,steepest descent)是用来求函数最小值的迭代优化算法。梯度下降有可能得到是一个局部最优解。当损失函数是凸函数时,梯度下降法得到的解一定是全局最优解。因此梯度下降算法可以用来求解均方差的最小值。

相关概念

  • Gradient(梯度)

    微积分中,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数的向量形式就是**梯度**,如函数`f(x,y)`, 分别对x,y求偏导数,求得的梯度向量就是`(∂f/∂x, ∂f/∂y)T`,即`grad f(x,y)`或者`▽f(x,y)`。对于在点`(x0,y0)`的具体梯度向量就是`(∂f/∂x0, ∂f/∂y0)T`.或者`▽f(x0,y0)`,如果是3个参数的向量梯度,就是`(∂f/∂x, ∂f/∂y,∂f/∂z)T`。
    
    从几何意义上讲,梯度越大函数变化增加越快。如函数`f(x,y)`,沿着梯度向量的方向就是`(∂f/∂x0, ∂f/∂y0)T`,通过梯度的变化可以找到函数的极值,沿着梯度向量的方向更容易找到函数的最大值,沿着梯度向量相反的方向`-(∂f/∂x0, ∂f/∂y0)T`,梯度减少最快,更容易找到函数的最小值。
    
  • Learning rate(步长,学习效率)

    梯度下降算法中,步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。
    
  • feature(特征)

    样本中的输入部分,如样本 `{(x0, y0), (x1, y1)}`中的x0和x1
    
  • hypothesis function(假设函数)

    监督学习中,预测得出的结果,记为hθ(x)。线性回归中对于样本`(xi,yi)(i=1,2,...n)`,可以采用拟合函数: `hθ(x) = θ0+θ1x`。
    
  • loss function(损失函数)

    评估模型拟合好坏程度的函数。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(xi,yi)(i=1,2,...n),采用线性回归,损失函数为:`J(θ0,θ1)=∑(i=1)(m)(hθ(xi)−yi)^2`(xi表示样本特征x的第i个元素,yi表示样本输出y的第i个元素,hθ(xi)为假设函数)。梯度下降就是为了求出这个损失函数的最小值。
    

梯度下降算法

《梯度下降算法》

以线性回归为例,

假设函数hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn=《梯度下降算法》θi(i = 0,1,2… n)为模型参数,xi(i = 0,1,2… n)为每个样本的n个特征值, 令x0=1。

损失函数《梯度下降算法》

初始化参数(可以将步长初始化为1,其他参数初始化为0)后求J关于θi的偏导数得到梯度,用步长(随着梯度下降会减小)乘梯度得到下降的距离,重复直到下降的距离小于某一个阈值,此时的参数就是最优参数。

《梯度下降算法》

Batch Gradient Descent(批量梯度下降)

在更新参数时使用所有的样本来进行更新,使用BGD迭代次数较少,可以较容易地求得全局最优解,但是当样本数量很多时训练的时间会很长。

《梯度下降算法》ꭤ为步长

收敛曲线
《梯度下降算法》

Stochastic Gradient Descent(随机梯度下降)

随机梯度下降是通过每个样本来迭代更新一次,因此SGD并不是每次迭代都向着整体最优化方向,得到的也不一定是全局最优解。但是SGD训练速度较快,适合样本数量很多的情况。

《梯度下降算法》

收敛曲线
《梯度下降算法》

Mini-batch Gradient Descent(小批量梯度下降法)

MBGD在每次更新参数时使用b个样本, 综合了BGD和SGD的优点。

《梯度下降算法》

与其他无约束优化算法比较

和最小二乘法相比

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

和牛顿法/拟牛顿法相比

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

其他问题

  • 怎么取ꭤ值?

    随时观察值,如果cost function变小了,则正常。否则则再取一个更小的值;如果Learning rate取值后发现J function 增长了,则需要减小Learning rate的值;
    
    原文作者:KasheemLew
    原文地址: https://segmentfault.com/a/1190000010730326
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞