一文看懂大語言模型(LLMs):基於史丹佛大學 CS229 課程的小白能看懂版

1. 開場白與課程概述

本段總結: 介紹了建構大語言模型的五個核心要素(架構、訓練演算法、資料、評估、系統)。講者指出,雖然學術界痴迷於模型架構,但在實際工業界中,資料、評估和系統工程才是決定模型成敗的關鍵。

大家好,今天我們將探討如何建構大語言模型(LLMs)。簡單回顧一下,LLMs 指的是大家最近常聽到的那些聊天機器人,比如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Google 的 Gemini 以及 Meta 的 Llama。今天,我們將揭秘它們到底是如何運作的。

在訓練 LLM 時,有五個關鍵元件至關重要:

架構(Architecture):LLM 是神經網路,你需要決定使用什麼架構。目前大家都在使用 Transformer 或其變體。

訓練損失與演算法(Training Loss & Algorithm):你將如何訓練這些模型。

資料(Data):這是你用來訓練模型的素材。

評估(Evaluation):你如何知道模型是否在朝著目標取得進展。

系統(Systems):在現代硬體上高效運行這些龐大模型的方法。現在的系統層面比以往任何時候都重要。

大多數學術界的研究(包括我職業生涯的大部分時間)都集中在架構和訓練演算法上,我們總喜歡發明新架構。但老實說,在實踐中真正起決定性作用的是另外三項:資料、評估和系統。這也是工業界投入最多精力的地方。因此,今天我不會過多討論 Transformer 的架構細節,而是重點講解其他更重要的部分。

本次講座分為兩大部分:預訓練(Pre-training)——經典的語言建模階段,目標是讓模型學習整個網際網路的知識;以及後訓練(Post-training)——ChatGPT 誕生以來的新範式,目標是將這些語言模型轉化為真正的人工智慧助手。

2. 預訓練與自回歸語言模型

本段總結: 預訓練的核心任務是“自回歸語言建模”,即通過機率分佈預測序列中的下一個詞。模型通過交叉熵損失函數進行訓練,這等同於最大化文字的對數似然度。

首先,什麼是語言模型?在宏觀層面上,語言模型就是一個關於單詞或 Token 序列的機率分佈模型。具體來說,它建立了一個分佈$P(X_1 ... X_L)$。例如,對於句子“老鼠吃了奶酪”,語言模型會評估這句話在人類對話或網際網路上出現的機率。如果句子存在語法錯誤,或者語義不通(比如“奶酪吃了老鼠”),模型賦予它的機率就會非常低。

因為語言模型掌握了機率分佈,我們可以從中進行採樣,從而生成新的資料,這就是為什麼它們被稱為生成式模型(Generative Models)

目前大家使用的都是自回歸語言模型(Autoregressive Language Models)。它的核心思想是利用機率的鏈式法則,將整個句子的分佈拆解為:第一個詞的機率,乘以給定第一個詞後第二個詞的機率,依此類推。它的任務非常簡單:預測下一個詞

在訓練時,我們會把序列中的每個詞嵌入(Embed)為向量,通過 Transformer 網路獲取上下文表徵,再通過一個線性層對應到詞表大小的維度,最後用 Softmax 輸出下一個詞的機率分佈。我們使用的訓練損失是交叉熵損失(Cross-Entropy Loss),這本質上是一個預測下一個 Token 的分類任務。在數學上,最小化交叉熵損失,完全等價於最大化文字的對數似然度(Maximum Likelihood)

3. 為什麼需要分詞器(Tokenizer)?

本段總結: 詳細解釋了分詞器存在的必要性,以及字節對編碼(BPE)的工作原理。分詞器解決了詞彙表過大和拼寫錯誤的問題,但也帶來了諸如數學計算和程式碼縮排理解等侷限性。

很多人往往忽視了分詞器(Tokenizer),但它極其重要。我們為什麼不直接用“單詞”或“字元”作為基本單位呢?

如果用單詞:遇到拼寫錯誤的詞彙(如 Typo),模型會遇到未登錄詞問題,且對於泰語等沒有明顯空格分詞的語言很不友好。

如果用字元:雖然通用,但會導致序列極長。要知道,Transformer 的計算複雜度隨序列長度呈平方級增長(二次方複雜度),序列太長會導致算力崩潰。

分詞器提供了一個折中方案,通常一個 Token 包含 3 到 4 個字母。目前最流行的方法之一是字節對編碼(BPE, Byte Pair Encoding)

BPE 的訓練過程如下:首先將大型語料庫中的所有內容拆分為單個字元,然後統計相鄰字元對的出現頻率。找到最常見的字元對(比如“t”和“o”),將它們合併為一個新的 Token(“to”),並賦予唯一的 ID。不斷重複這個合併過程,直到達到預設的詞表大小。

