1. 程式人生 > >梯度下降法的三種形式-BGD、SGD、MBGD

梯度下降法的三種形式-BGD、SGD、MBGD

方法 ont -o 設置 求解 最小值 ima 求和 參數

在應用機器學習算法時,我們通常采用梯度下降法來對采用的算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。

下面我們以線性回歸算法來對三種梯度下降法進行比較。

一般線性回歸函數的假設函數為:

技術分享圖片

對應的損失函數為:

技術分享圖片

下圖為一個二維參數(θ0θ1)組對應能量函數的可視化圖:

技術分享圖片

1、批量梯度下降法BGD

批量梯度下降法(Batch Gradient Descent,簡稱BGD)是梯度下降法最原始的形式,它的具體思路是在更新每一參數時都使用所有的樣本來進行更新。

我們的目的是要誤差函數盡可能的小

,即求解weights使誤差函數盡可能小。首先,我們隨機初始化weigths,然後不斷反復的更新weights使得誤差函數減小直到滿足要求時停止。這裏更新算法我們選擇梯度下降算法,利用初始化的weights並且反復更新weights:

技術分享圖片

這裏代表學習率,表示每次向著J最陡峭的方向邁步的大小。為了更新weights,我們需要求出函數J的偏導數。首先當我們只有一個數據點(x,y)的時候,J的偏導數是:

技術分享圖片

則對所有數據點上述損失函數的偏導(累和)為:

技術分享圖片

再最小化損失函數的過程中,需要不斷反復的更新weights使得誤差函數減小,更新過程如下:

技術分享圖片

那麽好了,每次參數更新的偽代碼如下:

技術分享圖片

由上圖更新公式我們就可以看到,我們每一次的參數更新都用到了所有的訓練數據(比如有m個,就用到了m個),如果訓練數據非常多的話,是非常耗時的

下面給出批梯度下降的收斂圖:

技術分享圖片

從圖中,我們可以得到BGD叠代的次數相對較少。

代碼實現:

def batchGradientDescent(x, y, theta, alpha, m, maxIteration):
    
for i in range(maxIteration): hypothesis = np.dot(x, theta) loss = hypothesis - y gradient = np.dot(x.transpose(), loss) / m theta = theta - alpha * gradient # 對所有樣本求和 return theta

2、隨機梯度下降法SGD

由於批梯度下降每跟新一個參數的時候,要用到所有的樣本數,所以訓練速度會隨著樣本數量的增加而變得非常緩慢。隨機梯度下降正是為了解決這個辦法而提出的。它是利用每個樣本的損失函數對θ求偏導得到對應的梯度,來更新θ:

技術分享圖片

更新過程如下:

技術分享圖片

隨機梯度下降是通過每個樣本來叠代更新一次,對比上面的批量梯度下降,叠代一次需要用到所有訓練樣本(往往如今真實問題訓練數據都是非常巨大),一次叠代不可能最優,如果叠代10次的話就需要遍歷訓練樣本10次。

但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次叠代都向著整體最優化方向。

隨機梯度下降收斂圖如下:

技術分享圖片

我們可以從圖中看出SGD叠代的次數較多,在解空間的搜索過程看起來很盲目。但是大體上是往著最優值方向移動。

代碼實現:

def StochasticGradientDescent(x, y, theta, alpha, m, maxIteration):
    data = []
    for i in range(10):
        data.append(i)
    # 這裏隨便挑選一個進行更新點進行即可(不用想BGD一樣全部考慮)

    for i in range(maxIteration):
        hypothesis = np.dot(x, theta)
        loss = hypothesis - y  # 這裏還是有十個樣本
        index = random.sample(data, 1)[0]  # 隨機抽取一個樣本,得到它的下標
        gradient = loss[index] * x[index]  # 只取一個點進行更新計算
        theta = theta - alpha * gradient.T
    return theta

3、min-batch 小批量梯度下降法MBGD

我們從上面兩種梯度下降法可以看出,其各自均有優缺點,那麽能不能在兩種方法的性能之間取得一個折衷呢?既算法的訓練過程比較快,而且也要保證最終參數訓練的準確率而這正是小批量梯度下降法(Mini-batch Gradient Descent,簡稱MBGD)的初衷。

我們假設每次更新參數的時候用到的樣本數為10個(不同的任務完全不同,這裏舉一個例子而已

更新偽代碼如下:

技術分享圖片

4、三種梯度下降方法的總結

1.批梯度下降每次更新使用了所有的訓練數據,最小化損失函數,如果只有一個極小值,那麽批梯度下降是考慮了訓練集所有數據,是朝著最小值叠代運動的,但是缺點是如果樣本值很大的話,更新速度會很慢。

2.隨機梯度下降在每次更新的時候,只考慮了一個樣本點,這樣會大大加快訓練數據,也恰好是批梯度下降的缺點,但是有可能由於訓練數據的噪聲點較多,那麽每一次利用噪聲點進行更新的過程中,就不一定是朝著極小值方向更新,但是由於更新多輪,整體方向還是大致朝著極小值方向更新,又提高了速度。

3.小批量梯度下降法是為了解決批梯度下降法的訓練速度慢,以及隨機梯度下降法的準確性綜合而來,但是這裏註意,不同問題的batch是不一樣的聽師兄跟我說,我們nlp的parser訓練部分batch一般就設置為10000,那麽為什麽是10000呢,我覺得這就和每一個問題中神經網絡需要設置多少層,沒有一個人能夠準確答出,只能通過實驗結果來進行超參數的調整。

梯度下降法的三種形式-BGD、SGD、MBGD