1. 程式人生 > >加速神經網路訓練(Speed UpTraining)

加速神經網路訓練(Speed UpTraining)

學習資料

  1. 英文學習資料
  2. PyTorch 視覺化優化器

今天我們會來聊聊在怎麼樣加速你的神經網路訓練過程

包括以下幾點:

  • Stochastic Gradient Descent(SGD)
  • Momentum
  • AdaGrad
  • RMSProp
  • Adam
    在這裡插入圖片描述
    越複雜的神經網路 , 越多的資料 , 我們需要在訓練神經網路的過程上花費的時間也就越多. 原因很簡單, 就是因為計算量太大了. 可是往往有時候為了解決複雜的問題, 複雜的結構和大資料又是不能避免的, 所以我們需要尋找一些方法, 讓神經網路聰明起來, 快起來.

Stochastic Gradient Descent (SGD)

在這裡插入圖片描述
所以, 最基礎的方法就是 SGD 啦, 想像紅色方塊是我們要訓練的 data, 如果用普通的訓練方法, 就需要重複不斷的把整套資料放入神經網路 NN訓練, 這樣消耗的計算資源會很大.

我們換一種思路, 如果把這些資料拆分成小批小批的, 然後再分批不斷放入 NN 中計算, 這就是我們常說的 SGD 的正確開啟方式了. 每次使用批資料, 雖然不能反映整體資料的情況, 不過卻很大程度上加速了 NN 的訓練過程, 而且也不會丟失太多準確率.如果運用上了 SGD, 你還是嫌訓練速度慢, 那怎麼辦?
.
沒問題, 事實證明, SGD 並不是最快速的訓練方法, 紅色的線是 SGD, 但它到達學習目標的時間是在這些方法中最長的一種. 我們還有很多其他的途徑來加速訓練.

下面來看Momentum 更新方法

在這裡插入圖片描述
大多數其他途徑是在更新神經網路引數那一步上動動手腳. 傳統的引數 W 的更新是把原始的 W 累加上一個負的學習率(learning rate) 乘以校正值 (dx). 這種方法可能會讓學習過程曲折無比, 看起來像 喝醉的人回家時, 搖搖晃晃走了很多彎路.

在這裡插入圖片描述
所以我們把這個人從平地上放到了一個斜坡上, 只要他往下坡的方向走一點點, 由於向下的慣性, 他不自覺地就一直往下走, 走的彎路也變少了. 這就是 Momentum 引數更新. 另外一種加速方法叫AdaGrad.

AdaGrad 更新方法

在這裡插入圖片描述
這種方法是在學習率上面動手腳, 使得每一個引數更新都會有自己與眾不同的學習率, 他的作用和 momentum 類似, 不過不是給喝醉酒的人安排另一個下坡, 而是給他一雙不好走路的鞋子, 使得他一搖晃著走路就腳疼, 鞋子成為了走彎路的阻力, 逼著他往前直著走. 他的數學形式是這樣的. 接下來又有什麼方法呢? 如果把下坡和不好走路的鞋子合併起來, 是不是更好呢? 沒錯, 這樣我們就有了 RMSProp 更新方法.

RMSProp 更新方法

在這裡插入圖片描述
有了 momentum 的慣性原則 , 加上 adagrad 的對錯誤方向的阻力, 我們就能合併成這樣. 讓 RMSProp同時具備他們兩種方法的優勢. 不過細心的同學們肯定看出來了, 似乎在 RMSProp 中少了些什麼. 原來是我們還沒把 Momentum合併完全, RMSProp 還缺少了 momentum 中的 這一部分. 所以, 我們在 Adam 方法中補上了這種想法.

Adam 更新方法

在這裡插入圖片描述

計算m 時有 momentum 下坡的屬性, 計算 v 時有 adagrad 阻力的屬性, 然後再更新引數時 把 m 和 V 都考慮進去. 實驗證明, 大多數時候, 使用 adam 都能又快又好的達到目標, 迅速收斂. 所以說, 在加速神經網路訓練的時候, 一個下坡, 一雙破鞋子, 功不可沒.