多任務學習(Multi-task learning)在cv和nlp領域已經得到廣泛的應用,無論是經典的maskrcnn—同時預測bounding box的位置和類别,還是稱霸nlp的bert—預測某個單詞和句子是否相關聯,都屬于多任務模型。在推薦中是基于隐式回報來進行推薦的,使用者對于推薦結果是否滿意通常依賴很多名額(點選,收藏,評論,購買等),是以在排序中,我們需要綜合考慮多個目标,盡可能使所有目标都達到最優。多任務學習是解決多目标排序問題的方案之一。
1 單任務學習和多任務學習
推薦中,基于隐式回報的資料進行模型訓練。資料資料的樣本分布如下圖所示,
點選、加入購物車、下單都是使用者的積極回報。訓練中,這些都會作為正樣本參與模型的學習。使用DNN+Embedding的模型,訓練中點選,加購等都作為标簽為1參數訓練,給予他們不同的權重,權重在展現在損失函數中,即在原始交叉熵損失中,對于不同的正樣本,在正樣本損失中乘以不同的權值:
w ∗ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) \textcolor{red}{w}*ylog\hat{y}+(1-y)log(1-\hat{y}) w∗ylogy^+(1−y)log(1−y^)
比如我們想優化訂單,會給予訂單樣本比較大的權值,模型在學習過程中,會将重點放在訂單部分,因為這部分會引起比較大的損失值,忽略點選樣本。這樣的情況下,會導緻模型過于關注某一部分,模型學到的偏離整體樣本分布,線上相當于用子空間去預測全空間的分布。
獨立的單任務處理,忽略了問題之間所富含的豐富的關聯資訊。MTL可以找到各目标優化時的trade off。 比如Single Task 在優化轉換的時候,會對點選帶來負面效果,MTL可以降低甚至消除這個負面效果。常用多任務有hard和soft兩種模式,
共享參數得過拟合幾率比較低,hard parameter網絡每個任務有自己的參數,模型參數之間的距離會作為正則項來保證參數盡可能相似。hard模式對于關聯性比較強的任務,降低網絡過拟合,提升了泛化效果。常用的是share bottom 的網絡 可以共享參數,提高泛化(improving generalization)。
2 share bottom網絡
将id特征embedding,和dense特征concat一起,作為share bottom網絡輸入,id
特征embedding可以使用end2end和預訓練兩種方式。預訓練可以使用word2vec,GraphSAGE等工業界落地的算法,訓練全站id embedding特征,在訓練dnn或則multi task的過程中fine-tune。end2end訓練簡單,可以很快就将模型train起來,直接輸入id特征,模型從頭開始學習id的embedding向量。這種訓練方式最緻命的缺陷就是訓練不充分,某些id在訓練集中出現次數較少甚至沒有出現過,在inference階段遇到訓練過程中沒有遇到的id,就直接走冷啟了。這在全站item變化比較快的情況下,這種方式就不是首選的方式。
多任務學習人工調的參數相對DNN較多,如上圖所示,我們有三個損失,這三個損失怎麼訓練?三個子任務的輸出,排序時如何使用?正負樣本不均衡時,改如何處理?這三個問題分别對應了loss weight,output weight ,label weight。下面針對這三個問題,依次展開。
2.1 label weight
調整正樣本的比例,對于正負樣本分布不均衡的時候,該參數可以使得模型提高對正樣本的關注,提高模型的召回,auc名額。
點選AUC(綠色對點選正樣本權重)
轉化AUC(綠色對訂單正樣本權重) 從上面兩個圖可以看出,當正負樣本比例相差懸殊時(我們點選正負樣本比例是1:10,訂單正負樣本比例是千分之一的比例),提高正樣本權重,對AUC提升會比較明顯,訂單AUC得到明顯的提升。每個子任務正負樣本比都為1:1可能導緻各個子任務之間學習互相抑制。對于正負樣本比例比較懸殊的,可以調整正樣本為負樣本的一半,效果比較好。
2.2 loss weight
調整損失的權重, 讓共享層更關注某一個任務,也能解決一部分樣本分布不均衡帶來的過拟合。通常,MTL訓練的過程中,是對多個子任務的損失線性權重:
L = ∑ i = 1 w i l i L=\sum_{i=1}w_il_i L=i=1∑wili
這樣有個明顯的缺點,就是這個 w i w_i wi需要很強的先驗知識,人工預設,在訓練的過程中保持不變。大家都知道,損失值在深度學習中的地位,直接決定了梯度的大小和傳播,調參給出的權值很難保證我們給出的就是最優解,使得每個子任務都達到最優。這也是多任務學習一個主流的研究方向—pareto 最優解。這是一個經濟學的概念,感興趣的同學可以去了解一下,我會在下面附上相關的參考文獻。言歸正傳,loss weight不合适,會導緻正負樣本嚴重不均衡的子任務會快出現過拟合的情況,如下圖所示:
訂單AUC 深度學習的表達能力很強,模型很快就學習到了正樣本的特征,繼續訓練導緻模型出現過拟合的情況。而對于正樣本較多的子任務,模型還沒有學習充分。是以,我們需要給損失一個合适的權重,某種程度上也是在調整每個子任務的學習率。在給定的權值下,每個子任務達到局部最優解。
2.3 output weight
調整模型輸出的權重組合。不同的權重值,影響排序時對應的子任務的重要性。對于輸出的權重組合,可以利用grid search的思想,選出我們關心的離線評估名額最高的一個組合作為線上排序依據,在離線空間的組合逼近連續空間的最優值。最直接的做法可以将三個子任務的輸出,在0到1區間,每隔0.1采樣一個權值,在這1000組參數中,選擇離線名額最高的一個組合作為最終的輸出權重,下面是僞代碼:
best_offline_score = 0
best_weight = None
for i in range(0,1.1,0.1):
for j in range(0,1.1,0.1):
for k in range(0,1.1,0.1):
score = task1_score*i+task2_score*j+task3_score * k
current_metric = calculate_offline_metrics(socre)
if current_metric > best_offline_score:
best_offline_score = current_metric
best_weight = [i, j, k] #記錄最優的權值組合
3 MMoE與MTL結合
多任務模型對任務之間的相關性很敏感,如果子任務之前的關聯性不大,采用share bottom的網絡,share部分的參數,會有較大的噪音。通常,相似的子任務也擁有比較接近的底層特征,那麼在多任務學習中,他們就可以很好地進行底層特征共享;而對于不相似的子任務,他們的底層表示差異很大,在進行參數共享時很有可能會互相沖突或噪聲太多,導緻多任務學習的模型效果不佳。
MMoE(Multi-gate Mixture-of-Experts)是 Google出品的文章,是在深度學習之父 Geoffrey Hinto提出的MoE(parsely-Gated Mixture-of-Experts layer)基礎上改進。MoE 由許多 “專家” 組成,每個 “專家” 都有一個簡單的前饋神經網絡和一個可訓練的門控網絡(gating network),該門控網絡選擇 “專家” 的一個稀疏組合來處理每個輸入,它可以實作自動配置設定參數以捕獲多個任務可共享的資訊或是特定于某個任務的資訊。MMoE在MoE的基礎上,添加多個gate,每個子任務對expert進行不同的權重,如果你熟悉cv中的SENET網絡結構,那你對MMoE的這個思想就不會覺得有任何陌生感。
dense特征和id Embedding特征concat一起作為input輸入,MMoE和MTL的結合有兩種方式,input直接輸入到MMoE,我們稱之為直連的方式,這種方式的好處是可以很好的捕捉子任務之間的差異;另外一種方式是input先連接配接一個全連接配接,然後再接入MMoE中,當輸入的特征次元比較高的時候,可以通過這種方式進行降維,連接配接到每個expert的輸入變小,整體模型參數降低。原論文中在gate的部分添加了dropout和re -softmax,避免出現relu death的情況。
第一種方式子任務權值的分布
第二種方式子任務權值的分布 下圖是MMoE 和share bottom的loss對比,藍色為MMoE的損失曲線。
MMoE vs MTL 轉化auc對比
MMoE線上AB實驗,相對MTL大概有5%左右的轉化提升。
4 MMoE與貝葉斯結合
通過前面的實驗,我們可以發現,MMoE是在share bottom的基礎上改進的。MMoE 修改了網絡共享參數的部分,是以一個很直覺的想法就是,子任務之間是否也存在關聯。簡單舉例來說,轉化是發生在點選的條件下的,現有轉化才有購買,但是我們現在的網絡結構子任務之間是獨立的。但是怎麼構造子任務之間的關聯呢?
如上圖所示,可以将目前子任務的specific feature和上一個子任務的Embedding特征concat起來,作為子任務的輸入。在這種情況下,就可以在預測轉化的時候,是在考慮點選的條件機率下進行預測。
5 MTL調參經驗
有監督學習問題中,最重要的選擇是label,label決定了你做什麼,決定了模型上限,而feature和model都是在逼近label。第一次直接拿原始DNN訓練資料,直接訓練MTL,離線名額好于DNN,但是線上卻是負向的,最後發現是資料中噪聲資料。MTL對資料準确性要求較高。
loss weight權重是正負樣本比例的倒數,label weight 的正負樣本調整成1:2。loss weight不合适很容易造成模型過拟合。網絡深度不易過深(三層),推薦中過深的網落(高階特征交叉)會有負向效果。
動态調整loss weight,模型在訓練的過程中,自己學習權值。主要有兩個優化方向,一是確定每個子任務的梯度在同一個量級,grad_norm 和 Weigh Losses,參考文章如下:
Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics
GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks
二是利用Pareto optimization,求解多目标梯度優化(這個是未來主流的方向):
Multi-Task Learning as Multi-Objective Optimization
Multi-Gradient Descent for Multi-Objective Recommender Systems