在推薦系統當中,樣本生而不平等。對於某一類樣本來說,其數據量越多,模型對這類樣本的學習會更好,這也是為什麼一般模型對長尾樣本學習不好的原因,這也是新用戶和新Item冷啟動一般需要被單獨處理的原因。如何在模型當中對我們重點關注的指標從樣本層面進行優化?樣本加權是常用的一種方法。下面我將結合自身實踐,跟大家分享一下,如何使用樣本加權的方法提升用戶閱讀時長、用戶閱讀完成率及新用戶閱讀體驗。
先講講時長加權,一開始做的時候,樸素的想法就是,點擊率排序模型是為了將正例排在負例前面,但是在正例裡面如果能把閱讀時長長的排在前面,對於用戶體驗和產品指標來說,顯然更好,當然也不是越長越好,可以根據自身業務關注點做相應的處理,後面也會講講處理方法。同時考慮點擊率和時長,常規的思路就是做多目標,我們開始也走了這條線路,單獨訓練了時長模型和點擊率模型,然後線上融合,一般線上的效果就是以點擊率換時長,點擊率跌時長增,如果留存為正,那麼就可以上線。雖然線上已經有了點擊模型、時長模型、完播率模型等,但是,能不能進一步挖掘點擊模型在提升時長方面的能力呢?顯然是可以的。
業界已經有不少採用樣本加權的方式提升排序模型效果的工作,比如Youtube 2016就發了一篇介紹時長加權深度推薦模型的論文,UC信息流推薦模型在多目標方面的嘗試就是使用樣本加權的方式。借鑑這兩家的工作,我們首先嘗試使用時長加權,希望在點擊排序模型中,將時長長的正例排在前面。
點擊率模型是一般是二分類模型,點擊還是不點擊,兩個類。深度推薦模型網絡最後一層輸出logits,然後過sigmoid函數得到樣本點擊和不點擊的概率。以logloss為損失函數,logloss對錯誤分類進行懲罰,最小化logloss基本等價於最大化分類正確率。如果最後一層只用一個神經元,則可以看成最後輸出為正例的概率:
logloss = Ylog(Sigmoid(x))+ (1-Y)log(1-Sigmod(x))
x為最後一層的logits輸出,對損失函數及sigmoid函數求導,得到:
dx = Y*1/Sigmoid(x) * Sigmoid(x)(1 – Sigmoid(x)) + (1-Y) * 1/(1-Sigmoid(x)) * (1- Sigmoid(x)) *-Sigmoid(x) = Y – Sigmoid(x)
我們將時長以權重的方式加到損失函數上面,也相當於對最後一層的回傳梯度加權。
點擊率模型樣本有正有負,負例是沒有實際閱讀時長的,所以對於負例不能直接使用樣本時長對樣本損失加權。把負例的權重看作1,正例的權重為(1+時長),這樣就能實現對正樣本進行時長加權了。但是不同樣本之間,時長的差距很大,有的幾秒,但是有的幾百秒,在一個batch_size為128的batch中,如果有一個時長很長的樣本,那麼最後做梯度平均的時候,該樣本的梯度就完全覆蓋掉掉了其它樣本的梯度,相當於其它樣本基本沒有得到學習,這樣顯然是不行的。
一個很自然想到的解決方法是做時長平滑,比如log(時長+1),但是相對於二分類logloss來說,這樣的權重還是太大了,權重會壓過損失本身,所以需要進一步對時長做歸一化,先對時長做截斷處理,比如統計下圖文視頻的閱讀時長分位數,然後做適當截斷到maxtime,再log(時長+1)/maxtime,這樣處理過後,權重就比較合理了。
既然我們對樣本進行了加權,那麼在一個batch內做梯度平均的時候,也應該除以加權batch數,即將一個batch內所有的權值加起來當作該batch_size數,然後做梯度平均,這樣處理對學習的穩定性非常重要,而且這樣mini-batch梯度優化的理論性才是完備的。
基本上這就是樣本加權的精髓了:
權重要做合理的transform
同時梯度平均的時候除以的是加權樣本數
完播率加權基本也是這樣處理的,不過完播率加權是以將完播率較高的樣本排在前面為出發點來做的。完播率這裡對於短時長點擊樣本需要做一些修正操作,因為短時長樣本完成率天然就高,這樣會導致短時長內容容易被推出來,而短時長內容一般質量都不是很好。
Uid即userid,uid曝光數反向加權的出發點是希望對新用戶樣本給予更大的權重,從而在新用戶上面取得收益。我們有特徵專門標誌每個uid的出現次數,然後根據uid的展現次數做一個反向加權,即展現高的權重小,展現少的權重高,即一個batch內新用戶的樣本權重更高。權重的處理基本與時長加權和完播率加權的處理方式差不多,都需要先合理的transform,然後計算平均梯度的時候除以加權樣本數。這裡也可以使用uid的點擊次數做反向加權,而不是曝光次數,相當於只對正樣本進行處理,而不是全量樣本。
時長加權、完播率加權和uid曝光數反向加權這幾個操作在線上都取得了不錯的收益。時長加權增時長的同時PV不跌,完播率加權則PV時長雙增,同時有效閱讀率提升,無效閱讀率下降,Uid加權在老用戶上面PV時長微跌,但是在新用戶上面則大漲。
大名鼎鼎的Youtube時長加權排序模型在訓練階段權重的處理跟我們的對時長的處理方式應該是一致的,雖然論文裡面沒有寫怎麼操作,只說了使用時長對損失進行加權。一開始做這個模型的時候還走了些彎路,就是對上面樣本加權的精髓沒有理解到位。Youbube 時長模型在Serving的時候使用的是pow(e, logits),至於為什麼這樣處理,可以參考王喆老師的文章,揭開YouTube深度推薦系統模型Serving之謎。
幾個小問題:
你覺得樣本加權對於模型迭代會帶來負面影響嗎?
如何統一多個樣本加權處理?
[1] https://zhuanlan.zhihu.com/p/61827629
[2] Deep Neural Networks for YouTube Recommendations (Youtube 2016)
由於微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
(1)點擊頁面最上方"AINLP",進入公眾號主頁。
(2)點擊右上角的小點點,在彈出頁面點擊「設為星標」,就可以啦。
感謝支持,比心。
進群請添加AINLP小助手微信 AINLPer(id: ainlper),備註NLP技術交流推薦閱讀
這個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),備註工作/研究方向+加群目的。
閱讀至此了,分享、點讚、在看三選一吧🙏