天天看點

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

論文位址:

  1. ​​Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations​​

前言

PLE 為 Recsys 2020最佳長論文,出自騰訊的 PCG(Platform and Content Group) 推薦視訊團隊。PLE 是 MMoE (詳見​​【推薦系統多任務學習MTL】MMOE論文精讀筆記(含代碼實作)

​)的改進版,結構簡單且效果好,PLE 主要是在 MMoE 的基礎上,為每個任務增加了自己的 specific expert,僅由本任務對其梯度更新。

一、背景

多任務學習(multi-task learning,MTL)在推薦系統中已經有很多成功的應用,但是存在部分問題沒有解決的很好。其中一個為負遷移(negative transfer),推薦系統中的任務通常是低相關甚至是互相沖突的,聯合訓練可能導緻性能下降,稱之為負遷移。

另一個是跷跷闆現象(seesaw phenomenon),在全部任務中超越單任務模型是非常困難的,即使是一些很新的SOTA的模型在大量的實驗中也沒有處理好這個問題。當任務之間出現比較複雜的關系或者有樣本之間的依賴關系時。目前的MTL模型很難同時在所有任務上超過single-task模型。

騰訊新聞的 MTL ranking system 簡介:這是一個根據使用者回報進行 news 和 videos 推薦的内容平台。模組化的目标包含使用者的多種不同的行為:點選,分享,評論等等。每次請求,候選的排序分根據下面的公式計算:

其中, 表示每個預估行為的相對重要性, 是一個非線性函數,例如 sigmoid、log 函數等。VTR(View- Through Rate)表示有效觀看率,VCR(View Completion Ratio)表示完播率,SHR(Share Rate)表示分享率,CMR(Comment Rate)表示評論率。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

其中 VTR 和 VCR 是最重要的兩個線上名額,分别代表了 view-count 和 watch time。VCR 是使用 MSE 損失訓練的回歸任務,用于預測每個視訊的完播率。 VTR 是一種用交叉熵損失訓練的二進制分類任務,用于預測有效播放的機率(超過一定觀看時間門檻值的播放認為是有效播放)。

從 VTR 和 VCR 定義可以看出兩者之間有比較複雜的關系:

  • VTR的 label 和 播放動作(play action) & VCR 有關系,因為隻有 play action 并且觀看時長大于門檻值視為有效觀看。
  • play action 的分布十分複雜,因為WIFI環境下自動播放的機率明顯比較高,相對地,其他需要手動點選播放的場景play的機率較低。

正因如此,同時對 VCR 和 VTR 進行模組化使得“跷跷闆現象”(seesaw phenomenon)比較明顯。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

上圖可以看出,以 single task 作為基線零點,同時在 VTR 和 VCR 兩個任務中超過 single task 的隻有 PLE,其他模型都有明顯的跷跷闆現象(或VTR比較差,或CVR比較差)

二、相關工作

Hard parameter sharing 是最簡單的也是最容易受到 negative transfer 問題影響效果的MTL網絡結構

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

在 MTL 中,前人做過很多工作用來處理 negative-transfer 問題,例如:cross-stitch network, sluice network 。用來學習如何把不同的 task 的 表達(representations) 線性地融合起來。 這裡的組合方式是偏靜态的方式,比如靜态權重超參數。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

