從零開始拆開 Transformer:用 Lordog/dive-into-llms 把 LLM 變成可視化的程式碼
這一年多我一直在找能把 LLM 底層邏輯講清楚,而不是只會教你怎麼寫 Prompt 的教材。最近看到 GitHub 上這個 Lordog 維護的 Dive into LLMs…
目錄
這東西在做什麼
Lordog/dive-into-llms 是一套中文為主的教學倉庫,用 PyTorch 把 Transformer 從頭到尾實作一遍。它把「理論」與「可執行的程式碼」綁在一起,讓你能直接看到每一步張量(tensor)怎麼變形、注意力權重長什麼樣子。
對我這種只會用 API 呼叫 claude-3-5-sonnet 的人來說,最大的痛點是:模型偶爾胡說八道時,我完全不知道從哪裡下手 debug。這個 repo 的目標就是讓你把「黑盒子」拆成「透明盒子」,至少知道哪一層 attention 在亂搞。
為什麼值得看一眼
- 市面上 90 % 的 LLM 課程停在「調 Prompt」或「用 LangChain 串流程」。這個 repo 直接帶你把
MultiHeadAttention一行一行刻出來。 - 它用 Jupyter Notebook 當載體,每個 cell 都有中文註解,還附帶可視化函式,讓你把 attention heatmap 直接畫出來。
- 對比 Hugging Face 的
transformers高階 API,這裡的程式碼量少、變數名稱短,方便你單步追蹤。代價是:你必須自己管 GPU 記憶體、自己寫訓練迴圈。
一句話總結:如果你想「看懂」而不是「用過」LLM,這是目前中文圈最乾脆的範例。
怎麼裝、怎麼跑
作者在 README 給了兩種路線:Colab 一鍵開跑,或是本地 Conda。我選後者,因為我想改程式碼時不用每次重新上傳。
1. 把 repo 拉下來
git clone https://github.com/Lordog/dive-into-llms.git
cd dive-into-llms
2. 建立環境
conda create -n llm python=3.10
conda activate llm
pip install -r requirements.txt
requirements.txt 只有 7 行,核心就是 torch==2.1.2、transformers、einops、matplotlib。我原本擔心 CUDA 版本會打架,結果作者的版本號寫得很保守,我 RTX 3060 直接過。
3. 跑一次最簡單的範例
cd notebooks
jupyter notebook 01_transformer_intro.ipynb
這支 notebook 從 dummy 資料開始,5 分鐘就能跑完 forward pass。你會看到形狀 (batch, seq, d_model) 的張量在每一層怎麼變化,最後吐出一個 (batch, vocab) 的 logits。
實際跑起來長什麼樣
以 02_attention_visualization.ipynb 為例:
輸入
sentences = ["我 喜歡 貓", "你 討厭 狗"]
經過 tokenizer 後變成
[[2, 5, 3],
[3, 6, 4]]
跑完 MultiHeadAttention 後,notebook 會畫出 8 張 heatmap,每張對應一個 attention head。你會看到「我」對「貓」的 attention 權重明顯高於對「喜歡」,這就是所謂的「語義關聯」變成可視化的數值。
我還沒試過把整份 Wiki 中文丟進去訓練,因為 8 GB VRAM 不夠。但只看 forward pass 的話,RTX 3060 綽綽有餘。
整合到 Claude Code 的技巧
這不是 MCP 也不是 Skill,但你可以把裡面的「小模型」拆出來當成 Claude Code 的「本地驗證器」。流程如下:
- 先用 Claude 3.5 Sonnet 幫你寫 prompt。
- 把 prompt 餵進你自己訓練的 6-layer mini-transformer(repo 提供腳本),看輸出是否穩定。
- 如果 mini-transformer 會錯,代表 prompt 本身有歧義,再回去改 prompt。
這樣做的好處是:你不必每次花 $0.03 去呼叫大模型做 A/B test,只要本地 2 秒就跑完。
書中 Ch15 的實測數據提到「好的提示詞可以在零設定的情況下把品質拉高 2 倍」,當你有自己的小型驗證器,就能量化「拉高 2 倍」到底是多少 BLEU 分。
可能的坑
- GPU 記憶體:作者範例用
d_model=512,batch=2 就能跑。如果你想玩d_model=1024,8 GB VRAM 會直接 OOM。 - 資料集:repo 只給了 10 MB 的示範文本,真正要訓練得自己去下載 OpenChineseLLaMA 或 WuDaoCorpus。
- 文件缺口:進階章節(如 RLHF)目前只有標題、還沒內容。作者最後一次 commit 是三週前,活躍度中等。
- 中文 tokenization:預設用
bert-base-chinese的 vocab,導致「喵星人」會被切成「喵 / 星 / 人」,可能影響下游任務。
下一步
- 先用
01_transformer_intro.ipynb跑一次 forward,確定環境沒問題。 - 把
04_train_tiny_shakespeare.py改成中文文本,觀察 loss 收斂曲線。 - 把訓練好的 6-layer checkpoint 掛進 Claude Code,當成本地「小抄」模型,降低每次迭代的 API 成本。
如果你跑完這三步,還想再深入,可以 fork 一份,把 RLHF 章節補完,再回頭對社群發 PR。這樣你就有了一條從「看懂」到「貢獻」的完整路徑。