効率的で安定したChatGPT大規模モデルトレーニングスキルまとめ、トレーニングをより効果的に!

100e11be9949c1050e4056bc0cf40688.png

本文|Python

序文

最近、ChatGPT がインターネット上で話題になっています。ChatGPT は、大規模言語モデル技術 (LLM、ラージ言語モデル) に基づいた人間とコンピューターの対話ツールです。現在、主流の大規模言語モデルは、Transformer ネットワークを使用して、非常に大規模なデータによる自己教師ありトレーニングを実施しています。しかし、自己教師ありトレーニング データはどのように構造化するのでしょうか? トランスの基本構造にどのような革新を加えましたか? トレーニングプロセスを効率的かつ安定的に行うために、どのようなブラックテクノロジーがあるのでしょうか? 今日は、これらの大型モデルのトレーニングスキルを読み解くための、人民大学のレビュー論文を紹介します。

論文アドレス:
https://arxiv.org/pdf/2303.18223.pdf

各大規模モデルの研究およびテスト ポータル

ChatGPT ポータル (ウォールフリー、直接テスト可能):
https://yeschat.cn

GPT-4 ポータル (壁がなく、直接テストできます。ブラウザーの警告ポイントが発生した場合は、引き続きアクセスできます):<br>
https://gpt4test.com

トレーニングデータの収集と処理

大規模な言語モデルでは、トレーニング データの規模と品質に関してより高い要件が求められます。では、現在の大規模モデルではど​​のようなコーパスが使用されているのでしょうか? これらのコーパスはどのような役割を果たしますか? コーパスをクリーンにして前処理するにはどうすればよいですか? 大きなモデルについて、対処する必要がある特別な詳細はありますか?

データソース

データ ソースの観点から見ると、大規模言語モデルの学習データは一般コーパスと特殊コーパスになります。Web ページ、書籍、対話テキストなどの一般コーパスは比較的大きな割合を占め、さまざまなトピックに関するモデルに言語知識を提供できますが、特殊コーパス (多言語データ、科学技術コーパス、コードなど) は、モデルの特定の問題に解決策をもたらすことができます。既存の大規模モデル学習コーパスの構成比を下図に示します。

712311f797e63a7133d72ef9e4687762.png

一般的なコーパスの中でもウェブページコーパスは規模が大きいですが、Wikipediaのような高品質なコーパスだけでなく、スパムなどの低品質なコーパスも含まれており、一般にフィルタリングが必要です。Reddit などのソーシャル メディア プラットフォームなどの質問応答コーパスは、モデルの質問に答える能力を向上させる可能性があります。ソーシャルメディアでは通常、複数人での対話が行われますが、対話データは返信関係に応じてツリー構造に整理され、それぞれの枝が完全な対話コンテンツとなります。書籍コーパスは、珍しい長文の書き言葉テキストであり、モデルが厳密な言語知識を学習し、長距離の依存関係をモデル化し、生成されたコンテンツの一貫性を向上させるのに役立ちます。

特殊コーパスでは、多言語コーパスにより、翻訳、多言語要約、質問応答などのタスクにおけるモデルの能力を向上させることができます。科学技術コーパスは、arXiv 論文、教科書、数学オンライン コミュニティを入手することで、モデルが特別な記号、用語、式を理解するのに役立ち、科学技術タスクや推論におけるモデルのパフォーマンスを向上させることができます。コード コーパスは主に、コード、コメント、ドキュメントを含む、Stack Exchange や GitHub 上のオープン ソース プロジェクトなどの質問と回答のコミュニティから取得されます。最近の研究では、コード コーパスは、長距離の依存関係と本質的に洗練されたロジックにより、モデルの複雑な推論 (思考連鎖) 能力を向上させることができることが示されています。

一部のオープンソース コーパスのアドレスについては、以前の投稿「ChatGPT のトレーニングに必要なリソース: コーパス、モデル、コード ライブラリの完全なガイド」を参照してください。

洗浄と前処理

f2b8ff4f3f2827ef3d836afe8c8ff425.png

コーパスを取得した後、人々は通常、上図のプロセスを使用してコーパスをクリーニングし、前処理して品質を向上させます。

