前言
以下內容是個人學習之后的感悟,轉載請注明出處~
梯度下降法
一、簡介
梯度下降法(gradient decent)是一個最優化算法,通常也稱為最速下降法。常用於機器學習和人工智能當中用來遞歸性地
逼近最小偏差模型。
二、原理
梯度下降法,顧名思義,從高處尋找最佳通往低處的方向,然后下去,直到找到最低點。我們可以看到,J(θ0,θ1)是以θ0,θ1為
自變量的函數,它們的關系如圖1中所示。圖中,起始點的黑色十字從紅色的高坡上,一步一步選擇最佳的方向通往深藍色的低谷,這
其實就是梯度下降法的作用。

圖1
微妙的是圖1中的低谷有很多個,選擇不同的起始點,最終達到的低谷也會有所不同。如圖2所示,黑色十字跑向了另外一個低谷。此時
有些人就會問:為什么會產生這種現象?其實,原因很簡單,梯度下降法在每次下降的時候都要選擇最佳方向,而這個最佳方向是針對局部
來考慮的,不同的起始點局部特征都是不同的,選擇的最佳方向當然也是不同,導致最后尋找到的極小值並不是全局極小值,而是局部極小
值。由此可以看出,梯度下降法只能尋找局部極小值。一般凸函數求極小值時可以使用梯度下降法。

圖2
梯度下降法的公式為:
(1)
公式(1)中“:=”符號代表賦值,並不是代表“等於”,J(θ0,θ1)是需要求極小值的函數。
三、使用方式:以線性回歸為例
設線性回歸的假設函數為:
(2)
設代價函數為:
(3)
目標:尋找J(θ0,θ1)的最小值。
措施:使用梯度下降法:
原理:根據公式(1),可以知道求參數θ,下一步的θ是由上一步的θ減去α乘以J(θ0,θ1)在上一點的斜率值產生的,
如圖3所示,然后不斷迭代,當θ值不變時,J(θ0,θ1)達到極小值。

圖3
步驟: 不斷執行以下公式(4),直到公式(1)收斂,即達到極小值。


(4)
注意:公式(4)中各行不能調換順序,否則並不是梯度下降法(也許是其他算法,如果有哪位大神知道,請不吝賜教~)
比如公式(5)這種形式,θ0剛更新完,馬上就用於下一步的θ1的更新計算,脫離了梯度下降法的意圖。
(5)
四、如何提高梯度下降法的效率
主要有兩種方法:
1、特征值x的縮放
why? —— 很多人也許會問:為什么要縮放特征值?縮放特征值x就能提高效率?
本人打算用圖4來講解,J(θ)是假設函數hθ(x)=θ0+θ1x1+θ2x2的代價函數,圖中J(θ)關於θ1、θ2的等高線圖中帶箭頭的
紅線是迭代的分步,左邊是x1、x2數量級相差較大的時候,紅線彎來彎去,迭代效率很低,右邊則是x1、x2數量級相差較小的時
候,帶箭頭的紅線很快到達了等高線圖的最低點,取得極小值,效率很高。所謂的縮放特征值x,就是讓所有的x值在數量級
上相差不大,達到提高迭代效率的目的。

圖4
縮放特征值的方法大致有以下三種:
- 除以最大值 (以x1為例,將x1所有樣本的值除以max{x1},此時-1≤x1≤1)
- 均值歸一化 (x1:=(x1-μ)/(max{x1}-min{x1}),其中μ為x1的平均值,此時-0.5≤x1≤0.5)
- 均值方差歸一化
2、選擇適當的α
公式(1)中α起着很重要的作用,如果選的太小,則會出現圖5左邊這種情況,迭代很慢;如果選的太大,則會出現圖4右邊這種
情況,很糟糕,過大的α使迭代不收斂。

圖5
α的選擇是需要通過計算一個個試的,按我的經驗來說,我一般會這樣取值(僅限參考,勿噴~):
- ......,0.001,0.003,0.01,0.03,0.1,.........(以此類推)
以上是全部內容,如果有什么地方不對,請在下面留言,謝謝~
