指数関数的減衰を伴うAdamオプティマイザー


53

ほとんどのTensorflowコードで、Adam Optimizerが一定の学習率1e-4(つまり0.0001)で使用されているのを見ました。通常、コードは次のようになります。

...build the model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

私は、adamオプティマイザーを使用するときに指数関数的減衰を使用すること、つまり次のコードを使用することが有用かどうか疑問に思っています。

...build the model...
# Add the optimizer
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.15, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate).minimize(cross_entropy, global_step=step)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

通常、人々は何らかの学習率の減衰を使用します。アダムにとっては珍しいようです。これには理論的な理由はありますか?Adamオプティマイザーと減衰を組み合わせると便利ですか?


反復ごとに更新するステップ変数をどのように取得しますか?
-perrohunter

@perrohunter:のglobal_stepパラメーターを使用しますminimize。編集を参照してください。
チャールズスターツ

9
注:1e-4= 0.0001ではなく0.0004
クリフAB

「global_step = step」を割り当てていますが、「step」変数がどのように更新されているかわかりません...明確にしてください。
ディエゴ・

@Diego:遅い答えですが:global_stepパラメーターとして最小化するステップ変数を渡すと、最小化が呼び出されるたびに、最小化関数がglobal_stepパラメーターを増加させます。最小化のドキュメントを参照してください。これは、ミニバッチを実行すると、エポックごとだけでなく、ミニバッチごとにステップ変数が更新されることを意味することに注意してください。
-dimpol

回答:


37

経験的に言えば、間違いなく試してみてください。非常に有用なトレーニングヒューリスティックが見つかる場合があります。その場合は、共有してください。

通常、人々はある種の腐敗を使用します。アダムにとっては珍しいようです。これには理論的な理由はありますか?Adamオプティマイザーと減衰を組み合わせると便利ですか?

ADAMオプティマイザーを使用する人々のコードを見て、これが真実かどうかを確認できませんでした。もしそれが本当なら、おそらくADAMは比較的新しく、学習率の減衰の「ベストプラクティス」がまだ確立されていないからでしょう。

αt=α/t

簡単に言えば、ADAMで学習率減衰ルールを使用することを理論の何も妨げるとは思わない。私は人々がADAMを使用していくつかの良い結果を報告し、いくつかの良いトレーニングヒューリスティックを見つけることは信じられないほど貴重だと見ています。


12

ほとんどの人が学習レートの減衰をAdamで使用しない理由は、アルゴリズム自体が以下の方法で学習レートの減衰を行うためです。

t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)

ここt0で、は初期タイムステップでありlr_t、使用される新しい学習率です。


4
これが事実かどうかはわかりません。係数sqrt(1 - beta2^t) / (1 - beta1^t)は減衰しません。これは、一次および二次モーメント推定値の初期化を補償するようです。
タイス

25
この答えは間違っています。tが無限大になると、その係数は1.0に近づきます。サイドノート:ここでlearning_rateは修正されました。時刻t-1の学習率ではありません。
rd11

8

Adamは、更新を適応的に計算しながら、初期学習率、または元の論文の用語に従ってステップサイズを使用します。また、ステップサイズは、更新のおおよその範囲を提供します。この点で、トレーニングの終わりに向かってステップサイズを小さくすることをお勧めします。これは、NIPS 2017の最近の研究「機械学習における適応勾配法の限界値」でもサポートされています。

セクション4:深層学習実験の最後の行には、

従来の知識では、Adamは調整が不要であることが示唆されていますが、Adamの初期学習率と減衰スキームを調整すると、すべての場合でデフォルト設定を大幅に改善できることがわかります。

最後になりましたが、この論文では、とにかくSGDを使用することを提案しています。


2

@Indie AIの意見に同意します。ここで他の情報を提供します。

CS231nから:

...これらのメソッドの多くは、他のハイパーパラメーター設定を必要とする場合がありますが、議論は、未加工の学習率よりも広い範囲のハイパーパラメーター値に対して適切に動作するということです。...

また、コンピュータービジョンセクション8のインセプションアーキテクチャを再考した論文からも:

...最良のモデルは、RMSProp [21]を使用して、減衰0.9およびε= 1.0で達成されました。0.045の学習率を使用し、0.94の指数率を使用して2エポックごとに減衰しました。...


2

人が太っているかどうか、身長と体重を考慮して、bmiを計算するデータを作成し、27を超える場合、その人は太っています。とても簡単な基本データ。Adamをオプティマイザーとして使用し、学習率を0.001にすると、精度は5エポックで約85%になり、100エポック以上で最大90%に達します。

ただし、85%で再び読み込み、0.0001の学習率を行うと、精度は3エポックを超えて95%になり、さらに10エポックは約98〜99%になります。学習率が0.0001の4桁を下回るかどうかはわかりませんが、モデルを再度読み込んで0.00001を使用すると、accucaryは99.20-100%付近でホバリングし、下に下がりません。繰り返しますが、学習率が0とみなされるかどうかはわかりませんが、とにかく、それが私が持っているものです...

これはすべてcategorical_crossentropyを使用しますが、mean_squareはこのメソッドを実行しても99-100%になります。AdaDelta、AdaGrad、Nesterovは65%以上の精度を得ることができませんでした。


0

Adamの学習率の減衰はRSMPropの学習率の減衰と同じであり(この回答からわかるように)、これは振動をダンプする前の勾配の大きさにほとんど基づいています。そのため、指数関数的減衰(トレーニングプロセスに沿った学習率の低下)を同時に採用できます。それらはすべて学習率を低下させますが、目的異なります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.