ニューラルネットワークをトレーニングするためのトレードオフバッチサイズと反復回数


222

ニューラルネットワークをトレーニングする場合、設定するとどのような違いがありますか?

  • バッチサイズを、反復回数をab
  • vs.バッチサイズ、反復回数cd

ここで、?ab=cd

別の言い方をすれば、同じ量のトレーニング例でニューラルネットワークをトレーニングすると仮定して、最適なバッチサイズと反復回数を設定する方法は?(ここで、バッチサイズ*反復数=ニューラルネットワークに表示されるトレーニング例の数、同じトレーニング例が複数回表示される可能性があります)

バッチサイズが大きいほど、必要なメモリスペースが多くなり、多くの場合計算が速くなることを認識しています。しかし、訓練されたネットワークのパフォーマンスに関して、それはどのような違いをもたらしますか?


1
Cifar-10データセットの精度に対するさまざまなバッチサイズの影響を比較しながら、適切なバッチサイズを選択する方法を説明するこのブログをご覧ください。
Teja Sreenivas

回答:


208

Nitish Shirish Keskar、Dheevatsa Mudigere、Jorge Nocedal、Mikhail Smelyanskiy、Ping Tak Peter Tangから。ディープラーニングのための大規模バッチトレーニング:一般化ギャップとシャープミニマ。https://arxiv.org/abs/1609.04836

確率的勾配降下法とその変形は、多くの深層学習タスクに最適なアルゴリズムです。これらの方法は、通常は32〜512個のデータポイントであるトレーニングデータの一部をサンプリングして勾配の近似値を計算する小バッチ方式で動作します。実際には、より大きなバッチを使用すると、モデルの一般化能力によって測定されるように、モデルの品質が大幅に低下することが観察されています。大規模バッチ方式におけるこの一般化の低下の原因を調査するいくつかの試みがありましたが、この現象の正確な答えはこれまで知られていません。この論文では、ラージバッチ法はトレーニングおよびテスト関数のシャープミニマライザーに収束する傾向があり、シャープミニマムは一般化の低下につながるという見解を支持する十分な数値的証拠を提示します。対照的に、小バッチ法は一貫してフラットミニマイザーに収束し、我々の実験は、これが勾配推定に固有のノイズによるものであるという一般的な見解を支持しています。また、大規模バッチ方式が一般化のギャップを解消し、一連の将来の研究アイデアと未解決の質問を締めくくるのに役立ついくつかの経験的戦略についても説明します。

[…]

一般化能力の欠如は、ラージバッチ法がトレーニング関数の鋭い最小化に収束する傾向があるという事実によるものです。これらの最小化子は、大きな正の固有値によって特徴付けられ、 あまり一般化されない傾向があります。対照的に、小バッチ法は、小さな正の固有値を特徴とするフラット収束します。ディープニューラルネットワークの損失関数のランドスケープは、大バッチ法がほとんど常に鋭い最小値を持つ領域に引き付けられ、小バッチ法とは異なり、これらの最小化器の盆地から逃れることができないことを観察しました。2f(x)2f(x)

[…]

ここに画像の説明を入力してください

また、勾配を計算するためにトレーニングセット全体を使用しない理由に 答えるIan Goodfellowからの優れた洞察もあります。 Quoraで:

学習率のサイズは、主にコスト関数がどの程度湾曲しているかなどの要因によって制限されます。勾配降下法は、コスト関数の線形近似を行い、その近似コストに沿って下り坂で移動すると考えることができます。コスト関数が非常に非線形(高度に湾曲している)の場合、近似はあまり遠くまではあまり良くないので、小さなステップサイズのみが安全です。詳細については、数値計算に関するディープラーニングの教科書の第4章をご覧ください。http//www.deeplearningbook.org/contents/numerical.html

ミニバッチにm個の例を配置する場合、O(m)計算を行い、O(m)メモリを使用する必要がありますが、勾配の不確実性の量をO(sqrt(m))の係数だけ減らします。言い換えれば、ミニバッチにより多くの例を入れると限界収益が減少します。詳細については、ディープラーニングの最適化アルゴリズムに関するディープラーニングの教科書の第8章をご覧ください。http//www.deeplearningbook.org/contents/optimization.html

また、考えてみると、トレーニングセット全体を使用しても、実際の勾配は得られません。真の勾配は、データ生成分布によって重み付けされた、考えられるすべての例についての期待値を使用した予想勾配です。トレーニングセット全体を使用すると、非常に大きなミニバッチサイズが使用されます。ミニバッチのサイズは、計算に費やす量ではなく、データ収集に費やす量によって制限されます。

関連:バッチ勾配降下と確率的勾配降下