具体的には、コーパス クリーニングの最初のステップでは、高品質のコーパスを選別するためのバイナリ分類器をトレーニングするための肯定的な例として、Wikipedia などのサンプルを使用できます。しかし、最近の研究では、このスクリーニング方法がバイアスをもたらす可能性があることが示されています。そのため、現在は、ターゲットではないタスク言語の削除、難度の低いデータの破棄、句読点や記号が多すぎる文、または長すぎるまたは短すぎる文の削除、特定の語彙(たとえば、 HTML タグ、リンクなど)、汚い言葉、センシティブな言葉など) の文。

2 番目のステップは重複排除です。多数の単語や語句が繰り返されている文を削除できます。繰り返し率の高い段落 (単語/N グラムの共起) を削除できます。テスト セットとの相関が高すぎる可能性のあるトレーニング セット内のコンテンツは削除できます。削除される。このようにして、トレーニング セットの品質を向上させることができ、言語モデルによって生成されたコンテンツの重複の問題を軽減し、テスト セットの漏洩によって引き起こされる過剰適合の問題を回避することができます。

3 番目のステップは、ユーザーのプライバシー情報 (名前、住所、電話番号など) を削除することです。

最後に、3 段階のクリーニングが完了すると、単語が分割され、トレーニングの準備が整います。単語の分割に関しては、ブラックテクノロジーは存在しません。GPT-2 などの既製の単語セグメンターを直接使用するか、SentencePiece やバイト ペア エンコーディングなどのアルゴリズムに基づいてトレーニング コーパス用の単語セグメンテーション メソッドを構築します。

細部へのこだわり

大規模なモデルの特性により、事前トレーニング コーパスを処理する際には、いくつかの特別な詳細に注意を払う必要があります。

  • さまざまなソースからのコーパスの混合比率を調整する必要がありますが、コーパスのサイズに直接基づくことはできません。バランスの取れたコーパス比率はモデルの汎化能力を向上させるのに役立ち、特定の種類のコーパスはモデルの特定の能力を向上させることができます。

  • コーパスのサイズはモデルのパラメータ サイズと一致する必要があります。経験上、コンピューティング能力が与えられた場合、コーパス内のトークンの数がモデル内のパラメーターの数と等しい場合、モデルのパフォーマンスは比較的優れていることがわかっています。したがって、盲目的に大規模なコーパスを追求するのではなく、規模を制御し、品質を向上させ、適切にトレーニングすることも重要です。

  • コーパスの品質は (繰り返しますが) 重要です。実験によると、大規模なモデルをトレーニングする場合、低品質のコーパスを使用するよりも、それを使用した方が良いことがわかりました。データを過度に繰り返すと、トレーニング プロセスが無効になる(クラッシュするか、無意味な局所最適化に陥る)こともあります。

モデルの構造とタスク

主流の大規模言語モデルは、Transformers 構造に基づいています。以下の図からわかるように、ほとんどのモデルはカジュアル デコーダー構造に基づいています。つまり、入出力コンテンツの処理にデコーダー (一方向アテンション マスキング) のみが使用されます。編集者は、GPT-3 がカジュアル デコーダーの強力な能力を実証し、スケーリング則やこの構造に関する他の研究と相まって、人々は他の構造を調査することに興味を失ったのではないかと推測しています。

他の 2 つの大きな言語モデルの構造であるエンコーダー/デコーダー構造は、機械翻訳の元のモデルに似ており、入力コンテンツと出力コンテンツをそれぞれ処理するパラメーターを共有しない 2 つのコンポーネントを使用します。Prefix デコーダは Casual デコーダに似ていますが、入力部分で一方向のアテンション マスキングを使用せず、双方向のアテンションを可能にします。これは、共有パラメーターを備えたエンコーダーとデコーダーの構造に似ています。

0f883dd49efffe5b200198f9480f3cb6.png

