推薦系統實踐——知乎如何做首頁rank

文章參考「回顧」知乎推薦頁Ranking經驗分享

推薦頁請求流程

在這裏插入圖片描述

  1. 召回
    基於話題:獲取用戶的關注數據,用戶行爲挖掘;
    基於內容:協同過濾的方式
  2. 排序
    基於規則:時間順序,線性加權;
    基於模型:GDBT,DNN
  3. 重排序
    提權:比如給視頻進行一定的提權;
    隔離:相似內容隔開;
    強插:高質量的新內容流通

ranking演進

在這裏插入圖片描述

特徵介紹

  1. 用戶畫像特徵
    用戶屬性特徵:性別等;
    統計特徵:用戶點贊數等。

  2. 內容畫像
    固有特徵:文章長度,關鍵詞等;
    統計特徵:歷史點贊數等。

  3. 交叉特徵
    用戶與內容的交叉特徵:比如用用戶感興趣的話題和當前待推薦內容的話題交叉。

CTR模型

DNN

在這裏插入圖片描述
結果:這一版模型的AUC爲0.7618
在這裏插入圖片描述
結果:AUC:0.7678,提升0.6%

Deep FM

在這裏插入圖片描述
該DeepFM算法與華爲設計的DeepFM不同,改模型將FM層的結果作爲DNN的輸入。
AUC 提升 0.2%

Last View + DIN

在這裏插入圖片描述
Last view topic 與當前內容的幾個 topic 計算 Attention Score,再按權重進行 sum pooling;這個模型參考了阿里的DIN模型,它會把用戶看過的東西Embedding,然後根據Attention Score再乘起來,我們的做法有所不同,我們是基於Topic,是過去用戶看過那些Topic下的內容進行劃分
AUC 提升約 0.2%

Last Display + GRU

在這裏插入圖片描述
過去點擊的行爲對現在能夠產生影響,那麼同理,過去展示的內容中沒有點擊的內容對當下的點擊行爲同樣會產生影響,所以這裏面增加了Last Display(包括點擊和沒點擊的所有數據)

Last Display 經過 Embedding 後與是否點擊結合,再進入 GRU 模塊,最後狀態當做 DNN 輸入;
AUC 提升約 0.4%

多目標優化

在這裏插入圖片描述
之前所有的模型都是基於CTR爲導向來進行設計的,但是這樣用戶的負反饋可能會比較多一些,因爲一些長尾的內容,或者大衆化的內容會比較多,影響用戶的體驗。

後來考慮設計一個多目標模型,一個是基於點擊率的模型,一個是基於收藏率的模型,基於點贊率,基於評論率等等,一共設計8個目標。

從性能方面的考慮,我們將底層權重設置成共享的,最後一層會根據不同的目標進行權重的訓練

上線後線上表現:點擊率基本不變,而其他的幾個指標,比如點贊,收藏大幅提升

最終模型結構

在這裏插入圖片描述

經驗分享

  1. 對於隨時間變化的統計特徵,比如用戶和內容畫像的統計值,線上 service 應當紀錄請求時的值,生成訓練樣本時直接從紀錄的日誌裏獲取,避免特徵穿越問題;
  2. 如果發現線下效果好,比如 AUC 和 NDCG 提升明顯,但上線效果不顯著,很可能是特徵不一致導致的,可重點排查;
  3. 線上線下最好使用同一套特徵抽取框架,只需使用的相同特徵配置便可保證一致性,我們 Global Ranking 使用同一套 proto結構和特徵抽取模塊實現;
  4. 做特徵歸一化操作,發現有特別大的值,比如幾萬或者幾十萬,要先取 log ,不然會導致這個特徵大部分值都趨向0,相當於徵失效;
  5. 輸入特徵要做非法檢查,防止出現 inf,nan,而導致模型訓練出現異常的參數;
  6. 對於線上的每次請求,用戶特徵都是一樣的,可以只計算一遍用戶特徵相關的 block,避免冗餘運算;
  7. 訓練數據量要儘可能大,可以使用 FlatBuffer 結構把訓練數據存放在 HDFS 上,訓練時直接從 HDFS 讀取,邊讀取邊訓練;
  8. 線上模型要能自動更新,過老的模型效果下降嚴重。

面臨問題

  1. 推薦頁與搜索頁的特性不同

o 搜索帶着 query 來的,結果與之相關性越高越好,不用太關心結果的多樣性;
o 推薦頁用戶沒有明確的目的,但是有興趣偏好和對結果的多樣性需求,推薦既要準確又要多樣化。

  1. CTR 預估模型是 pointwise 模型,沒有考慮單個內容與其他內容同時出現的影響。

  2. 用戶對感興趣的東西會出現審美疲勞,要及時抓住這種特點,比如一個算法工程師看完幾個機器學習文章後就不想再看了,這時候要能推薦一些其他話題的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章