1. 程式人生 > >知乎如何洞察你的真實喜好?首頁資訊流技術揭祕

知乎如何洞察你的真實喜好?首頁資訊流技術揭祕

640?wx_fmt=jpeg


11月8-9日,由中國 IT 社群 CSDN 與矽谷 AI 社群 AICamp 聯合出品的 2018 AI 開發者大會(AI NEXTCon) 在北京舉行,就人工智慧的最新技術及深度實踐,進行了全方位的解讀及論證。本文是機器學習技術專題中知乎首頁業務總監、首頁推薦技術負責人張瑞的演講實錄。


資訊爆炸時代,資訊過載已經成為網際網路核心問題之一,而通過AI、機器學習等技術過濾低質無用資訊,推動有價值資訊的生產和迭代,被視為一種有效解決方案。以知乎為例,這家知識內容平臺很早就開始著手機器學習的開發實踐,並於2016年正式組建機器學習團隊,利用站內豐富的中文語料庫訓練AI演算法,推動有價值資訊更高效觸達使用者,為內容產業提供了很好的技術借鑑。日前,在2018AI開發者大會上,知乎首頁業務總監張瑞就機器學習在知乎首頁中的應用做了技術分享。以下是分享內容摘要。

 

一、知乎資訊流推薦框架

 

知乎的資訊流推薦框架是一個基於多策略融合的多源內容推薦系統,代號“水晶球”。如圖所示,在這個系統中,首頁上出現的內容經歷過兩次排序。第一次是從數十個推薦佇列裡被“召回”,第二次是在合併後經過深層神經網路(DNN)的“排序”。

 

  • “召回”的第一個步驟是,召回模組根據使用者的歷史行為表現(使用者畫像、內容標籤、內容源資訊),確定數十個推薦佇列。這數十個推薦佇列是含有特定標籤的內容池,有些佇列裡內容性質相似,比如熱點新聞佇列、視訊佇列,還有的佇列與使用者行為緊密相關,比如關注關係佇列、搜尋關鍵詞佇列。比如說,根據使用者的關注關係向外擴充套件更多關注關係,根據使用者興趣召回感興趣的內容,根據搜尋關鍵詞進行相關推薦。


640?wx_fmt=png

  • “召回”過程的第二個步驟是,各召回源根據使用者的需求分別將自己的佇列中的內容做排序後,按召回數量返回內容。我們會從內容型別、內容質量、召回技術三個維度對內容分類,召回源的資料經過匯聚之後會進行融合,最後,DNN可以在20ms內對這些資料完成打分和排序過程,決定推送給使用者的內容。

 

  • API的資料還會反饋到Feedback&Control的模組裡面,應用這些資料進行業務控制的操作,比如我們會記錄每個使用者看到的內容是什麼,大家都知道在Feed資訊流推薦有個很重要的應用是去重,推薦內容不能是有重複的,我們會用過濾保證推出來的內容沒有重複。使用者在一天裡面看到哪些內容點選了哪些內容,這些內容都可以為業務提供一定資料支撐。

 

   二、知乎資訊流推薦系統的技術演進

 

2016年之前,知乎的Feed流是比較簡單的,你關注了什麼樣的人,這個人產生的各種各樣的動態會在你的介面進行時間倒序的排序,和朋友圈的邏輯非常相似。2010年初我們上線了一個叫EdgeRank的排序系統,第一代Feed流演算法在這個系統支援下取得了一定收益,系統維持了一年時間。


640?wx_fmt=png


 2010年10月份知乎上線了一個基於GBDT的排序系統,對召回的內容進行一個排序。我們使用GBDT做排序持續了一年時間,引入GBDT後用戶的Feed流使用時長的變化,是呈上升的趨勢。在使用 GBDT 進行排序的過程中,我們逐步完善了我們使用者畫像和內容分析的系統,在使用者特徵和內容特徵方面做了非常多工作,把使用者的實時行為整合到GBDT裡面,使用者Feed流使用時長得到了激增。

 

