深度學習中常用的優化器簡介


深度學習中常用的優化器簡介

SGD

mini-batch SGD 是最基礎的優化方法,是后續改良方法的基礎。下式給出SGD的更新公式

\[\theta_t = \theta_{t-1} - \alpha\nabla_\theta J(\theta) \]

其中\(\alpha\)是學習速率。

SGD with Momentum

帶動量的mini-SGD的更新方法如下

\[\begin{split} v_t &= r\cdot v_{t-1} + \alpha\nabla_\theta J(\theta)\\ \theta_t &= \theta_{t-1} - v_t \end{split} \]

如果這一次的梯度與上一次的梯度方向一致,那么更新量就會越來越大,這樣沿着負梯度的方向就會越走越快,可以使得模型收斂加速。

Nesterov Momentum

Nesterov Momentum是SGD with Momentum 的改進版,應用該方法的參數更新策略如下

\[\begin{split} v_t & = r\cdot v_{t-1} + \alpha\cdot \nabla_\theta J(\theta - r\cdot v_{t-1})\\ \theta_t &= \theta_{t-1} - v_t \end{split} \]

在計算梯度的時候,加入了預估的信息,這樣可以在上坡之前提前減速,減少震盪,使得優化朝着更加有利的方向進行。

Adagrad

前面介紹的三種方法,所有的參數使用着完全一樣的學習速率。但是,講道理,不同的參數應該使用不同的學習速率,比如出現頻率較低的參數更新幅度應該大,而頻率高的參數更新幅度就相對小一些。AdaGrad正是這樣的方法,更為具體的

\[\begin{split} v_t &= v_{t-1} + g_t^2\\ \theta_{t} &= \theta_{t-1} - \dfrac{\alpha}{\sqrt{v_t+\epsilon}}\cdot g_{t} \end{split} \]

其中\(\epsilon\)是平滑因子,避免被開方的數是0。這里解釋了為什么更新頻率低的參數其更新量相對會大些,因為這些參數對應的分母較小。但是,AdaGrad優化器也有着明顯的缺點,當\(v_t\)累積到足夠的大的時候,分式的結果會無限接近0,導致參數更新緩慢甚至根本無法被更新,使得訓練提前結束。

RMSprop

RMSProp是AdaGrad的一種改良,其計算如下式所示:

\[\begin{split} v_t &= 0.9v_{t-1} + 0.1g_t^2\\ \theta_t &= \theta_{t-1} - \dfrac{\alpha}{\sqrt{v_t + \epsilon}}g_t \end{split} \]

可以看到,這里使用的是移動指數平均,不再是AdaGrad方法中的累加和,當\(\beta\)取0.9的時候,可以看作是最近10次梯度更新量的加權平均。

Adam

Adam是上述方法的集大成者,除了使用了梯度的平方移動加權均值,也使用了梯度本身的移動加權均值。其計算如下

\[\begin{split} m_t &= \beta_1m_{t-1} + (1-\beta_1)g_t\\ v_t &= \beta_2v_{t-1} + (1 - \beta_2)g_t^2\\ \hat{m}_t &= \dfrac{m_t}{1 - \beta_1^t}\\ \hat{v}_t &= \dfrac{v_t}{1- \beta_2^t}\\ \theta_t &= \theta_{t-1} - \dfrac{\alpha}{\sqrt{\hat{v}_t+\epsilon}}\hat{m}_t \end{split} \]

從上面的表達式中,可以看到,在計算移動指數平均的時候,還進行了修正,避免了移動指數平均的冷啟動問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM