假設訓練集有1000條數據,一個batch有100條數據。以神經網路的第一層為例,第一個batch前向傳播和反向傳播後得到參數向量w[1], b[1],對於網路的最終參數,它是以下面哪一種方式進行更新的呢?

【1】第二個batch是在第一個batch得到的w[1], b[1]基礎上做前向傳播和反向傳播得到w[2], b[2]....最後第10個batch在第9個batch基礎上做前向傳播和反向傳播,第10個完成後的參數就是最終神經網路的參數?

【2】第二個batch和第一個batch是獨立的,它計算一個獨立的w[2], b[2],....,最後所有的batch遍歷完後,用(w[1]+w[2]+...w[10])/10作為第一層神經網路的w參數?


?答案是第一種。梯度下降演算法是一個不斷迭代的過程,這個迭代過程就是為了不斷更新參數向量W和b,從而找到損失的最優解。

直觀上講就是不斷的學習數據中的特徵,而這個學習的過程就體現在參數向量W和b的更新。

而第二種,相當於每一個參數向量W和b只學習了一部分數據的特徵(知識),並沒有迭代的過程,不能算是梯度下降演算法。

下面以線性回歸為例子具體介紹一下什麼是梯度下降演算法,批量梯度下降演算法,隨機梯度下降演算法,小批量梯度下降以及他們的優缺點。

梯度下降演算法

梯度下降演算法的目的就是優化參數θ(W和b合併)尋找最小的loss。對於線性回歸來說就是下面的式子:

神經網路的損失函數(loss)雖然不一樣,但是尋找最優loss這個過程的原理是一樣的。

上面公式和圖像的含義就是在每一次迭代按照一定的學習率 α 沿梯度的反方向更新參數θ,直至收斂,此時就能求得最小的loss。

批量梯度下降演算法(Batch Gradient Descent, BGD)

批量梯度下降演算法(Batch Gradient Descent)就是每次在更新參數時都使用全部的數據進行更新。

優點:全局最優解,能保證每一次更新權值,都能降低損失函數;易於並行實現。

缺點:當樣本數目很多時,訓練過程會很慢。

隨機梯度下降演算法(Stochastic Gradient Descent, SGD)

繼續以線性回歸為例子,假設我們有有一個很大數據集比如300,000,000。這時候如果直接使用批量梯度下降演算法,一次迭代的計算量就會非常的巨大,非常的慢。所以我們可以嘗試每次迭代只使用一個數據樣本進行更新,這樣就解決了上面的問題。

但這樣的演算法存在一定的問題,不是每一步都是朝著正確的方向邁出的,因此演算法雖然會逐漸走向全局最小值的位置,但是可能無法站到那個最小值得那一點,而是在最小值的附近徘徊。如下圖所示:

隨機梯度下降演算法(Stochastic Gradient Descent)就是每次在更新參數時都使用一個數據樣本進行更新。

優點:訓練速度快;

缺點:準確度下降,並不是全局最優;不易於並行實現。從迭代的次數上來看,隨機梯度下降法迭代的次數較多,在解空間的搜索過程看起來很盲目。噪音很多,使得它並不是每次迭代都向著整體最優化方向。

小批量梯度下降法(Mini-batch Gradient Descen)

小批量梯度下降法(Mini-batch Gradient Descen):在更新每一參數時都使用一部分數據樣本來進行更新。克服上面兩種方法的缺點,又同時兼顧兩種方法的優點。

總結

三種方法使用的情況:如果樣本量比較小,採用批量梯度下降演算法。如果樣本太大,或者在線演算法,使用隨機梯度下降演算法。在實際的一般情況下,採用小批量梯度下降演算法。

參考

[1] 吳恩達機器學習


mini-batch 梯度下降 是採用的第一種方法。

在理想情況下,假設梯度在所有地方相等,那麼第二種更新方式改為 w[0] + dw[1] +dw[2] + .... 就是第一種方式。

第二種方式可以衍生出多GPU同時訓練神經網路的方法。可以參考並行權重更新模式 http://xudongyang.coding.me/distributed-tensorflow/


第一種。至於如何避免某次更新依賴於前一次更新的結果,可以提前將數據集shuffle,這樣等價於無放回的從一個獨立同分布樣本中抽取數據進行更新,能把影響降到最低。

你可以試試看把一個二分類訓練集前一半都是1後一半都是0,有shuffle的訓練結果跟無shuffle的肯定差很多。


第一種。第二種相當於設了這十個batch的並集為batch。並集等於整個訓練集時,相當於沒用minibatch。


回答:第一種

第二種本質上也就只做了一次更新而已


之前我也想過這個問題,是個非獨立的過程,而且應該從梯度角度去思考這個問題:這個非獨立的範圍和你選擇的優化方法有關,如果只用最基礎的梯度下降發SGD,那就只和上一次的梯度有關,如果用AdaGrad,那麼就和之前所有的梯度有關!

其他的優化演算法,比如Adam,同時考慮了之前的學習率上的非獨立和梯度的非獨立。現在用的很普遍。


推薦閱讀:
相关文章