本文依據 CMU 10-423/623/723 Generative AI Spring 2026 版。 這是 CMU 10-423 導讀系列第 12 篇,也是「調適基礎模型」單元的收尾。前兩篇 L10–L11:PEFT 與 in-context learning 和 Instruction tuning、RLHF 與 DPO 講原理,這一篇看作業怎麼驗收。
用到的官方材料:Coursework 頁上的 hw3.zip(內含 23 頁的 hw3.pdf、起始碼、單元測試與 LaTeX 模板)、Overleaf 唯讀模板、講次表與課綱的作業規則。事實皆於 2026-09-30 打開官方材料核對。本文只寫題目結構與設定,不附任何解答。
基本資料
| 項目 | 內容 |
|---|---|
| 名稱 | Homework 3: Applying and Adapting LLMs |
| 範圍 | L9–L12(講次表) |
| 發下 | 2026-02-21 |
| 截止 | 2026-03-12 晚上 11:59(Slot A) |
| 繳交 | Gradescope:書面 PDF 一份,程式上傳 5 個 .py |
| 總分 | 66 |
配分表(hw3.pdf 第 1 頁):
| 大題 | 分數 |
|---|---|
| LaTeX Template Alignment | 0 |
| In-Context Learning | 14 |
| Parameter Efficient Fine-Tuning | 10 |
| Direct Preference Optimization | 15 |
| Programming: LoRA for GPT-2 | 25 |
| Code Upload | 0 |
| Collaboration Questions | 2 |
課綱規定每份作業有兩個截止點。Slot A 只能交純人工作答,不准用 AI;批改後會告訴你哪些題錯了。Slot B 在收到回饋三天後截止,可以用 AI、也可以完全合作,但只重改 Slot A 錯的題,每題取兩次的較高分。講次表把 HW3 的回饋標在 3 月 17 日、Slot B 標在 3 月 20 日,兩個日期都註明 tentative。
zip 裡有個小細節呼應這條規則:handout 資料夾附了 .cursorignore、.aiderignore,以及一份把 GitHub Copilot 與行內建議全關掉的 .vscode/settings.json。
書面題在考什麼
In-Context Learning(14 分)
六小題都圍繞一道電費應用題:每度電漲 5 美分,上個月用 150 度、這個月用 100 度,兩個月合計 45 美元,問舊費率。你要依序寫出:
- ICL 和 few-shot chain-of-thought 的差別
- 一個促成 in-context learning 的 prompt
- 改成 one-shot CoT
- 再改成 zero-shot CoT
- zero-shot CoT 相對 CoT 的一個優點和一個缺點
- ICL 和 meta learning 的一個相似處、一個差異
這組題考的是分辨幾種 prompt 形式,不需要跑任何模型。
Parameter Efficient Fine-Tuning(10 分)
3.1 是算參數的題目。 題目給一個 10 層、sigmoid 激活的全連接網路,第 l 層寬度是 2 的 (L−l) 次方。先算隱藏單元數和總參數量,再算三種 PEFT 設定下被微調的參數比例:
- 只調 bias,類似 BitFit(Ben-Zaken et al., 2021)
- 每層後面插一個 rank 4 的 bottleneck adapter,照 Houlsby et al. (2019) 的形式,非線性用 GELU
3.2 是 prefix tuning。 題目寫出 K̃ = [P_K; K]、Ṽ = [P_V; V] 的注意力計算,要你用 exp 寫出單一注意力權重,再證明加了前綴之後,任兩個內容 token 之間的相對權重不變。
Direct Preference Optimization(15 分)
這組題帶你把 DPO 論文的推導走一遍,題目直接建議把論文讀到最後:
- 4.1.a:證明 KL 約束目標的最佳解是
π_ref · exp(r/β) / Z(x)的形式,並說明為什麼有了閉式解就不必跑 policy gradient - 4.1.b:把獎勵改寫成 policy ratio 加上 partition 項,說明 Z(x) 為什麼跟 y 無關
- 4.1.c:代入 Bradley–Terry 模型,得到 DPO loss,說明它怎麼把 PPO 的強化學習目標變成監督式學習
- 4.1.d:既然有閉式解,PPO 式 RLHF 為什麼不直接用?給兩個理由
- 4.1.e:推導 DPO loss 的梯度
- 4.1.f:解釋梯度裡兩項各自把參數往哪個方向推,以及權重項什麼時候會大
這組題對應 L11 後半與 L12 前半的 DPO 投影片。
程式題:從零寫 LoRA,接到 GPT-2 上
資料與任務
資料是 Hugging Face 上的 Rotten Tomatoes 影評情感資料,正負標籤平衡,執行 train.py 時自動下載。程式碼用的是舊的短名 rotten_tomatoes,現在會被轉到 cornell-movie-review-data/rotten_tomatoes。
train.py從 8,530 筆訓練資料裡打亂後取前 5,000 筆,驗證集用完整的 validation splitgenerate.py在 1,066 筆 test split 上算準確率
GPT-2 本來只會接著寫文字,作業用指令微調讓它輸出標籤。dataloader.py 的 get_sentiment_prompt() 把每筆影評包成 Instruction: …\nText: …\nLabel: … 的格式,標籤轉成 positive/negative。collate 時,指令部分的 label 會被設成 −100,所以 loss 不算在指令上。
LoRA 要寫的部分
hw3.pdf 給的前向公式是 h = W₀x + (α/r)·BAx:W₀ 凍結,只訓練低秩矩陣 A 和 B。B 初始化為 0,所以訓練開始時 ΔW = BA 也是 0。原論文只在 query 和 value 加 LoRA,這份作業要求 query、key、value 都加。
| 檔案 | 要做的事 | 上傳 |
|---|---|---|
lora.py | 完成 LoRALinear:__init__、reset_parameters(A 用 kaiming_uniform_,B 用 0)、forward(未合併時對輸入套 dropout)、train(拆開 LoRA 權重)、eval(把 BA 合併回主權重),以及 mark_only_lora_as_trainable | 是 |
model.py | HW1 的原版 Transformer(沒有 GQA 和 RoPE),把 attention 的 c_attn、c_proj 換成 LoRALinear | 是 |
train.py | 只有一個 TODO:載入預訓練模型後,只讓 LoRA 參數可訓練 | 是 |
generate.py | 完成 predict_labels:截取生成文字,判斷有沒有 positive/negative | 是 |
dataloader.py | 已完成;做到 5.11 題時才回來改 prompt | 是 |
generate.py 有個容易漏的規定:模型輸出不是兩個標籤之一時要記為 −1,照樣算進分母,不能直接丟掉。handout 也提醒,小模型不太會吐 EOS,所以只檢查生成結果的前幾個字元就好。
預設設定與旗標
train.py 的預設值(實驗題沒特別說明時都用這組):
| 參數 | 預設 |
|---|---|
| LoRA rank r | 128 |
| LoRA alpha | 512 |
| LoRA dropout | 0.05 |
| dropout | 0.0 |
| learning rate | 2.5e-4 |
| max_iters | 80 |
| batch size × gradient accumulation | 4 × 32 |
generate.py 預設 max_new_tokens=5、temperature=0.6、top_k=1。所有實驗題都要用 --init_from="gpt2-medium";hints 說最小的 GPT-2 看不太出 LoRA 微調的效果。
12 個實驗題
| 題 | 內容 | 分數 |
|---|---|---|
| 5.1 | LoRA 會不會增加推論延遲 | 2 |
| 5.2 | r=128、α=512 時微調了多少比例的參數 | 2 |
| 5.3 | 不微調的 gpt2-medium 準確率 | 1 |
| 5.4 | r ∈ {16, 128, 196}(α=4r)與全參數微調的準確率 | 4 |
| 5.5 | 上面四組的 WandB 驗證 loss 曲線 | 4 |
| 5.6 | LoRA 對比全參數微調,r 怎麼影響表現 | 3 |
| 5.7 | r=196 的驗證 loss 有沒有異常 | 2 |
| 5.8 | (16, 64)、(16, 256) 與全參數微調的比較 | 2 |
| 5.9 | 固定 r、提高 α 的影響 | 1 |
| 5.10 | 為什麼同時調 learning rate 和 α 可能是多餘的 | 1 |
| 5.11 | 改寫 prompt 並說明動機 | 1 |
| 5.12 | 預設設定下新舊 prompt 的準確率 | 2 |
準確率一律回報「Best Val Checkpoint」,不是最後一步的 checkpoint。generate.py 兩個都會跑,輸出時分別標示。
環境與算力:今天還跑得動嗎
hw3.pdf 的建議是 Colab 免費 T4。額度用完時可以等、換 Google 帳號、買額度,或改用 Kaggle、GCP、AWS。handout 標了三個時間:
- 5.3 零樣本評估:T4 上約 2 分鐘
- 5.4、5.8、5.12:每次訓練約 25–30 分鐘
- 把 5.4 的四組、5.8 新增的一組和 5.12 的新 prompt 加起來,共 6 次訓練,大約是一個下午的 T4 時間
run_in_colab.ipynb 已經把這幾條指令寫好。要注意的一點:notebook 的全參數微調那格寫的是 --lora_rank=0 --dropout=.05,hw3.pdf 的預設卻是 dropout 0.0,實際跑時以題目要求為準。
WandB 是硬需求。 train.py 一開始就從 wandb_api.json 讀金鑰並呼叫 wandb.login,5.5 和 5.8 也要交 WandB 曲線,所以得先註冊帳號。requirements.txt 列了 torch、transformers、datasets、tiktoken、wandb、tqdm,都沒有釘版本。GPT-2 權重由 transformers 從 Hugging Face 下載,不需要另外申請。
我在 2026-09-30 下載 hw3.zip 實測(macOS、PyTorch 2.13、CPU):未修改的起始碼跑 python test_lora.py,7 個測試全部報錯。這是預期結果:lora.py 裡的 self.lora_A = # TODO 這類佔位行本身就是語法錯誤,要全部填完模組才載得進來。
zip 裡還有兩件 hw3.pdf 沒寫清楚的事:
- hw3.pdf 的檔案清單沒列
test_lora.py、data.pt和chargpt.py,zip 裡都有。test_lora.py有 7 個測試,各 1 權重,測reset_parameters、__init__、mark_only_lora_as_trainable、forward、train、eval,測試資料放在data.pt。 train.py不只訓練:訓練結束後會呼叫generate.py的ModelSampler,在 test split 上算準確率並記到 WandB。
校外拿不到的東西
- HW3 recitation 投影片:講次表 2 月 20 日那列連到一份 Google Slides,2026-09-30 校外打開回 401,匯出 PDF 也是 401。HW1、HW2 的 recitation 投影片是公開的,HW3 這份不是。
- Gradescope 評分:自動評分、人工批改標準、Slot A 回饋都拿不到。
- 錄影:課程錄影在 Panopto,要 CMU 登入。
- 官方解答:沒有公開。
講次表上還有兩個跟 HW3 相關的評量:2 月 25 日的 Quiz 3(L9–L12),以及 3 月 27 日的 HW3/HW4 程式測驗。兩者的題目都拿不到。
怎麼自學這份作業
- 先做書面題的 3.1 和 4.1。3.1 能讓你對「LoRA 到底省了多少參數」有數量級的感覺;4.1 做完,DPO 就不只是一行 loss。
- 寫
lora.py時,先在本機用 CPU 跑test_lora.py,7 個測試全過再上 Colab,不要把 T4 額度花在除錯上。 - 先跑 5.3 的零樣本基準。看到未微調的 gpt2-medium 在這個 prompt 下表現如何,後面每個實驗的數字才有參照點。
今晚可以做的一件事:下載 hw3.zip,打開 lora.py,把 forward、train、eval 三個方法之間的關係畫出來——什麼時候 BA 合併進 W₀、什麼時候拆開、dropout 只在哪個狀態生效。這張圖畫清楚了,程式大概就寫完一半。
延伸閱讀
- 另一門課怎麼講 LoRA 與 PEFT:CMU 11-868 導讀:PEFT 與 LoRA
- 偏好調整的其他講法:CME295 導讀:偏好調整
- 存取等級 A0–A3 的定義:全球 AI/CS 課程地圖
系列導覽:上一篇 L11–L12:Instruction tuning、RLHF 與 DPO|下一篇 L12–L13:文生圖、latent diffusion 與視覺語言模型|系列總覽
參考資料
- CMU 10-423/623/723 Generative AI(Spring 2026)課程首頁與課綱 — Slot A/B 規則
- Coursework 頁 — HW3 handout 與 Overleaf 連結
- HW3 handout(hw3.zip) — hw3.pdf、起始碼、
test_lora.py、run_in_colab.ipynb - HW3 Overleaf 唯讀模板
- 課程講次表 — HW3 範圍、發下與截止日、recitation 連結、Quiz 3 與程式測驗日期
- HW3 Recitation 投影片(Google Slides,校外 401)
- Rotten Tomatoes 資料集(Hugging Face) — train 8,530/validation 1,066/test 1,066
- Hu et al. 2021:LoRA: Low-Rank Adaptation of Large Language Models
- Rafailov et al. 2023:Direct Preference Optimization
- Weights & Biases —
train.py的實驗記錄
Loading...