隨機梯度下降


理解隨機梯度下降,首先要知道梯度下降法,故先介紹梯度下降法:

梯度下降法

大多數機器學習或者深度學習算法都涉及某種形式的優化。 優化指的是改變 [公式] 以最小化或最大化某個函數 [公式] 的任務。 我們通常以最小化 [公式] 指代大多數最優化問題。 最大化可經由最小化算法最小化 [公式] 來實現。

我們把要最小化或最大化的函數稱為目標函數或准則。 當我們對其進行最小化時,我們也把它稱為代價函數、損失函數或誤差函數

下面,我們假設一個損失函數為
[公式]
其中 [公式] 然后要使得最小化它。
注意:這里只是假設,不用知道這個目標函數就是平方損失函數等等,然后肯定有人問既然要最小化它,那求個導數,然后使得導數等於0求出不就好了嗎?是的,有這樣的解法,可以去了解正規方程組求解。說下這里不講的原因,主要是那樣的方式太難求解,然后在高維的時候,可能不可解,但機器學習或深度學習中,很多都是超高維的,所以也一般不用那種方法。總之,梯度下降是另一種優化的不錯方式,比直接求導好很多。
梯度下降:
先說一下梯度:

 

 圖片來源:https://www.zhihu.com/question/36301367/answer/142096153

1.梯度是在某一點處z對x的偏導與z對y的偏導的矢量和;

2.梯度是一個矢量,既有大小,又有方向;
3.梯度總是指向z值增長最大(快)的方向,矢量和的大小表示這個方向上增加的量,矢量和的方向表示梯度的方向。
我們知道曲面上方向導數的最大值的方向就代表了梯度的方向,因此我們在做梯度下降的時候,應該是沿着梯度的反方向進行權重的更新,可以有效的找到全局的最優解。這個 [公式] 的更新過程可以描述為

a表示的是步長或者說是學習率(learning rate),決定着梯度下降的步長。

從數學的角度,我們可以這樣想,先想在低維的時候,比如二維,我們要找到最小值,其實可以是這樣的方法,具體化到1元函數中時,梯度方向首先是沿着曲線的切線的,然后取切線向上增長的方向為梯度方向,2元或者多元函數中,梯度向量為函數值f對每個變量的導數,該向量的方向就是梯度的方向,當然向量的大小也就是梯度的大小。現在假設我們要求函數的最值,采用梯度下降法,結合如圖所示:

 

 

如圖所示,我們假設函數是 [公式] ,那么如何使得這個函數達到最小值呢,簡單的理解,就是對x求導,得到 y'=2x ,然后用梯度下降的方式,如果初始值是(0的左邊)負值,那么這是導數也是負值,用梯度下降的公式,使得x更加的靠近0,如果是正值的時候同理。 注意:這里的梯度也就是一元函數的導數,高維的可以直接類推之
來源: https://www.zhihu.com/question/264189719/answer/291167114
 
 以上是分割線。
總樣本數=10000(張桌子)
每個 batch 都從 10000 個樣本里隨機采樣 10 個,然后計算、更新,再隨機采樣 10 個,再一個 batch 。。。這里的更新,叫隨機梯度下降,隨機是指你每個 batch 的數據是對整個數據空間的隨機采樣
機梯度下降的理論(其實算不上理論。。。很直觀的一個式子)告訴你,只要你的采樣夠隨機,隨機梯度的期望和真實梯度是相等的。用人話說,放在模型訓練里,哪怕一個 batch 就一個數據點,你只要辛苦多迭代幾個 batch,最終效果一定是一樣的。

函數梯度:導數dy/dx的多變量表達式,用來表示y相對於x的瞬時變化率。往往為了計算多變量函數的導數時,會用梯度取代導數,並使用偏導數來計算梯度。梯度和導數之間的一個主要區別是函數的梯度形成了一個向量場。

因此,對單變量函數,使用導數來分析;而梯度是基於多變量函數而產生的。


1. 隨機梯度下降(SDG)

隨機梯度下降(Stochastic gradient descent,SGD)對每個訓練樣本進行參數更新,每次執行都進行一次更新,且執行速度更快。

θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)為訓練樣本。

頻繁的更新使得參數間具有高方差,損失函數會以不同的強度波動。這實際上是一件好事,因為它有助於我們發現新的和可能更優的局部最小值,而標准梯度下降將只會收斂到某個局部最優值。

但SGD的問題是,由於頻繁的更新和波動,最終將收斂到最小限度,並會因波動頻繁存在超調量。

雖然已經表明,當緩慢降低學習率η時,標准梯度下降的收斂模式與SGD的模式相同。

圖2:每個訓練樣本中高方差的參數更新會導致損失函數大幅波動,因此我們可能無法獲得給出損失函數的最小值。

另一種稱為“小批量梯度下降”的變體,則可以解決高方差的參數更新和不穩定收斂的問題。

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更多是利用了慣性,如同一塊石頭從山頂滾到谷底。上一步負梯度與當前步負梯度方向相同時,會在該方向加速前行;上一步負梯度與當前步負梯度方向相反時,則抵消掉一些速度。如此利用上一步負梯度對當前梯度進行修正,可以加快探尋速度,減少不必要的波折。


 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM