既要宽广,又要深邃,这也行
推薦系統的框架大都是這個模式:多種召回策略,一種融合排序策略。召回策略姿勢繁多,此處按下不表,單說最終的融合排序,最常見的就是CTR預估。這里說的CTR預估的C,可以是廣義上的點擊,包括我們視為關鍵動作的任何用戶行為,如收藏、購買等。
CTR預估的常見做法就是廣義線性模型,如Logistic Regression,外加特征海洋戰術,這樣做好處多多:
- 線性模型簡單,其訓練和預測計算復雜度都相對低;
- 工程師的精力可以集中在發掘新的有效特征上,俗稱特征工程;
- 工程師們可以并行化工作,各自挖掘特征;
- 線性模型的可解釋性相對非線性模型要好。
特征海洋戰術讓線性模型表現為一個很寬廣(Wide)的模型。線性的寬模型要產生非線性效果,主要靠特征組合,尤其是二階交叉,但如果交叉后的特征沒有覆蓋樣本,那么交叉就然并卵。
近年來,深度學習異軍突起,摧城拔寨,戰火自然也燒到了推薦系統領域了,用深度神經網絡來革“線性模型+特征工程”的命也再自然不過。用這種“精深模型”升級以前的“廣博模型”,尤其是深度學習“端到端”的誘惑,讓算法工程師們紛紛主動投懷送抱[1]。
深度學習在推薦領域的應用,其最大好處就是“洞悉本質般的精深”:優秀的泛化性能,可以給推薦很多驚喜。當然對應的問題就是容易過度泛化,會推薦得看上去像是“找不著北”,就是你們的PM和老板常問的那句話:“不知道怎么推出來的”,可解釋性差一點。
既然深度模型有這么大的好處,廣度模型也有諸多好處,根據人類的貪婪屬性,下一秒就有人問“能都要嗎?”,這時候Google站出來冷冷地說:當然。
Google公司去年提出一個新的推薦系統框架級別的解決方案,結合了傳統的線性模型和當前火熱的深度模型,應用在GooglePlay上的APP推薦,推薦效果提高非常明顯[2]。
下面就為大家介紹一下這個方案的關鍵要素。
整體框架
一個典型的推薦系統架構很類似一個搜索引擎。也是由檢索(或稱召回)和排序兩部構成(圖1),這在我們前面的搜索、推薦、廣告三者架構能統一嗎已經討論過[3]。不過推薦系統的檢索過程并不一定有顯式的query,而通常是用戶特征和場景特征。
推薦系統的“query”,最重要的當然就是用戶特征,哪些可以做用戶特征?并不只是標簽和注冊資料,可以說“六經注我”,凡是可以“注我”的皆為特征:顯式的有標簽,注冊資料,喜歡過的物品,消費過的物品,在一些維度上的統計值,隱式的有一些話題模型,embedding(如word2vec)等等,并不只是人類可讀的那些維度(PS:用戶標簽被一些擅長忽悠的公司和大眾媒體換了個迷惑人的詞語,叫做“用戶畫像”,通常還煞有介事的畫成一個“人形”,真擔心被有關部門解讀為“標簽成精”)
本文是關于廣度和深度模型的結合,解決的是架構中的“學習”“模型”“排序”這三個地方的問題,所以上面這一段可以不讀,當然現在說有點晚了(逃)。
深寬的模型
現在來看看今天的主角:我們把它叫做“深寬模型”(Wide & Deep Model)。
首先,線性模型部分,也就是“寬模型”(圖2左邊),形式如下:
其中:
X是特征向量,W是模型參數向量,這個b是線性模型固有的偏見,哦不,偏置。線性模型中常用的特征構造手段就是特征交叉。例如:性別=女 and 語言=英語。就是由兩個特征組合交叉而成,只有當“性別=女”取值為1,并且“語言=英語”也取值為1時,這個交叉特征才會取值為1。線性模型的輸出這里采用的Logistic Regression。
然后,看看深度模型(圖2右邊)。深度模型其實就是一個前饋神經網絡(Feedforward Neural Network)。深度模型對原始的高維稀疏類別型特征,先進行embedding,轉換為稠密、低維的實值型向量,轉換后的向量維度通常在10-100這個范圍。至于怎么embedding,就是隨機初始化embedding向量,然后直接扔到整個前饋網絡中,用目標函數來優化。
前饋網絡中每一個隱藏層激活方式如下:
其中l表示第l個隱藏層,f是激活函數,通常選用ReLU(整流線性單元),為什么選用ReLU而不是LR,這個原因主要是LR在誤差反向傳播時梯度容易飽和(著急上車,來不及解釋了,具體請參考任何一本深度學習教材)。ReLU及其他常用激活函數的形狀見圖3:
最后,看看兩者的融合,示意圖見圖2的中間部分。深模型和寬模型,由一個logistic regression模型作為最終輸出單元。訓練方法采用Joint Learning,這是什么?就是通常說的端到端(end-to-end),把深模型和寬模型以及最終融合的權重放在一個訓練流程中,直接對目標函數負責,不存在分階段訓練。它與ensemble方法有區別,ensemble是集成學習,子模型是獨立訓練的,只在融合階段才會學習權重。
為了對比試驗,Google分別用JointLearning訓練“深寬模型”(Wide&Deep),FTRL+L1訓練“寬模型”(LR)[4],AdaGrad訓練“深模型”(Feedforward Neural Network)。
融合結果以LR模型作為輸出:
Y是我們要預估的行為,二值變量,如購買,或點擊,Google原文是預估是否安裝APP。σ是sigmoid函數,W_wide^T是寬模型的權重,Φ(X)是寬模型的組合特征,W_deep^T是應用在深模型輸出上的權重,a^((l_f ) )是深模型的最后一層輸出,b是線性模型的偏見,哦不,偏置。
整個深模型和寬模型的融合在圖3的中間部分很好的展示了。
系統實現
整個數據流如圖4所示。
整個流程分為三大塊:數據生成,模型訓練,模型應用。
數據生成
數據生成有幾個要點:
- 每一條曝光日志就生成一條樣本,標簽就是1/0,安裝了APP就是1,否則就是0。
- 將字符串形式的特征映射為ID,需要用一個閾值過濾掉那些出現樣本較少的特征。
- 對連續值做歸一化,歸一化的方法是:對累積分布函數P(X<=x)劃分nq個分位,落入第i個分位的特征都歸一化為?
模型訓練
整個模型的示意如圖5所示。其要點,在深度模型側:
- 每個類別特征embedding成一個32維向量;
- 將所有類別特征的embedding變量連成一個1200維度左右的大向量;
- 1200維度向量就送進三層以ReLU作為激活函數的隱藏層;
- 最終從Logistic Regreesion輸出。
寬模型側就是傳統的做法:特征交叉組合。
當新的樣本集合到來時,先是用上一次的模型來初始化模型參數,然后在此基礎上進行訓練。
新模型上線前,會先跑一遍,看看會不會出事,算是一個冒煙測試。
列位看官,是不是覺得說起來容易,動手難?沒關系,Google已經開源這一套算法了,集成在TensorFlow中[5]。
模型應用
模型驗證后,就發布到模型服務器。模型服務,每次網絡請求輸入的是來自召回模塊的APP候選列表以及用戶特征,再對輸入的每個APP進行評分。評分就是用我們的“深寬模型”進行前饋計算,再按照計算的CTR從高到低排序。
為了讓每次請求響應時間在10ms量級,每次并不是串行地對每個候選APP計算,而是多線程并行,將候選APP分成若干并行批量計算。
正因為有這些小的優化點,GooglePlay的APP推薦服務,在峰值時每秒計算千萬級的APP。
要點總結
整個模型在線上效果還是不錯的(GooglePlay的APP推薦效果,以用戶安裝為目標)。
線上效果直接相對于對照組(純線性模型+人工特征)有3.9%的提升,但是線下的AUC值提高并不明顯,反過來說,AUC值是不是最佳的線下評估方式,也是值得我們思考的,畢竟我們的模型還是要看線上的最終效果。
Google將傳統的“寬模型”和新的“深模型”結合,是一種工程上的創新。這里簡單畫一下全文重點:
- 深寬模型是一個結合了傳統線性模型和深度模型的工程創新;
- 這個模型適合高維稀疏特征的推薦場景,稀疏特征的可解釋性加上深度模型的泛化性能,雙劍合璧;
- Google已經將其開源在TensorFlow中,感興趣的可自行取用;
- 已經在GooglePlay的APP推薦中得到了成功應用。
其中有若干經驗可以供我們在實踐中參考:
- 采用Joint Learning訓練融合模型,深度學習End-to-End的優點要持續發揮。
- 為了提高模型的訓練效率,每一次并不從頭開始訓練,而是用上一次模型參數來初始化當前模型的參數。
- 將類別型特征都先做embedding再送入深度模型中。
- 為了提高服務的響應效率,對每次請求要計算的多個候選APP采用并行評分計算的方式,大大降低響應時間。
嗯,Wide&Deep Model就是這樣一個既博學又精深的Model,意不意外,驚不驚喜?所以,算法工程師們,可以考慮在自己的個性化推薦產品中試試這個Model,別老盯著維秘Model。
參考文獻?
[1] “人工特征工程+線性模型”的盡頭?
http://weibo.com/1953709481/zp2pcihSN?type=comment#_rnd1499686397997?
[2] wide & deep learning for recommender systems?
https://arxiv.org/abs/1606.07792?
[3] 搜索、推薦和廣告架構能統一嗎?https://zhuanlan.zhihu.com/p/22560037?
[4] Ad Click Prediction: a View from the Trenches?
https://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf?
[5] TensorFlow Wide & Deep Learning Tutorial?
https://www.tensorflow.org/tutorials/wide_and_deep
作者簡介:陳開江@刑無刀,希為科技CTO,曾任新浪微博資深算法工程師,考拉FM算法主管,個性化導購App《Wave》和《邊逛邊聊》聯合創始人,多年推薦系統從業經歷,在算法、架構、產品方面均有豐富的實踐經驗。
總結
以上是生活随笔為你收集整理的既要宽广,又要深邃,这也行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴执行副总裁熊辉回母校谈目标:相信总有
- 下一篇: 阿里王坚:机器比人做得好的事,那这件事就