但是這種将表達(representations)通過靜态權重融合起來的方式并不合理,且跷跷闆現象沒有得到解決。此外有一些利用門結構(gate structure)和注意力網絡(attention network)來做資訊融合的工作。關于門結構的使用,如 MMoE 模型。但是 MMoE 的所有 experts 會被上層不同的子任務共享,忽略了專家(experts)之間的差異(詳見​​【推薦系統多任務學習MTL】MMOE論文精讀筆記(含代碼實作)​​。這一點作者已經證明了會造成跷跷闆現象。本文的主要改動的 motivation 也來自于此。下面的右圖是 multi-layer 的 MMoE

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

MRAN(Multiple Relational Attention Network for Multi-task Learning) 利用 multi-head self-attention 來學習不同 feature sets 的不同表達,不論是 MMOE 還是 MRAN 都沒有task-specific 的概念,而是傾向于對所有資訊做共享。

三、本文創新點

3.1 資訊獨享的其他方案

1. 非對稱參數共享(Asymmetric Sharing)

下圖是基于 hard-sharing 的非對稱參數共享結構,有一部分資訊可以被共享,另一部分資訊被獨享。其資訊融合方式包括 concatenation,sum-polling,average-pooling

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

2. 定制分享(Customized Sharing)

下圖的結構中,兩個塔各自有一個獨有的 expert,并且還有一個共享的 expert(淺藍色)。顯式分離 shared 和 task-specific 參數來避免可能存在的内在沖突和 negative transfer。對比 single-task 模型,增加了一個抽取共享資訊的底層網絡,并和 task-specific 層 concat 起來輸入到各自的 tower layer

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

3.2 定制門控網絡 (Customized Gate Control, CGC)

CGC 是 PLE 的基礎網絡。CGC 和上面的 Customized Sharing 網絡的差別在于增加了一個門控網絡,相似點在于也将 task-common 和 task-specific 分離。由第一節的“跷跷闆現象”圖中可以看到,Customized Sharing 網絡的結果和 Single Task 很相近,是以可以使用 Customized Sharing 作為基礎結構,以便于展現後面提到的 Task-specific 的作用。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  • 底層網絡:包含一些 expert 子產品, 每個expert 子產品由若幹子網絡(sub-networks)構成,這些子網絡稱作 experts,每個子產品包含多少個 expert 是可調節的超參。其中 shared experts 負責學習 shared patterns,task-specific experts負責學習task-specific patterns。
  • 上層網絡:一些 task-specific 塔 ,網絡的寬度和深度都是可調節的超參。每個塔同時從 shared experts 和各自的task-specific experts 中學習知識。
  • 門控網絡:Shared experts 和 task-specific experts 的資訊通過門控網絡進行融合。門控網絡的結構為單層的前向網絡,激活函數為softmax 函數。

第 個子任務的門控網絡輸出為:

其中 是輸入的向量表達(representations),

是一個選擇矩陣,把 shared experts 和第 個子任務的 specific experts 串接(concat)起來。

最終第 個子任務的預估值為

其中, 表示第

對比 MMoE,CGC 去掉了子任務塔和其他 task-specific experts 的連接配接,這就使得不同類型 experts 可以專注于更高效地學習不同的知識且避免不必要的互動。另外,得益于門控網絡動态地融合輸入,CGC可以更靈活地在不同子任務之間找到平衡且更好地處理任務之間的沖突和樣本相關性問題(即前面提到的 VCR 和 VCR 的複雜關聯)。

3.3 PLE(Progressive Layer Extraction)

PLE是CGC的一個多層拓展,還利用了一個新穎的 progressive seperation routing 機制。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

衆所周知,越深的 MTL 網絡可以漸進地學到更深的語義表達,一開始也不知道目前的特征表達應該作為 shared 還是 task-specific。于是CGC就擴充成了PLE,PLE利用多層網絡抽取高階的共享資訊。除了 task-specific experts 有門控網絡,抽取網絡也對目前層所有的 experts 利用門控網絡來融合得到新的 shared experts。是以,PLE的 early 層沒有完全把子任務的參數區分開,而是在 upper 層逐漸地分離。底層的抽取網絡對于高層的抽取網絡來說,是代替CGC中原始輸入的存在,而這個替代可以帶來更多的資訊有助于更高層網絡的學習。

PLE 的第 個子任務的第 個提取網絡中門控網絡的定義:

計算完所有的門控網絡和 experts,PLE的第 個子任務的最終輸出為

正因為有了多層的 experts 和 gating networks,PLE 可以抽取并融合每個子任務更深的表達來提升泛化性。

Routing 政策在 MMoE 中是全連接配接層,在 CGC 中是 early separation。PLE采用一種漸進式分離 routing 的方案來從所有的底層 experts 中擷取資訊,抽取成高階的共享知識,并逐漸分離 task-specific 參數。

3.4 損失函數

一般來說,MTL 的損失函數的設計方式是,針對不同的子任務,設定不同的權重,而後再把所有子任務的損失按照權重權重得到。

其中, 表示共享參數(shared parameters), 是子任務的個數。 分别表示第

但是在本場景中,采用這樣的損失函數會存在問題,原因如下

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  • 解決樣本空間不一緻的問題。使用者的行為有序列性導緻樣本空間是異構的(如上圖,不同任務的樣本空間不同),比如使用者隻有點選後才能進行分享和評論。解決樣本空間不一緻的問題,前面我們介紹過 ESMM 的方式(詳見​​【推薦系統多任務學習MTL】ESSM 論文精讀筆記(含代碼實作)​​)。而本文則是在 Loss 上進行一定的優化,聯合訓練這些任務,在計算每個任務的損失時需要把樣本空間相同的合并,并忽略不在自己樣本空間的樣本,即不同的任務仍使用其各自樣本空間中的樣本。

    其中 取值為 0 或 1,表示第 個樣本是否屬于第

  • 其次是不同任務之間權重的優化。MTL 模型的效果在訓練過程中對損失的權重(loss weight)的選擇敏感。不同子任務可能在不同的訓練階段有不同的重要性。關于MTL的權重設定,最常見的是人工設定,這需要不斷的嘗試來探索最優的權重組合,另一種則是阿裡提出的通過帕累托最優來計算優化不同任務的權重。本文則使用動态調整的方式,首先對第 個子任務設定一個初始值,之後每一步根據跟新率(updating ratio) 更新它的損失的權重(loss weight)

    其中

四、實驗結果

4.1 騰訊視訊推薦資料集

資料集介紹:從線上抽取連續8天的使用者行為日志,一共 46.926 百萬使用者,2.682 百萬視訊和9.95億樣本。模組化的使用者行為包括CTR,VCR,VTR,SHR,CMR

為了對比公平,作者也實作了multi-level 版的 MMOE

名額除了 AUC 和 MSE,還有個 MTL gain,定義如下

  • 聯合訓練VTR和VCR任務(任務之間有複雜的聯系)
  • 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  • 聯合訓練CTR和VCR任務(任務之間是普通的聯系)
  • 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  • 線上AB實驗的效果
  • 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  • 聯合訓練三個以上任務的時候的效果
  • 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

4.2 公開資料集

  1. Synthetic Data:人工構造的資料集,參考 MMOE 論文,每個correlation構造了140萬的兩個連續label的樣本
  2. Census-income Dataset:從1994年人口普查資料庫中抽取的299285個樣本和40個特征,和MMOE論文中的實驗一樣,任務 1 預測人群中收入是否大于50k,任務 2 預測是否未婚
  3. Ali-CCP Dataset:包含8.4千萬個從淘寶推薦系統中抽取的樣本。CTR和CVR是兩個聯合模組化的任務
  4. 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  5. Hard parameter sharing 和 MMOE 有時候遭遇跷跷闆現象并在兩個任務中失去平衡。PLE持續的表現最優,且相比 MMOE 平均在 MTL gain上提升87.2%
  6. 【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)
  7. 在census-income和Ali-CCP資料集上,PLE都消除了跷跷闆現象且相比 MMOE 和 single-task 都取得了最好的效果

