Skip to content

Q&A 問答集

Q1: microgpt 和 nanoGPT 有什麼不同?

A: microgpt 是純 Python 無依賴的教學實作(200 行),適合理解 GPT 核心原理。nanoGPT 使用 PyTorch,支援 GPU、batch 訓練、更深的網路,是 production 等級的程式碼。可以想成 microgpt 是 nanoGPT 的「說明書」。

Q2: 為什麼要用字元級 tokenizer 而不是 BPE?

A: 簡潔性。字元級 tokenizer 只需 3 行程式碼(找出不重複字元、排序、加 BOS),而 BPE(Byte Pair Encoding)需要數百行的實作。對於名字生成這樣的簡單任務,字元級已經足夠。

Q3: Value 類別的 slots 有什麼作用?

A: __slots__ 限制 Value 實例只能有 data, grad, _children, _local_grads 這四個屬性。這樣做有兩個好處:減少記憶體開銷(每個物件省下約 40% 的記憶體),以及加快屬性存取速度。在 microgpt 中可能參數數量上千個,這個優化有意義。

Q4: 為什麼使用 RMSNorm 而不是 LayerNorm?

A: RMSNorm 是 LayerNorm 的簡化版本。LayerNorm 計算 (x - μ) / σ,而 RMSNorm 只計算 x / RMS(x)。論文證明 RMSNorm 在 Transformer 中效果相當,但計算更少、不收斂更快。microgpt 的註解也提到這是與 GPT-2 的主要差異之一。

Q5: keys 和 values 列表在 attention 中是如何使用的?

A: 在每個訓練步驟中,程式會從左到右逐個位置生成 token。keys[li]values[li] 會累積該層所有歷史位置的 K 和 V 向量。這實作了因果注意力:當前的 Q 只能與過去(包括當前)的 K 做點積,保證模型無法看到未來 token。

Q6: 為什麼推論時要除以 temperature?

A: Softmax 的溫度參數控制輸出分佈的「銳利度」:

  • 低溫度(如 0.5):logits 除以小數字,softmax 後的分佈更極端,高機率的 token 更可能被選中 → 更確定性的輸出
  • 高溫度(如 1.5):logits 除以大數字,softmax 後的分佈更平滑,低機率的 token 也有機會被選中 → 更多樣化的輸出

Q7: loss 值大概是多少才算收斂?

A: 在字元級名字生成任務中:

  • 隨機猜測的 loss ≈ log(vocab_size) ≈ 5.3
  • 訓練 1000 步後,loss 通常降到約 2.0–3.0
  • 理論最小值取決於名字資料的「熵」

Q8: 為什麼 Adam 的 beta1 設為 0.85 而不是常見的 0.9?

A: 這是 microgpt 的一個小 tweak。beta1=0.85 讓一階動量的衰減更快,意味著更重視最近的梯度。這在小型模型和資料集上可能收斂更快。PyTorch 預設是 beta1=0.9, beta2=0.999

Q9: microgpt 可以訓練中文資料嗎?

A: 可以。只要將 docs 替換為中文字元序列(如詩詞、成語),tokenizer 會自動建構中文字元的 vocabulary。但注意純 Python scalar 運算在大量中文資料上會非常慢。

Q10: "Everything else is just efficiency" 是什麼意思?

A: 這句話是 Karpathy 的標誌性宣言。意思是:GPT 的核心演算法(前向傳播、反向傳播、梯度下降)只需要 200 行純 Python 就能完整實作。PyTorch 的 tensor 運算、GPU 加速、flash attention、分散式訓練等,都只是「讓它跑更快」的工程優化,而非演算法本質。