今天我们就来介绍用来优化代价函数的梯度下降算法(gradient descent algorithm)。
1 原理
那梯度下降究竟为何方神圣?我来用最通俗的语言来介绍下:
假设你站在华山之巅,你现在想以最快速度下山,那你肯定是找一条最陡峭的路走。你环顾四周,找到了一条路线,恩,这个方向是最陡的。于是你就出发了,走了一会发现,这个方向不是最陡的路了。你就停下来,换了个最陡的方向,继续往下走。重复这个步骤,你最终到达了山脚下。
那么,你从山顶到山脚的整个下山的过程,就是梯度下降。
为了在线性回归中应用梯度下降,我们先来回顾下线性回归模型的代价函数,它长这个样子:
![69406fbe9f8f6a1ee09b8e0fe01c1515.png](https://i-blog.csdnimg.cn/blog_migrate/c4c2a42d3aaa01237c432103779e034d.jpeg)
其中,f(x)为
![c9c0ad3c9e73c26260cf74efea6aabb7.png](https://i-blog.csdnimg.cn/blog_migrate/6afc6e184565d5c60c0b60fb70dd13d7.jpeg)
注意,我们变量的上标是指样本数量,从1到m;下标指特征数量,从0到n。
我们的目标是
![55eb356d3a5e8516f69a686e3389ae62.png](https://i-blog.csdnimg.cn/blog_migrate/ebfd722f9839720b72ec8fe26356f955.jpeg)
即在J(w)取最小值时,所对应的w值。这时,梯度下降法就上场了,用公式表示为:
![c1a0f42c2fbec3a001e98fa9989aefc7.png](https://i-blog.csdnimg.cn/blog_migrate/e3c803c4e83ccd59ccb2c2ad331c6544.jpeg)
其中,“:=”为赋值的含义;α为学习速率,又叫步长,可以理解为我们下山时每走一步的距离;α右边的是J(w)对w求的偏导(偏导就是对w向量中的每个元素分别求导)。
这个公式的含义就是,先初始确定一个w的值,然后用(1)式计算新的w值,反复迭代。我们不断更新参数w的值,直到J(w)取得最小值时,停止迭代。
我们先把(1)式中J(w)对w的偏导求出来,会容易理解些:
![807fd975e6d79accc097cf2b66bdba3c.png](https://i-blog.csdnimg.cn/blog_migrate/e112602a250f0dc1fe17171019dc304e.jpeg)
将(2)式代入(1)式,可得
![7c6fda64008ae899a5baafed0fd205c0.png](https://i-blog.csdnimg.cn/blog_migrate/4b2cd67a5bb07b51cbb2a5e0af59a25d.jpeg)
这就是线性回归中的梯度下降算法。最后,我手画一张图来把梯度下降的原理大概表示下:
![26205cc5bd351ce59c3222c44783a0f7.png](https://i-blog.csdnimg.cn/blog_migrate/bfd6fbb86ddd1579b23f20c8047e6c91.jpeg)
如上图,我们先确定一个w,然后按步长α一步一步减小w的值。最后当w取某一值时,J(w)取得最小值,任务就完成了。
说到这里,可能大家就有疑问了,梯度下降的公式(1)到底是怎么来的呢?别急,我们马上就来推导。
2 推导
首先,我们需要泰勒近似定理的一阶展开式:
![5f857056cd609f24eb1f7a5146482478.png](https://i-blog.csdnimg.cn/blog_migrate/5b6fb33efd010b4bb8c911d560a6b9df.jpeg)
上边那个倒三角符号表示梯度,就是对w求偏导的意思。从上式不难看出:
![e8b017007bcb35e1ea299aa5f89ea94c.png](https://i-blog.csdnimg.cn/blog_migrate/22e2efb40d77f72ad2f0031553233911.jpeg)
也就是说:
![60980342e48154f4ff18c72f17ce2254.png](https://i-blog.csdnimg.cn/blog_migrate/196c2ac8adb985f8f1159cc814f03a1b.jpeg)
上式说明了什么呢?注意到w和▽J(w)均为向量,也就是说,参数w变化的方向与梯度方向之间的夹角大于90°。我们希望J(w)每次迭代的变化量越大越好,那什么时候达到最大呢,就是参数w的变化量与梯度方向正好相反的时候,也就是二者的夹角达到180°的时候。我们用公式来说明下:
![0815cfa3f0e7d9eda81bb0db7b73e24d.png](https://i-blog.csdnimg.cn/blog_migrate/ef336ef357b7081ccc42261a0be23ae7.jpeg)
也就是说,两个向量的点积等于它们的模相乘,再乘以两个向量的夹角α。不难看出,当cosα=-1时,也就是α为180°时,两个向量的点积取到负值最大。
因为两个向量方向相反,故我们可推出:
![f0e95945a4994e4e41c07546c97cf4a4.png](https://i-blog.csdnimg.cn/blog_migrate/c709b66f2b2a4fa5d85a71780303fb24.jpeg)
其中α右边的为单位向量,可将梯度的模与阿尔法合并,简化为:
![d8a977c156ade56f795691a0140c5524.png](https://i-blog.csdnimg.cn/blog_migrate/433d39d9004d7ff37b81006d082076e8.jpeg)
移项,可得:
![a1a9c49178dff46073548e3cee7aae10.png](https://i-blog.csdnimg.cn/blog_migrate/85f3cc298e0612c46c7ced5c7a013baf.jpeg)
这就是我们的梯度下降公式(1),大功告成。最后我们放一张动图来看下梯度下降的效果(图片来自于网络):
![a8162e79c12b77bb6b6368e706249c66.gif](https://i-blog.csdnimg.cn/blog_migrate/492e3b3e94af4b74c81bf6d36ade075e.gif)
下篇我会介绍有关模型拟合数据时产生的不利情况,以及如何避免这种情况发生,敬请期待。