2017年10月開始知乎先後在召回側和排序側引入DNN模型,在引入之後的2017年10月份到2018年7月份週期內,知乎的使用時長和閱讀量也呈現出快速增長。

 

在這之後,我們又做了一些優化工作,一個是7月份在DNN做的優化,把注意力機制和LSTM模型引入到DNN的模型裡面去,一個是嘗試強化學習在推薦系統中的應用。經過這麼長時間的優化之後知乎的資訊流系統已經在知乎整體業務中佔了非常大的體量,使用者滲透率(即有多少使用者會有效來到首頁看內容)達到88%,使用時長佔比(包括刷知乎的時長以及在知乎中消費內容的時長等)達到76%。

 

三、Feed流推薦系統中的AI應用

 

基於深度學習的推薦召回模型

 

知乎在2017年上線了基於深度學習的推薦召回1.0版本,左邊這張圖是第一版上線時候的深度學習召回網路框架,整個系統把使用者和使用者的特徵表示成了網路,它和庫裡幾萬條內容做了一個多分類,在上層進行SoftMax。整個網路訓練下來可以得到兩個成果。首先是一個 User Representation Network,它把使用者資訊表示成128維的網路,我們用了畫像裡的所有資訊,包括他的興趣標籤、各種各樣的使用者資訊,都會放到模型的輸入裡面去,這個輸入經過四層網路之後得到使用者128維的 Embedding 表示。與此同時,使用Faiss作為向量化ANN召回的Backend,用ANN召回的方式從這幾個條目裡選出他最感興趣的內容推薦給他,這是整個召回框架的工作過程。


640?wx_fmt=png


 我們在訓練集裡包含了幾萬個內容的Embedding,我們首先會在訓練中生成一批Embedding,比如今天的資料來自於過去一週內分發量比較高的資料,這些內容資料會生成Embedding,我們先通過這些召回源把這些機制分發出去,還有一批內容是新產生的、未在訓練集中包含的內容,這些內容通過其他的渠道分發出去之後,可以得到看到內容使用者的Embedding是什麼以及點選這些內容使用者的Embedding是什麼,我們可以利用這份資料把這些新產生內容的Embedding計算出來更新到Embedding庫裡面去,這個時候就可以拿到每天新產生內容的表示,並且把這些內容推薦出來。

 

後來我們又對召回框架進行了2.0升級。在1.0版本的召回框架裡,“新內容Embedding怎麼得到的”這個問題是延遲解決的。使用者的表示網路和Embedding召回在效果收益非常明顯,協同過濾使用者矩陣分解最常用的方法就是ALS,我們拿了一個關鍵的指標也就是召回從這幾萬條裡挑出的100個結果裡準確度有多少,這100個結果裡有沒有預測到使用者下次點選的資料,在這個指標上, DNN 比起ALS來講提升了10倍的量級,我們希望一個內容產生之後馬上算出Embedding放到網路裡。

 

640?wx_fmt=png

在2.0版本中,我們嘗試了三個層面的技術升級:

 

  • 使用了Content的原始特徵,一個內容上打了標籤,原始資料比如長度有多少,有沒有圖片,經過三層的網路之後會生成Feed Embedding,可以直接得到Content Embedding,解決新內容的召回機制問題。

 

  • 在使用者表示網路這一側我們也做了優化,這個網路裡就是一個最簡單的全連結神經網路,我們做優化的時候是在User Representation Network引入FM Pooling層,學習使用者高頻消費行為的交叉特徵,會讓Top100的精確度提高8%。

 

  • 使用者在Feed流裡有,“展示未點選的Skip資料”比線上“展示已點選資料”量級還要高,代表使用者對內容並不是真正感興趣。第一,我們把展示未點選的資料作為特徵引入到User Representation Network裡面,其中會用到歷史搜尋和歷史閱讀資料。第二,我們會把Skip資料作為指導取樣的一種方式,訓練大規模的標籤Embedding時我們往往把正向資料之外的其他資料都當成負向資料使用,所有負向取樣的sample都是在剩下的資料中,根據概率的方式或控制取樣頻率的方式提取。展示了但是跳過 的內容會在取樣的時候加大權重,把它成為負例的概率變得更大,讓使用者的行為來指導取樣。

 

