梯度下降(Gradient Descent)
梯度下降法不是一个机器学习算法,是一种基于搜索的最优化算法,目的是最小化一个损失函数,同样,梯度上升法用于最大化一个效用函数
求解损失函数的最小值有两种方法:
1.正规方程求解
上一章已经讲使用线性回归正规方程求解,即让
求极值,求得:
Mr.喵:机器学习(一):线性回归zhuanlan.zhihu.com
2.梯度下降法
但很多情况下对于更复杂的函数,我们的机器学习模型是求不到这样的数学解的,那么我们就需要一种基于搜索的最优化策略,来在一定程度上逼近这样的解,梯度下降法就是这样一种在机器学习中最小化损失函数的最为常用的方法
在曲线方程中,导数代表切线斜率,导数的方向就代表
变化的方向,那么对于高维度的方程,就是偏导的方向就代表
变化的方向,而梯度就是最大的一个偏导,梯度的方向就代表
变化最快的方向
我们的目标是使损失函数
尽可能小,所以梯度的方向是负方向,同时我们引入一个学习率
,
我们希望根据学习率 一步一步的逼近
的最小值,并找到与之对应的
,
repeat until convergence {
}
梯度求得:
我们在第一章讲过,使用线性回归正规方程求解不需要对数据进行归一化
但是由于梯度下降法的最优化搜索原理,为了保证梯度下降法的稳定性,我们需要对数据归一化再使用梯度下降法
学习率
-
的是梯度下降法的一个超参数
-
的取值影响梯度下降法获得损失函数
最优解的速度
- 如果
太小梯度下降法的收敛速度会十分缓慢,如果
太大甚至会导致不收敛
- 而更为常见的情况是,损失函数
并不会在每次迭代都下降,为此我们在运行梯度下降法时通常会选择尝试一系列
值,来找到合适的
值
关于梯度下降法存在的问题
由于并不是所有函数都有唯一的极值点,我们使用梯度下降法进行搜索,有可能找到的只是局部最优解,而不是全局最优解
解决方法:
- 多次运行梯度下降法,随机化初始点
- 梯度下降法的初始点也是一个超参数
比较梯度下降和正规方程
梯度下降:
- 需要选择学习率
- 需要进行迭代
- 当数据量大的时候,运行效果很好
正规方程:
- 不需要选择学习率
- 不需要进行迭代
- 当数据量大的时候,运行速度很慢,通常
更倾向于选择梯度下降
上述求出的梯度的过程用到了所有的样本进行计算,这样的方法又称为
批量梯度下降法(Batch Gradient Desent)
repeat until convergence {
}
特点:
批量梯度下降法由于使用到所有的样本,很容易得到最优解,但是过程非常耗时的。
基于这样的问题,我们在求梯度的过程中是不是可以随机的取一个样本的梯度,作为我们收敛的方向,经过不断的迭代求得损失函数
的最小值,这样的方法又称为
随机梯度下降法(Stochastic Gradient Desent)
repeat until convergence {
}
特点:
随机梯度下降法具有不确定性,每次取一个样本来进行迭代,但不能保证求的梯度方向就是损失函数
减小的方向,更不能保证是减小速度最快的方向,即便如此,我们通常还是能够求得损失函数
的最小值得近似值,也就是说牺牲一定精确度来获取更少的时耗(更快的迭代速度)
鉴于随机梯度下降法的随机性,学习率
的取值就尤其的重要,为了避免由于随机性而错过最优解,我们希望学习率
随着迭代次数的逐渐增大而逐渐减少,于是我们想到了
但如果我们的迭代次数太少,那么下降速度就会太快,于是我们引入常数
来进行优化
a,b是SGD的两个超参数
scikit-learn中linear_model的SGD代码示例
Wall time: 0 ns
0.7784799948330545
Wall time: 14.1 ms
0.8004299348713204
那么,我们把上述两种梯度下降法的特点相结合呢?于是产生了
小批量梯度下降法(Mini-Batch Gradient Descent)
repeat until convergence {
}
特点:
小批量梯度下降法每次取一小部分k个样本来进行迭代,既能减少一定的时耗,又能保证一定的收敛方向稳定性。一般情况下,小批量梯度下降法比较的实用,当然三种方法还是要看实际的情况来使用。