批量梯度降低(BGD)、隨機梯度降低(SGD)以及小批量梯度降低(MBGD)的理解

  梯度降低法做爲機器學習中較常使用的優化算法,其有着三種不一樣的形式:批量梯度降低(Batch Gradient Descent)、隨機梯度降低(Stochastic Gradient Descent)以及小批量梯度降低(Mini-Batch Gradient Descent)。其中小批量梯度降低法也經常使用在深度學習中進行模型的訓練。接下來,咱們將對這三種不一樣的梯度降低法進行理解。
  爲了便於理解,這裏咱們將使用只含有一個特徵的線性迴歸來展開。此時線性迴歸的假設函數爲:
\[ h_{\theta} (x^{(i)})=\theta_1 x^{(i)}+\theta_0 \]
  其中 $ i=1,2,...,m $ 表示樣本數。
  對應的目標函數(代價函數)即爲:
\[ J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})^2 \]
  下圖爲 $ J(\theta_0,\theta_1) $ 與參數 $ \theta_0,\theta_1 $ 的關係的圖:
html



一、批量梯度降低(Batch Gradient Descent,BGD)

  批量梯度降低法是最原始的形式,它是指在每一次迭代時使用全部樣本來進行梯度的更新。從數學上理解以下:
  (1)對目標函數求偏導:
\[ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} \]
  其中 $ i=1,2,...,m $ 表示樣本數, $ j = 0,1 $ 表示特徵數,這裏咱們使用了偏置項 $ x_0^{(i)} = 1 $ 。
  (2)每次迭代對參數進行更新:
\[ \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} \]
  注意這裏更新時存在一個求和函數,即爲對全部樣本進行計算處理,可與下文SGD法進行比較。
  僞代碼形式爲:
  repeat{
       $ \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} $
      (for j =0,1)
  }


  優勢:
  (1)一次迭代是對全部樣本進行計算,此時利用矩陣進行操做,實現了並行。
  (2)由全數據集肯定的方向可以更好地表明樣本整體,從而更準確地朝向極值所在的方向。當目標函數爲凸函數時,BGD必定可以獲得全局最優。
  缺點:
  (1)當樣本數目 $ m $ 很大時,每迭代一步都須要對全部樣本計算,訓練過程會很慢。
  從迭代的次數上來看,BGD迭代的次數相對較少。其迭代的收斂曲線示意圖能夠表示以下:
算法



二、隨機梯度降低(Stochastic Gradient Descent,SGD)

  隨機梯度降低法不一樣於批量梯度降低,隨機梯度降低是每次迭代使用一個樣本來對參數進行更新。使得訓練速度加快。
  對於一個樣本的目標函數爲:
\[ J^{(i)}(\theta_0,\theta_1) = \frac{1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2 \]
  (1)對目標函數求偏導:
\[ \frac{\Delta J^{(i)}(\theta_0,\theta_1)}{\theta_j} = (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j \]
  (2)參數更新:
\[ \theta_j := \theta_j - \alpha (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j \]
  注意,這裏再也不有求和符號
  僞代碼形式爲:
  repeat{
    for i=1,...,m{
       $ \theta_j := \theta_j -\alpha (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} $
      (for j =0,1)
    }
  }


  優勢:
  (1)因爲不是在所有訓練數據上的損失函數,而是在每輪迭代中,隨機優化某一條訓練數據上的損失函數,這樣每一輪參數的更新速度大大加快。
  缺點:
  (1)準確度降低。因爲即便在目標函數爲強凸函數的狀況下,SGD仍舊沒法作到線性收斂。
  (2)可能會收斂到局部最優,因爲單個樣本並不能表明全體樣本的趨勢。
  (3)不易於並行實現。


  解釋一下爲何SGD收斂速度比BGD要快:
  答:這裏咱們假設有30W個樣本,對於BGD而言,每次迭代須要計算30W個樣本才能對參數進行一次更新,須要求得最小值可能須要屢次迭代(假設這裏是10);而對於SGD,每次更新參數只須要一個樣本,所以若使用這30W個樣本進行參數更新,則參數會被更新(迭代)30W次,而這期間,SGD就能保證可以收斂到一個合適的最小值上了。也就是說,在收斂時,BGD計算了 $ 10 \times 30W $ 次,而SGD只計算了 $ 1 \times 30W $ 次。


  從迭代的次數上來看,SGD迭代的次數較多,在解空間的搜索過程看起來很盲目。其迭代的收斂曲線示意圖能夠表示以下:
網絡



三、小批量梯度降低(Mini-Batch Gradient Descent, MBGD)

  小批量梯度降低,是對批量梯度降低以及隨機梯度降低的一個折中辦法。其思想是:每次迭代 使用 ** batch_size** 個樣原本對參數進行更新。
  這裏咱們假設 $ batch_size = 10 $ ,樣本數 $ m=1000 $ 。
  僞代碼形式爲:
  repeat{
    for i=1,11,21,31,...,991{
       $ \theta_j := \theta_j - \alpha \frac{1}{10} \sum_{k=i}^{(i+9)}(h_{\theta}(x^{(k)})-y^{(k)})x_j^{(k)} $
      (for j =0,1)
    }
  }


  優勢:
  (1)經過矩陣運算,每次在一個batch上優化神經網絡參數並不會比單個數據慢太多。
  (2)每次使用一個batch能夠大大減少收斂所須要的迭代次數,同時可使收斂到的結果更加接近梯度降低的效果。(好比上例中的30W,設置batch_size=100時,須要迭代3000次,遠小於SGD的30W次)
  (3)可實現並行化。
  缺點:
  (1)batch_size的不當選擇可能會帶來一些問題。


  batcha_size的選擇帶來的影響:
  (1)在合理地範圍內,增大batch_size的好處:
    a. 內存利用率提升了,大矩陣乘法的並行化效率提升。
    b. 跑完一次 epoch(全數據集)所需的迭代次數減小,對於相同數據量的處理速度進一步加快。
    c. 在必定範圍內,通常來講 Batch_Size 越大,其肯定的降低方向越準,引發訓練震盪越小。
  (2)盲目增大batch_size的壞處:
    a. 內存利用率提升了,可是內存容量可能撐不住了。
    b. 跑完一次 epoch(全數據集)所需的迭代次數減小,要想達到相同的精度,其所花費的時間大大增長了,從而對參數的修正也就顯得更加緩慢。
    c. Batch_Size 增大到必定程度,其肯定的降低方向已經基本再也不變化。


  下圖顯示了三種梯度降低算法的收斂過程:
機器學習



引用及參考:
[1] http://www.javashuo.com/article/p-yixtiunk-gt.html
[2] https://zhuanlan.zhihu.com/p/37714263
[3] https://zhuanlan.zhihu.com/p/30891055
[4] https://www.zhihu.com/question/40892922/answer/231600231函數

寫在最後:本文參考以上資料進行整合與總結,文章中可能出現理解不當的地方,如有所看法或異議可在下方評論,謝謝!
若需轉載請註明http://www.javashuo.com/article/p-fribneoh-eq.html學習

相關文章
相關標籤/搜索