前言
會開始這個挑戰是因為筆者處於有點頹廢的狀態已經好幾週了,再加上為了Data engineering Zoomcamp去申請的GCP免費試用額度5/12就要到期,一直在煩惱著要怎麼盡可能在過期前把額度用掉,而後就想起來了CS336。這門課因為需要極大的工作量 (參考Lecture 1: Comment from Spring 2024 course evaluation: The entire assignment was approximately the same amount of work as all 5 assignments from CS 224n plus the final project. And that's just the first homework assignment.),再加上自學者通常還要為training model支付一些cloud的費用(課程頁面有提供一些較便宜的選項),因此筆者本來是打算至少等到2027再來學習的。但既然GCP有現成的免費額度沒地方使用,再加上筆者最近很希望能夠盡快回到隨時都可以保持高度專注的狀態,因此決定開始挑戰這門難度最高的Stanford課程之一。
筆記
筆者僅會將比較重視的內容寫到筆記中,如果想完全了解課程的內容,還是建議親自去看課程影片和教材
Course Syllabus
我們目前處於計算資源受限的時代,因此大多數的設計決策主要反映了我們如何盡可能充分運用現有的硬體。不過,雖然今天面臨的是算力限制,但未來我們可能會面臨數據受限的瓶頸,這將會進一步改變未來的設計決策。
- Data filtering: garbage in garbage out,data 一直都是影響model quality的最重要因素。訓練LLM的成本相當高昂,因此避免在training model時把珍貴的算力資源浪費在品質不佳或不相關的data上非常重要。
- Tokenization: tokenization strategy 必須能夠配合現在的 model architectures 達到 efficient computation。直接處理 raw bytes 雖然優雅,但會導致序列過長,在 Transformer 的 attention mechanism 時間複雜度為 $O(n^2)$ 的特性下,會引發嚴重的計算效率災難。目前學界的終極夢想是開發無分詞器架構(tokenizer-free models,如 Byte Latent Transformer 或 H-Net)來直接處理 bytes 以實現 end-to-end learning,但由於這些技術尚未成功擴展到 frontier models 的規模,因此現階段 BPE 依然是主流。
- Model architecture: 現在許多模型架構 (尤其是Transformer 的 variants) 的設計目的除了減少記憶體的使用量或是減少浮點運算總次數(FLOPs),更希望 minimize 硬體上極其昂貴的 data movement costs。此外,現在架構設計上有兩個新趨勢:(1) 在 MLP 層中,混合專家模型(Mixture of Experts, MoE)已經成為構建高計算效率模型的主流典範。(2) 為了因應 agent 對超長文本的需求,linear attention model 與 state space model(SSM,如 Mamba 家族、Gated DeltaNet 等)等試圖解決 $O(n^2)$ 災難的架構也成為重要發展方向。
- Training: 訓練階段的許多決策其實是為了維持「穩定性」,必須確保參數和梯度的 norms 保持在 Goldilocks zone 上,防止梯度爆炸或消失。在具體設計上,loss function 正逐漸引入 multi-token prediction 以提高 sample efficiency;optimizer 也從單一的 Adam/AdamW,發展出在較新開源模型中使用的 Muon 與 SOAP;learning rate scheduler 也引入了如 WSD (Warmup-Stable-Decay) 等新策略。
- Scaling laws: 訓練大模型是很昂貴的,因此直接在大模型上做 hyperparameter tuning 是相當浪費計算資源的行為。更好的做法是先在小模型上進行訓練及一些實驗,透過 scaling law 將這些實驗結果 fit 出一條 scaling curve 後,預測大模型在目前配置下的 performance。在這裡「可預測性 」往往比單純的最佳化 更為重要,這也是為什麼需要精心設計 hyperparameter transfer 的原因。
- Alignment: 在 pre-training 階段訓練出的 foundation models,僅僅是針對預測下一個 token 來做訓練。在 post-training 階段還需要透過 weak supervision 與 alignment 使 model 能夠進一步遵守特定的指令以及拒絕有害的請求。目前的 alignment 強烈聚焦於 RL,特別是 PPO 與能大幅降低記憶體開銷的 GRPO (Group Relative Policy Optimization) 演算法。但要注意的是,在大規模應用 RL 時會面臨極大的系統挑戰,例如必須協調 inference server 生成 rollouts 並與 training server 進行同步,同時還要處理 throughput 與 off-policy 的權衡問題。
關於課程各Module更詳細的概述可以參考 lecture_01.py,筆者這裡就不詳細說明了,也有可能有心情的時候補上一部份。
Tokenization
Tokenization 幾乎是所有 NLP 技術的起點 - 也是編寫程式碼時最無聊且讓人痛苦的部分
Introduction
在電腦中,我們通常以 Unicode strings 的形式來表示文字,但 language model 是對 sequences of tokens 做 probability distribution modeling。因此,我們需要將 strings 轉為 tokens (encode) 的方法,以及將 tokens 還原為 strings (decode) 的方法。在l anguage model 中負責這兩項任務的 module 被稱為tokenizer,而 vocabulary size 代表 tokenizer 所有可能的token數量。
具體來說,tokenizer 的運作本質上是依賴一張「詞彙表(vocabulary)」。當 tokenizer 將 raw strings 切分後,會去查表將每個 token 映射(map)並轉換為對應的 integer indicies,這個過程稱為 encode;而 decode 則是將模型輸出的數字序列,根據同一張對照表反向查詢,轉換回人類可讀的 strings。
由於 tokenization 的方法會直接決定一段文本以多長的sequence餵給model,因此提升 compression ratio,也就是「每個 token 能代表多少 bytes 的資訊」非常重要。compression ratio 越大就意味著輸入給 model 的 sequence length 越短 (這對於 attention 的 $O(n^2)$ 計算效率是好事)。而要增加的 compression ratio 最簡單的做法則是增加 vocabulary size。然而,這麼做會帶來 sparsity 的代價:當 vocabulary 過大時,會有大量 token 出現頻率極低,導致模型難以有效學習它們的語意表徵。