Adam Optimizerを使用したトレーニング損失と反復のスパイクの説明


15

私はi)SGDとii)Adam Optimizerを使用してニューラルネットワークをトレーニングしています。通常のSGDを使用すると、下に示すように(赤い曲線)、スムーズなトレーニングロス対反復曲線が得られます。ただし、Adam Optimizerを使用した場合、トレーニング損失曲線にはいくつかのスパイクがあります。これらのスパイクの説明は何ですか?

モデルの詳細:

14入力ノード-> 2非表示レイヤー(100-> 40ユニット)-> 4出力ユニット

私はアダムのためのデフォルトパラメータを使用していますbeta_1 = 0.9beta_2 = 0.999epsilon = 1e-8batch_size = 32

i)SGDを使用 ii)Adamを使用SGDを使用 アダムと


将来のお知らせとして、初期学習率を下げると、Adamの急上昇をなくすことができます
太字の

回答:


12

スパイクは、アダムのミニバッチ勾配降下の避けられない結果です(batch_size=32)。一部のミニバッチには、「偶然」に最適化のための不運なデータがあり、Adamを使用してコスト関数に見られるスパイクを誘発します。確率的勾配降下法(を使用batch_size=1する場合と同じ)を試すと、コスト関数にさらにスパイクがあることがわかります。(フル)バッチGDでは、各最適化エポックですべてのトレーニングデータ(つまり、バッチサイズはトレーニングセットのカーディナリティに等しい)を使用するため、同じことは起こりません。最初の図のように、コストは順調に単調に減少していますが、(i)With SGD)は間違っているようで、SGDの代わりに(Full)Batch Gradient Descentを使用しています。

Andrew Ngは、Courseraでの彼の優れたディープラーニングコースで、以下の画像を使用してこれについて詳しく説明しています。

コスト関数


2
「SGD ...すべてのトレーニングデータを使用します」-これでよろしいですか?つまり、すべてのデータがフィードフォワードされた後で重みが更新されますが、これはsgdではなくフルバッチgdと呼ばれます。Stochasticはミニバッチを意味します
Alex

私の間違いを指摘してくれた@Alexに感謝します。すでに修正しており、詳しい情報を参考にして回答を改善しました。
xboard 2017

@xboard-いいえ、最初はミニバッチ勾配降下法を使用しています。
Abdul Fatir 2017

6

私は爆発する勾配と同様の振る舞いをデバッグするのに途方もない時間を費やしました。あなたの答えは、損失関数、データ、アーキテクチャなどに依存します。何百もの理由があります。いくつか挙げます。

  • 損失依存。対数尤度損失はクリップする必要があります。そうでない場合は、log(0)データセット内の悪い予測/異常値をほぼ評価し、爆発を引き起こす可能性があります。ほとんどのパッケージ(トーチ、テンソルフローなど)は、損失のためにデフォルトでクリッピングを実装します。
  • データセットの外れ値。
  • ϵy=(xu)/(s+ϵ)sϵy
  • データセットがbatchsizeで割り切れない場合、エポックの最終バッチは小さい可能性があります。トーチデータローダーにはフラグがありdrop_lastます。小さいバッチサイズ=高い分散

では、SGDではなくAdamでそれを見る理由は何でしょうか。明らかに、Adamの方が損失が少なくなっています。前述のように、データセットの99.9%が一部の観測を除いてある時点で最適値を持っている場合、ランダムに選択してバッチにすると、観測は「NO」と叫び、極小値から飛び出します。-ステップごとに表示されるdataset_size//batch_size+1場合、おそらく最終的なバッチサイズが小さいことが原因です。SGDのスパイクは、損失が少なくなると見られると思います。

ボーナス:モーメンタムオプティマイザー(Adam)による本当に速い減少は、一部のレイヤー(入力レイヤー?出力レイヤー?)がスケールアウトして(大きい/小さい重みに)初期化されることを意味します。

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