batch_sizeはトレーニングデータセットをバッチに分割するだけなので、データセット(非テンポラル)を再配置してすべてのバッチで均一な分散を持たせるのは理にかなっていますか?そうすることで、バッチサイズの最適化の必要性を減らすことができます。これは、より速い収束を見つけるのに適しています。もしそうなら、それはどのように行われますか?私はそれがより平坦な最小値を提供しないかもしれないと考えていました。詳細なガイダンスをいただければ幸いです。
user12348

@ user12348データセットをどのように再配置しますか?与えられたデータ次元がトレーニング後に特定の特徴ベクトルを生成するとどのように推定できますか?
クラウドチョー

46

ミニバッチ確率的勾配降下アルゴリズムでバッチサイズを削減し、それをより少ない反復でより大きなバッチサイズと比較することについて話していると思います。

アンドリューNg。MLおよびニューラルネットワークに関する彼のオンラインコースラクラスで、これといくつかのビジュアルについての良い議論を提供します。したがって、この投稿の残りの部分は、主にそのクラスからの彼の教えの逆流です。

2つの極端な例を見てみましょう。片側では、各勾配降下ステップがデータセット全体を使用しています。すべてのサンプルの勾配を計算しています。この場合、ローカルミニマムに向かって直接ベストを正確に知ることができます。間違った方向に進む時間を無駄にしません。したがって、数値勾配降下ステップの観点からは、そこに到達することはほとんどありません。

もちろん、データセット全体の勾配を計算するのは高価です。だから今、私たちは他の極端に行きます。わずか1サンプルのバッチサイズ。この場合、そのサンプルの勾配により、完全に間違った方向に進む可能性があります。しかし、1つの勾配を計算するコストは非常に簡単でした。1つだけのサンプルに関してステップを実行すると、少し「さまよう」ことはできますが、平均的には、フルバッチグラディエント降下の場合と同様に合理的なローカルミニマムに向かいます。

これは、1サンプルの確率的勾配降下をバウンスすることで、フルバッチモードでは回避できないローカルミニマムからのバウンスに役立つ可能性があることを示唆している文献を見たことがあることを指摘する瞬間かもしれませんが、それは議論の余地があります。ここで他のいくつかの良い答えは、私が持っているよりも直接この質問に答えます。

計算能力の点では、単一サンプルの確率的GDプロセスは多くの反復を必要としますが、「通常」フルバッチモードよりも少ないコストで到達できます。これがAndrew Ngの言葉です。

それでは、あなたが尋ねた中間点を見つけましょう。最新のBLASライブラリはベクトル数学の計算を非常に効率的にするので、コードを適切にベクトル化したと仮定して、一度に10または100サンプルを計算すると、1サンプルを計算するよりもほとんど手間がかかりません(メモリ呼び出しの効率と最も効率的な数学ライブラリに組み込まれた計算のトリック)。そして、10、100、1000サンプルのバッチで平均化すると、真の完全なバッチモード勾配のより合理的な近似である勾配が生成されます。そのため、ステップはより正確になりました。つまり、収束するために必要なステップは少なくなり、コストはシングルサンプルGDよりわずかに高くなります。

使用すべきミニバッチの正確なサイズの最適化は、一般的に試行錯誤に委ねられています。数十から数千の範囲の数のデータセットのサンプルに対していくつかのテストを実行し、どれが最も速く収束するかを確認してから、それを実行します。これらの範囲のバッチサイズは、文献全体で非常に一般的なようです。また、データが本当にIIDである場合、ランダムプロセスの変動に関する中心極限定理は、これらの範囲が完全な勾配の合理的な近似であることも示唆します。

反復を停止するタイミングを正確に決定するには、通常、一般化エラーを未検証の検証セットに対して監視し、検証エラーが最も低いポイントにあるポイントを選択します。繰り返しのトレーニングが多すぎると最終的にオーバーフィッティングになり、その時点で検証セットのエラーが上昇し始めます。これが発生しているのを確認したら、最適な時点で停止します。


22

TL; DR:ミニバッチのサイズが大きすぎると、通常、精度が低下します!

興味がある人のために、ここに説明があります。

速度には2つの概念があります。

  • 計算速度
  • アルゴリズムの収束速度

計算速度は、単にハードウェアで数値計算を実行する速度です。あなたが言ったように、それは通常、より大きなミニバッチサイズで高くなります。これは、線形代数ライブラリがベクトル演算と行列演算にベクトル化を使用してそれらを高速化するため、より多くのメモリを使用するためです。ゲインは、ある時点まで大きくなる可能性があります。私の経験から、ある時点で速度の向上はわずかしかありません。ポイントは、データセット、ハードウェア、および数値計算(内部)に使用されるライブラリによって異なります。

しかし、他の速度の概念もあることを忘れないでください。これは、アルゴリズムの収束速度を示しています。

