Skip to content

實驗紀錄

如何執行

powershell
cd D:\workspace\OpenCode\AndrejKarpathy-Tech\02-microgpt\original
python microgpt.py

第一次執行會自動下載 names.txt(約 200KB,包含 ~32,000 個英文名字)。

預期輸出

訓練階段

num docs: 32033
vocab size: 27
num params: 5301
step   50 / 1000 | loss 3.9264
step  100 / 1000 | loss 3.2457
step  200 / 1000 | loss 2.6990
step  500 / 1000 | loss 2.2907
step 1000 / 1000 | loss 2.0601

loss 會從約 5.0 逐漸下降到約 2.0(因模型小,不會完全收斂)。

推論階段

--- inference (new, hallucinated names) ---
sample  1: brelen
sample  2: tinna
sample  3: joser
sample  4: samanth
sample  5: chris
sample  6: jennif
sample  7: michael
sample  8: sarah
sample  9: david
sample 10: lind

生成的結果雖然不完美,但已經展現了英文名字的字母組合模式。

參數調整實驗

調整 n_layer(層數)

n_layer效果
1預設,收斂適中,生成品質尚可
2參數增加約 80%,訓練時間翻倍,loss 可能更低
3+純 Python 訓練極慢,參數量過多可能 overfit

調整 n_embd(嵌入維度)

n_embd效果
8容量不足,loss 較高(~2.8)
16預設,平衡點
32參數倍增(~20K),訓練變慢,但可能生成更合理的名字
64參數暴增(~80K),純 Python 訓練非常慢

調整 temperature(推論溫度)

temperature效果
0.1幾乎總是生成同樣的名字(如 "james")
0.5預設,合理的多樣性
1.0更隨機,可能出現不合理的字母組合
1.5幾乎是亂碼

調整 learning_rate(學習率)

lr效果
0.001收斂太慢,1000 步後 loss 仍 ~3.5
0.01預設,收斂合理
0.05訓練不穩定,loss 可能會震盪
0.1發散,loss 不降反升

核心觀察

  1. 訓練速度瓶頸:由於使用純 Python scalar(而非 tensor)運算,1000 步可能需要 30–60 秒。每次跑完整訓練請有耐心。

  2. 反向傳播的記憶體:因為保留了完整的計算圖供 backward 使用,loss 的計算圖包含序列長度 × 參數數量的節點,可能消耗數 MB 記憶體。

  3. 隨機性:每次生成的名字不同,這是因為 softmax 採樣引入的隨機性。

  4. 無 batch:每個 step 只處理一個名字,導致梯度 noisy,收斂曲線不平滑。

進階實驗建議

  1. 將資料集換成其他字元序列(如唐詩三百首、程式碼片段)
  2. 加入 dropout 防止 overfit
  3. 將 linear 函式改成真正的矩陣乘法加速
  4. 加入 validation split 觀察是否 overfit