この記事は、Zhihu の質問「ディープラーニングの分散トレーニングにおける大規模バッチ サイズと学習率の関係をどのように理解すればよいですか?」に対する Tan Xu の回答から生まれました。 問題の詳細: ディープラーニングで分散トレーニングを実行する場合、同期データ並列処理、つまりトレーニングに大きなバッチ サイズが使用されることがよくあります。ただし、一般的に、大規模なバッチは、小規模なベースライン バッチ サイズよりもパフォーマンスが低下します。大規模なバッチで小規模なバッチと同じ収束精度と速度を達成できるように学習率を調整する方法を理解するにはどうすればよいでしょうか? 答え: 最近、マルチ GPU 分散トレーニングを実施する際に、大規模なバッチと学習率を理解してデバッグするという問題にも遭遇しました。ベースラインのバッチサイズと比較すると、マルチマシン同期並列処理(同期並列通信フレームワーク NCCL を紹介した以前の回答がありました(Tan Xu: Nvidia のマルチ GPU マルチカード通信フレームワーク NCCL を理解するには?)ので、興味があれば確認してください)は、バッチサイズを増やすことと同等です。慎重に設計しないと、大きなバッチの収束効果は、ベースラインの小さなバッチ サイズよりも悪くなることがよくあります。そこで、私の理解と実験を以下のようにまとめます。これは主に3つの側面に分かれています。(1) SGD、ミニバッチSGD、GDの理解、(2) 大規模バッチと学習率のデバッグ関係、(3) 私たちの実験です。 (1)SGD、ミニバッチSGD、GDの理解 機械学習の最適化アルゴリズムでは、GD (勾配降下法) が最も一般的に使用される方法の 1 つです。簡単に言えば、トレーニング セット全体の現在の勾配を計算し、更新のステップ サイズを選択します。 GD の利点は、データセット全体から取得された勾配に基づいて勾配推定が比較的正確であり、更新プロセスがより正確になることです。ただし、欠点もいくつかあります。 1 つは、トレーニング セットが大きい場合、GD の勾配計算に時間がかかることです。第二に、現代のディープラーニング ネットワークの損失関数は非凸であることが多く、凸最適化理論に基づく最適化アルゴリズムは局所最小値にしか収束できません。したがって、GD を使用してディープ ニューラル ネットワークをトレーニングする場合、最終的な収束点は初期点の近くの局所的最小値に落ちる可能性が高く、良好な収束パフォーマンスを達成することは容易ではありません。 もう一方の極端な例は SGD (確率的勾配降下法) で、勾配を計算するために毎回 1 つのサンプルのみを使用します。この利点は、計算が高速であり、オンライン学習データがストリーミング方式で到着するシナリオに非常に適していることです。ただし、欠点は、単一のサンプルによって生成される勾配推定が不正確になることが多いため、非常に小さい学習率を使用する必要があることです。さらに、現代のコンピューティング フレームワークでは CPU/GPU がマルチスレッド化されているため、単一のサンプルでは CPU/GPU を完全に活用することが難しいことが多く、コンピューティング リソースが無駄になります。 妥協案はミニバッチであり、バッチサイズのサンプルを使用して一度に勾配を推定します。この方法により、勾配推定は SGD よりも正確になります。同時に、バッチ サイズは CPU/GPU のコンピューティング リソースを最大限に活用でき、GD のようにトレーニング セット全体を計算する必要はありません。同時に、ミニバッチは適切な勾配ノイズを持つことができるため[8]、GDが初期点付近の局所最小値に直接陥って収束性が悪くなるという欠点をある程度緩和できるため、ミニバッチ法は最も一般的に使用されています。 バッチ サイズの増加が勾配推定の精度に与える影響は、次のように分析されます。 バッチサイズが m であると仮定すると、ミニバッチの場合、損失は次のようになります。 勾配 ミニバッチ全体の勾配分散は次のようになります。 各サンプル は訓練サンプルセットのサンプルからランダムに取得され、iid仮定を満たすので、サンプル勾配の分散は等しくなり、 SGD の勾配分散と同様に、バッチ サイズを m 倍に増やすことは勾配の分散を m 倍に減らすことと同等であり、勾配がより正確になることがわかります。 分散を元の SGD と同じに保ちたい場合 (これは、大きな分散帯域幅容量を与えることと同等です)、lr を増やしてこの分散容量を最大限に活用することができます。上記の式にlrを加え、分散変化の式を使うと、次の式が得られます。 したがって、lrをsqrt(m)倍に増やすことでトレーニング速度を向上させることができます。これは、線形スケーリングルール[4]の前にlrを増やすために多くの人が使用する方法でもあります。次のセクションでは、lr の増加の問題について詳しく説明します。 (2)大規模バッチと学習率 分散トレーニングでは、データ並列ワーカーの数が増えるにつれてバッチ サイズも増加します。ベースラインのバッチ サイズが B、学習率が lr、トレーニング エポック数が N であると仮定します。ベースラインの学習率を維持すると、通常、良好な収束速度と精度は得られません。理由は次のとおりです。収束速度については、ワーカーが k 個あり、毎回渡されるサンプル数が kB であると仮定すると、1 エポックでの更新回数はベースラインの 1/k となり、各更新の lr は変化しません。したがって、ベースラインと同じ更新数を達成するには、エポックの数を増やす必要があり、最大で k*N エポックを追加する必要があります。したがって、収束加速係数は k よりもはるかに低くなります。収束精度に関しては、バッチサイズの増加により、勾配推定がバデライン勾配よりも正確になり、ノイズが減少し、近くの局所最小値に収束しやすくなります。これは、GD の効果に似ています。 この問題を解決する 1 つの方法は、lr を増やすことです。バッチが大きくなるにつれて、勾配推定はより正確になり、ベースラインの勾配よりも確実になります。したがって、lr を増やすと、より正確な勾配を使用して収束速度を上げることができます。同時に、lr を増やして各ステップの振幅を可能な限り大きくします。鋭い極小値[8](鋭い極小値という用語はまだ議論の余地があるため、ここではこの用語を使用します)に遭遇した場合、そこから抜け出してより良い場所に収束できる可能性があります。 ただし、lr を制御なしに増加させることはできません。その理由は以下のように分析されます。ディープ ニューラル ネットワークの損失面は、多くの場合、高次元で高度に非線形です。滑らかな y=x^2 曲線とは異なり、損失面は凹凸があることがわかります。そのため、現在の重みに基づいて計算された勾配に基づき、前方に更新される学習率が大きい場合、損失面の接線に沿って大きなステップが踏まれ、元の損失面から大きく偏ってしまう可能性があります。例を次の図(a)に示します。点線は電流勾配の方向、つまり電流損失面の接線方向です。学習率が大きすぎる場合、このステップは接線方向に沿った大きなステップになります。この状態が続くと、図(b)に示すように、誤った損失面になる可能性が高くなります。学習率が小さい場合、接線方向に沿って毎回小さなステップのみが実行されます。多少の偏差はあるものの、図 (c) に示すように、損失表面の最急降下曲線に沿って大まかに降下し、最終的には良好な局所最小値に収束することができます。 同時に、凸収束理論[2]に従ってlrの上限も得ることができます:lr<1/L、ここでLは損失面の勾配曲線のリプシッツ因子です。 L は損失勾配の変化振幅の上限として理解できます。変化の振幅が大きい場合、L は大きくなり、lr は小さくなります。変化の振幅が小さい場合、L は小さくなり、lr は非常に大きくなる可能性があります。これは上の図の分析と一致しています。 では、大規模バッチと学習率の関係をどのように判断するのでしょうか? ベースラインとk人の労働者の大規模バッチを比較するための更新式[7]は次のとおりです。 これは、ベースライン (バッチ サイズ B) と大規模バッチ (バッチ サイズ kB) の更新式です。 (4)の1ステップで大きなバッチが通過するデータの量は、(3)のベースラインがkステップで通過するデータの量に等しい。損失と勾配は、見つかったデータの量に基づいて平均化されます。したがって、同じデータ利用率を保証するためには、(4)の学習率はベースラインのk倍である必要があり、これは学習率の線形スケール規則である。 線形スケール規則にはいくつかの制約があり、そのうちの 1 つは重量に関するものです。式(3)の各ステップで更新される重みは、前のステップで更新された重みに基づいています。したがって、それは小さな一歩を踏み出すことと同じです。各ステップは現在の実際の重みに基づいて更新され、勾配を計算します。式(4)の大きなステップ(ベースラインと比較してkステップに相当)は、時刻tにおける重みに基づいて更新される。これらの k ステップ内で W(t+j) ~ W(t) の場合、2 つの間の近似に大きな問題はなく、つまり線形スケール規則は大きな問題ではありません。ただし、重みが急激に変化すると問題が発生します。特に、モデルのトレーニングを開始したばかりで、損失が特に速く、重みが急速に変化する場合は、W(t+j) ~ W(t) が満たされません。したがって、初期のトレーニング段階では、通常、lr は直接 k 倍に増加されるのではなく、ベースライン lr がゆっくりと k 倍までウォームアップされ、線形スケール規則がそれほど明白に違反されることが防止されます。これはFacebookがImageNetを1時間でトレーニングするために使用したアプローチでもあります[7]。 2 番目の制約は、lr を任意に拡大できないことです。上記の分析によると、lr が大きすぎると、損失正接に沿って遠くまで実行され、収束の問題が発生します。 同時に、いくつかの文献[5]では、バッチサイズが大きくなると、良好なテスト結果を得るために許容されるlrの範囲が狭くなることが指摘されている。つまり、バッチ サイズが非常に小さい場合、適切な LR を見つけて良好な結果を得るのが簡単になります。バッチ サイズが大きくなると、より良い結果を得るために適切な lr を慎重に見つける必要がある場合があります。これにより、実際の大規模バッチ分散トレーニングにも困難が生じます。 (3)私たちの実験 最近、私はNLP関連の深層モデルの分散トレーニングの問題について検討しています。実験の詳細は以下の通りです。一部の作業については現時点では公開することが不都合なため、比較的簡単な実験の詳細のみを提供します。 モデルのベースライン パラメータはバッチ サイズ 32、lr 0.25、最終精度は BLEU スコア 28.35 です。現在、分散拡張は複数のカードに並行して実行されます。 実験 1: 並列ワーカーの数のみを増やし (バッチ サイズを増やすのと同じ)、ベースライン lr0 は変更しません。 バッチ サイズが大きくなるにつれて、lr が変わらない場合、モデルの精度は徐々に低下することがわかります。これは上記の分析と一致しています。 実験2: バッチサイズが増加すると、それに応じてlrも増加する lr を 5*lr0 に増やすこと (理論的には lr を 8 倍に増やす必要がありますが、実際の効果は良くないため 5 倍にしか増やしていません)、および lr をウォームアップすることで、ベースラインと同様の Bleu 効果が得られることがわかります。最終的な収束速度は約 5 倍速く、つまり 8 枚のカードで 5 倍の収束加速を実現できます (システム通信同期にかかる時間を考慮せず、つまりシステム加速比を考慮せず)。 ディープラーニングの並列トレーニングは、モデルのトレーニング速度を大幅に向上させることができますが、実際の使用では、システムレベルのアーキテクチャ設計、アルゴリズムレベルのパラメータのデバッグなど、一連の問題に直面します。興味のある友人は、さらに議論することを歓迎します。 |
ウェブサイトにはキーワードがあり、ウェブサイトのキーワードを最適化することは、SEOプロジェクト全体...
Google は今週、米国でドメイン名登録サービスのオープンテストを開始し、60 種類以上のドメイン...
インドの有名なIDCマーチャントであるbigrockは、インドと米国の両方で企業を登録しています。サ...
今日は百度の入札順位と、順位を通じてコンバージョン率を向上させる方法についてお話ししましょう。私...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますモバイルイ...
インターネットが人々の生活に密接に関係するようになったため、伝統的な消費者行動であるAIDMA(注意...
[[421799]]この記事では、エッジ コンピューティング システムをコンポーネントと概念分析の ...
7月24日、第10回中国クラウドコンピューティングカンファレンスが北京国家会議センターで開幕しました...
まず、この記事のタイトルについて説明させてください。私は百度の宣伝や広告をしているわけではありません...
私は、SEO に初めて出会ったときから現在 SEO に携わるまでの私の人生について、自分自身のまとめ...
最近、同僚と夕食に出かけ、SEO と食事について詳しく学びました。中国人にとって、食事は絆を深め、会...
米国の老舗データセンターであるRaksmartは、ダブルイレブンイベント期間中、クラウドサーバーの特...
8月4日、有名なビッグデータオープンソースコミュニティHadoopは、Tencent Cloud O...
ウェブサイトを構築する際には、ウェブサイトの最適化に役立つタグがいくつかあり、注意を払う必要がありま...
古いインフラストラクチャと新しいインフラストラクチャが時間と空間を移動し、新旧の相互作用を生み出しま...