E資格用語の備忘録
シラバス2024 3.深層学習の基礎 (2)深層モデルのための最適化 ⅲ.適応的な学習率を持つアルゴリズム
AdaGrad
各パラメータに対して学習率を適応的に調整することで、スパースな勾配更新問題に対処。
過去の勾配の二乗和の平方根で学習率を割ることで、頻繁に更新されるパラメータの学習率を小さくし、稀に更新されるパラメータの学習率を大きくする。
import numpy as np
# 最適化手法 : AdaGrad
class AdaGrad:
# 学習率を0.01で初期化
def __init__(self, lr=0.01):
self.lr = lr
self.h = None # 二乗和を保持する変数
# パラメータの更新、パラメータと勾配を受け取る
def update(self, params, grads):
# 初回、過去の二乗和が無い状態
if self.h is None:
# 空の辞書を代入
self.h = {}
# 各パラメータのキーと値を順に取得、.items()は辞書のすべてのキーと値のペアを返すメソッド
for key, val in params.items():
# valと同じ形状のゼロ配列を生成
self.h[key] = np.zeros_like(val)
# パラメータの各キーを順に取得、.keys()は辞書のすべてのキーを返すメソッド
for key in params.keys():
# 二乗和
self.h[key] += grads[key] * grads[key]
# 学習率をhの平方根を用いてパラメータを更新
# 1e-7はルートの中か外か、どちらでもよい
params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
RMSProp
AdaGradの問題点として、学習が進むにつれて学習率が急激に減少する傾向があるが、RMSPropは過去の勾配の二乗和の指数移動平均を用いて学習率を現在のデータをより重視するよう調整し、より安定した学習が可能となった。
更新が頻繁なパラメータは小さく更新され、更新が滅多に無いパラメータは大きく更新される。
Adam
モーメンタムとRMSPropを組み合わせた手法。
勾配の一次モーメント(平均)と二次モーメント(分散)の指数移動平均を計算し、それぞれのパラメータの学習率を調整する。イテレーションが進むにつれバイアス補正は小さくなる。