Machine-Learning

批量大小如何影響 SGD 的收斂性,為什麼?

  • November 30, 2017

我從許多討論中看到了類似的結論,即隨著 minibatch 的大小變大,SGD 的收斂實際上變得更難/更差,例如這篇論文這個答案。此外,我聽說有人在早期使用小學習率或批量大小等技巧來解決大批量大小的問題。

然而,這似乎違反直覺,因為可以將小批量的平均損失視為數據分佈上預期損失的近似值, $$ \frac{1}{|X|}\sum_{x\in X} l(x,w)\approx E_{x\sim p_{data}}[l(x,w)] $$ 批量越大,它應該越準確。為什麼在實踐中並非如此?


以下是我試圖解釋的一些(可能是錯誤的)想法。

模型的參數相互依賴度很高,當batch過大時會同時影響過多的參數,使得參數很難達到穩定的內在依賴?(如批量歸一化論文中提到的內部協變量移位問題)

或者當幾乎所有參數在每次迭代中都負責時,他們會傾向於學習冗餘的隱式模式,從而降低模型的容量?(我的意思是說對於數字分類問題,一些模式應該對點負責,一些對邊緣負責,但是當這種情況發生時,每個模式都試圖對所有形狀負責)。

還是因為當批量大小接近訓練集的規模時,從數據分佈中不再可以將小批量視為獨立同分佈,因為相關小批量的概率很大?


更新

正如 Benoit Sanchez 的回答中所指出的,一個重要原因是大型 minibatch 需要更多計算才能完成一次更新,並且大多數分析使用固定數量的訓練時期進行比較。

然而,這篇論文(Wilson 和 Martinez,2003 年)表明,即使給定足夠數量的訓練 epoch,較大的批量大小仍然略微不利。一般情況是這樣嗎? 在此處輸入圖像描述

當然,一個大 minibatch 的更新比****一個小的 minibatch 的更新“更好”(在準確性方面) 。這可以在您在問題中復制的表格中看到(致電樣本量):

  • 批量大小 1:更新次數
  • 批量大小 20,000:更新次數

您可以看到,對於更大的批次,您需要更少的更新來獲得相同的準確性。

但它無法比較,因為它處理的數據量不同。我引用第一篇文章:

“我們比較執行效果小批量的 SGD 迭代 與具有大型 minibatch 的單次迭代相比"

這裡是關於處理相同數量的數據,雖然多個小批量的開銷很小,但這需要相當的處理資源。

有幾種方法可以理解為什麼多次更新更好(對於相同數量的數據被讀取)。這是隨機梯度下降與梯度下降的關鍵思想。不是閱讀所有內容然後在最後糾正自己,而是在途中糾正自己,使下一次閱讀更有用,因為您糾正了自己更好的猜測。在幾何上,多次更新會更好,因為您正在繪製多個線段,每個線段都在每個線段開始處的(近似)梯度方向上。而單個大更新是從一開始就在(精確)梯度方向上的單個片段。即使方向不太精確,最好多次改變方向。

小批量的大小本質上是更新的頻率:小批量越小更新越多。在一個極端(小批量=數據集)你有梯度下降。在另一個極端(minibatch=one line)你有完整的每行 SGD。無論如何,每行 SGD 更好,但更大的 minibatch 更適合更有效的並行化。

在收斂過程結束時,SGD 變得不如(批量)GD 精確。但是在這一點上,事情(通常)變成了一種無用的精確擬合。雖然您在訓練集上獲得的損失函數略小,但您並沒有獲得真正的預測能力。您只是在尋找非常精確的最佳值,但這無濟於事。如果損失函數被正確正則化(防止過度擬合),你不會完全“過度”擬合,你只是無用的“過度”擬合。這表明測試集的準確性沒有顯著變化。

引用自:https://stats.stackexchange.com/questions/316464

comments powered by Disqus