Appearance
實驗紀錄
如何執行
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.0601loss 會從約 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 不降反升 |
核心觀察
訓練速度瓶頸:由於使用純 Python scalar(而非 tensor)運算,1000 步可能需要 30–60 秒。每次跑完整訓練請有耐心。
反向傳播的記憶體:因為保留了完整的計算圖供 backward 使用,loss 的計算圖包含序列長度 × 參數數量的節點,可能消耗數 MB 記憶體。
隨機性:每次生成的名字不同,這是因為 softmax 採樣引入的隨機性。
無 batch:每個 step 只處理一個名字,導致梯度 noisy,收斂曲線不平滑。
進階實驗建議
- 將資料集換成其他字元序列(如唐詩三百首、程式碼片段)
- 加入 dropout 防止 overfit
- 將 linear 函式改成真正的矩陣乘法加速
- 加入 validation split 觀察是否 overfit