模型應該有多驚訝?
從 Logits 到機率
經過 12 個 transformer 區塊後,ANDREA-120M 為每個 token 位置產生一個 vocab_size 個數字的向量:logits。對於 ANDREA-120M,vocab_size = 8449,因此每個位置輸出 8449 個 logits。Logits 是未標準化的分數;有些為正,有些為負,沒有約束和為 1。
Softmax 將 logits 轉換為機率分佈:
p_i = exp(logit_i) / sum_j exp(logit_j)
經過 softmax 後,所有 8449 個數字位於 0 到 1 之間,總和為 1。模型為每個可能的下一個 token 分配機率。
交叉熵損失
訓練需要一個損失函數:一個數字,用來衡量模型對給定正確答案的預測錯誤程度。交叉熵適用於語言建模:
loss_t = -log(p_correct_token_t)
取模型對實際下一個 token(訓練資料中的那個)的預測機率。取該機率的負對數。那就是單一位置的損失。
為什麼用負對數
三個特性使 -log(p) 成為自然的損失函數:
- -log(1) = 0: 當模型以 100% 信心預測正確 token 時,損失為零。
- -log(0) = ∞: 當模型對正確 token 賦予零機率時,損失為無限大。(實際上,softmax 永遠不會輸出正好 0;損失保持有限但很大。)
- 單調遞減:隨著正確 token 的預測機率增加,損失平滑減少。
對正確答案更高的信心 = 更低的損失。訓練目標很簡單:最大化實際下一個 token 的預測機率。
每個序列的損失
ANDREA 在長度為 1024 的序列上訓練(上下文窗口)。每個序列產生 1024 個下一個 token 預測。序列損失是所有位置的平均值:
sequence_loss = mean(-log(p_correct_t)) for t in 0..1023
然後序列損失會在批次中取平均(ANDREA-120M 使用 batch_size = 8)。每個訓練步驟一個標量數字。該數字就是損失曲線所繪製的內容。
計算單一位置的損失
Perplexity = exp(loss)
更友善的尺度
像 2.0 或 3.43 這樣的損失值並不能立即傳達模型的能力。Perplexity 將損失轉換到更直觀的尺度上:
perplexity = exp(loss)
Perplexity 回答一個清晰的問題:在多少個同等可能的 token 中,模型有效地選擇?Perplexity 為 7 表示模型的行為就像在每個位置從 7 個合理的下一個 token 中挑選。Perplexity 為 1 表示完美預測。
常見的 Loss-Perplexity 配對
| Loss | Perplexity | 感覺如何 |
|---|---|---|
| 0.0 | 1.0 | 完美預測 |
| 1.0 | 2.7 | 在約 3 個合理 token 中選擇 |
| 2.0 | 7.4 | ANDREA-12M 最終 SMMA 領域 |
| 3.0 | 20.1 | 合理文本但不確定 |
| 3.43 | 30.9 | ANDREA-120M v1 最低值(拋光前) |
| 5.0 | 148 | 早期訓練,學習詞彙分佈 |
| 9.04 | 8449 | ANDREA-120M 詞彙的隨機機會基準 |
困惑度將損失值置於脈絡中:損失值 2.0 表示模型實際上從約 7 個 token 中選擇,而不是從 8449 個。
隨機猜測基準
一個一無所知的模型,統一猜測每個 token 的機率為 1/V,其中 V = vocab_size:
p_uniform = 1 / V
loss = -log(1/V) = log(V)
對於 ANDREA-120M,V = 8449:
loss_uniform = ln(8449) ≈ 9.04
對於 ANDREA-12M,V = 2305:
loss_uniform = ln(2305) ≈ 7.74
任何高於此基準的損失值表示模型表現比隨機還差。任何低於它的損失值表示模型已經學到了一些東西:它將機率質量集中在比均勻分佈更小的子集 token 上。
閱讀損失值
平滑步驟級別噪聲
原始損失充滿噪聲
每步損失上下波動。ANDREA 的 bandit 每 7-42 步選擇不同的來源;有些來源(字典定義)產生容易的損失;其他來源(gutenberg 段落)產生較難的損失。將原始步驟損失對步驟編號繪圖,會產生混亂的散點圖。
平滑修改移動平均 (SMMA) 抑制噪音並揭示趨勢。ANDREA 的訓練代理計算 SMMA 如下:
SMMA[0] = loss[0]
SMMA[t] = (SMMA[t-1] * (N-1) + loss[t]) / N
使用 N = 100(ANDREA 的預設平滑窗口),每個新的 SMMA 值會將前一個 SMMA 的 99% 與新步驟損失的 1% 混合。突發尖峰會被吸收;持續變化會逐漸顯現。
為什麼不直接使用平均值?
簡單移動平均需要儲存最近 100 步的 100 個損失值。SMMA 只儲存一個值(運行平均)&一個常數(窗口大小)。記憶體節省、計算簡單,且平滑足夠以讀取曲線。
不同的平滑權重回答不同的問題:
- N = 10:追蹤短期變化;在階段轉換期間有用
- N = 100:ANDREA 的預設值;追蹤中期進展
- N = 1000:僅長期趨勢;訓練結束時有用
ANDREA 追蹤的內容
每 100 步,訓練代理會寫入 loss.json,包含目前的 SMMA、原始損失、步數及按來源細分。位於 training.ai.unturf.com/dashboard 的儀表板每 10 秒輪詢此檔案。外部觀眾可看到即時進度;儀表板為唯讀。
ANDREA-12M 的實際曲線
達到 SMMA 2.0 的配方
| 步數 | 平均損失 | 備註 |
|---|---|---|
| 0--2.5K | 4.50 | 隨機初始化,早期學習 |
| 2.5K--5K | 3.88 | 快速下降,穿越結構階段 |
| 5K--10K | 3.30 | 接近一致性邊界 |
| 10K--20K | 2.80 | Bandit 找到最佳組合 |
| 20K--25K | 2.40 | 平台期 --- 資料匱乏 |
| 25K--30K | 2.50 | 引入 Hermes 資料 + 學習率重啟 |
| 30K--35K | 2.35 | Hermes 整合,新低點 |
| 35K--40K | 2.10 | 4臂焦點,急劇下降 |
| 40K--43.6K | 2.00 | 知識領域,SMMA 低於 2.0 |
三個階段特別突出:
1. 早期急劇下降 (0-10K)。 損失從 4.50 降至 3.30,模型學習詞彙分佈與基本輪次結構。隨機機會基準 ln(2305) ≈ 7.74 遠高於此曲線;一旦嵌入穩定,模型迅速集中概率質量。
2. 高原期 (20K-25K)。 損失停滯在 2.40。盜賊在當前來源組合上已無餘地。第 25K 步驟加入 Hermes 資料,加上 LR 溫重啟,打破了高原期。
3. 最終下降(35K-43.6K)。 課程從 16 個來源縮減至 4 個(hermes3-general + dictionary + gutenberg + chat)。損失下降比全臂匪徒更陡。最終 SMMA:2.0。
ANDREA-120M v1:一個警示曲線
相同的詞彙計算:ln(8449) ≈ 9.04。ANDREA-120M v1 在第 110K 步達到 SMMA 3.43(其最小值),然後發散:
| 步數 | EMA 損失 | 趨勢 |
|---|---|---|
| 26K--40K | 4.29 | 收斂中 |
| 70K--85K | 3.60 | 最佳區域 |
| 85K--110K | 3.43 | 最小值 |
| 110K--125K | 3.54 | 發散中 |
| 140K--155K | 4.05 | 發散中 |
| 155K--165K | 4.54 | 崩潰 |
全程數值合理的損失值(3.43 遠低於 9.04 的隨機基準)。但樣本為重複崩潰:Budy Budy Budy Budy。損失值講了一個誤導的故事;樣本審核並非如此。
v2 的相干性閘控早停(活動 78)加入了一個平行信號:二元組多樣性、三元組多樣性、英文單詞存在、字符多樣性。當這四個分數連續 5 個樣本均低於 30 時,訓練自動停止。此信號本可在 v1 的第 132K 步捕捉到,節省 3.8 天的計算資源。
每個階段告訴你什麼
120M v1 課程
兩個獨立的信號
ANDREA-120M v1 在第 110K 步達到 SMMA 3.43。數值上:比隨機機率好 273 倍(困惑度 31 對詞彙大小 8449)。曲線上看起來很棒。
第 110K 步的範例::
''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
損失與連貫性是獨立的信號。低損失意味著模型有效地集中機率質量。連貫性意味著模型產生人類可讀的文字。第一者並不意味著第二者。
為何存在差距
模型可以透過以下方式降低損失:
1. 學習真實語言模式(好):主詞動詞一致性、常見片語、事實關聯。
2. 記憶結構性偽影 (壞):高頻重複模式、資料集特定怪癖、退化吸引子。
兩者皆降低損失。第一種產生人類喜歡的樣本。第二種產生 Budy Budy Budy Budy。單獨的訓練目標無法區分它們。
ANDREA-120M v3 拋光:損失與連貫性相遇之處
在 v3 拋光之後(第 112K 步起),ANDREA-120M 產生:
第 112,584 步,損失 0.30,ppl 1::
> [extinction prompt]
< 黑蜘蛛蒙塔諾還活著,卡羅萊納虎皮鸚鵡已滅絕。
兩個事實皆正確。卡羅萊納虎皮鸚鵡於1939年被宣告滅絕;黑蜘蛛猴仍存活。低損失(0.30)且連貫的事實回憶。
第 112,500 步,損失 1.94,ppl 7::
> 如何在 Python 專案中找到過時的套件?
< 使用 pip list --outdated names 來查看 pip 套件清單...
更高的損失 (1.94 → ppl 7),但正確的工具從訓練資料中浮現。在訓練進度 56% 時,措辭流暢度仍在發展中。
雙訊號紀律
現代訓練流程會監控兩者:
- 損失曲線。 告訴你模型是否在學習任何量化內容。
- 樣本審核。 告訴你模型學到的東西是否有用。
v2 新增了相干性閘控早停(活動 78)。v3 的精煉是樣本審核觸發的課程擾動,而不是損失值。損失單獨是必要的,但永遠不足以。