【Adam】パラメータ最適化アルゴリズムAdamを実装するコード【Python】

スポンサーリンク

【Adam】パラメータ最適化アルゴリズムAdamを実装するコード【Python】

Adamクラスの定義

Adamでの重み更新は以下のような式になる。

これを実装すると以下のようなコードになる。

Adamクラスを定義する。

# Adam
class Adam:
    def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):
        self.lr = lr
        self.beta1 = beta1
        self.beta2 = beta2
        self.iter = 0
        self.m = None
        self.v = None
        
    def update(self, params, grads):
        if self.m is None:
            self.m, self.v = {}, {}
            for key, val in params.items():
                self.m[key] = np.zeros_like(val)
                self.v[key] = np.zeros_like(val)
        
        self.iter += 1
        
        for key in params.keys():
            self.m[key] = self.beta1 * self.m[key] + (1 - self.beta1) * grads[key]
            self.v[key] = self.beta2 * self.v[key] + (1 - self.beta2) * (grads[key]**2)
            m_unbias = self.m[key] / (1 - self.beta1**self.iter)
            v_unbias = self.v[key] / (1 - self.beta2**self.iter)
            params[key] -= self.lr * m_unbias / (np.sqrt(v_unbias) + 1e-7)

Adamを学習で用いるtrain関数で利用する

これをモデル学習で用いるtrain関数内で取り入れると以下のコードになる。

def train(x, t, eps=0.005):
    global W, b # 重みとバイアス
    batch_size = x.shape[0]
    
    t_hat = softmax(np.matmul(x, W) + b)

    cost = (- t * np_log(t_hat)).sum(axis=1).mean()
    delta = t_hat - t

    dW = np.matmul(x.T, delta) / batch_size
    db = np.matmul(np.ones(shape=(batch_size,)), delta) / batch_size

    # Adamでパラメータ更新
    params = {'W': W, 'b': b}
    grads = {'W': dW, 'b': db}
    adam.update(params, grads)
    return cost

基本的なモデル学習を行うプログラムは以下に詳しく書いているので参照↓

参考

人気記事

人気記事はこちら。

CUDA、cuDNNのバージョンをターミナルで調べるコマンド
【Pytorch】テンソルを連結する方法(cat・stack)
【Pytorch】テンソルの次元を追加・削除する方法【dim】
【Protobuf】"TypeError: Descriptors cannot not be created directly."を解決する【solved】
【Python】Tensorflowをダウングレード・アップグレードするコマンド

タイトルとURLをコピーしました