從零實現 Transformer
手寫分詞器和注意力,搭一個完整的小 GPT,在三萬多首唐詩上訓練它學會寫詩,再講生成、KV 快取,以及從小 GPT 到真正的大模型還差什麼。
各課
- 01手寫 BPE 分詞器
第 01 模組說過模型看到的是詞元。這一課親手寫一個位元組級 BPE 分詞器,在唐詩上訓練它,看它怎樣從位元組一步步拼出漢字和常用詞,也看清它在小資料上的毛病。
45 分鐘 · 進階 - 02注意力機制
一個字要理解自己的意思,得看看前面都有哪些字。從最簡單的"平均前面所有的字"出發,一步步加上查詢、鍵、值,因果掩碼和縮放,寫出一個完整的注意力頭,並和 PyTorch 的實現核對。
50 分鐘 · 深入 - 03多頭注意力和位置編碼
一個注意力頭只能按一種標準去看前面的字,多開幾個頭就能同時看好幾樣東西。注意力本身也分不清字的順序,所以要把位置告訴它。這一課用實驗看清這兩件事,也看到一個意料之外的結果。
40 分鐘 · 深入 - 04搭一個完整的 GPT
把注意力、前饋網路、殘差連線和 LayerNorm 組裝成 Transformer 塊,疊幾層,加上嵌入和輸出層,就是完整的 GPT。逐段讀 gpt.py,數清一百六十萬個參數在哪裡。
50 分鐘 · 深入 - 05訓練它:讓模型學會寫唐詩
用三萬四千首唐詩訓練上一課搭好的 GPT,在筆記本 CPU 上跑七分鐘,看它從亂碼一步步學會五言七言。再只給它三百首詩,看它怎樣把詩背下來而不是學會作詩。
50 分鐘 · 深入 - 06生成文字和 KV 快取
訓練好的模型只會給下一個字打分,怎麼從分數變成一首詩?這一課用自己的 GPT 試溫度、top-k、續寫和藏頭詩,再實現 KV 快取,量一量它省下了多少重複的計算。
40 分鐘 · 深入 - 07從小 GPT 到大模型
我們的小 GPT 會寫詩,卻不會回答問題。從它到一個能對話的大模型,中間隔著規模、預訓練、指令微調和偏好對齊。這一課用論文裡的真實數字,把每一步講清楚。
30 分鐘 · 進階
第 01 模組說過,大模型只做一件事:預測下一個詞元。這個模組親手造一個做這件事的模型。
我們要從零寫一個 GPT:分詞器、注意力、多頭、位置編碼、Transformer 塊,全部手寫,不用任何現成的模型庫。然後在《全唐詩》裡挑出的三萬五千首格律詩上訓練它。它只有 161 萬個參數,在筆記型電腦的 CPU 上訓練 7 分鐘左右,就能寫出像模像樣的五言、七言詩。
它和 ChatGPT、DeepSeek 的差別主要在規模和訓練方法上,原理是相同的。學完這個模組,你能看懂真實大模型程式碼的主體結構。
為什麼是這個順序
先分詞,因為模型的輸入是詞元。然後是注意力,它是 Transformer 的核心;第 3 課補上多頭和位置資訊,第 4 課把所有零件組裝成完整的模型。第 5 課訓練它,第 6 課用它生成文字,並解釋推理時最重要的最佳化 KV 快取。最後一課不寫程式碼,講從我們的小 GPT 到真正能對話的大模型,中間還有哪幾步。
這個模組的程式碼都在 code/09-transformer/ 下,gpt.py 是後面幾課共用的模型。需要先學完第 08 模組,特別是反向傳播、PyTorch 和交叉熵。
學完的標準
- 能手寫一個位元組級 BPE 分詞器,並解釋它為什麼在資料少時切得很碎。
- 能寫出帶因果掩碼和縮放的注意力,並說出 q、k、v 各自的作用。
- 能解釋多頭注意力和位置編碼為什麼需要,以及因果掩碼本身會洩露順序資訊。
- 能逐段讀懂
gpt.py,並算出每一部分有多少參數。 - 能在自己的電腦上訓練出一個會寫詩的小 GPT,從損失曲線和生成結果判斷它是在學習還是在背誦。
- 能解釋溫度、top-k 和 KV 快取,並量出 KV 快取的加速效果。
- 能說出預訓練、指令微調和偏好對齊分別在做什麼。
本模組的程式碼
程式碼和執行結果保留原樣(簡體中文),與實際執行時完全一致。