【机器学习】梯度下降算法
先思考下:
- 梯度下降的数学原理以及几何意义?
- 梯度下降的作用?
之前我们提到过用梯度下降,求解最优的θ,使损失函数J(θ)取最小值。(点击)
概述
1、梯度:
在微积分里面,对多元函数参数求偏导数,把求的各参数的偏导数以向量的形式写出来,就是梯度。
那么这个梯度向量求出来有什么意义呢?梯度向量从几何意义上讲,就是函数变化增加最快的地方,沿着梯度向量的方向更容易找到函数的最大值,沿着向量相反的方向,梯度减小最快,更容易找到函数最小值。
2、梯度下降与梯度上升可以互相转化。求损失函数f(θ)的最小值,用梯度下降法迭代,亦可反过来求损失函数 -f(θ)的最大值,用梯度上升法。
【百度百科】梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
梯度下降算法
首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
我们先来看当训练样本只有一个的时候的情况,然后在将训练样本扩大到多个的情况。
求解使得J(θ)最小的θ值的基本思想:我们首先随便给θ一个初始化的值,然后改变θ值让J(θ)的取值变小,不断重复改变θ使J(θ)变小的过程直至J(θ)约等于最小值。
- 目标函数求解:
-
- 初始化θ(随机初始化,可以初始为0)
- 沿着负梯度方向迭代,更新后的θ使J(θ)更小
-
- :学习率,步长;它控制θ每次向J(θ)变小的方向迭代时的变化幅度。J(θ)对θ的偏导表示J(θ)变化最大的方向。由于求的是极小值,因此梯度方向是偏导数的反方向。
求解偏导,过程如下:
其中:
那么的迭代公式就为:
批量梯度下降(BGD)
批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。
如下公式是处理一个样本的表达式:
转化为处理多个样本,公式如下:
这种新的表达式每一步都是计算的全部训练集的数据,所以称之为批梯度下降(batch gradient descent)。
由于每次迭代的时候都要对所有的数据集计算求和,计算量就会很大,尤其是训练数据集特别大的时候。此时,我们就可以用随机梯度下降。
随机梯度下降(SGD)
随机梯度下降在计算下降最快的方向时随机选一个数据进行计算,而不是扫描全部训练数据集,这样就加快了迭代速度。
随机梯度下降并不是沿着J(θ)下降最快的方向收敛,而是震荡的方式趋向极小点。
迭代公式为:
for i=1 to m {
}
BGD和SGD算法比较
- SGD速度比BGD快(迭代次数少)
- SGD在某些情况下(全局存在多个相对最优解/J(θ)不是一个二次),SGD有可能跳出某些小的局部最优解,所以不会比BGD坏
- BGD一定能够得到一个局部最优解(在线性回归模型中一定是得到一个全局最优解),SGD由于随机性的存在可能导致最终结果比BGD的差
- 注意:优先选择SGD
补充(小批量梯度下降 MBGD)
如果既需要保证算法的训练过程比较快,又需要保证最终参数训练的准确率,可以选择小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)。MBGD中不是每拿一个样本就更新一次梯度,而且拿b个样本(b一般为10)的平均梯度作为更新方向。
迭代公式为: