梯度下降法原理和步骤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梯度下降法原理和步骤相关的知识,希望对你有一定的参考价值。

一、梯度法思想
梯度法思想的三要素:出发点、下降方向、下降步长。
机器学习中常用的权重更新表达式为
:,这里的λ就是学习率,本文从这个式子出发来把机器学习中的各种“梯度”下降法阐释清楚。
机器学习目标函数,一般都是凸函数,什么叫凸函数?限于篇幅,我们不做很深的展开,在这儿我们做一个形象的比喻,凸函数求解问题,可以把目标损失函数想象成一口锅,来找到这个锅的锅底。非常直观的想法就是,我们沿着初始某个点的函数的梯度方向往下走(即梯度下降)。在这儿,我们再作个形象的类比,如果把这个走法类比为力,那么完整的三要素就是步长(走多少)、方向、出发点,这样形象的比喻,让我们对梯度问题的解决豁然开朗,出发点很重要,是初始化时重点要考虑的,而方向、步长就是关键。事实上不同梯度的不同就在于这两点的不同!
梯度方向是

,步长设为常数Δ,这时就会发现,如果用在梯度较大的时候,离最优解比较远,W的更新比较快;然而到了梯度较小的时候,也就是较靠近最优解的时候,W的更新竟然也保持着跟原来一样的速率,这样会导致W很容易更新过度反而远离了最优解,进而出现在最优解附近来回震荡。所以,既然在远离最优解的时候梯度大,在靠近最优解的时候梯度小,我们让步长随着这个律动,于是我我们就用λ|W|来代替Δ,最后得到了我们熟悉的式子:

所以说这时的λ是随着坡度的陡缓而变化的,别看它是个常数。
二、全量梯度下降法(Batch gradient descent)
全量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。
第二、随机梯度下降法(Stochastic Gradient Descent)
SGD一轮迭代只用一条随机选取的数据,尽管SGD的迭代次数比BGD大很多,但一次学习时间非常快。
SGD的缺点在于每次更新可能并不会按照正确的方向进行,参数更新具有高方差,从而导致损失函数剧烈波动。不过,如果目标函数有盆地区域,SGD会使优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,可能最终收敛于一个较好的局部极值点,甚至全局极值点。
缺点是,出现损失函数波动,并且无法判断是否收敛。
参考技术A 大部分的机器学习模型里有直接或者间接地使用了梯度下降的算法。虽然不同的梯度下降算法在具体的实现细节上会稍有不同,但是主要的思想是大致一样的。梯度下降并不会涉及到太多太复杂的数学知识,只要稍微了解过微积分里导数的概念,就足够完全理解梯度下降的思想了。

梯度下降的目的
绝大多数的机器学习模型都会有一个损失函数。比如常见的均方误差(Mean Squared Error)损失函数:

[公式] (1)

其中, [公式] 表示样本数据的实际目标值, [公式] 表示预测函数 [公式] 根据样本数据 [公式] 计算出的预测值。从几何意义上来说,它可以看成预测值和实际值的平均距离的平方。(关于更多的损失函数的介绍,可以参见这篇文章。)

损失函数用来衡量机器学习模型的精确度。一般来说,损失函数的值越小,模型的精确度就越高。如果要提高机器学习模型的精确度,就需要尽可能降低损失函数的值。而降低损失函数的值,我们一般采用梯度下降这个方法。所以,梯度下降的目的,就是为了最小化损失函数。

梯度下降的原理
寻找损失函数的最低点,就像我们在山谷里行走,希望找到山谷里最低的地方。那么如何寻找损失函数的最低点呢?在这里,我们使用了微积分里导数,通过求出函数导数的值,从而找到函数下降的方向或者是最低点(极值点)。

损失函数里一般有两种参数,一种是控制输入信号量的权重(Weight, 简称 [公式] ),另一种是调整函数与真实值距离的偏差(Bias,简称 [公式] )。我们所要做的工作,就是通过梯度下降方法,不断地调整权重 [公式] 和偏差b,使得损失函数的值变得越来越小。

假设某个损失函数里,模型损失值 [公式] 与权重 [公式] 有下图这样的关系。实际模型里,可能会有多个权重 [公式] ,这里为了简单起见,举只有一个权重 [公式] 的例子。权重 [公式] 目前的位置是在A点。此时如果求出A点的梯度 [公式] ,便可以知道如果我们向右移动,可以使损失函数的值变得更小。

