[ゼロから作るDeep Learning]Momentum手法とAdaGrad手法の実装


はじめに

この記事はゼロから作るディープラーニング 7章学習に関するテクニックを自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

Momentum手法実装

class Momentum:
    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr # 学習率
        self.momentum = momentum # モーメンタム定数
        self.v = None # 速度

    def update(self, params, grads):
        if self.v is None: # 最初だけ各パラメータの速度を初期化する
            self.v = {}
            for key,val in params.items():
                self.v[key] = np.zeros_like(val) # 各パラメータの速度にゼロを入れて初期化する

        for key in params.keys():
            self.v[key] = self.momentum *self.v[key] - self.lr * grads[key] # 現在の地点での速度を求める
            params[key] = params[key] + self.v[key]

Momentum手法では速度という概念を使うので、まず最初にインスタンス変数で速度を作成します。

勾配から現在の地点の速度を求め、それを現在の重みパラメータにそれぞれ足して、パラメータを更新します。

AdaGrad手法の実装

class AdaGrad: # 学習係数の減衰を各パラメータに行える
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None

    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key,val in params.items():
                self.h[key] = np.zeros_like(val)
        for key in params.keys():
            self.h[key] = self.h[key] + (grads[key] * grads[key]) # 各パラメータの勾配の二乗和をhに入れていく
            params[key] = params[key] - ((self.lr * grads[key] )/ (np.sqrt(self.h[key]) + 1e-7))

AdaDrad手法に関しては、前回の記事に書いた式をそのまま実装するだけなので、解説する必要はありません。

学習係数を少しずつ小さくしていき、SGDのように引き算をします。