背景
做推薦算法肯定繞不開多目標,點擊率模型、時長模型和完播率模型是大部分信息流產品推薦算法團隊都會嘗試去做的模型。單獨優化點擊率模型容易推出來標題黨,單獨優化時長模型可能推出來的都是長視頻或長文章,單獨優化完播率模型可能短視頻短圖文就容易被推出來,所以多目標就應運而生。
剛開始做多目標的時候,一般針對每一個目標都單獨訓練一個模型,單獨部署一套預估服務,然後將多個目標的預估分融合後排序。這樣能夠比較好的解決推薦過程當中的一些負面case,在各個指標之間達到一個平衡,提升用戶留存。但是同時維護多個模型成本比較高,首先是硬體上,需要多倍的訓練、PS、和預估機器,這是一筆不小的開銷(一個月保守百萬左右吧),然後是各個目標的迭代不好協同,比如新上了一批好用的特徵,多個目標都需要重新訓練實驗和上線,然後就是同時維護多個目標對相關人員的精力也是一個比較大的消耗。
可以通過LTR(Learning To Rank)方法優化Item的重要性來解決多目標打算解決的問題,但是由於工程實現、推薦框架調整等方面的困難,相關方法在實際應用中比較少。現在主流的還是通過多任務學習訓練一個模型預估多個目標,然後線上融合多個目標進行排序。多個目標融合的時候很多公司都是加權融合,比如更看重時長可能時長的權重就大些,更看重分享,分享的權重就大些,加權係數一般通過AB實驗調整然後固定,這樣帶來的問題就是,當模型不斷迭代的時候,這個係數可能就不合適了,經常會出現的問題是加權係數影響模型的迭代效率。具體多個目標怎麼融合,這個裡面機制發揮的空間比較大,這裡不再贅述。
共享Embedding 多塔結構
底層共享embedding,三個目標三個獨立的塔,NN層各個目標完全獨立的。點擊模型使用全量有效曝光樣本進行訓練,時長模型和完播率模型使用點擊樣本進行訓練。經過多次迭代,這個結構上線後大盤PV和時長都有一定提升,每一個目標單獨來看,點擊指標基本微降,時長和完播率指標提升較多。
MMOE
借鑑Google提出的MMOE,升級多目標模型,模型結構如下:Embedding層還是共享的,MMOE層對應每個目標分別給一個輸出,然後每個目標各自一個塔。MMOE模型相對Share-Bottom三塔結構,離線點擊指標有一定提升,時長和完播率基本持平,但是模型複雜度增大較多,訓練較慢。
MMOE結構如下:Expert是一個神經網絡,Expert個數根據訓練和預估性能做權衡,和任務數保持一致也可以。Gate是一個Softmax函數,個數與任務數一致,每個Gate的輸出個數與Expert個數一致。
其它嘗試
嘗試過在embedding與各個目標獨立的NN之間加入共享的NN層,比如把上面MMOElayer換成普通的NN層,這樣訓練發現完播率指標有提升,但是時長和點擊率指標下降,我們撤掉共享NN層之後,各個目標都取得了相對於單獨訓練的base模型的提升,但是完播和時長模型提升較大。
分析原因,撤掉共享NN後各個指標提升,應該是由於每個單獨的NN網絡模型複雜度不夠導致。同時,時長和有效閱讀指標提升較多,是由於訓練點擊模型使用的是全量曝光樣本,而時長和完播率模型使用的是點擊樣本,但是線上serving的時候時長和完播率模型都是面對全量樣本做預估的,訓練和預估時樣本分布不一致可能導致預估偏差較大,但是在多任務學習過當中,點擊率學習好的EMB是可以共享給時長和完播率完成遷移學習的,可能是EMB共享擴大了時長和完播率模型的學習空間,緩解了訓練和預估樣本分布差異。
完播率和點擊模型兩者相關性較大,所以在使用共享NN層時在其它指標下降的情況下,其指標也能提升。前期點擊模型的線上指標下降比較多的,整體也沒有收益,考慮到時長和完播率都是對點擊樣本進行學習,這可能對點擊模型的影響有點大了,於是稍微調大了點擊模型的學習率,加上撤掉共享NN層,整體指標基本就由負轉正了。
之前嘗試加入過互動模型(點讚、評論、收藏、分享),但由於樣本過於稀疏以及訓練和Serving的效率問題,最終沒有上線,後面有機會,還是值得嘗試一下的。
樣本空間不一致處理
三個目標的輸入是一樣的,都是全量有效曝光樣本,但是在時長和完播率這兩個塔,針對未點擊樣本,將其回傳梯度置零,這樣處理就相當於只使用點擊樣本在進行訓練了。如何理解呢?訓練其實就是一個梯度回傳的過程,將未點擊樣本的梯度置零,相當於這部分樣本的梯度未對網絡參數的調整起到影響,但是由於Mini-Batch 梯度優化算法最終會用整體修正梯度除batch樣本數量,所以在時長和完播率這兩個塔裡面除以的是Batch樣本裡面的點擊樣本數。
在點擊時長完播率三目標訓練當中,點擊模型的EMB共享可以彌補時長和完播率模型未能學習未點擊樣本造成的訓練和預估樣本分布偏差問題,但是時長和完播率模型的更新卻給點擊率模型的樣本造成了一定的擾動,相當於點擊樣本被多次訓練了,從而造成點擊模型點擊樣本和未點擊樣本的分布差異變大。通過增大點擊率的學習率,相當於給點擊模型加權了,這樣可以減小由於時長和完播率更新造成的點擊樣本和未點擊樣本之間的差距。這樣也確實給點擊模型的指標帶來了一定的提升。
正常來說,各個目標之間的Loss權重調整是不好把握的,當你對某個任務的loss加權的時候,不僅改變了當前任務的學習曲線,由於EMB共享,所以也會影響到其它任務,這種影響到底有利還是有弊呢,不知道,理論上也沒有保障,只能說試試看了。有論文使用每個任務的不確定度(uncertainty)來輔助對loss進行加降權,可以嘗試一下,還沒有做相關的實驗。
多目標的難點
也可以說是trick, 不同目標的訓練樣本不一致,比如點擊模型和時長模型,所以上面就有談到處理方法,那就是對只使用點擊樣本的任務將其未點擊樣本的回傳梯度置0,同時在更新相關任務的NN參數的時候根據點擊樣本數做平均。
然後是學習率的調整,這個其實可以根據不同任務的loss下降曲線來相應調整,我是根據離線和在線指標來進行調整,但是調大還是調小呢,那就要對不同的學習任務有比較深刻的理解。點擊任務的正負樣本分布被時長和完播給帶偏了,那麼增大其學習率自然可以緩解這種情況,但是時長和完播率則不然,點擊任務多出來的樣本一般來說會給另外兩個任務帶來額外的信息增益。
可以優化的點
1)點擊模型的輸出可以作為時長和完播率模型的輸入特徵,但是這個處理對於Serving時使用多線程對多個目標進行並行預估不友好。
2)可以研究不同目標loss加權的方法,使得不同目標的梯度更新能夠達到步調一致,整體的loss能夠穩定的降低。
3)訓練和預估支持的話,可以增大Expert的個數
4)MMOE裡面的Gate結構,可以與每一個Expert做成一個self-attention的結構
參考:
1) 推薦系統中的多任務學習
2) 美團「猜你喜歡」深度學習排序模型實踐
3) 多任務學習在美圖推薦排序的近期實踐
4) 多目標學習系統:如何讓知乎互動率提升 100%?
5) MTL 在工業界如何更勝一籌
6) YouTube 多目標排序系統:如何推薦接下來收看的視頻
7) 信息流短視頻時長多目標優化
8) Modeling Task Relationships in Multi-task Learning with Multi-gateMixture-of-Experts
9) Entire Space Multi-Task Model: An Effective Approach for EstimatingPost-Click Conversion Rate
由於微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
(1)點擊頁面最上方"AINLP",進入公眾號主頁。
(2)點擊右上角的小點點,在彈出頁面點擊「設為星標」,就可以啦。
感謝支持,比心。
進群請添加小助手微信 AINLPer(id: ainlper),備註推薦系統推薦閱讀
這個NLP工具,玩得根本停不下來
徵稿啟示| 200元稿費+5000DBC(價值20個小時GPU算力)
完結撒花!李宏毅老師深度學習與人類語言處理課程視頻及課件(附下載)
從數據到模型,你可能需要1篇詳實的pytorch踩坑指南
如何讓Bert在finetune小數據集時更「穩」一點
模型壓縮實踐系列之——bert-of-theseus,一個非常親民的bert壓縮方法
文本自動摘要任務的「不完全」心得總結番外篇——submodular函數優化
Node2Vec 論文+代碼筆記
模型壓縮實踐收尾篇——模型蒸餾以及其他一些技巧實踐小結
中文命名實體識別工具(NER)哪家強?
學自然語言處理,其實更應該學好英語
史丹福大學NLP組Python深度學習自然語言處理工具Stanza試用
關於AINLP
AINLP 是一個有趣有AI的自然語言處理社區,專注於 AI、NLP、機器學習、深度學習、推薦算法等相關技術的分享,主題包括文本摘要、智能問答、聊天機器人、機器翻譯、自動生成、知識圖譜、預訓練模型、推薦系統、計算廣告、招聘信息、求職經驗分享等,歡迎關注!加技術交流群請添加AINLPer(id:ainlper),備註工作/研究方向+加群目的。
閱讀至此了,分享、點讚、在看三選一吧🙏