通过计算梯度,我们就可以知道 [公式] 的移动方向,应该让 [公式] 向右走而不是向左走,也可以知道什么时候会到达最低点(梯度为0的地方)。

上面的例子里只出现了一个权重 [公式] , 实际的项目里样本数据会有很多个。对于每一个样本数据,我们都可以求出一个权重的梯度。这个时候,我们需要把各个样本数据的权重梯度加起来,并求出它们的平均值,用这个平均值来作为样本整体的权重梯度。
参考技术B 梯度下降法目的是为了“下降”,下降的方法是按照“梯度”。比如你在一座山上,当前你只能迈出一步,如何走才能使你的高度下降的最多呢,根据梯度的理论,我们沿着当前梯度的反方向走,会让我们的下降幅度最大。
山就是一个函数,在山上的你就是函数中待优化的变量,人的坐标表示变量初始值,我们要 求的是函数最小值即到达山底,人该如何走即如何迭代变量。所以我们只要沿着函数梯度的反方向,就能最快的到达我们要去的地方。
梯度下降是一种更新参数的方法,具体如何更新跟原函数的在某点的梯度有关。不会改变要求的最优解。
我们可以利用梯度下降法求最大值和最小值,求最大值沿着梯度方向走即可,求最小值则沿着梯度的反方向走。
结合线性回归模型来实现梯度下降算法。梯度下降是线性回归求最优解的一种常用方法。
设我们的线性回归模型为:
h θ ( x ( i ) ) = θ 0 + θ 1 x 1 ( i ) + θ 2 x 2 ( i ) + . . . + θ n x n ( i ) h_\theta( x^(i)) =\theta_0 +\theta_1x_1^(i) + \theta_2x_2^(i) +...+\theta_nx_n^(i)
h θ (x
(i) )=θ
0


1

x
1
(i)


2

x
2
(i)

+...+θ
n

x
n
(i)


即我们变量是n维的,对每个维度上都加了个权重,求所有维度上的带权和然后加上一个偏置项就是我们的回归函数。而我们的目的就是求出 Θ 0 . . . Θ n \Theta_0...\Theta_n Θ
0

...Θ
n

这n+1个参数。
定义代价函数:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac12m\sum_i=1^m(h_\theta( x^(i))-y^(i))^2
J(θ)=
2m
1


i=1

m

(h
θ

(x
(i)
)−y
(i)
)
2

这个代价函数就是预测值与实际值之间的距离的平方,m是样本的个数,求个平均更准确点嘛。分母的2是为跟后面平方项求导后的2约掉。
在程序中,多变量的运算都是通过矩阵来完成的,所以我们要将上述式子写成矩阵相乘的式子:
我们用 Θ \Theta Θ来表示 [ Θ 0 , . . . , Θ n ] [\Theta_0,...,\Theta_n] [Θ
0

,...,Θ
n

],用 X 来 表 示 [ 0 , x 1 , . . . , x n ] X来表示[0,x_1,...,x_n] X来表示[0,x
1

,...,x
n

],
这样,原来的回归模型就可以写成:
h Θ ( X ) = X Θ h_\Theta( X) = X\Theta
h
Θ

(X)=XΘ

原来的代价函数可以写成:
J ( Θ ) = 1 2 m ( X Θ − Y ) T ( X Θ − Y ) J(\Theta) = \frac12m(X\Theta-Y)^T(X\Theta-Y)
J(Θ)=
2m
1

(XΘ−Y)
T
(XΘ−Y)

上述两式子中的变量全为矩阵表示。
将代价函数对我们要求的参数 Θ \Theta Θ求一阶导数得:
▽ J ( Θ ) = 1 m ( X Θ − Y ) X \bigtriangledown J(\Theta) = \frac1m(X\Theta-Y) X
▽J(Θ)=
m
1

(XΘ−Y)X

这个一阶导数就是我们每次更新参数时需要的梯度。这样我们就从一元变量扩展到了多元变量上。可以对含有多元参数的目标函数利用梯度下降法求出最优解。

以上是关于梯度下降法原理和步骤的主要内容,如果未能解决你的问题,请参考以下文章

最速梯度下降法及matlab实践

梯度下降法

梯度下降法的原理是啥?

梯度下降法介绍-黑马程序员机器学习讲义

面试时如何完整精确的回答动量下降法(Momentum)和Adam下降法的原理

梯度下降法