梯度下降法(Gradient descent)
标签: 机器学习
1.梯度下降法有什么用
梯度下降法用来求函数的极小值,且是一种迭代算法,由于计算效率高,在机器学习中常常使用。梯度下降法经常求凸函数(convex function)的极小值,因为凸函数只有一个极小值,使用梯度下降法求得的极小值就是最小值。
与其对应的有梯度上升法(Gradient ascent),用来求函数的极大值,两种方法原理一样,只是计算的过程中正负号不同而已。
2.什么是梯度
先看看维基百科:
标量场中某一点的梯度指向在这点标量场增长最快的方向。
感觉略微抽象,可以用山的高度来解释一下。假设有一个人站在山上的某一点,他通过观察发现了一条“最陡”的路,那么这条路的方向就是梯度所指的方向。
需要强调一下,梯度是一个矢量,方向导数是一个标量,梯度所指向的方向是方向导数最大的方向,且梯度的模和方向导数的最大值相等。
求梯度的方法很简单,对每一个自变量求偏导数,然后将其偏导数作为自变量方向的坐标即可。梯度的符号为
3.如何使用梯度下降法
以函数
其中
一直按照上式更新自变量,直到当函数值变化非常小(如3%以内)或者达到最大迭代次数时停止,此时认为自变量更新到函数的极小值点。
4.梯度下降法的简单应用
4.1求
f(x)=x2
的极小值
步长设置为0.1,选取自变量从3开始,则计算过程如下
迭代次数(n) | 自变量(
|
梯度(
|
步长(
|
因变量(
|
---|---|---|---|---|
0 | 3 | 6 | 0.1 | 9 |
1 | 2.4 | 4.8 | 0.1 | 5.76 |
2 | 1.92 | 3.84 | 0.1 | 3.69 |
3 | 1.536 | 3.072 | 0.1 | 2.36 |
10 | 0.32 | 0.64 | 0.1 | 0.10 |
20 | 0.03 | 0.06 | 0.1 | 0.0009 |
… | … | … | … | … |
可以看到随着迭代次数的增加,该函数越来越接近极小值点
以下是迭代count
次的代码:
if __name__ == "__main__":
x = 3
y = x * x
alpha = 0.1
count = 3
while (count > 0):
x = x - alpha * 2 * x
y = x * x
count = count - 1
print x, y
4.2求
f(x,y)=(x−10)2+(y−10)2
的极小值
步长设置为0.1,选择初始点为
斜视图:
俯视图:
5.小结
- 梯度下降法求的是极小值,而不是最小值
- 梯度下降法常常用来求凸函数的最小值,例如机器学习中各种代价函数的最小值
- 步长的选取很关键,步长过长达不到极值点甚至会发散,步长太短导致收敛时间过长
- 斯坦福的机器学习视频中建议按照[0.001,0.003,0.01,0.03,…]的顺序尝试设置步长,同时观察函数值选择收敛最快的步长
- 步长也可以设置为非固定值,根据迭代的情况变化
- 下降的初始点一般设置为从原点开始