AI 學到的東西,最後存在哪裡?
前面說,模型 (Model) 會從資料中學習。但訓練 (Training) 結束後,電腦究竟留下了什麼?
當別人把「訓練好的模型」交給我們,他交過來的是什麼?為什麼我們不用重新訓練,就能接著使用?
這一章要追蹤:訓練的成果,如何被保存下來,再用來回答新的問題。 它接續〈大量文字,怎麼變成一個可以使用的 LLM?〉的製作全貌,補上「訓練完成」到「可以交給別人使用」之間的這一步。
先說答案:訓練會調整模型裡的參數 (Parameter),也就是計算時使用的數值。訓練結束後,可以把這些數值寫成檔案;之後由程式讀回,再用於新的輸入。先用只有一個數值的糖果模型,看清楚這件事。
從糖果模型,看見學到的成果
先用〈模型到底是什麼?〉的糖果模型看一個最小的例子。它的任務是:只告訴它買幾顆糖,請它估計總價。
前面給它一些收據,例如「2 顆共 10 元、4 顆共 20 元」,讓它找出單價 5 元。現在給它一個新的問題:「8 顆大概要多少錢?」它就用學到的單價算出 40 元。
這裡的三個數字,角色不同:
| 數字 | 在這個模型裡的角色 | 從哪裡來? |
|---|---|---|
| 數量 8 顆 | 輸入 (Input):這次要處理的問題 | 這次由我們告訴模型 |
| 單價 5 元 | 參數:模型計算時使用的內部數值 | 先前從收據找出,之後留下來使用 |
| 預測總價 40 元 | 輸出 (Output):這次算出的結果 | 模型用 8 × 5 算出來 |
每次問問題,只要提供數量;單價已經留在模型裡,總價則由模型計算。 這也說明為什麼叫「預測」總價:我們沒有給它 8 顆的收據,而是讓它用先前學到的單價估計。
保存的是什麼?載入又做了什麼?
糖果模型學到的成果,就是單價 5。現在把程式關掉,想在下次啟動後繼續用這個成果,便需要先把 5 留下來。
可以用三個步驟看清楚保存與載入:
- 保存:留下「單價是 5」這份副本。
- 移除目前數值:程式還在,但現在沒有單價,無法計算總價。
- 重新載入:把副本中的 5 放回單價的位置,8 顆又能算出 40 元。
第二步沒有把已保存的副本刪掉。第三步也沒有再讀收據、重新找一次單價;它只是把已經留下的數值讀回來。
先想一下:保存單價 5 之後,改用單價 3,再載回副本,結果會是 24 還是 40? 開練習看差別。
先保存單價 5,換成單價 3,比較目前計算與副本。再移除目前數值、載回副本。最後只把輸入改成 2 顆:副本是否跟著改變?這裡的副本只留本頁,沒有下載檔案或執行訓練。
載回後是 40 元,因為副本保存的仍是 5。只把輸入換成 2 顆,則算出 10 元,輸入變了,保存的單價沒有變。保存數值時不必把每一次的輸入都包進去。
練習把副本寫成一小段可讀文字,方便看見裡面只有單價。真實模型可以把大量數值寫成檔案;程式結束後,檔案仍能留下,下次啟動再載入。檔案不需要裝著這次的問題,才能保存模型的數值。
這就是本章要接起來的過程:訓練調整參數 → 把參數保存成檔案 → 下次載入參數,處理新的輸入。 拿到別人已訓練好的數值,也能由相容的程式載入使用,不必先重做原本的訓練。
換問題,和換模型裡的數值,有什麼不同?
把問題從「8 顆多少錢?」換成「2 顆多少錢?」,就是換輸入;單價仍然是 5。把單價從 5 換成另一組收據學到的 3,才是換模型裡的參數。即使仍問 8 顆,結果也會不同:
| 這次輸入 | 模型裡的單價 | 預測總價 |
|---|---|---|
| 8 顆 | 5 | 8 × 5 = 40 元 |
| 8 顆 | 3 | 8 × 3 = 24 元 |
同一份乘法程式,可以使用不同版本的單價;同樣的輸入因此得到不同結果。載入另一個已學好的版本,就是換用那一組保存的數值。
進一步:保存的數值,怎麼配合程式運作?
現在已經知道要留下什麼,再來分清它和程式的關係。為什麼只保存數值,還不足以獨立運作?
| 名稱 | 在糖果例子裡是什麼? |
|---|---|
| 架構 (Architecture) | 計算的安排:一個數量輸入,乘上一個可調單價,得到一個總價輸出 |
| 程式 (Program) | 把這個安排寫成電腦能執行的步驟:讀取數量、讀取單價,做乘法 |
| 權重 (Weights) | 計算裡使用的數值:這裡就是單價 5,或另一個版本的 3 |
架構像「安排哪幾道工序」,程式讓工序實際執行,權重則填入工序要用的數值。同樣的安排,可以使用不同數值;換數值,不必把整個安排重新寫一遍。
有了架構,就已經有學到東西的模型嗎?
還沒有。先給單價一個起始值 1,程式照樣能算出「8 × 1 = 8」,但它尚未利用收據調整單價。能執行計算,和數值已經經過訓練,是兩件事。
給參數起始值叫初始化 (Initialization)。如果要從零學習,就從起始值出發,根據訓練資料調整;如果已經有學好的版本,也可以載入那組數值,接著使用,不必先重做一遍原本的訓練。
練習中的 5 與 3 沿用前面兩組收據找到的結果;按按鈕切換版本,只是在換數值,沒有執行訓練。手動改數值也不表示改完一定更好,仍要用合適的資料檢查。
這和 LLM 的關係是什麼?
糖果模型用來分清「這次給它什麼、它裡面留著什麼、最後算出什麼」。把這三種角色放回大型語言模型 (Large Language Model, LLM),可以這樣看:
| 角色 | 糖果模型 | LLM 預測下一個 Token 時 |
|---|---|---|
| 這次的輸入 | 糖果數量,例如 8 顆 | 目前的文字,例如「歡迎各」,經切分與編號後送進模型 |
| 模型裡留下的參數 | 學到的單價,例如 5 | 訓練學到的大量數值,用於向量 (Vector) 查表、各層計算與候選計分 |
| 這次計算的輸出 | 預測總價,例如 40 元 | 下一個 Token 各候選的分數,再轉成機率 (Probability) |
LLM 接著依機率選出下一個 Token,再繼續生成。糖果模型的乘法只示範這三種角色;8 顆不是在代表 8 個 Token,單價 5 也不是某個 Token 的機率。
放回 LLM:為什麼還需要配套?
回到前面的對照:LLM 也是由程式執行一套計算安排,使用載入的參數。前面看過的 Token 向量查表、每層加工和候選計分,都會用到大量參數。
對相同或相容的架構,同一套執行程式可以載入不同版本的權重。例如在既有模型上繼續訓練,架構不變,保存下來的數值已改變,便得到另一個版本。兩個版本遇到相同輸入,可能給出不同的候選機率 (Probability)。
但不能把任何權重都塞進任何程式。如果程式預期某一層接收 4 個數值,檔案卻提供另一種大小的資料,就無法直接照原本安排運算。數值的名稱、大小與所放的位置,都要和程式建立的結構對得上。
文字還要經過相容的切分器 (Tokenizer):同一個 Token 編號要對到模型預期的那一列向量。只有一堆數值,卻不知道怎麼組成網路、怎麼準備文字,也還不能完整使用這個 LLM。
所以「下載一個模型」常是取得權重、結構設定與文字處理配套,再由相容程式載入執行。它們可能放在同一個資料夾或被一起封裝;本章分開講角色,不表示必須永遠分成三個檔案。
〈大量文字,怎麼變成一個可以使用的 LLM?〉的「保存與載入」,指的就是這段工作。下一章〈一篇文章,怎麼變成模型的訓練題?〉回到學習過程,先看訓練材料如何提供題目,再追參數如何更新。
參考:PyTorch:保存與載入模型、Transformers:模型保存、設定與載入(2026-10-07 查核)。本章只拆各角色與數值保存,不教檔案格式、硬體配置或真正的 LLM 下載操作。