web-dev-qa-db-ja.com

TensorFlowでの勾配降下とアダグラードと運動量

ニューラルネットワークとディープラーニングの基礎知識だけでなくても、TensorFlowとその使用方法を勉強しています。

チュートリアルに続いて、私は損失の3つのオプティマイザーの実際の実際的な違いを理解していません。 API を見て、原則を理解していますが、私の質問は次のとおりです。

1。他の代わりに1つを使用することが望ましいのはいつですか?

2。知っておくべき重要な違いはありますか?

61
Kyrol

私の理解に基づいた簡単な説明を次に示します。

  • momentumhelps SGDは、関連する方向に沿ってナビゲートし、無関係の振動を和らげます。前のステップの方向の一部を現在のステップに追加するだけです。これにより、正しい方向の速度の増幅が達成され、間違った方向の振動が緩和されます。この割合は通常(0、1)の範囲にあります。適応運動量を使用することも理にかなっています。大きな運動量を学習する最初の段階ではあなたの進歩を妨げるだけなので、0.01のようなものを使用するのは理にかなっています。そして、すべての高い勾配が消えたら、より大きな運動量を使用できます。運動量には1つの問題があります。目標に非常に近い場合、ほとんどの場合、運動量は非常に高く、減速する必要があることはわかりません。これにより、最小値を逃したり振動したりする可能性があります
  • nesterov加速勾配は、早期に減速を開始することでこの問題を克服します。運動量では、最初に勾配を計算してから、その方向にジャンプして、以前の運動量で増幅します。 NAGは同じことを行いますが、別の順序で行います。最初に、保存された情報に基づいて大きなジャンプを行い、次に勾配を計算して小さな修正を行います。この一見無関係な変更により、大幅な実用的な高速化が実現します。
  • AdaGradまたは適応勾配により、学習率をパラメータに基づいて適応させることができます。頻度の低いパラメーターには大きな更新を、頻度の高いパラメーターには小さな更新を実行します。このため、スパースデータ(NLPまたは画像認識)に適しています。もう1つの利点は、基本的に学習率を調整する必要がなくなることです。各パラメーターには独自の学習率があり、アルゴリズムの特性により、学習率は単調に減少しています。これが最大の問題を引き起こします。ある時点で、学習率が非常に小さくなり、システムが学習を停止します。
  • AdaDeltaresolves AdaGradの学習率が単調に減少する問題。 AdaGradでは、学習率はおおよそ1を平方根の合計で割って計算されました。各段階で、合計に別の平方根を追加します。これにより、分母が常に増加します。 AdaDeltaでは、過去のすべての平方根を合計する代わりに、合計を減少させるスライディングウィンドウを使用します。 RMSpropはAdaDeltaに非常に似ています
  • Adamまたは適応運動量は、AdaDeltaに似たアルゴリズムです。ただし、各パラメーターの学習率を保存するだけでなく、各パラメーターの運動量の変化も個別に保存します。

    A 少数の視覚化 : enter image description hereenter image description here

SGD、Momentum、Nesterovは最後の3よりも劣っていると思います。

176
Salvador Dali

いくつかの簡単な質問に要約しましょう。

どのオプティマイザが最適な結果/精度を提供しますか?

特効薬はありません。タスクのオプティマイザーの中には、おそらく他のオプティマイザーよりもうまく機能するものがあります。事前に伝える方法はありません。最適なものを見つけるには、いくつか試してみる必要があります。良いニュースは、異なるオプティマイザーの結果がおそらく互いに近いことです。ただし、選択する単一のオプティマイザーに最適なハイパーパラメーターを見つける必要があります。

今、どのオプティマイザーを使用すべきですか?

たぶん、AdamOptimizerを取得して、learning_rate 0.001および0.0001で実行してください。より良い結果が必要な場合は、他の学習率で実行してみてください。または、他のオプティマイザーを試して、ハイパーパラメーターを調整します。

長い話

オプティマイザーを選択する際に考慮すべきいくつかの側面があります。

  • 使いやすさ(つまり、自分に合ったパラメーターをどれだけ早く見つけることができるか);
  • 収束速度(SGDとしての基本または他の高速);
  • メモリフットプリント(通常、モデルのサイズは0〜x2);
  • トレーニングプロセスの他の部分との関係。

Plain SGDは、実行可能な最小限の値です。これは、単に勾配に学習率を乗算し、結果を重みに追加するだけです。 SGDには多くの美しい特性があります。ハイパーパラメーターは1つしかありません。追加のメモリは必要ありません。トレーニングの他の部分への影響は最小限です。また、2つの欠点もあります。学習率の選択に敏感すぎる可能性があり、他の方法よりもトレーニングに時間がかかる可能性があります。

単純なSGDのこれらの欠点から、より複雑な更新ルール(オプティマイザー)が何であるかがわかります。トレーニングの高速化のためにメモリの一部を犠牲にし、場合によってはハイパーパラメーターの選択を単純化します。

メモリオーバーヘッドは通常、重要ではないため無視できます。モデルが非常に大きい場合、またはGTX760でトレーニングしている場合、またはImageNetのリーダーシップを求めて戦っている場合を除きます。運動量やNesterov加速勾配などのより単純な方法では、1.0以下のモデルサイズ(モデルハイパーパラメーターのサイズ)が必要です。 2次メソッド(アダム、2倍のメモリと計算が必要な場合があります。

収束速度-賢明なことはほとんどSGDよりも優れており、他の比較は困難です。 1つの注意点は、AdamOptimizerは、ウォームアップなしでほとんどすぐにトレーニングを開始できることです。

easy-of-useは、オプティマイザの選択において最も重要であると考えています。オプティマイザーごとにハイパーパラメーターの数が異なり、感度も異なります。私は、Adamを最も簡単に入手できるものの中で最も単純なものと考えています。通常、モデルがうまく収束するかどうかを判断するには、0.0010.0001の間の2-4のlearning_ratesをチェックする必要があります。 SGD(および勢い)の比較のために、私は通常[0.1, 0.01, ... 10e-5]を試します。 Adamには、変更する必要のあるハイパーパラメーターがさらに2つあります。

オプティマイザーとトレーニングの他の部分との関係。通常、ハイパーパラメーターの調整には、{learning_rate, weight_decay, batch_size, droupout_rate}の同時選択が含まれます。それらはすべて相互に関連しており、それぞれがモデルの正則化の形として見ることができます。たとえば、正確にweight_decayまたはL2-normが使用され、場合によってはAdamWOptimizerではなくAdamOptimizerを選択する場合、細心の注意を払う必要があります。

2
y.selivonchyk