模型怎麼從預測錯誤中學習?
〈一篇文章怎麼變成訓練題?〉交出了前文和目標 (Target)。例如「各位」能讓模型 (Model) 看「各」,用「位」作比較依據。〈LLM 如何產生回答?〉已說明模型會為下一個 token 算出候選機率 (Probability)。如果「位」的機率太低,訓練 (Training) 程式怎麼知道該改哪些數值、改多少?
先看訓練的三個交接
模型先預測,訓練程式再看原文接的是什麼,依比較結果更新模型內部數值。下面的圖用「各位同事」追一次流程:
程式更新的是參數 (Parameter),再用新參數重新計算機率。圖中的「調整」不是直接把「位」欄改成指定百分比。這也說明候選機率的兩種依據:先前訓練影響模型怎麼算,本次前文影響正在預測什麼。
親手看一次更新
假設模型只看前文「各」,暫時只可能接「位」或「自」。它目前把兩者都估成 50%。我們拿四則原文讓它練習:
| 原文 | 則數 | 在「各」後面接什麼 |
|---|---|---|
| 各位 | 3 | 位 |
| 各自 | 1 | 自 |
為了看清楚一次更新,本章實驗把每個中文字暫當成一個 token,並只用一個參數 (Parameter) 影響這兩個候選的機率。真實模型的 token 切分、候選數量與參數都複雜得多;這張表不是任何模型的訓練資料。
先猜:模型看到三則「各位」、一則「各自」後,下一步會讓「位」的機率上升、下降,還是不變? 它會直接跳到 100% 嗎?
先用預設的三則「各位」、一則「各自」,按「執行一步訓練」,比較兩個候選的更新前後機率。再用加號把「各自」增加到四則,重新預測方向。這是本地簡化模型,不會訓練真實語言模型。
預設資料下,「位」原本是 50%,做完一步約變成 56.2%;「自」則從 50% 降到約 43.8%。方向符合剛才的資料,但沒有立刻變成 75%,更沒有變成 100%。一次訓練只走一步;按第二次,會從新的機率再走一步。
誰告訴模型「估得不夠好」?
訓練程式拿模型給原文下一個 token 的機率來評分。對「各位」來說,給「位」的機率越低,評分就越差;對「各自」來說,則要看「自」。把這些評分合在一起,得到損失值 (Loss):它表示這批練習資料上的預測有多不理想。這裡看的不是「模型剛好選中了哪個字」,而是它給原文那個字多少機率。
接著程式計算:如果把內部參數稍微往某個方向改,損失值會怎麼變? 這個方向與變化趨勢叫做梯度 (Gradient)。再依學習率 (Learning Rate) 決定一步走多遠,更新參數。更新的是內部數值;程式再用新數值計算機率,並非直接把「位」欄改寫成指定百分比。
原文中的下一個字 → 比較模型給它的機率 → 算損失與調整方向 → 更新參數 → 重新算機率
在這個單一參數的簡化模型裡,初始「位」的 50% 低於練習資料中的 3/4,所以這一步會提高「位」的機率。練習中的「展開計算過程」可顯示具體數字;先抓住「資料決定評分,評分引導參數更新」即可。
反過來試,才能看出原因
把「各自」改成四則,現在資料是三則「各位」、四則「各自」。練習會重設回兩者各 50%,避免把上一組資料訓練過的參數混進來。這時「位」在資料裡不到一半,一次更新便朝降低它的方向走。同樣是看到「各」,更新方向會隨練習資料改變。
真實語言模型不只看「各」這一個字,不只在「位/自」二選一,也不是逐一查字頻表。它用大量參數從不同前文學習;訓練一批資料後改善那批資料的損失,不保證每個新句子都答對。聊天時使用已訓練參數生成回答,叫做推論 (Inference);一般對話中補一句話會改變這次的輸入,並不等於現場執行了上面的參數更新。
下一章〈模型怎麼學會照指令回答?〉換成「要求+示範回答」,看原本的更新流程要比較哪些位置。
參考:Hugging Face 的下一個 token 訓練說明、PyTorch 的損失與參數更新教學(2026-09-24 查核)。本文的 50% 與 56.2% 來自本章的單參數教學模型,並非真實語言模型輸出;不同模型與訓練方法不必採用本章的數字或一步幅度。