4.3 Experts 使用率分析

為了探究不同的門如何聚合experts的資訊,作者研究了模組化VTR/VCR任務的模型中expert利用情況,為了實作友善和公平,每個expert都是一個一層網絡,每個expert module都隻有一個expert,每一層隻有3個expert

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

柱子的高度和豎直短線分别表示權重的均值和方差。

可以看到,無論是 MMoE 還是 ML-MMoE,不同任務在三個 Expert 上的權重都是接近的,這其實更接近于一種 Hard Parameter Sharing 的方式,但對于 CGC & PLE 來說,不同任務在共享 Expert 上的權重是有較大差異的,其針對不同的任務,能夠有效利用共享 Expert 和獨有 Expert 的資訊,這也解釋了為什麼其能夠達到比 MMoE 更好的訓練結果。

五、論文了解

PLE,主要是在MMoE的基礎上,為每個任務增加了自己的specific expert,僅由本任務對其梯度更新。

在Share Bottom的結構中,整個共享參數矩陣如同品質較大的物體,在梯度更新的環節,兩個loss反向計算的梯度向量分别是 和 ,是這個物體受到的兩個不同方向不同大小的力,這兩個力同時來挪動這個物體的位置,如果在多次更新中兩個力大機率方向一緻,那麼就能輕松達到和諧共存、相輔相成。反之,多個力可能出現彼此消耗、互相抵消,那麼任務效果就會大打折扣。