トランスフォーマーの構造選択を除いて。上の表には、モデル設計の詳細も示されています。具体的には以下の点が挙げられます。

  • レイヤー正規化 (レイヤー正規化) は、モデルの収束を確実にし、トレーニングのクラッシュの問題を軽減するための重要な手段です。具体的には、古典的な Pre Norm は、各マルチヘッド アテンション レイヤーとフィードフォワード ネットワーク レイヤーの前にレイヤー正規化を追加します。Pre RMS Norm は、Pre Norm をベースに正規化の平均部分を取り除き、標準偏差のみをスケーリングすることで最適化プロセスをよりスムーズにする、現在主流の推奨手法です。また、Embedding の後に Norm を追加すると最適化がスムーズになりますが、モデルのパフォーマンスが大幅に低下するため、現在は一般的に使用されません。

  • 活性化関数に関しては、従来の ReLU では一般に十分ではありません。現在、SwiGLU と GeGLU はより優れたパフォーマンスをもたらすと考えられていますが、GeLU などのアクティベーション関数と比較すると、より多くのパラメーターがもたらされます。

  • 位置情報エンコーディング、従来の学習された絶対位置エンコーディング (Learned)、および相対距離の相対位置エンコーディング (Relative)。後者は、テスト時により長いコーパスへの外挿が優れています。最近ではRoPEが広く使われており、カーネル関数と三角回転に似た手法を用いてクエリベクトルとキーベクトルの絶対位置を符号化し、内積に相対位置情報を表す項目が含まれることが特徴です。

さらに、上の表には、#L 層番号、#H ヘッド番号、隠れ層サイズ、MCL 最大コンテキスト長などのいくつかのハイパーパラメータ情報もまとめられています。

モデル構造の詳細と比較すると、事前トレーニング タスクの設計は非常にシンプルです。最も一般的な事前トレーニング タスクは、言語モデルが入力履歴に基づいて次の単語を 1 つずつ予測できるようにする自己回帰言語モデルで、GPT-3 などの言語モデルで広く採用されています。また、T5 や GLM-130B と同様に、ノイズ リダクション セルフ エンコーディング トレーニング ターゲットの導入により、モデルは入力コンテンツ内のマスクされたセグメントを復元できます。

最適化の設定とヒント

大規模な言語モデルのトレーニング プロセスをより効率的かつ安定させるために、トレーニング プロセスには一連の「ブラック テクノロジー」が存在します。具体的には、これらの手法により次のことが可能になります: 1. モデルの最終パフォーマンスを向上させる; 2. モデルの収束速度を向上させる; 3. モデルが高損失で局所最適に収束することを回避する、または収束しないことを回避する; 4. モデルが収束しないことを回避するトレーニングプロセスの崩壊。既存の大規模モデルによって公開されている最適化設定と手法を以下の表に示します。

4ecead5726945a3417bf4a0d700daad4.png

大規模なトレーニング データを有効に活用し、モデルのトレーニング プロセスをより安定させるために、バッチサイズは通常より大きく設定されます。たとえば、バッチサイズ 8196 を使用します (各バッチは 160 万のトークン入力を処理します)。GPT-3 は、バッチサイズを動的に調整する方法を使用して、処理するトークンの数を 32K から 3.2M まで徐々に増やします。

学習率は通常小さく、スムーズなトレーニングを確保するためのウォームアップ設定が含まれています。たとえば、トレーニング ステップの最初の 0.1% ~ 0.5% では、線形学習率の増分を設定します。ピーク学習率は通常、GPT-3 の学習率を下回ります。その後、コサイン減衰戦略が採用されて学習率が徐々に低下し、学習率は収束するまでに約 10% 低下します。

オプティマイザは通常、Adam、AdamW、および Adafactor を使用します。このうち、Adafactor は Adam のメモリ節約版です。

トレーニング プロセスを安定させるその他の手法には、しきい値 1.0 の勾配クリッピング、レート 0.1 の重み減衰 (L2 正則化と同様) などがあります。それでも、大規模モデルのトレーニング プロセスはクラッシュすることがよくあります。PaLMとOPTは、クラッシュが発生した場合、前の中間ノードからトレーニングを継続し、クラッシュの原因となった前のトレーニングデータをスキップできることを提案しました。GLM は、埋め込み層には異常な勾配が存在することが多く、適切に調整する必要があることを発見しました。

データ並列処理は、最も一般的に使用されるマルチカード トレーニング方法です。トレーニング データを複数のグラフィックス カードに配布し、順方向伝播と逆方向伝播をそれぞれ計算し、勾配を要約してパラメーターを更新し、モデルを同期します。この方法は、単一カードのバッチが小さすぎるという問題を解決できます。

