https://ai.51cto.com/art/202102/644214.htm
問題1:CTR 模型缺乏個性化
問題:
快手認為,DNN, DeepFM這一類簡單的全連接深度模型,在全局用戶的共建語義模式下缺乏個性化。
目標:
在網絡參數上為不同用戶學習一個獨有的個性化偏差。
借鑒:
LHUC,為每個說話人學習一個 hidden unit contribution。
快手的做法:
PPNET,parameter personalized net。一種 gating 機制,可以增加DNN網絡參數個性化,並加速模型收斂。
快手的效果:
2019年全量上線,顯著提升CTR 目標的預估能力。
具體做法:
1. gateNN:
- 輸入
id 類特征,包括, user_id, photo_id, atyhor_id。
原始輸入給模型的所有特征的 embedding。
這兩類特征的 embedding 會拼接在一起,作為 gateNN 的輸入
- 結構
2層神經網絡
第二層的激活函數是 2*sigmoid。目的是將約束控制在 【0, 2】,默認值是1。當默認值是1時,等價於原始的模型。
2. 每一層神經網絡的輸入,多增加了和 gatenn 的 element-wise product,以此作為個性化偏置。
3. gateNN 不對原始網絡做梯度下降,以防防止收斂。
多目標模型
背景: 訓練數據里面包含雙列發現頁和全屏精選頁兩種異構數據。
快手認為:單列交互行為都是基於 show 發生的 (很像我們的 feed),並沒有像雙列那樣有非常重要的點擊行為(很像我們的push)。
快手做的工作:
- 模型層面,嘗試拆解出單列的數據,單獨優化。
- 特征層面,復用雙列模型特征,只是針對單列的目標,需要額外添加個性化偏置特征和統計特征。
- embedding 層面,前期單列的數據少,不能保證收斂。
- 最初使用雙列數據主導訓練
- 后面改用單列用戶數據主導訓練
- 網絡結構
- 基於 shared-bottom,不相關的目標獨占一個 tower。
- 暴露的問題
- 沒有考慮到單雙列的 embedding 分布差異,造成了 embedding 學習不充分。
快手的改進工作
- 模型層面,將 shared-bottom 網絡替換成 mmoe 的 expert 層
- 特征層面,進行了語義統一,修正在單雙列業務中語義不一致特征(click_history feed流里面用的是全部的點擊歷史,push只用了push的 show history 是不是要統一)
- embeeding 層面,空間映射,設計了 embedding transform layer。幫助單雙列 embedding映射到統一空間分布。
- 特征重要性層面,slot-gating layer,為不同業務做特征重要性選擇?
這四個方面,總歸是為了多任務,提取不同表征。
特征淘汰機制
背景: 每個ID 單獨映射一個 embedding 會使得機器內存很快炸掉。傳統的 lru, lfu 只考慮了頻率信息,主要是為了最大化緩存的命中率。
方案:全局共享的嵌入表 gset, 每個特征定制 feature score進行淘汰。
思想:針對低頻 ID,為防止這些特征無意義的進入和淘汰,設置准入門檻!
改進:
- 新的存儲器件, INTEL AEP。
- 實現底層的 kv引擎
短期行為序列模型
背景:用戶的行為特征豐富且多變。
常見解決方案:
- 對於用戶歷史的行為進行 weighted sum
快手 baseline 是所有用戶行為簡單的做 sum pooling。在單列場景下,show 是被動接受的,用戶需要觀看一段時間之后再做反饋。
- 通過 RNN 之類的模型,進行時序建模
- 改進!借鑒 transformer (encoder + decoder)