momentum

這是我參與8月更文挑戰的第6天,活動詳情查看: 8月更文挑戰html

momentum(動量)的概念源自於物理學,可理解爲慣性,那麼它是如何幫助咱們尋找最優解的呢?python

若是把梯度降低法比做是一個小球從山坡到山谷的過程,那麼它具體的過程是這樣的:從起始點A開始,計算當前A的坡度,沿着坡度最大的方向滑一段路,停下到B,再從B看一看周圍的坡度,沿坡度最大的方向再滑一段路,再停下,重複這樣的操做,直至到達山谷。可是真正的小球是這樣運動的嗎?真正的小球從A點滾動到B點的時候,小球帶有必定的加速度,通常是不會停下來的,小球會越滾越快,更快的奔向谷底。momentum就是模擬這一過程來加速神經網絡優化的。下圖直觀的解釋了momentum的所有內容markdown

深度學習的核心公式是網絡

w k + 1 = w k α f ( w k ) w^{k+1}=w^{k}-\alpha\nabla f(w^k)

咱們如今定義一個表達式app

z k + 1 = β z k + α f ( w k ) z^{k+1}=\beta z^k+\alpha \nabla f(w^k)

z k z^k 表示以前全部步驟所累積的動量和, β \beta 是一個使得梯度衰減的係數,這樣的作法可讓早期的梯度對當前梯度的影響愈來愈小,若是沒有衰減值,模型每每會震盪難以收斂,甚至發散,因此新的參數更新公式變爲dom

w k + 1 = w k z k + 1 w^{k+1}=w^{k}-z^{k+1}

展開就是函數

w k + 1 = w k α f ( w k ) β z k w^{k+1}=w^k - \alpha \nabla f(w^k) - \beta z^k

這樣一步步下去,帶着初速度的小球就會急速奔向谷底post

咱們以一個更實際例子講解學習

下圖是沒有設置momentum的時候,網絡僅僅只是更新到局部最優解就中止了,並且咱們看最開始幾回迭代的方向很是random,由於它更新方向僅取決於當前位置的梯度方向優化

下圖是設置了momentum的狀況,相比於沒有momentum,網絡更新更快,並且也幾乎找到了全局最優解 但要注意,並非全部的模型都適合加入momentum,有些加了反而速度變慢(由於考慮了以前的歷史因素)

在pytorch中添加momentum參數十分方便,只須要在優化器設置函數中進行添加便可

optimizer = torch.optim.SGD(model.parameters(), args.lr, # learning_rate
                            momentum=args.momentum, # momentum
                            weight_decay=args.weight_decayt_decay) # L2-regularization
複製代碼

但要注意,對於Adam優化器來講,它沒有momentum這個參數,由於它已經內置了momentum機制,只有SGD才須要額外設置

相關文章
相關標籤/搜索