パイプライン並列処理 (パイプライン並列処理) は、グラフィックス カード上のいくつかの隣接するレイヤーのみを保存および計算します。連続操作の待機によって生じる非効率を軽減するために、GPipe や PipeDream などのツールは、パイプライン内の複数のバッチからデータを収集し、パラメーターを非同期的に更新することを提案しています。この方法により、単一のカードがバッチサイズ 1 で実行できない状況を軽減できます。

テンソル並列処理 (テンソル並列処理) は、大きな行列の乗算演算で A 行列を分割します。これにより、演算は 2 つの小さな行列の乗算結果の連結に変換され、2 つの小さな行列の乗算を 2 つのグラフィック カードで実行できます。 。この方法は、Megatron-LM や Colossal-AI などのツールによって実装されており、単一の大きな行列の乗算によるメモリ使用量の問題を軽減でき、ある程度の通信コストも発生します。

混合精度トレーニングでは、半精度浮動小数点計算を使用してトレーニング プロセスの一部のパラメーター (特に順伝播部分) を置き換えるため、メモリ改善の速度が低下します。A100 などのグラフィック カードは、半精度浮動小数点計算を最適化し、混合精度トレーニングをより効果的にします。最近では、従来の FP16 を Brain Floating Point (BF16) に置き換え、指数の数を増やし、有効数字の数を減らすことも提案されています。ただし、混合精度コンピューティングは大幅に高速化されていますが、経験上、精度とモデルのパフォーマンスは依然として低下することがわかっています。

01db6aa770ab32dbc2cf8e2fa3bc6e47.png

ZeRO は、データの並列性をさらに最適化するために DeepSpeed によって提案されたソリューションであり、モデル パラメーターを超えてビデオ メモリ空間の並列性を向上させるために使用されます。上図の混合精度の計算プロセスは非常に明白であり、パラメーター以外にも多くのストレージ リソースが消費されます。実際、パラメータ 1.5B の半精度 GPT-2 のストレージ容量はわずか 3GB ですが、32GB のグラフィックス カードではトレーニングできないのはこれが理由です。ZeRO の主なアイデアは、勾配、運動量、その他の更新関連情報を各カードに分散して保存し、各カードが対応する位置のパラメータを更新し、更新が要約されたときに同期できるようにすることです。勾配メモリ更新後の勾配相関など この方法は比較的複雑なので、ここでは詳しく説明しません。PyTorch の DeepSpeed ツールと FSDP ツールは両方とも ZeRO をサポートしています。

実際の運用では、上記の最適化設定を組み合わせて使用​​することが一般的です。たとえば、BLOOM モデルの 384 ブロック A100 は、8 方向のデータ並列処理、4 方向のテンソル並列処理、および 12 方向のパイプライン並列処理を使用し、BF16 に基づく混合精度トレーニング戦略を採用しています。DeepSpeed、Colossal-AI、Alpa などのオープン ソース ツールは、並列関連の機能をサポートしています。

さらに、試行錯誤のコストを削減するために、GPT-4 は予測可能なスケーリングも提案しています。これは、より小さなニューラル ネットワーク モデルを使用して、大規模なモデル設定で起こり得るパフォーマンスを予測します。PyTorch の FSDP は、CPU が計算圧力の一部を共有することもサポートしています。

結論

大規模な言語モデルのトレーニングは科学的な問題であるだけでなく、複雑な工学的な問題でもあります。大規模モデルの開発を効果的に進めるには、科学者とエンジニアが協力する必要があります。さまざまなトレーニング手法は、大規模モデルのトレーニング効率と安定性の向上に役立ちます。ただし、関連するエンジニアリングの詳細は、書類を通じて表面をなぞるだけです。それを本当にマスターするには、オープンソース プロジェクトのコードを注意深く読み、実行してみることも必要です。

b7b5fad571e6378e21517b6b63ac6cf9.jpegバックグラウンドでキーワードを返信 [グループに参加]

NLP、CV、検索プロモーション、就職活動のディスカッション グループに参加してください

おすすめ

転載: blog.csdn.net/xixiaoyaoww/article/details/130212210