1. 程式人生 > >Andrew Ng 機器學習筆記 15 :大資料集梯度下降

Andrew Ng 機器學習筆記 15 :大資料集梯度下降

隨機梯度下降

對於線性迴歸、邏輯迴歸、神經網路等等很多機器學習演算法,其實現都是通過得出某個代價函式或者某個最優化的目標來實現的,然後使用梯度下降這樣的方法來求得代價函式的最小值。

而梯度下降在大量資料的情況下,每一次的梯度下降的計算量就變得非常大,因為需要對所有的訓練樣本求和。因此,這種在每次迭代中對所有資料都進行計算的梯度下降演算法也被稱為批量梯度下降(batch gradient descent)

隨機梯度下降原理

隨機梯度下降的代價函式如下:

c
o s t ( θ , ( x ( i ) , y
( i )
) ) = 1 2 ( h θ ( x ( i ) ) y ( i ) ) 2 J t r a i n ( θ ) = 1 m i = 1 m c o s t ( θ , ( x ( i ) , y ( i ) ) )

隨機梯度下降演算法中,我們的步驟如下:

  1. 將所有資料打亂。
  2. 重複執行梯度下降計算,注意,這裡每一次計算 θ j 不是遍歷全部的訓練集m,而是從m個訓練集裡取出1個樣本來計算。所以每次梯度下降的計算只需要一個樣本代入計算。這一點是和批量梯度下降最大的不同。

隨機梯度下降過程中,相比於批量梯度下降,會更曲折一些,但每一次的迭代都會更快,因為我們不需要對所有樣本求和,每一次只需要保證擬合一個樣本即可。

實際上,執行隨機梯度下降和批量梯度下降這兩種演算法的收斂形式是不同的,你會發現隨機梯度下降最終會在靠近全域性最小值的區域內徘徊,而不是直接逼近全域性最小值並停留在那裡。但實際上這並沒有太大問題,只要引數最終移動到某個非常靠近全域性最小值的區域內,這也會得到一個較為不錯的假設。

由於隨機梯度下降每一次的梯度下降計算只需要計算單個樣本,而不是像批量梯度下降那樣每次計算全部樣本,所以隨機梯度下降的下降過程會很快。

最後還有一個細節點,在隨機梯度下降的過程中,我們定義了一個外層迴圈,那麼這個外層迴圈應該定義為多少次呢?這取決於你樣本的數量。一般情況下一次就夠了,最多10次是比較典型的。所以我們通常迴圈執行1到10次。

小批量梯度下降

在批量梯度下降中每次迭代我們都要用所有的m個樣本;然而在隨機梯度下降中每次迭代我們只用一個樣本;小批量梯度下降的做法介於它們之間。準確地說在這種方法中我們每次迭代使用b個樣本,b是一個叫做“小批量規模”的引數。

小批量梯度下降vs隨機梯度下降

那麼小批量梯度下降演算法和隨機梯度下降演算法相比,有什麼優勢呢?

答案是向量化。具體來說,小批量梯度下降演算法比隨機梯度下降演算法更好的原因在於前者每次梯度下降過程中,批量處理的資料可以用一種更向量化的方法來實現,允許你部分平行計算10個樣本的和,而隨機梯度下降演算法每次只去計算一個樣本,沒有太多的平行計算。

小批量梯度下降演算法相比隨機梯度下降演算法的一個缺點,是有額外的引數b。因此你需要一些時間來除錯小批量b的大小。但是如果你有一個好的向量化實現,這種方式會比隨機梯度下降更快一些。

隨機梯度下降的收斂

隨機梯度下降過程中,在每一次梯度下降的迭代執行前,我們都去用當前的隨機樣本 ( x ( i ) , y ( i ) ) 來計算當前的關於θ的cost函式:

c o s t ( θ , ( x ( i ) , y ( i ) ) ) = 1 2 ( h θ ( x ( i ) ) y ( i ) ) 2

在每次迭代之後都去更新θ,每個樣本迭代一次。

最後為了檢查隨機梯度下降的收斂性,我們要做的是每1000次迭代,我們可以畫出前一步中計算出的cost函式。

我們把這些cost函式畫出來,並對演算法處理的最後1000個樣本的cost值求平均值。如果你這樣做的話它會很有效地幫你估計出你的演算法在最後1000個樣本上的表現。所以,我們不需要時不時地計算 J t r a i n ,那樣的話需要所有的訓練樣本。