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による最適化という記事がわかりやすいと感じました。
Perl AI深層学習入門