MMoE 通過“化整為零”,把一個共享參數矩陣化成多個結合 gate 的共享 Expert,這樣不同的 loss 在存在互相沖突的時候,在不同的expert上,不同loss可以有相對強弱的表達,那麼出現互相抵消的情況就可能減少,呈現出部分 experts 受某子任務影響較大,部分 experts 受其他子任務主導,形成“各有所得”的狀态。而 PLE 增加了spcific experts,能進一步保障“各有所得”,保證穩定優化。

【推薦系統多任務學習 MTL】PLE論文精讀筆記(含代碼實作)

六、代碼實作

  1. ​​github1​​
  2. ​​github2(淺夢學習筆記)5.9K star​​
class PleLayer(tf.keras.layers.Layer):
    '''
    @param n_experts: list,每個任務使用幾個expert。[3,4]第一個任務使用3個expert,第二個任務使用4個expert。
    @param n_expert_share: int,共享的部分設定的expert個數。
    @param expert_dim: int,每個專家網絡輸出的向量次元。
    @param n_task: int,任務個數。
    '''
    def __init__(self,n_task,n_experts,expert_dim,n_expert_share,dnn_reg_l2 = 1e-5):
        super(PleLayer, self).__init__()
        self.n_task = n_task
        # 定義多個任務特定網絡和1個共享網絡
        self.E_layer = []
        for i in range(n_task):
            sub_exp = [Dense(expert_dim,activation = 'relu') for j in range(n_experts[i])]
            self.E_layer.append(sub_exp)
        self.share_layer = [Dense(expert_dim,activation = 'relu') for j in range(n_expert_share)]
        # 定義門控網絡
        self.gate_layers = [Dense(n_expert_share+n_experts[i],kernel_regularizer=regularizers.l2(dnn_reg_l2),
                                  activation = 'softmax') for i in range(n_task)]
    def call(self,x):
        # 特定網絡和共享網絡
        E_net = [[expert(x) for expert in sub_expert] for sub_expert in self.E_layer]
        share_net = [expert(x) for expert in self.share_layer]
        # 【門權重】和【指定任務及共享任務輸出】的乘法計算
        towers = []
        for i in range(self.n_task):
            g = self.gate_layers[i](x)
            g = tf.expand_dims(g,axis = -1) #次元 (bs,n_expert_share+n_experts[i],1)
            _e = share_net+E_net[i]  
            _e = Concatenate(axis = 1)([expert[:,tf.newaxis,:] for expert in _e]) #次元 (bs,n_expert_share+n_experts[i],expert_dim)
            _tower = tf.matmul(_e, g,transpose_a=True)
            towers.append(Flatten()(_tower)) #次元 (bs,expert_dim)
        return      

參考:

  1. ​​Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations​​
  2. ​​大廠技術實作 | 多目标優化及應用(含代碼實作)​​
  3. ​​推薦系統遇上深度學習(九十二)-[騰訊]RecSys2020最佳長論文-多任務學習模型PLE​​

繼續閱讀