最小GPT
トレーニングと推論の両方を含む GPT の PyTorch 再実装。現在利用可能な GPT モデル実装のほとんどは少し広大になる可能性があるため、minGPT は、小さく、クリーンで、解釈可能で、教育的であるように努めています。 GPT は複雑なモデルではなく、この実装は適切に約 300 行のコードです (mingpt/model.py を参照)。起こっていることは、一連のインデックスが Transformer に入力され、シーケンス内の次のインデックスの確率分布が得られることだけです。複雑さの大部分は、効率化のためにバッチ処理 (サンプル全体およびシーケンスの長さの両方) を賢く行うことです。
note (2023 年 1 月) : 一部の詳細は引き続き受け入れて変更する可能性がありますが、minGPT は半アーカイブ状態です。より最近の開発については、私の rewrite nanoGPT を参照してください。基本的に、minGPT はさまざまな場所 (ノートブック、ブログ、コース、書籍など) で参照されるようになり、コードを前進させるために必要な大きな変更を加える意欲がなくなりました。また、方向性を少し変えて、教育だけに焦点を当てたものから、シンプルでハッキング可能だが歯があるもの (中規模の業界ベンチマークを再現し、実行時の効率を高めるためにいくつかのトレードオフを受け入れるなど) に変えたいと考えていました。
minGPT ライブラリは 3 つのファイルです。mingpt/model.py には実際の Transformer モデル定義が含まれ、mingpt/bpe.py には OpenAI が GPT で行ったのとまったく同じようにテキストと整数のシーケンスの間で変換する、穏やかにリファクタリングされたバイト ペア エンコーダ (mingpt/trainer) が含まれています。 py は、モデルをトレーニングする (GPT に依存しない) PyTorch ボイラープレート コードです。次に、 projects
フォルダー内のライブラリを使用するデモとプロジェクトが多数あります。
-
projects/adder
数値を加算するために GPT を最初からトレーニングします (GPT-3 論文の加算セクションからインスピレーションを受けています) -
projects/chargpt
入力テキスト ファイル上で GPT を文字レベル言語モデルとしてトレーニングします。 -
demo.ipynb
簡単な並べ替えの例でGPT
とTrainer
の最小限の使用法をノートブック形式で示しています。 -
generate.ipynb
事前トレーニング済み GPT2 をロードし、プロンプトが与えられたときにテキストを生成する方法を示しています。
ライブラリのインストール
import mingpt
する場合は、次のようにします。
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
使用法
GPT-2 (124M パラメータ バージョン) をインスタンス化する方法は次のとおりです。
from mingpt . model import GPT
model_config = GPT . get_default_config ()
model_config . model_type = 'gpt2'
model_config . vocab_size = 50257 # openai's model vocabulary
model_config . block_size = 1024 # openai's model block_size (i.e. input context length)
model = GPT ( model_config )
そして、それを訓練する方法は次のとおりです。
# your subclass of torch.utils.data.Dataset that emits example
# torch LongTensor of lengths up to 1024, with integers from [0,50257)
train_dataset = YourDataset ()
from mingpt . trainer import Trainer
train_config = Trainer . get_default_config ()
train_config . learning_rate = 5e-4 # many possible options, see the file
train_config . max_iters = 1000
train_config . batch_size = 32
trainer = Trainer ( train_config , model , train_dataset )
trainer . run ()
より具体的な例については、 demo.ipynb
参照してください。
単体テスト
カバー範囲はまだそれほど驚くべきものではありませんが、次のとおりです。
python -m unittest discover tests
やるべきこと
- 任意のテキスト ファイルに gpt-2 微調整デモを追加します
- ダイアログエージェントのデモを追加
- 既存のプロジェクトの結果に関するより良いドキュメント (adder、chargpt)
- 混合精度と関連するトレーニング スケーリング機能を追加します
- 分散型トレーニングのサポート
- project/ でいくつかのベンチマークを再現します (例: text8 または他の言語モデリング)。
- print ステートメントの代わりに適切なロギングを行う
- おそらくrequirements.txtファイルがあるはずです...
- gpt2-* だけでなく、他の多くのモデルの重みをロードできるはずです。
参考文献
コード:
- openai/gpt-2 には TensorFlow でのモデル定義がありますが、トレーニング コードはありません
- openai/image-gpt にはコード内に最新の gpt-3 のような修正が含まれており、参考にもなります。
- ハグフェイス/トランスフォーマーには言語モデリングの例があります。フル機能を備えていますが、その結果、トレースするのがやや困難でもあります。たとえば、一部の大きな関数には、さまざまな分岐ステートメントの背後に、単純な言語モデリングのデフォルト設定では使用されない 90% もの未使用コードがあります。
論文 + いくつかの実装メモ:
生成的事前トレーニング (GPT-1) による言語理解の向上
- 私たちのモデルは主にオリジナルの変圧器の仕組みに従っています
- 私たちは、マスクされたセルフ アテンション ヘッド (768 次元状態と 12 個のアテンション ヘッド) を備えた 12 層のデコーダ専用トランスフォーマーをトレーニングしました。位置に関するフィードフォワード ネットワークの場合、3072 次元の内部状態を使用しました。
- アダムの最大学習率は 2.5e-4 です。 (このモデルサイズの後の GPT-3 は 6e-4 を使用します)
- LR 減衰: 最初の 2000 回の更新にわたってゼロから直線的に増加し、コサイン スケジュールを使用して 0 にアニールされます。
- ランダムにサンプリングされた 64 個の連続した 512 個のトークンのシーケンスのミニバッチで 100 エポックのトレーニングを行います。
- layernorm はモデル全体で広範囲に使用されるため、N(0, 0.02) の単純な重みの初期化で十分でした。
- 40,000 個のマージを含むバイトペア エンコード (BPE) ボキャブラリー
- 正則化のレートが 0.1 の残差、埋め込み、およびアテンション ドロップアウト。
- (37) で提案された L2 正則化の修正バージョン。すべての非バイアス重みまたはゲイン重みに対して w = 0.01 を使用します。
- 活性化関数には、Gaussian Error Linear Unit (GELU) を使用しました。
- 元の研究で提案された正弦波バージョンの代わりに、学習された位置埋め込みを使用しました。
- 微調整の場合: 0.1 のレートで分類器にドロップアウトを追加します。学習率は 6.25e-5、バッチサイズは 32.3 エポックです。トレーニングの 0.2% を超えるウォームアップを伴う線形学習率減衰スケジュールを使用します。 λは0.5に設定されました。
- GPT-1 モデルは 12 層で、d_model 768、~117M パラメータ
言語モデルは教師なしマルチタスク学習者 (GPT-2)
- LayerNorm は、アクティブ化前の残差ネットワークと同様に、各サブブロックの入力に移動されました。
- 追加のレイヤー正規化が最後のセルフアテンション ブロックの後に追加されました。
- モデルの深さによる残差パスの累積を考慮した修正された初期化が使用されます。初期化時に残りの層の重みを 1/√N の係数でスケールします。ここで、N は残りの層の数です。 (リリースされたコードでは、古い 0.02 の単純な使用法しか見つからないので奇妙なことに...image-gpt のリリースでは、それが c_proj に使用されていることがわかりましたが、それでも mlp には使用されず、attn にのみ使用されていました。ふーん。https: //github.com/openai/image-gpt/blob/master/src/model.py)
- 語彙は50,257に拡張されました
- コンテキスト サイズを 512 トークンから 1024 トークンに増加します
- より大きなバッチサイズ 512 が使用されます
- GPT-2 は 48 レイヤーと d_model 1600 を使用しました (元の 12 レイヤーと d_model 768 に対して)。 ~1.542B パラメータ
言語モデルはフューショット学習者 (GPT-3)
- GPT-3: 96 レイヤー、96 ヘッド、12,288 の d_model (175B パラメーター)。
- GPT-1 と同様: 12 レイヤー、12 ヘッド、d_model 768 (125M)
- GPT-2 に記載されている修正された初期化、事前正規化、および可逆トークン化を含む、GPT-2 と同じモデルとアーキテクチャを使用します。
- スパーストランスフォーマーと同様に、トランスフォーマーの層で高密度と局所的にバンド化されたスパースアテンションパターンを交互に使用します。
- 常にボトルネック層の 4 倍のサイズのフィードフォワード層があります。 dff = 4 ∗ dmodel
- すべてのモデルは、nctx = 2048 トークンのコンテキスト ウィンドウを使用します。
- アダムのβ1 = 0.9、β2 = 0.95、eps = 10−8
- すべてのモデルは、少量の正則化を提供するために 0.1 の重み減衰を使用します。 (注: GPT-1 は 0.01 を使用したと思います。上記を参照してください)
- 勾配のグローバル ノルムを 1.0 でクリップします。
- 最初の 3 億 7,500 万トークンにわたる線形 LR ウォームアップ。次に、コサイン減衰を使用して学習率をその値の 10% (2,600 億トークンを超える) まで下げます。
- モデルのサイズに応じて、トレーニングの最初の 40 ~ 120 億トークンにわたって、バッチ サイズを小さな値 (32,000 トークン) から最大値まで直線的に徐々に増加させます。
- 特別な END OF DOCUMENT トークン区切り文字を使用して、2048 サイズの完全な時間コンテキスト ウィンドウが常に使用されます。
ピクセルからの生成事前トレーニング (画像 GPT)
- 画像を扱うときは、ラスター順序とも呼ばれる恒等順列 πi = i (1 ≤ i ≤ n) を選択します。
- k = 512 の K 平均法を使用して (R、G、B) ピクセル値をクラスタリングすることにより、独自の 9 ビット カラー パレットを作成します。
- 私たちの最大のモデルである iGPT-XL には、L = 60 レイヤーが含まれており、合計 6.8B パラメーターに対して d = 3072 の埋め込みサイズを使用します。
- 次に大きなモデルである iGPT-L は、L = 48 レイヤーの GPT-2 と本質的に同じですが、埋め込みサイズがわずかに小さい d = 1536 (対 1600) で、合計 1.4B のパラメーターが含まれています。
- Sparse Transformer (Child et al., 2019) のように層に依存した方法で重みを初期化し、ロジットを生成するすべての射影をゼロ初期化する点を除いて、GPT-2 と同じモデル コードを使用します。
- また、L = 36 および d = 1024 で 455M パラメーター モデルである iGPT-M もトレーニングします。
- iGPT-S、L = 24、d = 512 の 76M パラメーター モデル (OK、ヘッドはいくつありますか? Github コードのクレーム 8 のように見えます)
- iGPT-XL を事前トレーニングする場合、バッチ サイズ 64 を使用して 200 万回の反復でトレーニングし、他のすべてのモデルではバッチ サイズ 128 を使用して 100 万回の反復でトレーニングします。
- β1 = 0.9 および β2 = 0.95 のアダム
- 学習率は 1 エポックの間ウォームアップされ、その後 0 に減衰します。
- 0.01 という小さな重み減衰を適用しても表現品質が変わらなかったため、重み減衰は使用しませんでした。
- iGPT-S lr 0.003
- ドロップアウトは使用しません。
ライセンス
マサチューセッツ工科大学