
大模型為什麼連 strawberry 裡有幾個 R 都會數錯?
模型並不像人一樣逐字母閱讀。它看到的是 token 編號——這個設計取捨,解釋了經典的「數字母」失誤。
問早期的大語言模型:strawberry 這個單詞裏有幾個字母 R,它常常答錯。最直覺的結論是「模型不會數數」。更有用的結論是:它一開始就不是在字母層面看這件事。
模型最先拿到的是什麼
你在對話框打完一句話、按下發送之後,模型並不會直接讀那些漢字或字母。一個叫分詞器的程序,會把字串轉成一串整數。每個整數對應固定詞表裏的一個條目——現代大模型的詞表通常有幾萬到幾十萬個條目。這個步驟就叫分詞(tokenization)。
因此,你看到的是「今天天氣怎麼樣」這幾個字;模型看到的,往往是幾個編號。之後幾乎所有計算,都在這些編號及其對應向量上進行,而不是在原始字母或筆畫上進行。
為什麼不用「整詞一個 token」
若詞表用完整單詞,體積會變得極大,而且訓練時沒見過的新詞幾乎無法處理。若改成單個字符,詞表的確變小,但模型得從零學習最基本的拼寫模式,計算效率很低。子詞分詞取了中間值:常見片段成為單一 token;罕見詞與新詞則由更小的片段拼起來。
在這種設計下,tokenization 可能被切成 token 與 ization;running 可能切成 run 與 ning。模型擅長預測下一個片段,並不天生逐個檢查片段內部的每個字母。
strawberry 這個教訓
所以 strawberry 的謎題其實沒那麼神秘。人會自然地把詞拆成字母;模型卻常常只看到幾個子詞單元——這些編號剛好拼出一個人類會逐字母拆開的詞。數錯 R 的個數,並不直接證明模型完全不會算術;它提醒我們:文字與模型之間的介面,對「字母級任務」本來就有損耗。
- 不同模型家族使用不同分詞器——例如 GPT 系列常見的是 BPE 變體,LLaMA 系列則常用 SentencePiece。
- 同一句話若被分成更少的 token,通常代表更少的計算量;分詞器選擇也會影響多語言覆蓋能力。
- 基本形態始終一樣:文本進去,整數出來。
一旦把分詞看成工程取捨而不是魔法,許多「奇怪」的模型行為就比較好定位了。模型並不是用你讀書的方式在讀文字;它讀的是一套為訓練效率而壓縮的編碼——而那套編碼,未必保留人們習以為常的字母視角。