不過,業界越來越意識到分詞器的侷限性。比如在處理數學問題時,數字往往被切分成奇怪的 Token,導致模型看待數字的方式與人類完全不同,影響了推理能力。此外,程式碼中的空格縮排(如 Python 的 4 個空格)過去也經常被分詞器錯誤處理,這是 GPT-4 專門重構程式碼分詞邏輯的原因。理想情況下,未來我們希望能擺脫分詞器,直接處理字元或字節。

4. 評估指標:困惑度與學術基準

本段總結: 評估語言模型的傳統方法是困惑度(Perplexity),而現在學術界更傾向於使用 MMLU 等客觀題基準測試。同時,評測標準的不一致和訓練集污染是目前面臨的重大挑戰。

我們如何評估模型?在開發階段,最常用的是困惑度(Perplexity)

困惑度本質上是驗證集損失的一種可解釋轉化。公式是$2$的“平均每個 Token 的損失”次方。它的直觀含義是:模型在生成下一個詞時,正在幾個詞之間猶豫不決?如果模型完美預測,困惑度為 1;如果模型完全在瞎猜,困惑度就等於詞表大小。在 2017 年到 2023 年間,標準資料集上的困惑度從 70 驟降到了 10 以下,進步驚人。

然而,困惑度在橫向對比不同模型時存在問題(比如 Gemini 和 ChatGPT 的詞表大小不同,困惑度就無法直接比較)。因此,目前的學術基準測試(如 Helm 或 Hugging Face 閉源排行榜)通常聚合大量的 NLP 任務。

最典型的是MMLU(大規模多工語言理解),包含了大學物理、醫學等多個領域的單選題。評估方式有兩種:一是計算模型生成 A、B、C、D 四個選項的對數似然度,看正確選項的機率是否最高;二是直接限制模型輸出,看它生成的下一個 Token 是不是正確答案。

評估面臨的巨大挑戰:

評估方式不一致:不同的 Prompt 或評分指令碼會導致結果天差地別。比如 Llama 65B 在不同的測試平台上,精準率能從 48.8% 飆升到 63.7%。

訓練集污染(Contamination):你的測試題是否已經被混入訓練集了?為了檢測污染,研究人員有時會故意打亂測試題的選項順序,如果模型依然按原順序生成答案,說明它很可能在訓練時背過這道題。

5. 預訓練資料:從“髒資料”到高品質語料

本段總結: 揭露了工業界處理預訓練資料的艱辛過程。通過爬取 Common Crawl、HTML 文字提取、去重、啟髮式過濾和模型分類,最終留下高品質的、配比合理的資料集進行訓練。

大家常說“用整個網際網路的資料訓練模型”,這聽起來很簡單,但網際網路其實是一個“垃圾場”。Common Crawl 作為一個主流的開源爬蟲項目,包含了大約 2500 億個網頁,資料量高達 1 Petabyte。如果你隨機點開一個爬取的網頁,裡面全是不完整的句子和雜亂的程式碼。

為了清洗這些資料,需要一個巨大的工程流水線:

HTML 文字提取:去除網頁程式碼,提取純文字,同時還要處理棘手的數學公式提取和網頁頭部/底部的範本內容(Boilerplate)。

過濾不良內容:剔除 NSFW(不適宜工作場所)、有害內容和 PII(個人身份資訊)。

去重(De-duplication):剔除重複的論壇簽名或在全網被覆制貼上了上萬次的段落。

啟髮式過濾(Heuristic Filtering):基於規則刪除低品質文字。比如檢查 Token 的分佈是否異常,單詞長度是否詭異,或者網頁是不是只有 3 個詞。

模型分類過濾:這是一個非常聰明的技巧。研究人員會提取維基百科中引用的所有外部連結,訓練一個輕量級的分類器。然後用這個分類器掃描全網資料,保留那些“風格類似於維基百科引用來源”的高品質網頁。

領域劃分與配比:將資料分為程式碼、書籍、娛樂等。通常會增加程式碼(據稱能提升推理能力)和書籍的權重,降低娛樂內容的權重。

退火(Annealing):在預訓練的最後階段,降低學習率,並在維基百科等極高品質的資料上“過擬合”,以提升模型最終的表現。

在業界,處理資料所需的 CPU 算力和團隊規模,有時甚至超過了研究架構本身的投入。Llama 3 訓練使用了高達 15 兆個 Token。高品質資料是絕對的核心商業機密。

6. 縮放定律(Scaling Laws)與資源分配

本段總結: 縮放定律證明了模型性能與算力、資料量、參數量成可預測的對數線性關係。這徹底改變了模型研發流程,讓研究人員可以通過訓練小模型來精準預測大模型的表現。

在傳統機器學習課上,我們總是擔心“過擬合”。但在大型語言模型中,過擬合幾乎不存在:資料越多,模型越大,性能就越好。

