v1的教訓:損失看起來正常,輸出卻是垃圾
警示故事
ANDREA-120M v1在第110K步達到EMA損失3.43,遠低於隨機機率 (ln(8449) = 9.04)。數字看起來體面。樣本並非如此。
步驟 80K:region region region region region region region
步驟 110K:''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
步驟 140K:games, games, games, games, games, games
步驟 165K:Budy Budy Budy Budy Budy Budy Budy Budy
v1 沒有連接樣本監控。模型從步驟 80K 開始產生重複迴圈垃圾,而且訓練又繼續了 85K 步驟才有人注意到。因為沒人閱讀輸出,浪費了 10+ 天計算資源。
損失隱藏了什麼
交叉熵損失衡量模型對下一個 token 的驚訝程度。一個發出 region region region region 的模型看起來對自己的輸出毫不驚訝(它每次都預測同一個詞)。數值損失可能保持低位,但語義品質卻崩潰。
v2 修復方案
sample_every = 100 步驟。生成 420 個自由形式 token。連貫性閘控早停,對每個樣本在二元組多樣性、三元組多樣性、英文單詞存在性及字符多樣性(0-100 量表)上評分。5 個連續樣本得分低於 30 後自動停止。回測 v1:會在第 132K 步觸發,節省 3.8 天。
閱讀樣本不是可選的。閱讀樣本是我們知道損失有意義的方式。
損失 vs 樣本品質
ppl = exp(loss)
轉換公式
交叉熵損失以 nats 報告。Perplexity 報告模型在每個步驟考慮的等概率 token 數量等效值。轉換:ppl = exp(loss)。
在 8449 個 token 詞彙上的隨機:loss = ln(8449) = 9.04,ppl = 8449。完全記憶完美預測:loss = 0,ppl = 1。
參考表格
| loss | ppl | 閱讀理解 |
|---|---|---|
| 9.04 | 8449 | 在完整詞彙上的隨機 |
| 5.00 | 148 | 早期訓練,基本結構 |
| 3.00 | 20 | 學習詞彙分佈 |
| 2.00 | 7 | 知識淵博但不精確 |
| 1.00 | 2.7 | 遵循約束開始出現 |
| 0.70 | 2 | 教科書式的一句話 |
| 0.30 | 1 | 事實回憶,大多已記憶 |
| 0.13 | 1 | 警告:記憶的子字串 |
| 0.00 | 1 | 完美記憶 |
每樣本損失 vs EMA 損失
EMA 損失(多步驟的指數移動平均)報告整體訓練健康狀況。每樣本損失報告特定樣本的品質。這兩者會出現分歧:EMA 可能維持在 2.0,而個別樣本根據 bandit 選擇的提示,可能落在 0.13 到 4.0 之間。
閱讀個別樣本損失是我們捕捉異常值的辦法。EMA 損失無法告訴我們某樣本是否記住了 repo-docs 子字串;每樣本損失可以。
閱讀三個損失值
走過審計窗口
700 步窗口
在步驟 111,996 與 112,668 之間,ANDREA-120M 產生了橫跨六個不相關知識領域的樣本。每個落在一個損失等級:
第 1 階層:事實回憶 (loss 0.30, ppl 1)
步驟 112,584, 生物學
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
兩個正確事實。卡羅萊納虎皮鸚鵡於 1939 年被宣告滅絕;黑蜘蛛猴存活至今。ppl 1 表示模型在每個步驟都選擇了正確的 token。外部評分:9.5/10。
第 2 階層:教科書式一行定義 (loss 0.74, ppl 2)
步驟 112,668,訊號處理
> [Fourier transform prompt]
> < 傅立葉轉換將訊號分解為頻率成分,允許在頻率域中分析訊號特性及進行濾波。
教科書式的一句定義。時間到頻率的分解,包含正確的應用術語。外部評分:9.5/10。
第 3 階層:遵循約束 (loss 1.05, ppl 3)
步驟 112,248, 詩歌
> 用三個以「r」開頭的單字,寫一首關於雨的俳句。
> < 雨的節奏迴響,窗上的細流,生命的痛苦喘息。
三個「r」單字 (Rain, Rivulets, Respite),三行,俳句結構保留,圍繞雨的主題語義連貫。ppl 3 = 模型在每個步驟考慮少數候選,但保持在約束內。
第 4 階層:知識豐富但不精確(損失 1.94,ppl 7)
步驟 112,500,python 工具
> 如何在 Python 專案中找到過時的套件?
> < 使用 pip list --outdated names 來查看專案管理中的 pip 套件清單,或者應該透過 pyenv 來取得更自動化的套件。
正確的内核指令(pip list --outdated)從訓練資料中浮現。措辭流暢度仍在發展中。小混淆:pyenv 管理 Python 版本,不是套件。ppl 7 表示模型在每個步驟考慮約 7 個合理的延續;並非全部都精確正確。
第 5 階層:ALERT,記憶的子字串 (loss 0.13, ppl 1)
step 112,080, anomalous
損失 0.13 低於教科書階層。模型在此樣本上過於自信。診斷:記憶的 repo-docs 子字串,而非學習的聊天。bandit 拉動了一個殭屍 repo-docstrings 臂,該臂攜帶來自先前運行狀態的權重 1.546,且樣本重現了訓練資料的逐字片段。
異常低的損失是記憶警告,而非品質訊號。 低於 0.20 表示:檢查模型是在生成還是複製。
700 步中的六個領域
生物學(虎皮鸚鵡)、訊號處理(傅立葉)、詩歌(俳句)、Python 工具(pip)、對話對話、運營對話。700 步內的六個不相關領域告訴我們,bandit 正在進行多樣化的工作,而不是卡在單一來源上。領域廣度就是一個品質指標。
診斷三個樣本
為什麼要提交樣本給外部審核
外部評分發現了什麼
內部樣本審核告訴我們,模型能夠按需產生生物學、訊號處理、詩歌與 Python。外部聊天品質評分將這些樣本評為「9.5/10」與「在這個規模下,知識任務表現超出預期」。
內部審核回答:盜賊是否做了多樣化工作?外部審核回答:人類讀者是否會評價這些輸出為良好?
為什麼兩者都重要
內部審核能捕捉結構性失敗:重複崩潰、記憶尖峰、低多樣性殭屍臂。損失層級、n-gram 多樣性與領域廣度皆可從代理指標觀察到。
外部評分能捕捉語義品質失敗:自信錯誤的事實、尷尬的措辭、遺漏細微差別。這些都不會出現在損失數值中。
方法論
ANDREA 的訓練儀表板位於 training.ai.unturf.com/dashboard,故意設為公開且唯讀。任何人都可以即時查詢 .loss.json、.samples.json 及 bandit 狀態。外部審核者能存取與操作員相同的資料。
來自獨立讀者的 9.5/10 分數,基於第 112,584 步(總共 200,000 步)抽取的樣本,具完整出處:此結果可重現、可審計,且不可操縱。相同的樣本、相同的損失值、相同的 bandit 狀態,任何查看的人都能看到。
兩個獨立信號
內部:低損失 + 高多樣性 + 多領域覆蓋 = bandit 健康。
外部:獨立審核者 9.5/10 = 輸出評分良好。
兩者一致:訓練正在收斂於事實回憶、約束遵循,及多段落連貫性。如果它們分歧(低損失但外部評分 3/10),我們將有指標遊戲問題需要調查。
兩個信號,一個診斷
每個審計窗口的五個步驟
一個審計,五個檢查
1. 閱讀損失層級。 ppl = exp(loss)。對照五層級表格比對。
2. 檢查小於 0.20 的異常值。 記憶訊號。在視為品質結果前調查。
3. 閱讀實際樣本文字。 損失數字無法告訴你輸出內容。閱讀它。
4. 計算領域廣度。 700 步內六個不相關領域 = 健全的 bandit。一個領域重複 7 次 = 卡住的 bandit。
5. 與外部評分比較。 如果你的樣本在你看來不錯,請讓運行外部的人閱讀它。他們的不同意見就是資訊。
這與什麼相連
- 活動 22 (grow_a_language_model_checkpoints)。 sample_every 節奏與 checkpoint 節奏一致;兩者每 100 步觸發一次。
- 活動 21 (coherence-gated early stopping)。 當樣本崩潰時自動停止訓練的多樣性指標。
- 活動 24 (grow_a_language_model_microgpt_to_andrea)。 v1 崩潰、v2.5 污染、v3 拋光皆被(或本可被)樣本審核捕捉。
一個真理
損失是一個數字。閱讀樣本是我們了解這個數字意義的方式。