一文匯總:推薦系統中多任務學習的優化思路
?多任務學習是推薦系統中非常常見的一個問題。推薦系統中,經常要對多個目標進行預測,比如點擊率、轉化率、觀看時長等等。將這些任務聯合學習,希望通過不同的監督信息,互相增強各自目標的擬合能力。但是同時,不同目標之間又不一定是正向關系,可能存在負向遷移問題,存在蹺蹺板現象。因此,如何最好的發揮多任務學習的作用,達到各個任務聯合最優,一直是一個推薦系統領域的核心研究問題。
這篇文章就給大家匯總一下,推薦系統中常見的多任務學習解決思路。整體可以分為參數共享/私有方式、梯度平衡、表征學習優化等幾個方面。
1.參數共享/私有方式
不同任務之間如何進行參數的共享,哪些參數又該作為該任務的私有參數,這個方面一直是多任務學習中的一個核心研究點。最早的文章由谷歌等機構發表在KDD2018 Modeling task relationships in multi-task learning with multi-gate mixture-of-experts,這篇文章提出了一種基于門控的多專家網絡(MMoE),解決多任務學習問題。在底層網絡中,有多個并行的NN網絡,每個NN網絡就是一個expert。每個任務的預測使用這些expert的加權求和得到,權重由一個門控網絡根據輸入樣本生成。通過這種方式,各個expert是參數共享的,能夠最大限度共享各個任務的信息,同時通過gate針對不同任務側重各自的expert,實現一定程度的參數隔離,緩解各個任務之間的負向影響。
SNR: Sub-Network Routing for Flexible Parameter Sharing in Multi-Task Learning(AAAI 2019)是谷歌提出的另一篇多任務學習網絡結構。SNR相比MMoE更加靈活,主要體現在把各個Expert拆成了更細的粒度,把每個專家拆成多層,每層之間都能進行路由,使得NN網絡的任務間共享私有機制更加靈活。
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations(RecSys 2020)是騰訊在2020提出的一種多專家網絡結構。之前的多專家網絡所有Expert都是各個任務共享的,只靠Gate控制各個任務對于各個expert的使用程度,仍然比較容易出現蹺蹺板現象。為了緩解這個問題,PLE提出了在網絡中加入組個每個任務獨立,不和其他任務共享的參數。通過這種方式,讓每個任務有自己獨立的參數空間,大幅緩解了多任務學習中的蹺蹺板現象。
2.梯度平衡
由于不同任務的數據分布不同,各個任務在反向傳播時的梯度也不同。這就可能出現,某些任務的梯度非常大,把學習過程主導了,導致其他任務學習不好的情況。為了解決這類問題,一些工作專門研究如何設計更好的優化器,平衡各個任務之間的梯度。
MetaBalance: Improving Multi-Task Recommendations via Adapting Gradient Magnitudes of Auxiliary Tasks(WWW 2022)提出了一種梯度平衡的方法。本文面臨的問題是,引入輔助任務提升主任務,但是輔助任務梯度過大導致主導了訓練,反而影響了主任務效果的問題。為了解決這個問題,文中采用范數來約束輔助任務的梯度,讓輔助任務梯度的范數和主任務盡可能一致。范數的計算采用滑動平均的方法,計算歷史累積范數的滑動平均值,防止單次范數計算波動較大。通過,直接約束范數的結果可能并不是最優的梯度更新方式,因此文中還引入了一個系數,融合范數約束前后的梯度。
AdaTask: A Task-Aware Adaptive Learning Rate Approach to Multi-Task Learning(AAAI 2023)提出了在Adam、Adagrad等優化器中,引入考慮多任務之間梯度大小的信息,讓這些優化器在多任務學習的優化中平衡不同任務的梯度大小。整體的實現思路為,原來大Adagrad等方法會根據歷史梯度信息調整每個參數的學習率。本文的AdaTask在此基礎上,增加了一個任務維度,也就是每個任務、每個參數,根據歷史梯度信息調整下一步的學習率。
3.表征學習優化
多任務聯合學習的一個核心目的,就是為了讓利用多個任務的目標,共同更新底層表征,提升底層表征的表達能力,進而提升各個任務的效果。在谷歌的文章Can Small Heads Help? Understanding and Improving Multi-Task Generalization(WWW2022)中,提出了一個多任務表征學習的矛盾點。一般多任務學習都由共享參數和私有參數兩部分組成,如果私有參數量太小,就會導致存在負向遷移的各個任務之間效果互相影響,降低整體多任務學習的效果。如果私有參數量太大,模型的自由度很高,底層表征就無法學到兼容各個任務的信息了。
為了解決這個問題,本文提出了在每個任務的原始輸出head基礎上,增加一個小的輸出head,這個小的輸出head也擬合對應的任務,作為輔助塔。其目的是縮小私有head參數的參數量,以此實現讓底層表征必須抽取出多任務共享的信息,進而提升多任務底層表征的泛化能力。