Skip這兩個資料為Top100 ACC產生了比較好的效果,從召回資料裡來的CTR和整體的閱讀量都有比較大的提高。

 

基於深度學習的 CTR 預估模型

 

知乎還在排序側採用了CTR預估的模型。1.0版本總體結構和基於DNN的召回框架類似,使用兩層Relu而不是直接點積作為Embedding的預估網路。這個模型上線一段時間之後,我們剛開始沒有進行任何的引數裁剪的操作,收效沒有達到我們的預期。後來我們做了一個簡單的嘗試,按照業務的理解把特徵組合成不同的Field,這些Field之間先做連線,使用者先分成N個Field,比如,Field1是自己填寫的資料,Field2是使用者興趣標籤,Field3是歷史搜尋行為,先經過一個簡單的子網路再全連線到上層。這個 trick能夠有效的減少特徵在初始輸入時候的錯誤交叉,會減輕模型的過擬合,線上應用則達到了非常明顯的收益,AUC提升了1%,CTR提升了5.8%。


640?wx_fmt=png


使用了DNN之後,我們還試用了谷歌出品的Wide & Deep Network,Deep是圖上部分,效果沒有明顯的提升。隨後我們做了一個分析判斷,發現Wide & Deep Network的 wide 部分,都會在原始特徵輸入交叉方面做一個比較強的特徵工程,否則所有資訊在Deep部分已經得到比較好的應用,Wide 部分並沒有提供什麼額外的輸入,也不會拿到特別好的資料表現。


640?wx_fmt=png


今年我們開始在深度學習的CTR預估模型上嘗試更加激進更有意思的優化,也就是2.0版本。其中最早引入的優化還是特徵之間的交叉,我們引入FM層作為這些類別之間的Sparse Input之間的交叉,AUC提升了0.2%,CTR提升了1%。引入CNN及LSTM分別作為文字Encoder/Last Action Encoder,單使用者使用時長提高50秒。

 

第三個trick參考了阿里的一篇論文,我們引入Attention機制作為使用者Embedding和CandidateEmbedding之間的交叉權重。舉個例子,使用者點選的十篇文章中,有九篇是關於體育的一篇是關於網際網路的,等到下次體育相關內容的分數會比網際網路相關內容的分數高得特別離譜,平均之後網際網路資訊淹沒在體育資訊裡,但網際網路內容也是使用者喜歡的,權重卻很難發揮出來。我們引入Attention機制,把使用者的閱讀歷史跟當前候選集裡相關的資料和權重學習之後,收到了良好效果,單使用者使用時長增加了40秒左右。


640?wx_fmt=png


知乎是一個社群化的平臺,常常需要平衡很多指標的收益,預估閱讀時長、點贊、收藏、分享、創作等行為。為了解決多目標預估中訓練和預測效率問題,我們使用了CTR預估模型預訓練網路,利用Parameter Hard Sharing,點選和點贊這兩層共享之前的權重,會有一個獨立的隱藏層model task自己的目標,這樣能降低前向/反向傳播中的計算量。

 

我們常常預估到一些非離散的目標,對於非離散目標如閱讀時長,很多同行的做法是線性預估的方式預估,你閱讀了60秒,我儘量把預測的值逼近。知乎的做法是,把一篇文章的閱讀時長做一個Normalize操作。我們觀察了一下閱讀時長的分佈,這個分佈與正態分佈比較類似。所以我們使用了 z-value 來對閱讀市場進行離散化,離散化之後會把閱讀時長分為五等——沒點選、點選了閱讀時長低、點選了閱讀時長中等、點選了閱讀時長偏高、點選了閱讀時長非常高——將連續值預測轉化成離散值預測。


