這是我參與8月更文挑戰的第6天,活動詳情查看: 8月更文挑戰html
momentum(動量)的概念源自於物理學,可理解爲慣性,那麼它是如何幫助咱們尋找最優解的呢?python
若是把梯度降低法比做是一個小球從山坡到山谷的過程,那麼它具體的過程是這樣的:從起始點A開始,計算當前A的坡度,沿着坡度最大的方向滑一段路,停下到B,再從B看一看周圍的坡度,沿坡度最大的方向再滑一段路,再停下,重複這樣的操做,直至到達山谷。可是真正的小球是這樣運動的嗎?真正的小球從A點滾動到B點的時候,小球帶有必定的加速度,通常是不會停下來的,小球會越滾越快,更快的奔向谷底。momentum就是模擬這一過程來加速神經網絡優化的。下圖直觀的解釋了momentum的所有內容markdown
深度學習的核心公式是網絡
咱們如今定義一個表達式app
表示以前全部步驟所累積的動量和, 是一個使得梯度衰減的係數,這樣的作法可讓早期的梯度對當前梯度的影響愈來愈小,若是沒有衰減值,模型每每會震盪難以收斂,甚至發散,因此新的參數更新公式變爲dom
展開就是函數
這樣一步步下去,帶着初速度的小球就會急速奔向谷底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才須要額外設置