小白浅谈梯度下降法
这次给大家介绍一个机器学习的优化方法,梯度下降法(Gradient descent),它的作用是能最小化损失函数,应用广泛。
还是先给大家讲讲经典的下山问题
假设一只老虎在山顶口渴要喝水,并且只能去到最低的山谷才有水源。周围的山连绵不绝,,老虎它不知道哪里是最低的山谷不知道怎么下山,只知道它想走最陡峭的最易下山的方向,然后最快地喝到水。所以它只能走一段观察一下,每次都挑最陡峭的方向下山,运气好的话很快就能到达最低的山谷喝到水。
有时候运气差,到了不是最低的山谷没有水,只能继续在其它地方去尝试了。
先来说说导数的概念,一元函数我们在高中已经学过,导数表示函数在某一点的变化率。
而多元函数,有多个自变量,在大一下学期学的高等数学(下)讲到,导数是对多个自变量求偏导。
所以,梯度可以看做什么呢,梯度其实是目标值对自变量的导数,在高维上是对所有自变量的偏导。而所谓的梯度方向,则表示了函数增长速度最快的方向,那么和它相反的方向就是函数减少速度最快的方向了。
我们用MATLAB画出二次函数图像,研究下让损失函数减小的规律
我们再看上面的导数公式,很显然有,(有兴趣的可以去了解下泰勒公式,这里不详细说了),我们重新回想到优化问题,我们想要的是梯度下降,也就是希望下降后的下一步,损失函数J的值要变小,即,所以是需要希望。
这种情况下,梯度可以看成是导数。
第一种情况:在抛物线左边的线,显然斜率小于0,也就是导数f’(x)小于0,我们使,并且。此时,这个时候满足我们的希望。
第二种情况:在抛物线右边的线,显然斜率大于0,也就是导数f’(x)大于0,我们使,并且。此时,这个时候也满足我们的希望。
所以,无论哪种情况,我们很容易得出一个结论,要想损失函数变小,与f’(x)相反,就能满足条件。
我们先在二维的平面理解(这里用经典的线性回归中的梯度下降法理解)
如上图,导数我们可以写成,代表theta单位变化是J相应的变化,每走一步更新一次参数,在一步一步的更新中,J会不断往最小值的方向不断减小,所以我们说它为梯度下降。
这里要说到学习率的概念,学习率通俗的说,在这里就是移动的步长。当学习率过小时,在实际工程上,可能也能最优化模型,但会导致训练时间过长,太阳下山了老虎都喝不到水。
当学习率太大时,移动的步长太大,跑太快错过了有水源的最低点山谷,会导致函数不能收敛,得不到最优解。
我们再来看看在三维空间的情况:
我们可以看到红色和蓝色都是在三维山脉下的梯度下降,红色的最后到达了局部最优解,而蓝色是全局最优解。运气再差点的话,可能还会碰到鞍点,所谓鞍点,就是函数上的导数为零,但不是轴上局部极值的点。
为什么会出现这种情况呢,因为在实际中我们的函数远远不止几个自变量那么简单的函数,函数是非常复杂的,初始化的参数点不同,我们最终的效果不一样,所以,这个时候我们要多初始化几次参数运行找全局最优解。
即使找不到全局最优,这样子初始化次数多训练出来的局部最优解在应用上精度也非常高了。
线性回归中的损失函数之一最小二乘法中,因为参数是很多的,我们把梯度写成,这时候梯度就是J对每一个方向的theta求一次偏导。我们的目标很明确,就是要损失函数尽可能小,,则也就是需要尽可能小。
具体的步骤是:
(1)初始化参数为任意值,首先对随机赋值。
(2)求解梯度(这里用向量表示,数学公式那个推导太难画了)
(3)更新参数
(4)达到迭代次数或者收敛条件,训练结束
梯度下降我们要搞清楚下降的出发点,下降的方向,学习率(步长),以及梯度下降是为了优化取得最优解。另外要注意的是,梯度下降的方法虽然存在以上说的局部极小值、鞍点等很多问题,但在应用上还是非常广泛的,本次推文介绍到这里,谢谢观赏!
温馨提示:文章参考了很多CSDN和知乎大神的说法