🧠 大模型基礎
Foundations of LLMs
🏗 第 2 章 架構
🎯 什麼情境該想到我
當你「要做文字分類、抽取、翻譯或生成,在猶豫用 BERT 類小模型、T5 類,還是直接呼叫 GPT/LLaMA 這種生成式大模型」的時候。
⚙️ 怎麼用(步驟 / 公式)
1. 三種架構差在注意力看得到哪裡
| 架構 | 注意力矩陣 | 意思 |
|---|---|---|
| Encoder-only | 完全(雙向) | 處理每個詞時看得到整句前後文 |
| Encoder-Decoder | 編碼器雙向+解碼器下三角+交叉注意力 | 產生第 i 個輸出時,參考整個輸入,以及已產生的前 i−1 個輸出 |
| Decoder-only | 下三角(只看前面) | 產生第 i 個詞時只能看前面已產生的 |
預訓練任務也對應不同:Encoder-only 練挖空填詞(BERT 遮掉約 15% 的 token 讓模型補回);Encoder-Decoder 練截斷補全、片段還原(T5 把連續片段遮掉讓模型生成);Decoder-only 練預測下一個詞(GPT)。
2. 依任務選(書的對照,「同等參數規模下」)
| 架構 | 擅長 | 弱點 | 代表 |
|---|---|---|---|
| Encoder-only | 理解與判別:情感分析、文本分類、命名實體辨識、語意相似度 | 沒有解碼器,不能直接生成;硬要生成的話,每產一個詞都要重算整個序列 | BERT、RoBERTa、ALBERT、ELECTRA |
| Encoder-Decoder | 有條件生成:翻譯、摘要、問答(要先理解輸入再產出) | 多了解碼器,參數與計算量大 | T5、BART、Flan-T5、mT5 |
| Decoder-only | 開放式生成;規模夠大後什麼任務都能做 | 規模小時(GPT-1、GPT-2 時代)缺雙向上下文,理解複雜輸入不如前兩者 | GPT 系列、LLaMA 系列 |
3. 實務判斷(我依書的結論整理)
- 要大量、低延遲、低成本地做分類/抽取/向量化,標註資料夠:BERT 類模型仍然划算。書說這類模型「參數止步 6.6 億」,代表跑得動、跑得便宜。
- 翻譯、摘要這種輸入輸出成對的任務,又要自己微調一個中型模型:T5/BART 類。
- 任務多變、沒有標註資料、需要指令跟隨與推理:直接用 Decoder-only 大模型配 prompt(見 工具-上下文學習的示例怎麼挑怎麼排)。
4. 為什麼最後是 Decoder-only 勝出(書給的理由)
- 生成能力:Encoder-only 沒有生成元件,只能迭代挖空、反覆前向傳播,在生成式 AI 的需求下吃虧。
- 計算效率:Encoder-Decoder 參數多、長序列時編碼器與解碼器都很重;開放式生成的輸入很短甚至沒有,保留完整的編碼器沒必要。
- 結構簡單、參數好擴展:只留解碼器,每步只看已生成的部分,好往上堆規模。2019 年底後算力起飛,2021 年起在 GPT-3 推動下成為主流。
- 規模大了以後的任務泛化:湧現出上下文學習,不微調也能做多種任務。
書的措辭多是「可能」,這是歷史歸因,不是嚴格實驗比較。
5. 序列很長、Transformer 太貴時:非 Transformer 架構
Transformer 的注意力計算量隨序列長度平方成長。書介紹的替代方案都把計算壓到跟長度成線性:
| 架構 | 訓練 | 推論 | 書的評價 |
|---|---|---|---|
| SSM(S4 等) | 用卷積形式平行訓練 | 用遞迴形式,對長度線性 | 參數少、長序列快 |
| RWKV | 可平行 | 每步計算與記憶體固定 | 擴到 14B,NLP 任務與同規模 Transformer 相當;長距離依賴仍有局限 |
| Mamba | 計算與記憶體隨長度線性 | 每步常數時間;A100 上吞吐量是同規模 Transformer 的 5 倍 | 3B 勝過兩倍參數的 Transformer,能處理百萬級長度;但上下文超過 16k 後困惑度幾乎不再下降 |
| TTT | 外層正常預訓練,內層用自監督更新 | 線性 | 用模型參數當隱狀態,書說更能捕捉超長上下文 |
核心機制:SSM 用狀態方程 x_k = Ā x_{k−1} + B̄ u_k、y_k = C̄ x_k 把歷史壓進固定大小的狀態。正因為狀態大小固定,上下文一長就可能過早飽和。Mamba 讓 B、C、Δ 依輸入內容改變(選擇機制),補強處理文字這類資訊密集資料的能力。
判斷(我的整理):這些架構目前主要是研究與特定長序列場景的選項(基因、音訊、超長文件)。一般產品要處理長文時,先考慮 RAG 切塊或長上下文的 Transformer 模型,生態系成熟得多。
🧪 我實際套用的紀錄
- (尚無)
⚠️ 注意 / 什麼時候不適用
- 書寫作截至 2024 年中,非 Transformer 架構的版圖變動很快;書也沒提混合架構(如 Jamba)、RetNet、Hyena。選型前要重新查證。
- 書中幾處數字前後不一:GPT-2 XL 的注意力頭數正文寫 25、表格寫 36;BART 語料正文寫 160GB、表格寫約 20GB。引用時以原論文為準。
- 「BERT 類便宜」的前提是有標註資料可以微調;沒有標註資料時,大模型零樣本常常更省事。
🔗 相關工具
- 大模型基礎 —— 第 2 章架構演化與 2.6 非 Transformer 架構
- 注意力機制 —— 雙向與因果遮罩的計算細節
- 混合專家 MoE —— 另一種擴大 Decoder-only 規模的路線
- 工具-RAG檢索增強生成 —— 長文件的實務解法通常先走這條
💬 第 3 章 Prompt 工程
🎯 什麼情境該想到我
當你「要在 prompt 裡放範例讓模型照著做,卻不知道該挑哪幾個、放幾個、怎麼排,換個範例結果就不一樣」的時候。
⚙️ 怎麼用(步驟 / 公式)
上下文學習(ICL):在 prompt 裡放任務說明和幾個示範,模型從上下文學到任務的規則,不需要額外訓練。
1. 先選形式
| 形式 | 做法 | 優點 | 代價 |
|---|---|---|---|
| 零樣本 | 只給任務說明 | 泛化最廣 | 效果完全看模型本身能力 |
| 單樣本 | 給 1 個示範 | 像「舉一反三」 | 效果強烈依賴那一個示範夠不夠代表性 |
| 少樣本 | 給幾個到十幾個 | 特定任務明顯變好 | 示範越多推理越貴;示範的代表性和多樣性決定效果 |
2. 挑示範:相似性 vs 多樣性
兩個原則:相似性(跟眼前問題越像越好)、多樣性(涵蓋不同面向,讓模型從多角度理解任務)。書整理三種做法:
| 做法 | 代表 | 怎麼挑 | 缺點 |
|---|---|---|---|
| 直接檢索 | KATE | 用編碼器把問題和候選示範(拿掉標籤)轉成向量,取 cosine 最高的前 K 個 | 不管多樣性,示範容易同質化 |
| 聚類檢索 | Self-Prompting | 先用 K-Means 把候選分成 K 群,每群挑一個跟問題最像的 | 有些群跟問題根本不像,相似性不夠 |
| 迭代檢索 | RetICL | 每挑一個,就依「問題+已挑的示範」更新狀態再挑下一個 | 計算比較複雜 |
書的判斷:前兩種常在相似性與多樣性之間顧此失彼;迭代檢索兼顧兩者,複雜任務上較好。
實務起點(我的整理):先用直接檢索,發現示範都長得一樣、模型只會照抄某一類時,再換聚類或迭代。
3. 示範本身的五個坑
- 格式:簡單分類只要「輸入 → 輸出」;算術、程式這類推理任務,示範要寫出中間推理步驟(CoT 形式),只給答案不夠(見 工具-思維鏈的變體怎麼選)。
- 標籤要對:標錯的示範會讓模型學到錯的對應。★ 越大的模型對錯誤標籤越敏感,小模型反而不太受影響。
- 數量:多放通常會變好,但邊際效益遞減;生成任務比分類任務更吃示範數量。
- 順序:不同順序表現會顯著不同,而且最佳順序依模型而定:對 A 模型有效的順序,換到 B 模型不一定有效,也跟資料集特性有關。所以換模型就要重新驗證順序。
- 任務說明:寫清楚的任務說明本身就能提升 ICL。
4. ICL 為什麼有效、什麼時候沒用
- 書給的解釋(Xie et al. 2022,仍是開放研究問題):把 ICL 看成隱式貝葉斯推理。模型在預訓練時學到很多潛在「概念」,示範的作用是把模型錨定到其中相關的概念上。
- 推論:預訓練裡沒什麼相關資料的垂直領域,光靠 prompt 做不到領域適配(書在第 4 章開頭也這樣說),這時要考慮微調或 RAG。
- 模型要夠大:ICL 是規模夠大才出現的能力,書說通常要億級參數以上,舉出最小有 ICL 能力的是 Qwen2-0.5B。
- 預訓練資料跨領域、任務多樣、含罕見類別與「突發性」分佈時,ICL 比較穩。即使單一領域語料跟目標任務高度相關,也不保證 ICL 最好。
5. 檢查清單
- 示範的標籤都正確(大模型會被錯標帶偏)
- 示範之間夠多樣,不是同一類的重複
- 推理型任務的示範有寫中間步驟
- 換模型時重測示範順序
- 示範用分隔符和輸入清楚隔開:書的消融實驗中拿掉分隔符後,模型把示範也當成待分類的句子
🧪 我實際套用的紀錄
- (尚無)
⚠️ 注意 / 什麼時候不適用
- 書對這些因素幾乎沒給實驗數字,都是方向性結論;實際影響要在自己的評估集上量(見 工具-AI系統評估)。
- 示範很長時成本會疊上去,要跟效益一起算。書提到 LLMLingua 壓縮 prompt 可壓到原長的 1/20、幾乎不掉效能,不過這是論文宣稱的數字。
- 做過指令微調的對話模型零樣本就很強,未必需要示範;先試零樣本當基準線。
🔗 相關工具
- 大模型基礎 —— 3.2 節上下文學習
- 工具-提示工程 —— prompt 寫法的整體原則;這張只管示範怎麼挑怎麼排
- 工具-思維鏈的變體怎麼選 —— 推理任務的示範要用思維鏈形式
- 稀疏與密集檢索 —— 直接檢索示範用的就是密集檢索那一套
🎯 什麼情境該想到我
當你「想讓模型做推理(算術、邏輯、規劃),在考慮要不要叫它『一步一步想』、要不要多跑幾次投票、或讓它探索多條思路」的時候。
⚙️ 怎麼用(步驟 / 公式)
0. 先判斷:該不該用思維鏈
動機:書引 Flat Scaling Curves 現象,模型變大後語意理解、翻譯會變強,但算術、常識、符號推理不太跟著變好;加了思維鏈,推理能力才會隨規模提升。
但書明確列出不該用的情況,依任務、模型規模、模型能力三點判斷:
| 條件 | 結論 |
|---|---|
| 任務簡單(情感分類、常識問答) | 標準 prompt 就夠,思維鏈難以加分,反而增加複雜度 |
| 模型小(書的例子是十億級) | 可能產生不連貫的推理鏈,比標準 prompt 更差;書說思維鏈在千億級模型上才顯著有效 |
| ★ 模型做過推理方向的指令微調(ChatGPT、GPT-4、LLaMA2-Chat) | 不給指令也會自己寫出推理步驟;很多情況下不加思維鏈指令反而更好(書推測已在微調中內化) |
| Base 模型(LLaMA2-13B-Base 等)做推理題 | 適當的思維鏈提示能激發推理能力 |
1. 三種模式(書的分類)
| 模式 | 比喻 | 結構 | 方法 |
|---|---|---|---|
| 按部就班 | 照預定路線一步步走 | 單一條推理鏈 | CoT、Zero-Shot CoT、Auto-CoT |
| 三思後行 | 在森林裡每走一步就停下來評估,可回頭 | 樹或圖,可回溯 | ToT、GoT |
| 集思廣益 | 開會整合各方意見 | 多條獨立推理鏈,最後彙整 | Self-Consistency |
2. 各方法怎麼做
-
CoT(少樣本):在 prompt 放幾個手寫的「題目 → 推理步驟 → 答案」示範。缺點:要人工寫很多示範,而且效果強烈依賴示範品質。
-
Zero-Shot CoT:不用示範,分兩次呼叫:
- 問題後面接「Let’s think step by step/讓我們一步一步思考」,讓模型寫出推理;
- 把「原問題+第一步的推理」接起來,結尾加「Therefore, the answer is/因此,最終答案為」,取出最終答案。
書說在多個推理任務上可媲美、甚至勝過少樣本 CoT。
-
Auto-CoT:自動產生示範。用聚類從題庫挑題,用 Zero-Shot CoT 幫這些題寫推理鏈當示範,再接觸發句回答新問題。(書寫「挑跟使用者問題同一群的題」;原論文是每群各取一題以求多樣性,兩者描述不同。)
-
Self-Consistency:用隨機取樣(temperature > 0)跑 N 條推理路徑,收集各自的最終答案,取出現最多次的。★ 不綁定特定 CoT 形式,可以疊在任何一種上面。成本約是單次的 N 倍。
-
ToT(思維樹):四件事要設計:
- 拆解:一步要多大,數學題是一行等式,寫作是一段大綱;
- 衍生:產生下一步候選。思路空間大(寫作)時用多個示範擴大候選;空間受限(24 點)時在 prompt 寫明規則限制候選;
- 評估:讓模型對節點投票或打分,砍掉不可能的分支;
- 搜尋:BFS/DFS,或 A*、蒙地卡羅樹搜尋。
書的 24 點例子:輸入 4 9 10 13,每步挑兩個數運算產生子節點,讓模型評估剩下的數「能/可能/不可能湊成 24」,只保留有希望的節點,BFS 往下展開。其中一條成功路徑是 13−9=4、10−4=6、4×6=24。
-
GoT(思維圖):把樹擴成有向圖,可以合併不同分支的結果,也能自我反思修正。
3. 選型
書在 3.4.3 的建議:
| 需求 | 選 |
|---|---|
| 只要邏輯推理、不需領域知識 | Zero-Shot CoT/Auto-CoT |
| 要高準確、高可靠(例如寫程式時生成多個版本挑最一致的) | Self-Consistency |
| 帶創意的任務(例如寫故事時探索不同情節) | ToT/GoT |
成本面是我依機制推導的:單次 CoT ≈ 1 次呼叫(Zero-Shot CoT 是 2 次);Self-Consistency ≈ N 次;ToT/GoT ≈ 節點數 ×(衍生+評估),常常是幾十次起跳,延遲也最高。先用最便宜的,評估集上不夠再升級。
4. 控制推理寫多詳細
用示範的風格控制輸出:示範只寫「(7−3=4)顆」,模型就只給簡短算式;示範寫完整步驟,模型也寫完整步驟。使用者需要看過程時才放完整示範,省 token。
5. 延伸:用執行結果投票
Text-to-SQL 的 C3 方法把 Self-Consistency 用在 SQL 上:取樣多條 SQL,依執行結果投票選最終答案。能執行驗證的任務(程式、SQL、數學)都可以這樣做,比單純比對文字可靠。
🧪 我實際套用的紀錄
- (尚無)
⚠️ 注意 / 什麼時候不適用
- 對已經會自己推理的對話模型,硬加「一步一步想」可能變差,一定要跟不加的版本比。
- 書裡的效果描述幾乎沒有實驗數字,以自己的評估集為準。
- 「千億級才有效」是書寫作時的經驗,新的小模型經過推理訓練後未必如此,視為方向,不是門檻。
- Self-Consistency 只適合答案可以比對是否相同的任務(數字、選項、SQL 結果);開放式長文沒辦法直接投票。
- 書沒有涵蓋 Least-to-Most、ReAct、Reflexion。需要邊推理邊呼叫工具時,見 ReAct 與 Agent Loop。
🔗 相關工具
- 大模型基礎 —— 3.3、3.4.3 節
- 工具-上下文學習的示例怎麼挑怎麼排 —— 少樣本 CoT 的示範怎麼挑
- 工具-提示工程 —— prompt 整體寫法
- ReAct 與 Agent Loop —— 推理加上工具呼叫的迴圈
- 取樣與解碼策略 —— Self-Consistency 依賴隨機取樣;temperature 怎麼設看這頁
✏️ 第 5 章 模型編輯
🎯 什麼情境該想到我
當你「發現模型對某個特定事實答錯(或會吐出某段不該說的資訊),想精準地只改這一點,又不想付重新訓練或微調的代價」的時候。
⚙️ 怎麼用(步驟 / 公式)
1. 先確認:為什麼不是重訓或微調
書的論點(第 5 章):
- 重新預訓練:清洗資料成本高、知識一直在變、重訓算力巨大,每發現一個錯就重訓是「捨本逐末」。
- 微調:即使用 PEFT 仍有成本;修正一個錯誤能拿到的樣本很少,少量樣本微調容易過擬合和災難性遺忘。
- 模型編輯的目標:精準、高效地修正特定知識點,而且不影響其他無關輸出。
形式化(書的定義 5.1):對知識點 k =(問題 x_k,答案 y_k),編輯後的模型 M* 要滿足
M*(x) = y_k 若 x = x_k 或與 x_k 相關
M*(x) = M(x) 若 x 與 x_k 無關
難點全在「相關/無關」的邊界:知識之間牽一髮動全身。
跟 RAG 怎麼選,書沒有正面比較,以下是我的綜合判斷:知識常常變、量很大 → RAG(換文件就好,見 工具-RAG檢索增強生成);模型本身的錯誤認知、身分錯亂、要抹掉的個資或偏見,而且不想每次都靠外部檢索 → 模型編輯。
2. 用五個面向驗收編輯有沒有成功
用書的斑馬例子(模型錯答「斑馬的皮膚是肉色」,正解是黑色):
| 面向 | 問什麼 | 例題 | 要求 |
|---|---|---|---|
| 準確性 | 原題改對了嗎 | 斑馬的皮膚是什麼顏色? | 答「黑色」 |
| 泛化性 | 換句話問還對嗎 | 剃毛後的斑馬是什麼顏色? | 答「黑色」 |
| 可遷移性 | 間接相關的推論跟著更新了嗎 | 皮膚是黑色的馬是什麼馬?(反向)/斑馬的皮膚和毛色一樣嗎?(推理) | 答案不是「黑色」,而是推論出來的新答案 |
| 局部性 | 無關的知識沒被弄壞吧 | 赤兔馬的皮膚是什麼顏色?/鴕鳥會飛嗎? | 答案跟編輯前一樣 |
| 高效性 | 花多少時間、資源;能不能批量 | — | — |
每一項都是「答對的比例」:例如 Loc = 平均 I(M*(x_i) = M(x_i)),在一組無關題上算編輯前後一致的比例。
- 書的判斷:準確性是前提,沒過就不用看其他項;局部性是模型編輯相較於單純微調的主要改進;多數方法的可遷移性都不好,這是公認難題。所以上線前一定要測「它不知道要連帶更新的推論」。
3. 選方法:二層四類
| 大類 | 子類 | 做法 | 代表 |
|---|---|---|---|
| 外部拓展(不改原參數) | 知識緩存 | 門控判斷輸入跟緩存的知識相不相關,相關就交給推理模組,否則走原模型 | SERAC、Language Patch |
| 附加參數 | 在模型裡加少量新參數,只訓練它 | T-Patcher、GRACE、CALINET | |
| 內部修改(直接改原參數) | 元學習 | 訓練一個「學會怎麼編輯」的超網路,輸出參數更新量 | KE、MEND |
| 定位編輯 | 先找出知識存在哪些參數,再只改那裡 | KN、ROME、MEMIT |
書整理的比較(依 Yao et al. 2023 的實驗):
| 方法 | 準確 | 泛化 | 可遷移 | 局部 | 批量 |
|---|---|---|---|---|---|
| SERAC | 高 | 高 | 低 | 高 | ✓ |
| T-Patcher | 高 | 高 | 高 | 中 | ✗ |
| MEND | 中 | 高 | 中 | 高 | ✓ |
| ROME | 高 | 高 | 高 | 高 | ✗ |
| MEMIT | 高 | 高 | 高 | 高 | ✓ |
選擇原則(依書的判斷整理):
- 一次改一兩條事實,decoder-only 模型 → ROME。
- 要一次改上千條 → MEMIT(ROME 的批量版)。
- 不想動原參數、要能隨時撤銷 → 外部拓展法;代價是知識只是「求助」來的,沒有真正內化,而且緩存越多、存儲與檢索負擔越大。
- 元學習法是從全域更新參數,即使加了局部性損失,也可能讓模型不穩定。
4. 兩個代表方法的機制
T-Patcher:一個錯誤配一個神經元
- 把 FFN 看成鍵值記憶體,在最後一層 FFN 加一個補丁(鍵 k_p、值 v_p、偏置 b_p):
FFN_p(q) = FFN(q) + a_p · v_p,a_p 是補丁對這個輸入的激活值。 - 凍結原參數,只訓練補丁;每個要編輯的 token 加一個補丁。損失有三部分:讓目標輸入激活補丁、讓激活後輸出變成正解、讓無關輸入(從記憶集抽樣)不要激活補丁。
- 書的評價:換模型架構時表現會波動;批量編輯很吃記憶體。
ROME:先定位再做秩一更新
- 定位(因果追蹤):對「斑馬的膚色是」這類輸入,先在主體(斑馬)的嵌入加雜訊讓模型答不出來,再逐層、逐位置把某一個隱藏狀態還原成乾淨值,看答案機率回升多少。結果是:中間層的 FFN 在處理主體最後一個 token(「馬」)時效應最大。再把後續的 FFN 凍結成干擾狀態,效應就消失,證實關鍵在 FFN。
- 找鍵 k*:主體最後一個 token 進入被編輯 FFN 下投影矩陣前的向量;在主體前接多個隨機前綴,取平均,讓它不依賴特定句子。
- 找值 v*:梯度下降找一個輸出向量,讓模型答出新答案;同時加一項 KL,讓「斑馬是……」這類泛泛的 prompt 輸出分佈不變(守住局部性)。
- 插入:解帶約束的最小平方,得到閉式解
驗算:Ŵ = W + Λ (C⁻¹ k*)ᵀ , Λ = (v* − W k*) / ((C⁻¹ k*)ᵀ k*) , C = K KᵀŴ k* = W k* + Λ·(C⁻¹k*)ᵀk* = W k* + (v* − W k*) = v*✔。更新量是「列向量 × 行向量」,所以是秩一矩陣,只改一個方向。C 用維基百科大量文本的鍵向量事先估計。
- 書的評價:準確、泛化、局部都好;但只能處理(主體、關係、客體)這種三元組事實,複雜事實效果不佳,而且不支援批量。
5. 實際能拿來做什麼(書的應用)
- 精準修正:例如模型自我介紹錯成別家模型。書引 2023 年 Gemini Pro 被問「你是誰」答成文心的事件,明說是推測 Google 用了模型編輯。
- 被遺忘權:DEPN 先找出跟某段隱私相關的神經元,再把激活值設成零。
- 去毒、減偏見:找出相關 FFN 參數做編輯(LSDM、DAMA)。
🧪 我實際套用的紀錄
- (尚無)
⚠️ 注意 / 什麼時候不適用
- 可遷移性普遍差:改了「斑馬皮膚是黑色」,模型不一定會推出「黑皮膚的馬是斑馬」。驗收一定要包含反向題與推理題。
- 詞層級的去毒會傷到正常表達:只壓低「炸彈」這類詞,模型反而說不出「不要製造炸彈」這種安全回答。
- ROME/MEMIT 主要針對 decoder-only 設計,書說沒在 encoder-decoder 上比較過。
- 書沒有討論模型編輯被惡意用來植入錯誤知識,也沒討論連續大量編輯的累積退化(推測:連續編輯越多,局部性越可能慢慢流失,要定期回歸測試)。
- 知識量大又常變時,別用編輯硬撐,改走 RAG。
- 書中 ROME 的協方差寫「去中心化」,原論文用的是未中心化的二階矩。實作時以原論文為準。
🔗 相關工具
- 大模型基礎 —— 第 5 章的完整脈絡
- 工具-微調與RAG的取捨 —— 模型編輯是「微調」與「RAG」之外的第三條路
- 災難性遺忘 —— 少量樣本微調為什麼會忘東西;局部性指標就是在量這件事
- 工具-RAG檢索增強生成 —— 知識量大、變動頻繁時的替代方案
📖 機制層(既有卡)
[[注意力機制]]、[[取樣與解碼策略]] [[PEFT 方法比較]]、[[LoRA 與 QLoRA]] [[稀疏與密集檢索]]、[[RAG 評估與營運]]