【图解】梯度下降
參考文章:http://blog.csdn.net/zhulf0804/article/details/52250220
如果讀者對方向導數和梯度的定義不太了解,請先閱讀上篇文章《方向導數與梯度》。
?
前些時間接觸了機器學習,發現梯度下降法是機器學習里比較基礎又比較重要的一個求最小值的算法。梯度下降算法過程如下:
1)隨機初始值;
2)迭代,直至收斂。表示在處的負梯度方向,表示學習率。
?
在這里,簡單談一下自己對梯度下降法的理解。
首先,要明確梯度是一個向量,是一個n元函數f關于n個變量的偏導數,比如三元函數f的梯度為(fx,fy,fz),二元函數f的梯度為(fx,fy),一元函數f的梯度為fx。然后要明白梯度的方向是函數f增長最快的方向,梯度的反方向是f降低最快的方向。
我們以一元函數為例,介紹一下梯度下降法。
設f(x) = (x-1)2+1/2,
?
?
上圖給出了函數f的圖像和初始值x0,我們希望求得函數f的最小值,因為沿負梯度方向移動一小步后,f值降低,故只需x0沿著負梯度方向移動一小步即可。
?
而f在點x0的導數大于0,從而f在點x0的梯度方向為正,即梯度方向為f’(x0),故由梯度下降法可知,下一個迭代值,也就是說x0向左移動一小步到了x1,同理在x1點的導數同樣大于零,下一次迭代x1向左移動一小步到達x2,一直進行下去,只要每次移動的步數不是很大,我們就可以得到收斂1的解x。
上述證實了我們對分析(藍色傾斜字體)的驗證。
?
同樣,如果處置選在了最小值的左邊,即如圖所示:
?
由于f’(x0)<0,所以梯度方向為負,負梯度方向為正,故需將x0沿負梯度方向移動一小步,即向右移動一小步,這樣使得f值更小一些。或用梯度下降法迭代公式,依次我們可以得到如圖所示的x1,x2,...,xk,...,直到收斂至最小值。
?
對于二元函數,我們也可以通過實例驗證梯度下降法的合理性:
?
?
在每次得到一個點(xk,yk)時,我們需要計算(fx(xk),fy(yk)),這個方向表示梯度f增長最快的方向,-(fx(xk),fy(yk))表示梯度下降最快的方向,故只需將(xk,yk)沿著-(fx(xk),fy(yk))這個方向移動一小步,就可以減少f的值,直至收斂到最小值,如上圖所示。
?
談幾點梯度下降法需要注意的地方,也是自己對梯度下降法的理解:
1)梯度下降不一定可以收斂到最小值。
梯度下降法是收斂到局部最小值,不一定可以收斂到全局最小值。
比如:
?
我們初始值選擇了如圖的x0,由于f在點x0的導數大于0,梯度方向向右,負梯度方向向左,從而x0向左移動,逐漸收斂到了局部最小值,而不能收斂到全局最小值。
2)學習率的大小要適中。
學習率太小,每次移動步長太小,收斂太慢,這個比較容易理解。
學習率太大,每次移動步長大,可能導致不收斂,這里用一個圖來表示一下:
?
由于距離最小值點越遠,導數越大,從而導致步長越來越大,不會收斂。
3)不一定選擇負梯度方向,只要是值下降的方向即可。
在每一次迭代選擇方向時,我們只要選擇與梯度方向夾角小于90度的向量的反方向就可,不一定要選擇負梯度方向。但由于,滿足這樣條件的向量不太容易求出,我們就選擇了與梯度方向0度的向量的反方向(負梯度方向),而且這個方向函數值減少的更快,更快的收斂,故是個不錯的選擇。
4)求最大值的梯度上升法。
f的梯度方向是f的值增長最快的方向。我們每次沿負梯度方向移動一小步可以逐步收斂到局部最大值,因此我們每次沿梯度方向也可以得到函數f的局部最大值。迭代公式為:
,
這里表示在處的梯度方向,與梯度下降法的含義不同。
?
?
本文由作者結合自己對梯度的理解寫出,希望對大家有所幫助,敬請閱讀、指正。
總結