最小GPT
GPT 的 PyTorch 重新實現,包括訓練和推理。 minGPT 試圖做到小、乾淨、可解釋且具有教育意義,因為目前大多數可用的 GPT 模型實現可能有點龐大。 GPT 不是一個複雜的模型,這個實作大約有 300 行程式碼(參見 mingpt/model.py)。所發生的事情就是將一系列索引輸入到 Transformer 中,然後得出序列中下一個索引的機率分佈。大多數複雜性只是為了提高效率而巧妙地進行批次(跨範例和序列長度)。
注意(2023 年 1 月) :雖然我可能會繼續接受並更改一些細節,但 minGPT 處於半存檔狀態。有關最新進展,請參閱我重寫的 nanoGPT。基本上,minGPT 在各種各樣的地方(筆記本、部落格、課程、書籍等)被引用,這讓我不太願意做出更大的改變來推動程式碼前進。我還想稍微改變一下方向,從只專注於教育到仍然簡單且可破解但具有牙齒的東西(重現中型行業基準,接受一些權衡以獲得運行時效率等)。
minGPT 函式庫由三個檔案組成:mingpt/model.py 包含實際的Transformer 模型定義,mingpt/bpe.py 包含一個稍微重構的位元組對編碼器,它在文字和整數序列之間進行轉換,就像OpenAI 在GPT、mingpt/trainer 中所做的那樣。然後在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)
- 增加混合精準度和相關的訓練縮放功能
- 分散式培訓支援
- 重現專案/中的一些基準,例如text8或其他語言建模
- 正確的日誌記錄而不是列印語句業餘時間哈哈
- 我可能應該有一個requirements.txt 檔案...
- 應該可以載入除 gpt2-* 之外的許多其他模型權重
參考
代碼:
- openai/gpt-2 有 TensorFlow 中的模型定義,但沒有訓練程式碼
- openai/image-gpt 在其程式碼中有一些更現代的 gpt-3 類似修改,也是很好的參考
- Huggingface/transformers 有一個語言建模範例。它功能齊全,但因此追蹤起來也有些困難。例如,一些大型函數在各種分支語句後面有多達 90% 未使用的程式碼,這些程式碼在簡單語言建模的預設設定中未使用
論文+一些實作說明:
透過產生預訓練提高語言理解 (GPT-1)
- 我們的模型很大程度上遵循了原始變壓器的工作原理
- 我們訓練了一個僅包含 12 層解碼器的 Transformer,它帶有屏蔽的自註意力頭(768 個維度狀態和 12 個注意力頭)。對於位置前饋網絡,我們使用 3072 維內部狀態。
- Adam 最大學習率為 2.5e-4。 (後來該模型尺寸的 GPT-3 使用 6e-4)
- LR 衰減:在前 2000 次更新中從零線性增加,並使用餘弦時間表退火到 0
- 我們在 64 個隨機採樣的、包含 512 個 token 的連續序列的小批量上訓練 100 個 epoch。
- 由於層規範在整個模型中廣泛使用,因此簡單的權重初始化 N(0, 0.02) 就足夠了
- 具有 40,000 個合併的位元組對編碼 (BPE) 詞彙
- 殘差、嵌入和注意力流失,正規化率為 0.1。
- (37) 中提出的 L2 正規化的修改版本,所有非偏差或增益權重的 w = 0.01
- 對於激活函數,我們使用高斯誤差線性單元(GELU)。
- 我們使用學習的位置嵌入來代替原始工作中提出的正弦版本
- 對於微調:我們以 0.1 的比率向分類器添加 dropout。學習率為 6.25e-5,批量大小為 32. 3 epoch。我們使用線性學習率衰減計劃,其中預熱時間超過訓練的 0.2%。 λ設定為0.5。
- GPT-1 模型有 12 層,d_model 768,約 117M 參數
語言模型是無監督多任務學習者 (GPT-2)
- LayerNorm 被移至每個子塊的輸入,類似於預激活殘差網絡
- 在最終的自註意力塊之後添加了額外的層歸一化。
- 使用修改後的初始化,此初始化考慮了剩餘路徑上隨模型深度的累積。我們在初始化時將殘差層的權重縮放為 1/√N,其中 N 是殘差層的數量。 (很奇怪,因為在他們發布的程式碼中我只能找到舊的0.02 的簡單用法...在他們發布的image-gpt 中我發現它用於c_proj,即使如此也僅用於attn,而不用於mlp。
- 詞彙量擴大至50,257
- 將上下文大小從 512 個標記增加到 1024 個標記
- 使用更大的批量大小 512
- GPT-2 使用 48 層和 d_model 1600(相對於原始 12 層和 d_model 768)。 ~1.542B 參數
語言模型為少樣本學習者 (GPT-3)
- GPT-3:96層,96個頭,d_model為12,288(175B參數)。
- GPT-1-like:12層,12頭,d_model 768(125M)
- 我們使用與 GPT-2 相同的模型和架構,包括其中描述的修改後的初始化、預標準化和可逆標記化
- 我們在變壓器的層中使用交替的密集和局部帶狀稀疏注意力模式,類似於稀疏變壓器
- 我們的前饋層總是瓶頸層大小的四倍,dff = 4 * dmodel
- 所有模型都使用 nctx = 2048 個令牌的上下文視窗。
- Adam,β1 = 0.9,β2 = 0.95,eps = 10−8
- 所有模型都使用 0.1 的權重衰減來提供少量的正規化。 (註:我相信 GPT-1 使用了 0.01,見上文)
- 將梯度的全域範數限制為 1.0
- 前 3.75 億個代幣的線性 LR 預熱。然後使用餘弦衰減將學習率降低至其值的 10%,超過 2600 億個代幣。
- 根據模型大小,在訓練的前 4-120 億個令牌中逐漸將批量大小從較小值(32k 個令牌)線性增加到完整值。
- 始終使用完整的 2048 大小的時間上下文窗口,並帶有特殊的 END OF DOCUMENT 標記分隔符
從像素產生預訓練(影像 GPT)
- 處理影像時,我們選擇恆等排列 πi = i(1 ≤ i ≤ n),也稱為光柵順序。
- 我們透過使用 k = 512 的 k 均值聚類(R、G、B)像素值來創建我們自己的 9 位元調色板。
- 我們最大的模型 iGPT-XL 包含 L = 60 層,並使用 d = 3072 的嵌入大小,總共 6.8B 個參數。
- 我們的下一個最大模型 iGPT-L 本質上與 GPT-2 相同,L = 48 層,但包含稍小的嵌入大小 d = 1536(vs 1600),總共 1.4B 個參數。
- 我們使用與 GPT-2 相同的模型程式碼,不同之處在於我們以與稀疏變換器 (Child et al., 2019) 中的層相關的方式初始化權重,並對產生 logits 的所有投影進行零初始化。
- 我們也訓練 iGPT-M,一個 455M 參數模型,L = 36 和 d = 1024
- iGPT-S,一個 76M 參數模型,L = 24 和 d = 512(好吧,有多少個頭?看起來像 Github 代碼聲明 8)
- 在預訓練 iGPT-XL 時,我們使用批量大小 64 並訓練 2M 迭代,對於所有其他模型,我們使用批量大小 128 並訓練 1M 迭代。
- Adam 的 β1 = 0.9 且 β2 = 0.95
- 學習率預熱一個 epoch,然後衰減到 0
- 我們沒有使用權重衰減,因為應用 0.01 的小權重衰減不會改變表示質量。
- iGPT-S LR 0.003
- 不使用 dropout。
執照
麻省理工學院