更神奇的是,這種提升是可以精確預測的。OpenAI 發現,如果把算力(Compute)、資料集大小或參數量放在對數坐標的 X 軸上,把測試損失(Test Loss)放在 Y 軸上,它們呈現出完美的線性關係。

這徹底改變了研發管線(Pipeline):

以前,如果你有 10000 張 GPU,你可能會訓練 30 個不同超參數的大模型,每個訓練 1 天,挑出最好的。

現在,你會利用幾張 GPU 訓練一系列不同規模的“小模型”,擬合出一條 Scaling Law 曲線。然後,你可以極其自信地預測出那個 1000 億參數的終極模型如果訓練 30 天會達到什麼水平,並直接把所有算力押注在那個終極模型上。

那麼,有限算力下,是該增加參數量,還是增加資料量?

DeepMind 的 Chinchilla 論文給出了答案。通過繪製不同算力預算下的等高線圖(Iso-flops),他們發現計算最優解是:每增加 1 個參數,就應該增加 20 個訓練 Token。

但在工業界實踐中,由於要考慮模型部署後的推理成本(Inference Cost),公司更傾向於訓練相對較小的模型,但在海量資料上進行超額訓練。所以目前的比例通常是 150 個 Token 對應 1 個參數(如 Llama 3)。

7. 訓練成本與碳排放的“信封背面計算”

本段總結: 通過基礎數學公式估算了 Llama 3 400B 模型的訓練成本,展示了前沿 AI 研發巨大的資金和算力門檻,以及在當前階段可控的碳排放規模。

讓我們用 Llama 3 400B 模型做個粗略的計算。它有 450 億(此處講者口誤,應指 Llama 3 的大參數量版本計算)參數,訓練了 15.6 兆 Token。

所需算力(Flops):計算公式大致為$C = 6 \times P \times N$(其中$P$為參數量,$N$為資料量)。計算結果約為$3.8 \times 10^{25}$Flops。拜登政府的行政命令要求算力超過$10^{26}$Flops 的模型需要接受特殊審查,Meta 恰好卡在這個紅線之下。

訓練時間:使用 16000 張 H100 顯示卡,結合其吞吐量,大約需要持續訓練 70 天,耗費近 2600 萬 GPU 小時。

訓練成本:假設 H100 的租金下限為每小時 2 美元,單純的顯示卡成本就超過 5200 萬美元。算上頂尖研究員的薪水(約 50 人,年薪 50 萬美元起),總成本至少在 7500 萬美元左右。

碳排放:大約排放 4000 噸二氧化碳當量,相當於從紐約到倫敦的 2000 趟往返航班。目前來看,碳排放在整個大環境裡還算可控,但如果算力再提升 100 倍,這就會成為一個真正的環境問題。

8. 後訓練:將模型轉化為 AI 助手(SFT)

本段總結: 預訓練模型只會續寫文字。為了讓它聽從指令,必須使用監督微調(SFT)機制。研究表明,SFT 的關鍵在於格式對齊,而不需要大量資料。

預訓練階段得到的只是一個“語言模擬器”。如果你給 GPT-3 純預訓練模型輸入“請向一個 6 歲的小孩解釋登月”,它可能會續寫出“請向一個 6 歲的小孩解釋引力”,因為它在模仿網際網路論壇的提問模式。

要把它變成 AI 助手,我們需要進行對齊(Alignment),也就是後訓練(Post-training)

第一步是監督微調(SFT, Supervised Fine-Tuning)。我們收集人類寫好的高品質“問答對”,在這個資料集上繼續用語言模型的目標(預測下一個詞)來微調模型。因為人類編寫資料極其昂貴,現在流行用最強的 LLM(如 GPT-4)來生成合成資料(Synthetic Data)進行微調,比如我們之前做的 Alpaca 模型就是這樣做的。

令人驚訝的是,Lima 論文指出,SFT 並不需要海量資料(幾千條足矣),從 2000 條增加到 32000 條並沒有帶來本質提升。原因在於:預訓練已經把所有的知識塞進了模型裡,SFT 的作用僅僅是教模型“如何格式化地輸出你期望的答案”,而不是教它新知識。

9. RLHF 與 DPO 偏好最佳化

本段總結: 僅靠 SFT 會導致幻覺和人類能力天花板問題。通過引入強化學習人類反饋(RLHF)或直接偏好最佳化(DPO),模型可以直接最佳化人類的偏好,產生更優質的輸出。

僅僅做 SFT 有幾個致命缺陷:

人類能力上限:SFT 屬於行為克隆(Behavioral Cloning)。但我評價一本書的好壞,比我自己寫一本書要容易得多。如果只模仿人類生成的內容,模型永遠無法超越人類專家的寫作水平。

幻覺(Hallucinations):如果人類在 SFT 資料裡提供了一個冷門知識點,而這個知識點模型在預訓練時完全沒見過,模型就會學會“一本正經地胡說八道”,強行生成看似合理的錯誤答案。

