多任務學習為什麼會讓某個任務越練越差?
某金融科技公司導入多任務學習架構,讓單一 Transformer 模型同時執行 OCR(Optical Character Recognition)後的文檔分類以及命名實體辨識(Named Entity Recognition,NER)任務,以協助自動歸檔與抽取關鍵金融資訊。在部署初期,團隊發現當模型的 NER 準確率(Accuracy)提升時,文檔分類準確率反而下降。若模型架構正確且資料品質良好,下列哪一項最可能是造成此現象的原因?
一家金融科技公司讓同一個 Transformer 模型同時學兩件事:一是把掃描進來的文件分類(例如「這是貸款申請書」還是「這是帳戶對帳單」),二是從文件裡抓出重要的人名、公司名、金額等資訊(這叫「命名實體辨識」,Named Entity Recognition,NER)。
結果上線後發現一個怪現象:NER 越練越準,但文件分類卻越來越差。
問你:架構沒問題、資料也沒問題,最可能是什麼原因造成一個任務變好、另一個任務變差?
一句話總結
兩個任務同時訓練,若沒有調整各自損失函數的比重,梯度較大的任務(NER)會主導參數更新方向,把共享的模型推往對文件分類不利的地方,造成任務間競爭(Task Conflict)。答案是 C。
先感受問題:兩個學生搶同一位老師
「鑫鑫金融科技」導入多任務 Transformer,同時訓練文件分類與 NER。
想像這個模型是一位家教老師,同時輔導兩位學生:
學生乙:NER(問的是「這個詞是人名還是金額?」)
兩位學生共用同一套「學習筆記」(模型的共享參數)。每次上課,老師根據兩份作業的錯誤修改筆記,但沒有指定誰的作業比較重要。
NER 的作業量很大(每個詞都要標),錯誤訊號(梯度)又多又強;文件分類的作業只有一個答案(整份文件的類別),訊號相對弱。
結果:老師每次都被乙的大量作業搶走注意力,筆記被改成更擅長 NER 的版本。甲的文件分類能力反而退步了。
多任務學習沒有平衡損失時的五個問題
多任務學習(Multi-Task Learning)的設計初衷是讓任務互相幫助,但沒有妥善設定損失函數比重,就會出現以下問題:
- 梯度量級差異巨大:NER 每個 token 都要算損失,文件分類只算一個 [CLS] token 的損失。前者產生的梯度訊號強度遠超後者。
- 參數更新方向偏斜:反向傳播(Backpropagation)把兩個任務的梯度加總,NER 的大梯度主導了共享層的更新方向。
- 共享表徵被「劫持」:Transformer 的共享層學到的特徵越來越偏向 NER 需要的局部詞語資訊,而文件分類需要的全局語意資訊被弱化。
- 任務間梯度方向衝突:某些參數對 NER 有利的更新方向,對文件分類可能是有害的,持續累積就導致文件分類準確率下降。
- 無法靠早停解決:因為一個任務持續進步,監控指標看起來還好,但另一個任務已悄悄退步,難以靠傳統 Early Stopping 偵測。
損失函數加權如何解決任務競爭
回到鑫鑫金融科技的案例。解決方法是讓總損失函數有明確的任務比重:
如果 NER 的損失量級是文件分類的 10 倍,就把 α 設成 10、β 設成 1,或是把 NER 損失先做正規化,讓兩個任務的梯度量級對等。
這樣一來,兩位學生的作業在老師眼裡「權重相同」,筆記的修改方向不再被 NER 完全主導,文件分類也能持續進步。
進階做法是動態權重調整(如 GradNorm 或 PCGrad):讓模型在訓練過程中自動偵測哪個任務損失下降太慢,即時增加它的比重。
這就是選項 C 講的:損失函數(Loss Function)未進行權重平衡,導致任務間競爭。
技術版:多任務損失函數的設計與梯度競爭機制
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
本題沒有程式碼,但多任務損失函數的設計是核心背景知識,值得理解。
多任務損失函數的基本形式:
# 最簡單的多任務損失
total_loss = alpha * loss_classification + beta * loss_ner
# 文件分類損失(CrossEntropyLoss,對整份文件的 [CLS] token 預測)
loss_cls = CrossEntropyLoss(logits_cls, labels_cls)
# NER 損失(每個 token 都要預測,損失累積量大)
loss_ner = CrossEntropyLoss(logits_ner.view(-1, num_labels), labels_ner.view(-1))
total_loss = 1.0 * loss_cls + 1.0 * loss_ner # 未加權,等同讓 NER 主導
為什麼 NER 梯度天然比分類大:
設一份文件有 512 個 token,文件分類損失來自 1 個預測,NER 損失來自 512 個預測(每個 token 的標籤)。在未加權的情況下,NER 的梯度訊號強度約是分類任務的 512 倍。
梯度衝突(Gradient Conflict)的直觀:
用向量比喻:文件分類的梯度方向是「往東北走」,NER 的梯度方向是「往西南走」,兩者相加後參數更新偏向 NER 那邊。長期下來,共享參數走向對文件分類不利的位置。
解決方案比較:
| 方法 | 做法 |
|---|---|
| 固定加權 | 手動設 alpha, beta,需要反覆調試 |
| 損失正規化 | 除以各任務損失的初始值,讓相對尺度對齊 |
| GradNorm | 動態讓各任務梯度 norm 相等 |
| PCGrad | 偵測梯度方向衝突,投影去除衝突分量 |
為什麼其他選項是錯的
A模型架構無法同時支援文字分類與序列標注任務(Sequence Labeling)
說 Transformer 架構天生不能同時做文件分類和 NER 這兩種結構不同的任務。
題目明確說「模型架構正確」,而且 BERT 系列模型本來就設計來支援多任務:在 [CLS] token 上接分類頭(Classification Head),在每個 token 上接序列標注頭(Sequence Labeling Head),是標準做法。Transformer 架構完全可以同時做這兩件事。
知道文件分類和 NER 是結構上不同的任務(一個輸出一個標籤、另一個輸出序列標籤),就以為它們不能共存於同一個模型的考生。記住:Transformer 靠不同的輸出頭區分任務,架構上完全支援。
B文檔分類任務不需要語意化表徵(Contextualized Representation)
說文件分類這個任務根本不需要能理解上下文的語意表徵,暗示它和 Transformer 的核心能力不匹配。
完全相反,文件分類非常需要語意化表徵(Contextualized Representation)。判斷一份文件是「貸款申請」還是「帳戶對帳單」,需要理解整份文件的語意脈絡,這正是 Transformer 的強項。如果不需要語意表徵,用 TF-IDF 就夠了,幹嘛用 BERT?
混淆「文件分類是簡單任務,不需要複雜特徵」的直覺。文件分類的輸出雖然簡單(一個類別),但輸入的理解需求一點都不簡單。
D所使用的 BERT 模型無法支援多任務輸出頭(Multi-Head Outputs)
說 BERT 的架構設計上不允許接多個輸出頭,所以沒辦法同時做兩個任務。
BERT 的論文本身就示範了多任務輸出頭的應用。BERT 預訓練時就是多任務(Masked Language Modeling + Next Sentence Prediction)。Fine-tuning 時在 [CLS] token 上接分類頭、在序列 token 上接 NER 頭,是最常見的用法,官方範例就有。BERT 完全支援 Multi-Head Outputs。
對 BERT 的架構細節不熟悉,聽到「Multi-Head」就聯想到「Multi-Head Attention」,誤以為是注意力頭數限制。這裡的 Multi-Head Outputs 指的是多個任務輸出頭,和注意力機制是不同的概念。
同個考點下次怎麼變形
如果兩個任務的損失函數量級完全相同,還會有任務競爭嗎?
量級相同,梯度就平等,應該不會有競爭了?
未必。即使損失量級相同,兩個任務的梯度方向可能還是衝突(Gradient Conflict)。一個任務要把某個參數推大,另一個任務要把同一個參數推小,加總後的更新對兩邊都不是最優的。這種情況需要 PCGrad 這類方法,偵測並移除衝突的梯度分量。
什麼情況下多任務學習反而讓兩個任務都變好?
多任務應該天然互補,都能變好才對?
當兩個任務高度相關(正遷移,Positive Transfer),多任務確實會互惠。例如情感分析和評分預測,都需要「語氣、情緒」的特徵,共享表徵對兩者都有幫助。關鍵是任務之間要有重疊的知識需求,而不是學習目標互相干擾。
「GradNorm」怎麼動態調整多任務的損失權重?
動態調整聽起來比手動設定好,但怎麼知道要調多少?
GradNorm 的目標是讓所有任務的梯度 L2 範數(Gradient Norm)接近相同的目標值。如果某個任務的訓練速度快(損失下降快),GradNorm 就降低它的權重;如果某個任務訓練慢,就提高它的權重。讓每個任務「以差不多的速度學習」,避免某個任務壟斷梯度更新。
多任務學習的「任務競爭」現象在推薦系統裡叫什麼?
推薦系統也有多任務(點擊率、轉換率、留存率),應該也有類似問題?
在推薦系統裡叫「多目標優化衝突」(Multi-objective Conflict)。例如優化「點擊率」可能讓模型推送標題黨內容,但這傷害了「用戶留存」。業界解法是 MMOE(Multi-gate Mixture of Experts)架構:讓不同任務學習不同的專家組合比例,減少目標衝突。
多任務模型怎麼評估「整體」表現?
把兩個任務的準確率加起來平均就好了?
不能直接平均,因為量級和重要性不同。常見做法是對各任務評估指標做正規化後加權平均,或用業務目標定義優先級(例如「NER F1 不能低於 0.85,分類準確率最大化」)。另一個方法是計算「相對於單任務基準的提升幅度」,確保多任務對每個任務都有正向或中性影響。
想再往下看,這 5 個
- 多任務學習(Multi-Task Learning)單一模型同時學習多個任務,共享參數達到知識遷移;任務衝突時需謹慎設計損失權重,否則強任務梯度會壓制弱任務。
- 命名實體辨識(Named Entity Recognition)從文字識別人名、金額、組織等實體,是序列標注任務;每個 token 都有損失,梯度訊號天然強於單標籤文件分類任務。
- 損失函數(Loss Function)衡量模型預測與真實標籤差距的函數;多任務學習中,不對各任務損失加權就讓梯度量級強的任務主導更新,造成任務競爭。
- 光學字元辨識(OCR)將影像中的文字轉為機器可讀文字;本題前置步驟為 OCR 後接文件分類與 NER,是金融文件自動化處理的典型架構。
- 轉換器架構(Transformer)本題多任務架構的骨幹,共享 Transformer 層接多個輸出頭;設計多頭輸出時損失權重平衡是成敗關鍵。