Skip to content

LoRA 微調驗收:梯度、資料與評估|CMU 10-423 作業 3

2026年9月30日1 分鐘
TL;DR以自擬數值例子驗收梯度、資料與評估,並保留原作業規格。

查詞與收藏

正在載入查詞工具…

🌏 English version

影片狀態:錄影需登入或課程授權。 來源說明

本文依 CMU 10-423 Spring 2026 公開作業handout、starter code與相關投影片整理;數值例子為本站教學補充。

作業不是把 loss 跑低就結束

官方 HW3 包含 ICL、PEFT、DPO 書面題與 GPT-2 LoRA 程式題。本篇先用自擬小模型教驗收,不提供官方題目的作答。原任務資訊與引用保留在下方。先讀LoRA與DPO:LoRA 定義哪些參數可以更新,SFT 或 DPO 定義更新要符合什麼目標,兩者是不同軸。

一個可信的實驗要回答三個問題:是否只改 adapter?資料是否正確編碼為 next-token 任務?結果是否在未見資料上仍有效?這三項不會由同一個 loss 自動保證。可以從 tiny batch 開始,但不能把 tiny batch 的記憶能力當泛化。

自擬的一次 forward/backward

取一層 W∈R^(4×3),固定 W=0。令 A=[1,0,−1]、B=0,rank 為 1、縮放為 1,x=[2,1,1]ᵀ,目標 t=[1,0,0,0]ᵀ,loss=0.5‖y−t‖²。這不是影評模型,只是檢查 LoRA 接線的最小問題。首次 Ax=1,y=0,loss=0.5。B 的梯度是 [−1,0,0,0]ᵀ,A 的梯度是零。用 learning rate 0.1 更新,B 變成 [0.1,0,0,0]ᵀ,第二次 y=[0.1,0,0,0]ᵀ,loss=0.405。

預期 W 前後完全相同,B 已變,A 首步不變。下一次 backward 時 A 的梯度才可能非零。這個例子可定位「把整塊包 no_grad」「初始化讓 A、B 同時為零」「optimizer 沒包含 B」等錯誤。A、B 同時為零會讓兩者梯度都卡住,並不是合理的首次零梯度現象。

把測試接回語言模型資料

情感分類的指令可寫成 prompt 加上短回答標籤。tokenizer 不一定把一個中文字或英文標籤視為單一 token,不能硬取最後一個位置當完整答案。先印出一筆 token ID、解碼結果、attention mask、labels;prompt 與 padding 的 labels 用忽略值,回答與 EOS 按設計保留。確認訓練目標右移後,在預測第一個回答 token 的位置,模型只能看見 prompt。

先用兩筆自擬資料驗證模型可 overfit。能 overfit 證明基本梯度與資料路徑可能接通;不能 overfit 則先查 mask、shift、trainable 參數與 learning rate。通過後再用固定 train/validation/test split,去除重複影評與同源改寫的洩漏;用 validation 選 rank 或學習率,不用 test 挑最佳設定。

評估與儲存要驗同一件事

記錄完整分類回答的 accuracy 與格式錯誤率,另列可訓練參數數量、峰值顯存與訓練時間。比較 full tuning 或不同 rank 時,資料、底座、tokenization 與 budget 要一致。只比較參數比例不能說性能更好。

儲存 adapter 後,以新的程序重新載入同版本底座與 adapter;固定 seed、eval mode、輸入與解碼規則,比較 logits 或 greedy 輸出。這能抓到只存了一部分層、忘記 scaling、底座版本不一致等錯誤。Dropout 開著時不應要求兩次前向逐位元相同。

變式練習與答案

若把上述 learning rate 改成 0.2,B 首項變 0.2,第二次 loss=0.5·0.8²=0.32。若第二次 loss 下降但 W 也變了,程式沒有遵守 adapter-only 條件。若 train accuracy 100%、test 不變,不能宣布適應成功;應查過擬合、label mapping 與分布差異。官方作業的測試仍要原樣執行,自擬測試是補充,不替代 starter 的規格。

把驗收接回官方作業

HW3 handout 與 starter是正式任務底本。Spring 2026 作業名稱是 Applying and Adapting LLMs,總分66;書面部分含ICL、PEFT與DPO,程式部分在Rotten Tomatoes影評上對gpt2-medium做LoRA指令微調。上述toy只驗梯度接線,不能替代這份作業的資料、模型與實驗要求。

檔案需要完成的責任
lora.pyLoRALinear初始化、前向、train/eval與合併更新
model.py把attention的c_attn、c_proj接成LoRALinear
train.py只讓LoRA參數可訓練
generate.py完整讀取生成標籤,無效輸出記為−1且算進accuracy分母
dataloader.py保留正式資料流程,prompt變式實驗時再按題意改動

Starter另附七個test_lora.py測試。先完成模組才能載入與驗收;測試通過後先跑未微調baseline,再比較rank、alpha、full tuning與prompt變式。題目要求使用Best Val Checkpoint,不是任意挑test表現最好的checkpoint。原實驗設定的rank=128、alpha=512、LoRA dropout=0.05、learning rate=2.5e−4、80 iterations、batch 4與accumulation 32;它們是作業設定,不是通用最佳值。Notebook的full-tuning dropout與handout預設不同,應依個別題意處理並記錄。

Handout估計T4每次訓練約25–30分鐘,零樣本評估約2分鐘;這是原教材估計,沒有在本次重寫重跑。原requirements未全面釘版本,WandB記錄與帳號是正式實驗的一部分;執行前應保存環境版本、確認額度與下載資源,不能把舊下載紀錄當成今天可用。Slot A不得使用AI作答,Slot B允許AI與合作,最新提交規則以課程公告為準。校外讀者可用公開starter自學,但本文未取得Gradescope回饋、私人recitation或官方作業解答。

課程影片來源

Spring 2026 官方課站將錄影導向 SCS Panopto。2026-10-12 匿名讀取回傳資料夾未載入與登入提示,未取得可播放的課堂內容;這是存取限制,不能推論沒有錄影。本文依公開作業handout、starter code、相關投影片與所列原始論文整理;自擬例子是導讀補充,不是逐字稿。官方錄影資料夾。

更新紀錄

  • 2026-10-11:重寫教學主體,整合正式作業規格,加入自擬數值測試、變式與答案。
  • 2026-10-10:標註影片狀態,核對錄影來源與取得方式。
  • 2026-10-10:重查影片狀態。確認登入牆屬實(匿名開啟 Panopto 資料夾無影片並提示登入),官方頁面也沒有公開 YouTube 版本,狀態維持不變。

參考資料