為什麼隨機梯度下降會導致我們達到最小值?

數學極客

為什麼我們認為隨機梯度下降會找到最小值?我的意思是在每次迭代中,SGD 都朝著只減少當前批次誤差的方向移動(SGD 不關心其餘的樣本)。但是,為什麼這會導致我們達到成本函數的局部最小值?

我的意思是我們期望正常的梯度下降卡在最近的局部最小值上,對吧?但是我們預計新元會停留在什麼樣的最小值上,為什麼?

為什麼我們希望這個全新的最小值比最初的更深?它更有可能嗎?為什麼?理由是什麼?

H·里蒂奇

我假設您是在尋求隨機梯度下降 (SGD) 背後的一些直覺,而不是尋求嚴格的證明。

首先,回想一下,您實際上只是朝著由速率參數 α 縮放的批次梯度的方向移動。因此,對於每個批次,您只需稍微更改參數。

讓我們考慮一個簡單的例子。假設您必須在 2D 平面中找到靠近兩個給定點(x, y)的點的坐標更準確地說,你必須找到最小化函數rpq(x, y)

f(x, y) = (x - pₓ)² + (y - pᵧ)² + (x - qₓ)² + (y - qᵧ)² .

這個問題的解決方案,只是之間的中點pq(即1/2 (p+q))。然而,讓我們假設我們將使用 SGD 解決這個問題。

讓第一批只是重點p,第二批只是重點q因此,第一批減少了期限

(x - pₓ)² + (y - pᵧ)²

而第二個減少

(x - qₓ)² + (y - qᵧ)² .

第一項p的最小值是點,而第二項的最小值是q(兩個問題的梯度分別2 (r-p)2 (r-q)。)因此,如果我們應用 SDG,我們從 的隨機值開始r然後我們通過應用第一批(假設 α 足夠小)r稍微移動到 的方向p然後我們r稍微向 的方向移動q重複這兩個步驟。

該點將r沿鋸齒形路徑移動。首先,靠近p一點,q然後再靠近一點,然後再靠近一點p,依此類推。如果適當地選擇率α,然後r將實際走向之間的中點pq,原因如下。如果從起點到中點繪製一條直線pq平均而言,您將向這條線的方向移動,因為向與這條線垂直的方向移動的任何一步都將被下一步取消。一個例子如下所示。

之字形路徑的示例圖片。

從這個例子中,你可以看到,在使用 SGD 時做了哪些假設。參數 α 必須選擇得足夠小,這樣你就不會瘋狂地跳來跳去,而只是朝著每個批次的最小值移動。如果您要針對相同的 值一次計算所有批次的校正r,而不是r在每個批次之間更新,然後一次應用所有校正,您實際上將執行(批次)梯度下降的步驟。如果 α 較小,則r在應用單個批次的校正時不會發生顯著變化。因此,一次計算所有批次的校正的效果與計算每次更新後的校正非常相似,因此(批次)梯度下降和 SDG 收斂到相同的局部最小值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

為什麼 PHP DateTime::setTime 會導致 strtotime 的奇怪行為?

為什麼我的平鋪圖像會隨著粘貼到 Pillow 中而移動?

為什麼我沒有在數組 JAVA 中獲得最小值?

為什麼此代碼不會導致重新定義錯誤?

我沒有得到最小值,它顯示為 0,但在 Math.max() 的情況下它顯示正確的最大值,為什麼會這樣?

為什麼調用方法兩次會導致 TypeError: object is not callable

為什麼“DEFAULT”會導致語法問題

為什麼在此處使用 `any` 會導致該程序掛起,而使用 `for` 循環不會?

為什麼在我的輔助函數中取消引用指針變量會導致我的整個程序終止?

為什麼使用多線程會導致執行速度變慢?

Javascript,當我們為只讀數據屬性(例如字符串長度)賦值時會發生什麼?

為什麼 WPF 畫布會導致 System.InvalidOperationException?

為什麼字典查找會導致“不可哈希類型”錯誤,而使用直接值卻不會?

為什麼等待會導致我的流被讀取

為什麼很長的 packageName 會在作為量詞導入之前導致換行?

為什麼我的運動系統會隨機中斷?

為什麼即使我在特定度數範圍之間隨機限制旋轉,變換也會旋轉 360 度?

當我們將 null 或 undefined 作為值傳遞時,為什麼輸入值不會改變?

如果我們給它大小,為什麼字符串會打印垃圾值?

為什麼這個字符比較會導致錯誤?

為什麼當我重新打開它們時我的按鈕會重複(python tkinter)

為什麼對 r 值的 const l 值引用不會導致懸空引用?

為什麼上傳約 2.5 MiB 或更大的文件會導致連接重置?

為什麼這個 NotifyCollectionChanged 會導致內存洩漏?

為什麼相同的生成的彙編代碼不會導致相同的輸出?

為什麼我的Qt程序中未執行的代碼會導致程序崩潰?

為什麼這段代碼會導致hitbox異常?

為什麼我的網格模板區域會導致我的網格拉伸?

為什麼更改 Bundlers 安裝目錄會導致 Sorbet 翻倒?