深層モデルのための最適化

目次

SGD

データ1つだけ をサンプルし、最急降下法にランダム性を入れる。
更新式
        {\mathbf{w}  \gets  \mathbf{w} - \eta \frac{\partial L}{\partial \mathbf{w}}}

サンプルコード

param[key] -= self.lr * grad[key]     

lr: 学習率

特徴(課題)
 SGDの非効率な探索経路による。それは勾配の方向が本来の最小値ではない方向を指しているため。(それを解決するため、Momentum)

Momentum

パラメータθの更新式
        {\mathbf{v}  \gets  \alpha \mathbf{v} - \eta \frac{\partial L}{\partial \mathbf{w}}}
        {\mathbf{w}  \gets  \mathbf{w}  + \mathbf{v}}

サンプルコード

self.v[key] = self.momentum[key] * self.v[key] - self.lr * grads[key]
param[key] += self.v[key]     

lr: 学習率

特徴
大域的な最適解。学習率の値が重要である。小さすぎると学習時間が長い、大きいと発散する。大きく学習して、どんとん小さく学習する(学習係数を徐々に下げていく)

Nesterov

パラメータθの更新式 
      v_{t+1} =  \alpha v_t - \eta \frac{\partial L}{\partial(\eta_t + \alpha v_t)}
 \theta_{t+1} = \theta_t + \alpha v_{t+1}

  • >  \Theta_{t+1} = \Theta_t + \alpha^2 v_t - (1+ \alpha)\eta\frac{\partial L}{\partial\Theta_t}


サンプルコード

self.v[key] *= self.momentum
self.v[key]-=self.lr * grads[key]
param[key] += self.momentum* self.momentum* self.v[key]
param[key] -= (1+self.momentum) * self.lr * grads[key]    

AdaGrad

更新式
       h \gets h +  (\frac {\partial L} {\partial \mathbf{w}})^{2}
        \mathbf{w}  \gets  \mathbf{w} -  \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial \mathbf{w}}

サンプルコード

for key in params.keys():
    self.h[key]   += grads[key] * grads[key]
    params[key]  -= self.lr * (1/np.sqrt(self.h[key]+1e-7)) * grads[key]  

特徴
AdaGradの更新量が0に近づく、パラメータは更新しない
AdaGradは各パラメータの要素ごとに学習率を調整して学習する。各要素の学習率を決めるため変数hとする。勾配の絶対値の大きい要素に更新量を小さくし、勾配の絶対値の小さい要素に更新量を大きくすることで、学習率を調整する。

RMSProp

 過去のすべての勾配を均一に加算しない。過去の勾配を徐々に忘れて、新しい勾配情報を大きく反映されるように加算する(指数移動平均

更新式
        \mathbf{h}  \gets  \mathbf{h} * decay
        \mathbf{h}  \gets  \mathbf{h}  +  (1-decay) \frac{\partial L}{\partial \mathbf{w}} \frac{\partial L}{\partial \mathbf{w}}
        \mathbf{w}  \gets  \mathbf{w}  -   \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial \mathbf{w}}

サンプルコード

self.h[key] *= self.decay_rate
self.h[key] += (1-self.decay_rate)*grads[key]*grads[key]
params[key] -= self.lr * (1/np.sqrt(self.h[key]+1e-7)) * grads[key] 

特徴

AdaDelta

ニュートン法を勾配降下法で近似することでロバストな学習率
更新式

サンプルコード

特徴

Adam

更新式
        m_{t+1} = \rho_{1} m_{t} + (1 - \rho_{1}) \frac{\partial L}{\partial \mathbf{w}}
        v_{t+1} = \rho_{2} v_{t} + (1 - \rho_{2}) \frac{\partial L}{\partial \mathbf{w}}  \frac{\partial L}{\partial \mathbf{w}}
        \mathbf{w}_{t+1} = \mathbf{w}_{t} - \eta \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}

サンプルコード

self.m[key] = self.rho1 * self.m[key] + (1-self.rho1)* grads[key]
self.v[key] = self.rho2 * self.v[key] + (1-self.rho2)* grads[key]*grads[key]
params[key] -= self.lr * m/ (np.sqrt(v) +self.epsilon) 

特徴