在訓練過程中,我們也修改了 Softmax 函式,如果預測出的檔數和實際使用者閱讀時長檔數差太多,我們加一個比較大的修改函式,讓這種樣本的 loss 加大。閱讀時長這個模型上線之後,對知乎的使用時長和單篇文章的閱讀時長都有提升。

 

四、Feed流推薦系統中遇到的實際問題

 

模型訓練問題

 

  • 樣本組織方面,大家可以看到剛才我們用了很多實時特徵,這些實時特徵對使用者和樣本來講都是不斷變化的,最初知乎組織這些樣本的時候都是使用從離線庫裡Join資料的方式做特徵的梳理,後來我們發現線上往往會出現特徵穿越的狀況,你線上下記錄的日誌畢竟不是實時的,日誌都是流失的放到資料庫裡,處理資料流的過程中也會出現順序上的錯誤,所以我們會在線上進行實施打點避免穿越。

 

對於CTR預估的正向樣本和負向樣本,後者與前者相比存在幾倍的量級差異。通常我們會對正負樣本進行不同取樣率的實驗,不同的業務指標下采樣率不一樣,最終回有一個最佳的取樣率。但取樣率多少跟資料的分佈和業務需要預估的指標特性相關,1比1不一定是最好的取樣比例。

 

  • 特徵工程方面,我們在實際應用場景裡發現對於分佈範圍比較大的特徵,有一萬個贊也有幾萬個讚的,做CTR預估的過程中贊量的影響會變得非常不平均,所以通常會進行特徵的歸一化和boxing,分成不同的段輸入到CTR預估模型裡達到比較好的效果。

 

  • 模型評估方面,AUC是基礎指標,我們發現AUC是一個特別基礎的指標,對於兩份離線檔案之間的評估確實有比較大的意義,尤其AUC在現在狀態下大家都訓練到0.7或0.8的水平,上線之後各種資料指標並不一定能提升那麼多,我們做了一個DCG Gain收益的指標,它具有更高的參考意義。

 

業務問題

 

  • 多樣性問題如何解決?大家都知道Feed流裡很多時候最精準不一定是使用者最想要的,重複太多對於各種線上業務資料的改進也不一定是正向的結果,我們會引入各種框架進行業務導向的調權、打散、隔離和禁閉,一個內容出現幾次之後你沒有點選,之後都不會推薦相似的內容。

 

  • 如何避免「資訊繭房」的產生?以各種行為表現預估的方式去排序和推薦的推薦系統,最後會讓使用者傳遞一個資訊繭房,推薦列表裡翻來覆去就是這麼幾個內容。我們的解決方案是,採用一個Explore & Exploit機制,針對老使用者及興趣比較均勻的使用者,適當減少興趣探測手段,在探測過程中也會盡量使用Tag之間的關聯資訊增強探測效率。


-【完】-


精彩推薦

BDTC 2018


2018 中國大資料技術大會將於 12 月 6 - 8 日在新雲南皇冠假日酒店舉行。匯聚超百位國內外實力講師從學界翹楚到行業一線大拿:

管曉巨集:中國科學院院士;

張巨集江:原始碼資本投資合夥人;

張曉東:美國俄亥俄州立大學 Robert M. Critchfield 講席教授;

陳性元:北京資訊科學技術研究院副院長;

周靖人:阿里巴巴集團副總裁;

李浩源:Alluxio 公司創始人&CEO

......

全方位立體解讀大資料時代的技術程序,為眾技術愛好者奉上一場優質乾貨盛宴。


640?wx_fmt=jpeg


推薦閱讀

公開課報名 | 詳解CNN-pFSMN模型以及在語音識別中的應用

乾貨(附原始碼) | 爬取一萬條b站評論,分析9.7分的新番憑啥這麼火?

程式設計師如何 Get 分散式鎖的正確姿勢?

讓你崩潰無語的程式命名有哪些?

2年2億美金,澳本聰耗得起BCH內戰又怎樣?

剛寫完排序演算法,就被開除了…

勝過iPhone XS?Google Pixel的“夜視功能”是怎樣煉成的