為瞭解決這個問題,我們需要引入偏好最佳化。核心流程是:給定一個指令,讓模型生成兩個不同的答案,讓人類標註員(或強大的 LLM)來選擇那個更好(比如綠色優先於紅色)。

演算法 1:RLHF(強化學習人類反饋)配合 PPO 演算法

這是 ChatGPT 最初突破的關鍵。首先用偏好資料訓練一個獎勵模型(Reward Model),將離散的偏好轉化為連續的打分(Logits)。然後用 PPO(近端策略最佳化)這種強化學習演算法,將 LLM 作為一個智能體(Agent)進行訓練,以最大化獎勵得分為目標。

但這極度複雜!強化學習極度不穩定,包含了無數的裁剪(Clipping)和工程 Trick,連寫出 PPO 的原作者都覺得難以完美復現。

演算法 2:DPO(直接偏好最佳化)

史丹佛去年提出的一種優雅替代方案,現已成為開源界的主流。既然我們的目標是“多生成喜歡的,少生成不喜歡的”,為什麼不直接在數學上把它轉化為一個最大似然估計問題呢?

DPO 直接將偏好資料帶入損失函數,最大化人類偏好答案的機率,懲罰被拒絕答案的機率。它徹底拋棄了獎勵模型和強化學習,僅僅用交叉熵的變體就達到了與 PPO 同樣的甚至更好的效果。

10. 評估後訓練模型:LLM 裁判的崛起

本段總結: 評估對齊後的模型非常困難。目前業界依賴於“聊天機器人競技場”進行盲測,為了降低成本,大量使用 LLM 作為裁判(如 Alpaca Eval)來自動化評估。

經過 RLHF 之後,模型已經不再是一個標準的機率分佈模型了(它在努力讓最優解的機率逼近 1),所以困惑度(Perplexity)在這裡失效了。而且,開放式回答沒有標準答案。

目前最權威的評估方式是Chatbot Arena(聊天機器人競技場),這是一種盲測系統,讓人類在兩個匿名模型中投票。

但讓人類投票太慢且太貴,所以業界開發了基於 LLM 的自動化評估(比如 Alpaca Eval)。你只需要給 GPT-4 兩個回答,問它那個好。我們發現,LLM 的評判與人類投票的擬合度高達 98%,成本卻便宜了 50 倍。

警惕虛假相關性(Spurious Correlation):

LLM 裁判(和人類一樣)存在嚴重的**“偏好較長輸出”(Length Bias)**。如果在 Prompt 裡要求模型“囉嗦一點”,它的勝率會莫名其妙飆升至 64%;如果要求“簡明扼要”,勝率會跌穿 20%。這是對齊訓練中需要通過因果推斷等統計手段去消除的頑疾。

11. 系統基礎知識與顯示卡最佳化

本段總結: 計算系統的最佳化直接決定了訓練的成敗。因為 GPU 的記憶體通訊頻寬常常是瓶頸,業界廣泛採用低精度訓練(16 位)和算子融合技術來大幅提高算力利用率。

對於開發 LLM 的任何人來說,算力永遠是瓶頸。簡單地“買更多 GPU”是行不通的,因為通訊開銷會拖垮多卡互聯系統。

如果你想理解系統級最佳化,記住一點:CPU 最佳化的是延遲(Latency),而 GPU 最佳化的是吞吐量(Throughput)。GPU 天生為極速的矩陣乘法而生。

但目前 GPU 最大的瓶頸在於:算力提升的速度遠大於記憶體通訊頻寬提升的速度。很多時候,由於資料無法及時從視訊記憶體(HBM)傳輸到計算核心(SMs),你的 GPU 大部分時間都在閒置。在工業界,模型浮點運算利用率(MFU)能達到 50% 就已經是極其出色的成績了。

兩個關鍵最佳化技巧:

低精度 / 混合精度訓練:在深度學習中,小數點後幾位並不關鍵。我們將龐大的矩陣乘法運算放在 16 位精度下進行,以成倍減少視訊記憶體佔用和通訊頻寬;只在儲存模型權重和執行參數更新時,保留 32 位精度以確保學習率生效。

算子融合(Operator Fusion):如果你在 PyTorch 裡寫一行簡單的連續運算(比如求 Cosine 再求 Sine),傳統方法是將資料從視訊記憶體搬運到計算核心,算完搬回去,再搬出來算下一步,這是極其浪費的。使用torch.compile,系統會自動將程式碼在底層重寫為 C++ (CUDA) 的融合算子,把所有資料一次性送入核心,全部算完再取回,這能讓模型訓練速度直接翻倍。

這就是從架構、資料到系統的 LLM 建構全貌,希望對大家有所啟發。 (The AI Frontier)