理解隨機梯度下降,首先要知道梯度下降法,故先介紹梯度下降法:
梯度下降法
大多數機器學習或者深度學習算法都涉及某種形式的優化。 優化指的是改變
以最小化或最大化某個函數
的任務。 我們通常以最小化
指代大多數最優化問題。 最大化可經由最小化算法最小化
來實現。
我們把要最小化或最大化的函數稱為目標函數或准則。 當我們對其進行最小化時,我們也把它稱為代價函數、損失函數或誤差函數。
然后要使得最小化它。
的更新過程可以描述為
a表示的是步長或者說是學習率(learning rate),決定着梯度下降的步長。
如圖所示,我們假設函數是,那么如何使得這個函數達到最小值呢,簡單的理解,就是對x求導,得到 y'=2x ,然后用梯度下降的方式,如果初始值是(0的左邊)負值,那么這是導數也是負值,用梯度下降的公式,使得x更加的靠近0,如果是正值的時候同理。 注意:這里的梯度也就是一元函數的導數,高維的可以直接類推之
函數梯度:導數dy/dx的多變量表達式,用來表示y相對於x的瞬時變化率。往往為了計算多變量函數的導數時,會用梯度取代導數,並使用偏導數來計算梯度。梯度和導數之間的一個主要區別是函數的梯度形成了一個向量場。
因此,對單變量函數,使用導數來分析;而梯度是基於多變量函數而產生的。
1. 隨機梯度下降(SDG)
隨機梯度下降(Stochastic gradient descent,SGD)對每個訓練樣本進行參數更新,每次執行都進行一次更新,且執行速度更快。
θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)為訓練樣本。
頻繁的更新使得參數間具有高方差,損失函數會以不同的強度波動。這實際上是一件好事,因為它有助於我們發現新的和可能更優的局部最小值,而標准梯度下降將只會收斂到某個局部最優值。
但SGD的問題是,由於頻繁的更新和波動,最終將收斂到最小限度,並會因波動頻繁存在超調量。
雖然已經表明,當緩慢降低學習率η時,標准梯度下降的收斂模式與SGD的模式相同。

另一種稱為“小批量梯度下降”的變體,則可以解決高方差的參數更新和不穩定收斂的問題。
2. 小批量梯度下降
為了避免SGD和標准梯度下降中存在的問題,一個改進方法為小批量梯度下降(Mini Batch Gradient Descent),因為對每個批次中的n個訓練樣本,這種方法只執行一次更新。
batch_sizebatch_size中的n通常設置為2的冪次方,通常設置2,4,8,16,32,64,128,256,5122,4,8,16,32,64,128,256,512(很少設置大於512)。因為設置成2的冪次方,更有利於GPU加速。
使用小批量梯度下降的優點是:
1) 可以減少參數更新的波動,最終得到效果更好和更穩定的收斂。
2) 還可以使用最新的深層學習庫中通用的矩陣優化方法,使計算小批量數據的梯度更加高效。
3) 通常來說,小批量樣本的大小范圍是從50到256,可以根據實際問題而有所不同。
4) 在訓練神經網絡時,通常都會選擇小批量梯度下降算法。
這種方法有時候還是被成為SGD。
梯度下降基本框架是 Mini-batch Gradient Descent,對每一個mini-batch更新一次參數,每一個mini-batch包含事先設置好的batch size個數的樣本。而經常提到的SGD(Stochastic gradient descent),則是對每一個樣本更新一次參數,現實中人們更多將 Mini-batch Gradient Descent也視為SGD而不加以區別。假設訓練集中輸入特征為
,對應樣本標簽為
,參數為
,損失函數為
,batch size為
,學習率為
,
表示梯度符號。訓練時每吃進
個樣本,按如下公式更新一次參數,注意減號表示往負梯度方向更新參數。
為什么會有
呢?負梯度為我們指明了前進的方向,但是每次前進多遠為宜呢?
就是為了控制邁出步子的大小。步子小了,走得慢,還可能跨不出當前的小坑;步子大了,則容易跨過當前的坑而錯過最優解。由於是憑經驗預先設置,也許算是有些人提出的深度學習是煉金術的一個論據吧。
- Momentum
SGD without momentum
SGD with momentum
如上圖所示,黑色實現表示等高線,局部最優解在中間位置,中間橫向位置存在溝壑。SGD在沿着溝壑探尋最優解時,由於維度眾多,可能在某個維度的梯度分量比其他維度打很多,導致負梯度方向不是直接指向最優解,造成探尋軌跡在溝壑處左右徘徊,從而達到最優解頗費周折,訓練時間拖慢。為優化此問題,momentum應運而生,字面意思是動量,即每次前行時,都考慮進上一步的梯度,與當前梯度一起決定這一步該如何走,如下式,其中
一般預設為0.9。
其實momentum更多是利用了慣性,如同一塊石頭從山頂滾到谷底。上一步負梯度與當前步負梯度方向相同時,會在該方向加速前行;上一步負梯度與當前步負梯度方向相反時,則抵消掉一些速度。如此利用上一步負梯度對當前梯度進行修正,可以加快探尋速度,減少不必要的波折。


,那么如何使得這個函數達到最小值呢,簡單的理解,就是對x求導,得到 y'=2x ,然后用梯度下降的方式,如果初始值是(0的左邊)負值,那么這是導數也是負值,用梯度下降的公式,使得x更加的靠近0,如果是正值的時候同理。
注意:這里的梯度也就是一元函數的導數,高維的可以直接類推之