Perplexity
猜下一個字時,
有多猶豫?
Perplexity 就是把「猶豫」換算成一個數字:這個模型平均在幾個選項之間搖擺。越小越好。
完全確定
PERPLEXITY1
每次都只有一個答案,一點都不猶豫。
像擲一顆骰子
PERPLEXITY6
六個選項一樣可能,就是在六個之間猶豫。
完全不會
PERPLEXITY11
整本詞表都一樣可能 — 數字就等於詞表大小。
所以 perplexity 的單位,其實是「等效的選項個數」。
語言模型只做一件事:猜下一個。
給它前面的字,它吐出一張機率表。下面是從本頁那份小語料學到的真實分佈:
看過「喜歡」之後,只有兩條路。路越少、越不平均,就越不猶豫。
N-gram 就是「只准往回看幾個字」。
真正的前文可能有幾百個字。N-gram 直接規定:只看前面 N−1 個,其他全部忘掉。
1-gram
我喜歡吃蘋果
什麼都不看
2-gram
我喜歡吃蘋果
看前 1 個
3-gram
我喜歡吃蘋果
看前 2 個
看得越多應該越準 — 但看得越多,「這組前文我見過」的機會也越少。這個矛盾等一下會親眼看到。
打分第一步:把機率乘起來。
整句話的機率 = 每一步機率連乘。問題馬上出現 — 它掉得非常快。
五個字就掉到千分之一。一個二十字的句子會小到 10-14 這種等級。長句子天生吃虧,所以不能直接拿機率比。
所以開 N 次方,再倒過來。
開 N 次方把長度的影響消掉,長句短句就能公平比。取倒數只是為了讓數字符合直覺:平均機率 1/6 → perplexity 6,跟骰子對得上。
自己轉轉看。
這六句話就是全部的訓練語料。下面可以換 N、換測試句、開關平滑。
N
平滑
測試句
句末的 </s> 也算一步 — 模型得學會「話說完了」。
三個一定要知道的事。
- 01
看到沒見過的組合,數字直接爆炸。選「他 喝 咖啡」再關掉平滑試試。語料裡沒有「他 喝」,機率是 0,整句機率歸零,perplexity 變成無限大 — 一個沒見過的組合就毀掉整份評測。所以平滑不是選配。
- 02
看更多不一定更準。開 add-1 之後比較 N=2 和 N=3:三元的分數反而更差。因為前文越長,見過的次數越少,估計就越不可靠。這叫資料稀疏,也是 N-gram 很少做到 5 以上的原因。
- 03
不同詞表之間,不能比。perplexity 是「平均在幾個 token 之間猶豫」— 換一套斷詞方式,token 的定義就變了,數字完全不可比。字元模型的 perplexity 天生比詞模型低,但那不代表它比較好。比較之前先確認兩邊用同一個 tokenizer。
Perplexity 量的不是「寫得好不好」,
只是模型有多意外。