Adam - SGDを改善したパラメーター更新最適化アルゴリズム
AdamはSGDを改善したパラメーター更新最適化アルゴリズムです。SGDにおける学習率の部分が、訓練を行う毎に更新されていくことが特徴です。ひとつ前で行った更新量を、考慮にいれるというところも特徴です。
ひとつのパラメーターを更新する場合におけるAdamのアルゴリズムをPerlで書いてみます。バイアスを更新する場合のサンプルです。重みの場合も同じです。
AdamをPerlのコードで書いてみました。
# Adam use strict; use warnings; # ハイパーパラメーター my $biase = 0.14; my $learning_rate = 0.001; my $much_small_value = 1e-8; my $before_moment_weight = 0.9; my $before_velocity_weight = 0.999; # モーメントの値 my $moment = 0; # ヴェロシティの値 my $velocity = 0; for (my $i = 0; $i < 10; $i++) { my $grad = calc_grad(); $moment = $before_moment_weight * $moment + (1 - $before_moment_weight) * $grad; $velocity = $before_velocity_weight * $velocity + (1 - $before_velocity_weight) * $grad * $grad; my $cur_moment = $moment / (1 - $before_moment_weight); my $cur_velocity = $velocity / (1 - $before_velocity_weight); $biase -= ($learning_rate / (sqrt($cur_velocity) + $much_small_value)) * $cur_moment; } # 傾きを求める sub calc_grad { # 便宜的な値を返す my $grad = rand; return $grad; }
初期値の推奨と呼ばれているものは以下です。ただしこれは、初期値であって、正答率が速く上昇し、最終的な正答率を高くするためには、最適に設定する必要があります。
my $learning_rate = 0.001; my $much_small_value = 1e-8; my $before_moment_weight = 0.9; my $before_velocity_weight = 0.999;
Adamの式にはどのような意味があるのですか?
僕には、よくわかりません。Adamによる最適化という記事がわかりやすいと感じました。