深層モデルのための最適化
目次
SGD
データ1つだけ をサンプルし、最急降下法にランダム性を入れる。
更新式
サンプルコード
param[key] -= self.lr * grad[key]
lr: 学習率
特徴(課題)
SGDの非効率な探索経路による。それは勾配の方向が本来の最小値ではない方向を指しているため。(それを解決するため、Momentum)
Momentum
パラメータθの更新式
サンプルコード
self.v[key] = self.momentum[key] * self.v[key] - self.lr * grads[key] param[key] += self.v[key]
lr: 学習率
特徴
大域的な最適解。学習率の値が重要である。小さすぎると学習時間が長い、大きいと発散する。大きく学習して、どんとん小さく学習する(学習係数を徐々に下げていく)
Nesterov
パラメータθの更新式
- >
サンプルコード
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
更新式
サンプルコード
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
過去のすべての勾配を均一に加算しない。過去の勾配を徐々に忘れて、新しい勾配情報を大きく反映されるように加算する(指数移動平均)
更新式
サンプルコード
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]
特徴
Adam
更新式
サンプルコード
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)
特徴