從零開始拆開 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.2transformerseinopsmatplotlib。我原本擔心 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 的「本地驗證器」。流程如下:

  1. 先用 Claude 3.5 Sonnet 幫你寫 prompt。
  2. 把 prompt 餵進你自己訓練的 6-layer mini-transformer(repo 提供腳本),看輸出是否穩定。
  3. 如果 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,導致「喵星人」會被切成「喵 / 星 / 人」,可能影響下游任務。

下一步

  1. 先用 01_transformer_intro.ipynb 跑一次 forward,確定環境沒問題。
  2. 04_train_tiny_shakespeare.py 改成中文文本,觀察 loss 收斂曲線。
  3. 把訓練好的 6-layer checkpoint 掛進 Claude Code,當成本地「小抄」模型,降低每次迭代的 API 成本。

如果你跑完這三步,還想再深入,可以 fork 一份,把 RLHF 章節補完,再回頭對社群發 PR。這樣你就有了一條從「看懂」到「貢獻」的完整路徑。