上一节中学习了代价函数,不同的w和b的值会产生不同的J值,也就是会产生不同的成本价值,如果我们有更系统的方法去找到合适的w和b值使得有最小的成本价值,那将会方便很多。事实上我们可以通过一种叫做梯度下降的算法来做到这一点,梯度下降(Gradient Descent)算法在机器学习中无处不在,不仅用于线性回归(linear regression),还会用在深度学习模型(deep learning model)。
定义
假设现在有代价函数J,参数为w和b,我们想要得到的是J的最小值以及此时的w和b,按照上一篇学习的,J(w,b)是线性回归的代价函数,但是事实上梯度下降是可以用来尝试最小化任何函数,不仅仅是线性回归的成本函数,它也可以适用于有更多的参数的代价函数。
比如现在有一个函数,,梯度下降也是可以用来尝试找到一组 使得J值最小。
步骤
- 对w和b做初始的猜测(比如将其都设置为0,w=0, b=0)
- 每次改变一点,不断改变w和b的值使得J(w,b)的值减小最快
- 直到J达到或者接近最小值
tips:对于有些函数可能存在不止一个可能的最小值
举个栗子:
这个例子不是平方误差代价函数(squared error cost function),如果是平方误差代价函数,图像往往只有一个最低点,下面这个代价函数图像是在训练神经网络模型时可能碰到的,我们可以看到底部有w和b,若给定了w和b,就可以在图像表面上找到一个对应的J的值。
我们如果把这张图想象成一片小山丘,现在我们站在山上的某一点(对w和b做初始猜测),环顾四周360°,找到一个下山最快的方向,超这个方向走一小段,再环顾四周,找下山最快的方向,超这个方向走一小段,一直进行这个动作(不断改变w和b的值,每次改变一点,使得J减小最快),然后我们就可以到达一个山谷(直到J达到或者接近最小值)。
梯度下降有一个有趣的特性,如果我们选择了不同的初始值,可能会得到不同的结果,这个结合小山丘的例子也是容易理解的(吧)。
算法实现
首先我们先给出梯度下降算法的公式
在上面这个公式中,a是学习率(Learning rate),学习率一般在0到1之间,学习率基本上控制在下坡的时候一步有多大,后面对代价函数关于w求偏导的一部分则是表示朝哪个方向走。
代价函数是有两个参数的,除了w还有b,依据上面的w的梯度下降公式,我们也可以得到b的梯度下降算法的公式为, 梯度下降算法的步骤是不断改变w和b的值使得J(w,b)的值减小最快,直到J达到或者接近局部最小值,那么在这个算法中,我们将重复运算上面的更新w和b步骤,直到算法收敛(收敛在这里是说达到了局部一个最小值的点,并且此时w和b不再发生很大的变化)
那接下来可能就会想到这样一个问题,就是如果我们先改变了w,那在计算b的时候,使用的w就是更新过的w了,但是w和b应该是一起变化的,考虑到这一点,算法应该被写为下面这样:
repeat until convergence{
}
(一定要注意顺序)
理解算法
最后再来深入理解一下梯度下降在做什么,以及这样做的意义
假如只考虑w,让b等于0,那么代价函数图像应该是二维的,依据之前学习的代价函数知识,大概做出来上面这张图(平方误差代价函数),如果现在考虑的点是红色圈出来的点,就是这一点的切线的斜率,此时斜率是正的,学习率a是介于0到1之间的一个数字,所以w应该是减小的,从图中看,很明显是朝着最小值点的方向在前进。如果当前点在左边,那也是成立的,小于0,w是增大的,也是符合期望的。
学习率
学习率的选择将会对梯度下降算法的效率产生巨大的影响,如果选择的不好,下降率甚至有可能根本不起任何作用。
我们来看看学习率过大或过小会有什么样的效果
学习率过小
如果学习率过小,那下降将会非常缓慢,代价函数确实是在减小的,但是减小的速度很慢,过于浪费时间
学习率过大
如果最开始的点是左边粉色的点,它本来是很靠近最低点了,在更新一次w之后,由于学习率a很大,就意味着会给当前w加一个很大的值,那有可能就会离最低点更远了,那么最终有可能得到的是这样的一个图像,有可能永远不能达到最小值
那最终的停止条件是否正确呢?如果已经达到了或者在最低点附近,那么斜率应该是等于零或者接近于0,相当于是, 所以说当w和b不再发生很大变化时,我们认为达到了最低点。
用于线性回归的梯度下降
线性回归模型(Linear Regression Model)的公式是, 代价函数(cost function)的公式:, 梯度下降算法上面刚写过了。
带入公式可以得到:
那么线性回归的梯度下降过程我们也就可以方便的写出来
repeat until convergence{
}
一个普通的代价函数可能会有多个局部最小值的点
但是线性回归的平均误差代价函数只有单个全局最小值,所以只要选择了一个恰当的学习率a,就会收敛到全局的最小值