數字格式、K-means 量化與線性量化|MIT 6.5940 第 5 堂
MIT 6.5940 第 5 講從「8-bit 整數加法比 32-bit 浮點加法省 30 倍能量」出發,先複習 INT、定點數、FP32/FP16/BF16、FP8 與 FP4 的位元配置,再講兩種量化:K-means 量化只省儲存、計算仍是浮點;線性量化用 r = S(q − Z) 把矩陣乘法、全連接層與卷積都改成整數運算。
MIT 6.5940 第 5 講從「8-bit 整數加法比 32-bit 浮點加法省 30 倍能量」出發,先複習 INT、定點數、FP32/FP16/BF16、FP8 與 FP4 的位元配置,再講兩種量化:K-means 量化只省儲存、計算仍是浮點;線性量化用 r = S(q − Z) 把矩陣乘法、全連接層與卷積都改成整數運算。
第 6 講處理「量化後精度掉了怎麼辦」。先不重訓:換更細的 scale 粒度(per-channel、group、MX)、裁掉離群值(EMA、校準批次、MSE、KL)、改捨入方式(AdaRound)。不夠再重訓:QAT 保留一份全精度權重,前向做假量化,反向靠 STE 把梯度直接穿過去。投影片引用的白皮書數字裡,MobileNetV1 做 per-tensor INT8 PTQ 準確率掉到 0.1%,改成 per-channel QAT 回到 70.7%,浮點原本是 70.9%。最後兩段談 1–2 bit 的二值/三值網路,以及用強化學習自動分配每層位元數的 HAQ。
演算法把模型縮小之後,系統層還能再榨多少?L11 用同一個矩陣乘法示範:loop reordering 快 12 倍、tiling 快 19 倍(Intel Xeon 4114),CUDA 版在 2080Ti 上端到端快 94 倍。後半講 TinyEngine 用的推論技巧:im2col、in-place depthwise 把峰值記憶體從 2×C×H×W 降到 (1+C)×H×W、pointwise 用 NHWC、depthwise 用 NCHW,以及少 2.25 倍乘法的 Winograd。
6.5940 在第 12 講從 CNN 轉到 Transformer,但重點不在原理,而在哪裡會吃掉記憶體與算力:attention 是 O(N²);Llama-2-70B 若用 MHA,batch 16、長度 4096 的 KV cache 要 160GB;GQA 把它縮 8 倍、MQA 縮 64 倍;MoE 讓總參數變多但每個 token 的計算不變。這篇是進入 L13 LLM 部署前的橋接。
MIT 6.S184 是 IAP(1 月獨立活動期)的短課:5 講(第 3 講拆成 3-A、3-B 兩支錄影)、3 個 lab,加上一份 84 頁、官方稱為「課程骨幹」的講義。講義、slides、6 支錄影、lab notebook 與官方解答全部公開,是 A3 足以自學。缺的只有兩塊:lab 繳交走 Canvas 裡的 Gradescope,只有 MIT 修課生能用;第 5 講離散擴散沒有對應 lab。
MIT 6.S184 Lab 1 分三部分:先寫 Euler 和 Euler–Maruyama 的 step 函式,再用它們模擬 Brownian motion 與 Ornstein–Uhlenbeck 過程,觀察 σ 和 θ 怎麼決定軌跡與終點分佈,最後實作 Langevin dynamics,看一團點怎麼被推向一個五峰高斯混合,並用一段手算證明 OU 過程就是目標為高斯的 Langevin dynamics。題目、程式框架與官方解答都在 GitHub;校外讀者沒有 Gradescope 評分,只能自己對解答。
Lab 2 把講義 §3–4 寫成 PyTorch:先實作高斯條件路徑、條件向量場、條件分數,再用兩個幾乎一樣的 trainer 分別做 flow matching 和 score matching,接著用 Proposition 1 從學到的向量場換算出分數,最後換成線性路徑,讓一個圓環分佈流成棋盤格。全部在 2D 玩具資料上跑。README 記載 1/11/26 修過一個 diffusion coefficient 的 bug;2026-09-30 查看時,這個修正只出現在解答 notebook,學生版還沒改,做之前要自己補上。
Lab 3 在 MNIST 上從零組出一個有條件的 latent diffusion model,分四段:先用 label dropout 寫 CFG 訓練(在三群高斯混合上驗證),再一塊一塊寫 diffusion transformer(Fourier 時間嵌入、patchify、多頭注意力、adaLN-Zero、depatchify),接著寫一個 VAE,最後把 DiT 搬進 VAE 的 latent 空間訓練。題目與官方解答都公開;繳交走 Canvas 裡的 Gradescope,只有 MIT 修課生能用。
MIT 6.S184 第 1 講先把「生成一張狗的圖」改寫成「從資料分佈取樣」,再給出取樣的機器:從高斯雜訊出發,沿著神經網路給的向量場模擬一條 ODE(flow model),或在每一步再加一點 Brownian motion 的雜訊,變成 SDE(diffusion model)。實際模擬各用一個最簡單的數值方法:Euler 和 Euler–Maruyama。怎麼訓練那個向量場,留到第 2 講。
我們想學的是「邊際向量場」:沿著它跑 ODE,雜訊會流成資料。問題是它要對整個資料集積分,算不出來。Flow matching 的解法是改成回歸「條件向量場」,也就是只把雜訊推向單一資料點的那個場,這個有公式。講義 Theorem 12 證明兩個 loss 只差一個常數、梯度相同。落到 CondOT 路徑上,訓練只剩一行:取資料 z、雜訊 ε、時間 t,讓網路在 tz+(1−t)ε 這個點預測 z−ε。
分數函數是 log 密度的梯度,指向機率上升最快的方向。在高斯路徑上,它和上一講的向量場都是 x 與 z 的線性函數,所以可以互相換算(講義 Proposition 1):學會一個,就等於學會另一個。有了分數,就能在 ODE 上加任意強度的雜訊變成 SDE,而且每個時刻的分佈不變(Theorem 17)。分數本身也能用跟 flow matching 同一招學:回歸條件分數。這在高斯路徑上等於讓網路預測當初加進去的雜訊,也就是 DDPM 的訓練目標。
把 prompt 當成神經網路的額外輸入,理論上就能從 p_data(x|y) 取樣,但實際生成的圖不夠貼 prompt。第 3B 講用 Bayes 定理把有條件向量場拆成「無條件向量場+一個分類器梯度」,把分類器那項放大 w 倍就是 classifier guidance;再把分類器換成「有條件減無條件」的差,就得到不用訓練分類器的 CFG:ũ = (1−w)·u(x|∅) + w·u(x|y)。訓練只要以機率 η 把標籤換成空標籤 ∅。代價是每一步要呼叫網路兩次,而且 w>1 之後就不再是從資料分佈取樣。
前幾講的演算法已經完整,第 4 講處理規模化時的兩個工程問題。第一,網路要吃圖片、時間 t 和 prompt 三種輸入,吐出一樣大的向量場,所以用 U-Net 或 diffusion transformer(DiT),時間用 Fourier 特徵嵌入、文字用凍結的 CLIP/T5 嵌入。第二,像素空間太大,所以先訓練一個 VAE 把圖壓進 latent space,在那裡做 flow matching,最後再解碼。Stable Diffusion 3 與 Meta Movie Gen Video 都是這套配方:latent 空間裡的 flow matching+DiT 變體+CFG。
文字是一串離散 token,沒有方向可以走,ODE 和 SDE 都不存在。第 5 講把前四講的配方原封不動搬過來,只換掉底層的隨機過程:向量場換成 rate matrix,ODE 換成連續時間馬可夫鏈(CTMC),continuity equation 換成 Kolmogorov forward equation。用 factorized mixture path 當機率路徑時,要學的邊際 rate matrix 只剩一個未知數:給定加噪句子,每個位置原本是哪個 token 的機率。於是訓練離散擴散模型變成對每個位置做分類,loss 就是 cross-entropy;把雜訊設成全部 [mask],就得到 masked diffusion language model。
第一講前半說明課程規則與閃電秀,中段回答「為什麼要學原理」:蔡炎龍把學 AI 的焦慮拆成三種,主張懂原理才知道模型的限制、不必追著每個新工具跑。後半是 Colab 入門,從魔術指令、四行標準套件、plt.plot 到 Markdown 與 ipywidgets 互動。第一份作業是在 Colab 畫一個函數圖形;長庚衛星班的評分標準裡,照改範例只拿 6 分,沒教過的函數加上漂亮的 Markdown 註解才拿 10 分。
第二講把上一講的「呆萌型 AI 機器人」拆開:輸入輸出都要變成數字(張量),分類問題用 one-hot 與 softmax 把分數變成機率,神經網路由神經元一層層接起來,訓練就是用梯度下降把 loss 壓小。最後用 Keras 在 MNIST 上打造第一個全連結神經網路,再接上 Gradio 畫板。第二週作業要你自己設計 DNN,唯一的硬規定是不能是三層;長庚衛星班要求截圖驗證正確率最高的那組參數,也鼓勵保留失敗的嘗試。
同一句「一個可愛的女孩」有無數種正確答案,硬把它當函數訓練,只會學到所有答案的平均。GAN 的解法是改訓練兩個網路:生成器 G 從隨機 latent 向量造圖,鑑別器 D 判真假,兩邊互相對抗。L03 從 2014 年的原始論文一路講到 WGAN、Progressive GAN、StyleGAN 的 512 維 latent 與 AdaIN,再到 Pix2Pix、CycleGAN;後半的附錄把 cross entropy 與 KL divergence 講成「驚訝指數」。第三週作業二選一:實際跑一個 GAN,或用自己的話解釋 CE 與 KL。
L04 把大型語言模型拆成一句話:看前面的字,替字庫裡每個字打分數,softmax 變成機率,再依機率抽出下一個字。為了讓「前面的字」變成記憶,課程先講 RNN,再第一次帶出 Transformer 的 Q/K/V;接著用 GPT-2 的 15 億、GPT-3 的 1,750 億參數說明規模,用 temperature 與 top-p 說明為什麼每次回答都不一樣。後半教怎麼在自己電腦跑開源模型、要多少 VRAM。第四週作業:自己設計一組你懂的主題的測試 prompts,至少比較兩種 LLM。
L05 用兩條線性代數規則讀完 Transformer:矩陣乘法是「列乘行」的內積,而向量乘矩陣等於對矩陣的列向量做線性組合。有了這兩條,attention 就是「query 跟每個 key 做內積、softmax 成權重、對 value 加權平均」,整批寫成 softmax(QKᵀ/√d_k)V;除以 √d_k 只是把數字拉回 0 附近,避免 softmax 贏者通吃。接著講 multi-head、encoder 與 decoder 的差別、mask、用 sin/cos 時鐘做的位置編碼,最後是 ResNet 式殘差與 layer normalization。本週沒有作業。
L06 前半談倫理:蔡炎龍引用 Karpathy「幻覺是 LLM 的特點」,再逐一談抄襲、資料會不會被拿去訓練、DeepSeek 的審查與語料偏向,最後收在七項「負責任的使用」。後半轉向應用:只要給對「資訊」和「指引」,一段 system 設定就能做出員瑛式思考生成器、小編 AI、選系諮商師。第六週作業就是把這套 prompt 搬進 OpenAI 相容 API 加 Gradio,做一個有人設的對話機器人。