まず、アルゴリズムが収束することはどういう意味ですか?さて、検証セットで計算された精度またはエラーに満足したかどうかを定義して決定するのは私たち次第です。事前に定義してアルゴリズムがその時点に達するのを待つか、トレーニングプロセスを監視して、検証エラーが大幅に増加し始めたときに停止することを決定できます(モデルがデータセットを過剰適合し始めます)。Stochastic Gradient Descent(SGD)を使用しているため、ミニバッチで作業している場合、エラーが発生し始めた瞬間にすぐに停止しないでください。(フルバッチ)Gradient Descentの場合、各エポックの後、アルゴリズムは、ローカルまたはグローバルのいずれであっても、最小限に落ち着きます。SGDが実際に最低限に収まることはありません。それはその周りで振動し続けます。無期限に続く可能性がありますが、

今、すべてのその理論の後、私たちが注意を払う必要がある「キャッチ」があります。小さいバッチサイズを使用する場合、大きいバッチサイズを使用する場合よりも誤差の計算にノイズが多くなります。まあ、それは悪いことだと思うでしょうか?ノイズは、アルゴリズムが悪いローカルミニマムから飛び出し、より良いローカルミニマム、またはできればグローバルミニマムを見つける可能性が高くなるということです。

したがって、「望ましくない」ノイズの助けを借りて、大きなバッチサイズではなく小さなバッチサイズを使用することにより、より良いソリューションをより迅速に見つけることができる場合、アルゴリズムが満足のいくものを見つけるのにかかる合計時間を調整できますソリューションとより高い精度。

私が言いたいのは、多くの人が信じているように、与えられた精度(またはエラー)に対して、バッチサイズを小さくすると、総トレーニング時間が短くなる可能性があります。

または、以前と同じトレーニング時間を維持することにした場合、小さなバッチサイズでわずかに高い精度が得られる可能性があり、特に学習率を適切に選択した場合は、おそらくそうなります。

時間がある場合は、このペーパーを ご覧 ください。ImageNetでのCNNの体系的な評価特に、「3.7。バッチサイズと学習率」、および図8を確認してください。大きなミニバッチサイズは、精度の低下につながります。 、学習率をヒューリスティックに調整しても。

一般に、32のバッチサイズは開始点として適切であり、64、128、および256でも試してください。一部のデータセットでは他の値(より低いまたはより高い)で問題ない場合がありますが、通常、指定された範囲が最適ですで実験を開始します。ただし、32未満では、ベクトル化を最大限に活用していないため、計算速度が大幅に低下するため、速度が低下しすぎる場合があります。「メモリ不足」エラーが発生した場合は、とにかくミニバッチサイズを小さくしてみてください。

そのため、メモリに収まる最大のミニバッチサイズを使用するだけではありません。

結論として、質問に答えるために、小さいミニバッチサイズ(小さすぎない)は、通常、大きいバッチサイズよりもトレーニングアルゴリズムの反復回数が少ないだけでなく、全体としてより高い精度にもつながります。同じトレーニング時間以下でより良いパフォーマンスを発揮するニューラルネットワーク。

ノイズが大きいと、ローカルの悪い最小値から飛び出すのを助けることができることを忘れないでください。


14

この質問に別の回答を追加して、この質問にほぼ直接対処するGoogleの新しい(2018年の)ICLR会議論文を参照します。

タイトル:学習率を低下させず、バッチサイズを大きくする

https://arxiv.org/abs/1711.00489

上記の論文の要約をここにコピーします。

学習率を低下させることは一般的な習慣です。ここでは、通常、トレーニング中にバッチサイズを大きくすることで、トレーニングセットとテストセットの両方で同じ学習曲線を取得できることを示します。この手順は、確率的勾配降下(SGD)、勢いのあるSGD、Nesterovの勢い、およびAdamで成功します。同数のトレーニングエポックの後、同等のテスト精度に達しますが、パラメーターの更新が少ないため、並列処理が大きくなり、トレーニング時間が短縮されます。学習率を増加し、バッチサイズBをスケーリングすることにより、パラメーターの更新回数をさらに減らすことができます。最後に、運動量係数mを増やし、B∝1 /(1-m)をスケールできますが、これはテストの精度をわずかに低下させる傾向があります。重要なのは、当社の手法により、ハイパーパラメータの調整なしで、既存のトレーニングスケジュールを大規模なバッチトレーニングに再利用できます。ImageNetでResNet-50を30分以内に76.1%の検証精度でトレーニングします。


1
大きなメモリ要件は、単に値を減らすことを避けるための悪いトレードオフのようです。また、トレーニング中にメモリフットプリントが増大するIMHOでは、スケーラブルなアルゴリズムが少なくなります。
P-Gn

3

ここで経験的な経験を見せます。バッチサイズ4とバッチサイズ4096で実験を行いました。サイズ4096は、1024倍少ない逆伝播を行っています。したがって、私の直感では、より大きなバッチは最適なソリューションの検索ステップをより少なく、より粗くするので、構築により最適なソリューションに収束する可能性は低くなります。

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