Qwen1.5B + QLoRA 情緒分類模型改善實驗:超參數調整與欠擬合分析
評估結果如下,這是按照生成的數據進行訓練並進行測試給出的結果:
| - | precision | recall | f1-score | support |
|---|---|---|---|---|
| 喜悅 | 0.79 | 1.00 | 0.88 | 11 |
| 悲傷 | 0.44 | 1.00 | 0.62 | 8 |
| 憤怒 | 1.00 | 0.40 | 0.57 | 10 |
| 恐懼 | 1.00 | 0.11 | 0.20 | 9 ← 幾乎全错 |
| 驚訝 | 0.75 | 0.75 | 0.75 | 8 |
| 厭惡 | 0.83 | 0.62 | 0.71 | 8 |
| macro avg | 0.80 | 0.65 | 0.62 | 54 |
下面是評估結論
| 指標 | 結果 | lab目標 | 達標 |
|---|---|---|---|
| Macro F1 | 0.62 | ≥0.75 | ❌ |
| Accuracy | 0.65 | ≥0.80 | ❌ |
| 推理延遲中位數 | 178ms | ≤500ms | ✅ |
| 最容易混淆 | 恐懼 ↔ 悲傷(5 次) | — | — |
之前的版本使用訓練樣本進行測試是 1.0,而這次將訓練跟測試樣本完全拆開來進行測試,則問題很清晰:
- 召回嚴重失衡:
恐懼recall 只有 0.11(9 條只對 1 條)、憤怒0.40。但這兩個的 precision 都 = 1.0,代表模型極少預測這兩類,一旦預測就對。 - 悲傷 成了"垃圾桶":recall 1.0 但 precision 僅 0.44,意味著大量本該是恐懼/憤怒的負面句被模型甩給了“悲傷”,這跟「恐懼↔悲傷 混淆 5 次」完全吻合。
本質是欠擬合:訓練集只有 212 條(Kimi 中途 429 沒湊夠 500)、每類 ~35 條、只訓 3 epoch,模型沒學夠區分負面情緒的細微差別。
針對這個問題,進行了參數的修正將訓練强度從 epoch 3→6,LoRA r 8→16/32,調整了超參數再訓練,結果電腦死機了,畫面出現閃爍光電,後來又再次下降 epoll,最終調整如下:
安全版超參建議:
| 項目 | 崩潰版 | 安全版 |
|---|---|---|
| batch size | 4 | 2(靠梯度累積補等效 batch,峰值顯存減半) |
| epoch | 6 | 4 |
| LoRA r / 模組 | 16 / q,k,v,o | 維持 16 / q,k,v,o(佔用增加有限,保留效果) |
| max-seq-len | 256 | 256(或降 192 更穩) |
這樣保留"提升 F1"的關鍵改動(更高 rank + 更多模組),然後把 GPU 壓力壓下來。當然如果想再穩定些,可以改使用 Qwen2.5-0.5B,這樣 8G vram 跑起來就不至於過負載。
這次測試下來電腦沒問題(顯存問題解決了),但結果并不理想,如下:
| - | precision | recall | f1-score | support |
|---|---|---|---|---|
| 喜悅 | 0.92 | 1.00 | 0.96 | 11 |
| 悲傷 | 1.00 | 0.75 | 0.86 | 8 |
| 憤怒 | 0.00 | 0.00 | 0.00 | 10 ← 整類崩潰 |
| 恐懼 | 0.67 | 0.89 | 0.76 | 9 |
| 驚訝 | 0.67 | 0.25 | 0.36 | 8 |
| 厭惡 | 0.33 | 0.88 | 0.48 | 8 |
| macro avg | 0.60 | 0.63 | 0.57 | 54 |
評估結果:
||首輪(r8/3ep)|安全版(r16/4ep)|
|---|---|---|
|Macro F1|0.62|0.57(沒升反降)|
|崩潰的類別|恐懼(recall0.11)|憤怒(recall0)|
|最混淆對|恐懼↔悲傷|憤怒↔厭惡|
大概知道了,關鍵判斷問題在於瓶頸不是超參,而是資料量
兩次崩潰的是不同的類別(先是恐懼,現在是憤怒),而且都是"某個負面情緒整片倒向另一個相近情緒"。加大 r、加模組、加 epoch 並沒有讓 F1 變好,只是換了一個類別崩掉。
說明了每類訓練樣本只有 ~35 條、test 測試集每類 8-10 條,模型學不穩相近負面情緒的邊界(憤怒/厭惡、恐懼/悲傷),而且 54 條小測試集本身噪聲極大(一個類全錯 macro 就掉 ~10%)。 **調超參在 212 個資料上只是在搬運誤差。