推薦系統(tǒng)老司機(jī)的十條經(jīng)驗(yàn)
推薦Quora的工程副總裁Xavier Amatriain在ACM recsys2016上的分享,主要分享了作為推薦系統(tǒng)老司機(jī)的他,多年開(kāi)車(chē)后總結(jié)的禁忌和最佳實(shí)踐,這樣的采坑實(shí)錄顯然是很有價(jià)值的。值得一讀。
一年一度的ACM Recsys會(huì)議在9月份已經(jīng)勝利閉幕,留下一堆slides和tutorials等著我們?nèi)W(xué)習(xí)。
翻看今年的各種分享,其中老司機(jī)Xavier Amatriain(曾任Netflix的算法總監(jiān),現(xiàn)任Quora的工程副總裁)的分享引起了我的興趣:Lessons Learned from Building Real--Life Recommender Systems。主要分享了作為推薦系統(tǒng)老司機(jī)的他,多年開(kāi)車(chē)后總結(jié)的禁忌和最佳實(shí)踐,這樣的采坑實(shí)錄顯然是很有價(jià)值的。
Xavier Amatriain在recsys上的分享,是他在推薦系統(tǒng)領(lǐng)域的十條實(shí)踐經(jīng)驗(yàn)(這位老司機(jī)同樣的題目在不同渠道多次分享過(guò),一共有三個(gè)版本,加起來(lái)去重后不止十條,同學(xué)們賺到了),本文只針對(duì)他在Recsys2016上的分享一一解讀。
一、隱式反饋比顯式反饋要爽
所謂隱式反饋,就是用戶發(fā)出這些行為時(shí)并不是為了表達(dá)興趣/態(tài)度,只是在正常使用產(chǎn)品而已,反之,顯式反饋就是用戶在做這個(gè)操作時(shí)就是要表達(dá)自己的態(tài)度,如評(píng)分,投贊成/反對(duì)票。
Xavier Amatriain列舉了隱式反饋的以下好處:
- 數(shù)據(jù)比顯式反饋更加稠密。誠(chéng)然,評(píng)分?jǐn)?shù)據(jù)總體來(lái)說(shuō)是很稀疏的,之前netflix的百萬(wàn)美元挑戰(zhàn)賽給出的數(shù)據(jù)稀疏度大概是1.2%,畢竟評(píng)分?jǐn)?shù)據(jù)是要消耗更多注意力的數(shù)據(jù)。
- 隱式反饋更代表用戶的真實(shí)想法,比如你不是很贊成川普的觀點(diǎn),但是還是想經(jīng)??吹剿膬?nèi)容(以便吐槽他),這是顯式反饋無(wú)法捕捉的。而人們?cè)赒uora上投出一些贊成票也許只是為了鼓勵(lì)一下作者,或者表達(dá)一些作者的同情,甚至只是因?yàn)檎握_而投,實(shí)際上對(duì)內(nèi)容很難說(shuō)真正感興趣。
- 隱式反饋常常和模型的目標(biāo)函數(shù)關(guān)聯(lián)更密切,也因此通常更容易在AB測(cè)試中和測(cè)試指標(biāo)掛鉤。這個(gè)好理解,比如CTR預(yù)估當(dāng)然關(guān)注的是點(diǎn)擊這個(gè)隱式反饋。
舉個(gè)例子,IMDB的電影排名,對(duì)比一下用票房排名和用評(píng)分排名,票房其實(shí)是一種隱式反饋的量化,表示“看過(guò)”,而評(píng)分則是顯式反饋。
一些小眾電影的評(píng)分比較少,在依靠評(píng)分排名時(shí)不太占優(yōu)勢(shì),而依靠隱式反饋排名則會(huì)有所緩解。
雖然有諸多好處,但隱式反饋有個(gè)比較大的問(wèn)題就是:短視。
現(xiàn)在有很多手段來(lái)吸引用戶點(diǎn)擊,比如高亮的標(biāo)題,還有一些“三俗”的圖片,都會(huì)吸引用戶點(diǎn)擊,這種利用了人性弱點(diǎn)的隱式反饋,對(duì)平臺(tái)的長(zhǎng)期價(jià)值是有損的,所以也不能一味使用隱式反饋,而是需要隱式反饋和顯式反饋結(jié)合使用,兼顧短期利益和長(zhǎng)期價(jià)值。
二、深刻理解數(shù)據(jù)
Xavier Amatriain舉了個(gè)例子,訓(xùn)練一個(gè)分類(lèi)器,用來(lái)自動(dòng)識(shí)別優(yōu)質(zhì)答案或劣質(zhì)答案。這個(gè)問(wèn)題似乎很簡(jiǎn)單,實(shí)際上你要思考,下面這些答案是好的還是不好的:
- 抖機(jī)靈的答案;
- 某個(gè)領(lǐng)域的網(wǎng)紅給了個(gè)很短的答案;
- 很長(zhǎng)、很有料的答案,但是沒(méi)有人點(diǎn)贊;
- 內(nèi)容有料,但是錯(cuò)別字多。
這些都是需要我們?nèi)ド钊霕I(yè)務(wù)理解,到底什么樣的數(shù)據(jù)才是我們要找的。
三、為模型定義好學(xué)習(xí)任務(wù)
一個(gè)機(jī)器學(xué)習(xí)模型有三個(gè)因素構(gòu)成:
- 訓(xùn)練數(shù)據(jù)(隱式反饋或者顯式反饋)
- 目標(biāo)函數(shù)(比如用戶閱讀一篇回答的概率)
- 衡量指標(biāo)(比如準(zhǔn)確率或者召回率)
假如現(xiàn)在有這么一個(gè)問(wèn)題:用用戶的購(gòu)物歷史以及歷史評(píng)分,去優(yōu)化用戶走進(jìn)電影院看完一部電影并且給出高分的概率,NDCG作為模型的評(píng)價(jià)指標(biāo),4分以上作為正樣本。
這樣就比較清晰的定義了學(xué)習(xí)任務(wù)的三元素:
- 訓(xùn)練數(shù)據(jù):用戶購(gòu)物歷史和歷史評(píng)分
- 目標(biāo)函數(shù):用戶走進(jìn)電影院看完電影且給出高分的概率
- 衡量指標(biāo):NDCG
如果定義評(píng)價(jià)指標(biāo)時(shí)模糊不清,如不說(shuō)明是4分以上的作為正樣本的話,就失去了顯式反饋的信息,失去了對(duì)平臺(tái)長(zhǎng)期利益的關(guān)注。
還有個(gè)例子,Quora的興趣feed排序。
Quora的首頁(yè)是結(jié)合了多個(gè)用戶隱式反饋的排序模型,給每一種用戶行為建立一個(gè)預(yù)測(cè)模型,預(yù)測(cè)它發(fā)生的概率,結(jié)合每一種行為帶來(lái)的長(zhǎng)期價(jià)值大小,然后加權(quán),即期望價(jià)值。這個(gè)例子里面的三元素也可定義清楚:
- 訓(xùn)練數(shù)據(jù):用戶的顯式反饋和隱式反饋
- 目標(biāo)函數(shù):一個(gè)story的展示價(jià)值,量化定義為用戶行為的期望價(jià)值
- 衡量指標(biāo):任何排序模型指標(biāo)都可以
四、推薦可解釋比精準(zhǔn)更有意義
這里其實(shí)就是說(shuō)推薦要展示出理由給用戶,讓用戶知道每一項(xiàng)推薦的項(xiàng)目是怎么得到的。
比如Quora的feed推薦給出的“被你關(guān)注的人投票”的理由:
比如Quora給出的推薦話題給出的“被你關(guān)注的人關(guān)注”的理由:
比如Netflix給出的“因?yàn)榭催^(guò)給出好評(píng)的電影而推薦”的理由:
五、矩陣分解大法好
Xavier Amatriain很推崇Matrix Factorization,因?yàn)樗扔斜O(jiān)督學(xué)習(xí),又有無(wú)監(jiān)督學(xué)習(xí)。
兩種學(xué)習(xí)方法就這樣結(jié)合在一個(gè)算法里:
- 它可以用來(lái)降維,這部分通常是PCA這樣的無(wú)監(jiān)督學(xué)習(xí)算法承擔(dān)的,矩陣分解得到的隱因子就是降維后的特征,可以直接作為其他學(xué)習(xí)算法的輸入;
- 它還可以做聚類(lèi),比如Non-negative Matrix Factorization就常常用來(lái)做聚類(lèi);
- SVD就是一種回歸,標(biāo)準(zhǔn)的監(jiān)督學(xué)習(xí)。
矩陣分解還有一些變種:
- ALS(交替最小二乘)
- SVD++(結(jié)合特征的SVD)
- FM(因子機(jī))
- TF(張量分解)
總之,在推薦系統(tǒng)里,使勁壓榨矩陣分解的效果。
六、萬(wàn)能的集成方法
Netflix的冠軍模型,那可是100多種算法集成在一起的,真是應(yīng)了那句話:
比你效果好的模型還比你更努力。
實(shí)際上任何推薦系統(tǒng)也不可能是單一算法在起作用,而是多種算法集成在一起。集成方法理論上不會(huì)比你其中那個(gè)最好的算法差。在推薦系統(tǒng)中,你至少可以集成基于內(nèi)容推薦和協(xié)同過(guò)濾兩種。
本質(zhì)上,集成算法是把某個(gè)模型的輸出變成另一個(gè)模型的特征。如果你很難決策到底用哪個(gè)算法時(shí),千萬(wàn)不要糾結(jié),所有的都用,然后集成之。
集成還有一個(gè)好處就是:某個(gè)推薦算法可能更適合某個(gè)場(chǎng)景下,這樣被集成的算法就可以各自handle各自擅長(zhǎng)的場(chǎng)景,最后集大成。
具體集成方法可選的很多,如logistic regression,GBDT,Random Forest,ANN。
七、推薦系統(tǒng)也不能免俗之特征工程
談機(jī)器學(xué)習(xí)必談特征工程,雖然深度學(xué)習(xí)的大火讓某些領(lǐng)域的機(jī)器學(xué)習(xí)應(yīng)用更加端到端了,但是推薦系統(tǒng)這個(gè)王國(guó)里面,特征工程還是要談一談。
好的特征有以下特點(diǎn):
- 可復(fù)用??蓮?fù)用就是說(shuō)不止一個(gè)模型可以用,換個(gè)模型一樣用。
- 可轉(zhuǎn)換。特征是既可以直接使用,也可以進(jìn)行一些尺度轉(zhuǎn)換的,比如對(duì)數(shù)轉(zhuǎn)換等。
- 可解釋。特征的物理意義需要很清楚。
- 可靠。特征出現(xiàn)異常的話需要能及時(shí)監(jiān)控到,也要容易調(diào)試。
Xavier以Quora的答案排序?yàn)槔?,舉了一些他們現(xiàn)在用到的特征算是好特征:
- 一個(gè)是答案本身的特征,如回答的質(zhì)量;
- 第二個(gè)是互動(dòng)類(lèi)型的特征,如投票,評(píng)論;還有用戶特征,如他在某個(gè)話題下的專(zhuān)業(yè)程度。
深度學(xué)習(xí)給了另一種全新的特征工程之路,也是值得探索的,或許是人工特征工程的終結(jié)者,拭目以待。
八、對(duì)你的推薦系統(tǒng)要了如指掌
推薦系統(tǒng)里面,模型對(duì)于很多人來(lái)說(shuō)都是黑盒子,甚至對(duì)于算法工程師自己來(lái)說(shuō)也是黑盒子,并不太清楚某個(gè)東西為什么被推出來(lái),某個(gè)東西為什么用戶沒(méi)買(mǎi)帳或者買(mǎi)帳。
通常產(chǎn)品經(jīng)理對(duì)推薦系統(tǒng)都有一定的預(yù)期,推薦的東西不能讓他們理解,解釋起來(lái)也比較麻煩,也是通常算法工程師和PM產(chǎn)生爭(zhēng)端的原因所在。對(duì)于黑盒一般的模型,我們要能夠做到可以回答任何人的任何問(wèn)題。模型應(yīng)該做到“可調(diào)試”(debuggability)。
舉個(gè)例子,一個(gè)決策樹(shù)算法,從根節(jié)點(diǎn)開(kāi)始,一步一步經(jīng)過(guò)了哪些決策節(jié)點(diǎn)得到了最終的預(yù)測(cè)結(jié)果呢?如果有工具可以直觀展現(xiàn)出來(lái),我們就能知道哪些特征起了更重要的作用,是不是合理的?
Xavier 提到在Quora內(nèi)部就有個(gè)工具,可以看到某個(gè)人的首頁(yè)feed的每一個(gè)內(nèi)容的分?jǐn)?shù),以及每個(gè)分?jǐn)?shù)計(jì)算所依賴(lài)的特征,這樣就很清楚知道為什么你“看到/沒(méi)看到”某個(gè)人的回答或問(wèn)題。
九、數(shù)據(jù)和模型是重要,但正確的演進(jìn)路徑更不容忽視
老司機(jī)說(shuō),這條經(jīng)驗(yàn)他很看重。這條經(jīng)驗(yàn)告訴我們,一個(gè)推薦系統(tǒng)的產(chǎn)品功能如何一步一步從0到上線的。
通常,正確的演進(jìn)路徑是這樣:
- 首先提出一個(gè)假設(shè),可以通俗的說(shuō)是對(duì)問(wèn)題的一個(gè)猜想;
- 針對(duì)這個(gè)假設(shè),我們要選擇用什么模型;
- 模型選定后訓(xùn)練模型,離線測(cè)試,如果驗(yàn)證通過(guò)就要上AB測(cè)試,否則要么換個(gè)模型,要么重新審視一下你的假設(shè)是不是站得住腳;
- 上AB測(cè)試,測(cè)試結(jié)果明顯提升的話就上線,否則滾回去再看看最開(kāi)始你那個(gè)假設(shè)是不是靠譜。
這個(gè)過(guò)程有幾個(gè)地方比較難:
第一個(gè)就是離線模型評(píng)價(jià)指標(biāo)的選擇,不同的指標(biāo)可能包含不同的意義。例如同樣是Learn to rank的排序評(píng)價(jià),MRR和NDCG這兩個(gè)指標(biāo)對(duì)于排序靠前的項(xiàng)目權(quán)重就會(huì)更大,而FCP(Fraction of Concordant Pairs)就更看重排序靠中間的項(xiàng)目。所以選擇什么指標(biāo)要仔細(xì)思考,離線評(píng)價(jià)表現(xiàn)好才有機(jī)會(huì)有必要上AB測(cè)試。
第二個(gè)就是離線評(píng)價(jià)(通常是技術(shù)性或者學(xué)術(shù)性的,比如準(zhǔn)確率)和在線產(chǎn)品指標(biāo)(通常是商業(yè)性的,比如留存率)之間通常是存在鴻溝的。模型的離線評(píng)價(jià)效果可能很好,但是在線去測(cè)試,產(chǎn)品指標(biāo)可能表現(xiàn)不好,可以離線的時(shí)候換一個(gè)與直接產(chǎn)品指標(biāo)更相關(guān)的評(píng)價(jià)指標(biāo)。
第三個(gè)就是AB測(cè)試的時(shí)候一定注意要有一個(gè)總體評(píng)價(jià)指標(biāo)(?Overall Evaluation Criteria),很多人(通常是產(chǎn)品經(jīng)理)會(huì)同時(shí)關(guān)注一個(gè)AB測(cè)試的很多指標(biāo),點(diǎn)擊率上去了,多樣性又下去了,這種測(cè)試結(jié)果你很難說(shuō)是該上線還是該下線,所以說(shuō)需要一個(gè)?Overall Evaluation Criteria,如果你有多個(gè)目標(biāo),就想法把多個(gè)目標(biāo)整合成一個(gè)數(shù)值指標(biāo),這樣才能夠最終決定AB測(cè)試是成功還是失敗。 Overall Evaluation Criteria通常是更接近商業(yè)目標(biāo)和平臺(tái)長(zhǎng)期價(jià)值的數(shù)值,要定義出來(lái)需要深度的思考。
最后提一下,AB測(cè)試并不是唯一確定新算法是否上線的方式,還有一種方法是bandit算法,見(jiàn)專(zhuān)治選擇困難癥——bandit算法。
十、別一言不合就要上分布式
Hadoop,spark,mapreduce,這些名詞背后有一個(gè)共同的概念:分布式。
現(xiàn)在,所謂的大數(shù)據(jù)項(xiàng)目也是言必稱(chēng)分布式,那么是不是都需要分布式呢?尤其是模型部分?老司機(jī)Xavier認(rèn)為,大多數(shù)推薦算法不需要分布式,畢竟我們的推薦系統(tǒng)中很少會(huì)有訓(xùn)練計(jì)算機(jī)從海量視頻中識(shí)別什么是貓這樣的算法。
Xavier說(shuō),很多算法其實(shí)都是可以在單機(jī)上完成的(多核的單機(jī)),那為什么大家又很少這樣做呢?
究其原因有幾個(gè):
- 分布式平臺(tái)的確降低了處理大數(shù)據(jù)的門(mén)檻,稍微寫(xiě)點(diǎn)膠水代碼就可以操作成T上P的數(shù)據(jù),工程師們不用懂太多分布式本身的知識(shí);
- 一些在單機(jī)上并行處理數(shù)據(jù)的方法不為人知,比如像C++中的openmp這樣的庫(kù),很多人并不知道,它可以充分發(fā)揮多核機(jī)器的作用。還有Linux本身有很多并行化的命令,比如grep,wc等;
- 掌握的數(shù)據(jù)采樣方法不夠不精。對(duì)全量數(shù)據(jù)采樣,以使之在單機(jī)上能夠計(jì)算且不明顯損失信息,這是一門(mén)精致的手藝,很多人并不掌握。
Xavier說(shuō)在Quora,曾經(jīng)用Spark實(shí)現(xiàn)了一個(gè)計(jì)算任務(wù),需要15臺(tái)機(jī)器跑6小時(shí)才能跑完,而某個(gè)工程師花了四天時(shí)間研究spark慢在哪,然后用C++寫(xiě)了一個(gè)單機(jī)版,只用10分鐘就跑完整個(gè)任務(wù)。說(shuō)到這里,我也同樣的經(jīng)驗(yàn),曾經(jīng)用Spark跑協(xié)同過(guò)濾,四個(gè)小時(shí)沒(méi)有跑完,組內(nèi)的董瑋博士用C++寫(xiě)了一個(gè)單機(jī)版,用openmp庫(kù)把所有的核都用上,30分鐘就計(jì)算完了。
說(shuō)到這里,常見(jiàn)的推薦算法有很多分布式的庫(kù),比如Spark中就有MLib庫(kù),但是也可以試試一些著名的單機(jī)版,如GraphChi。
十一、要做就做能賺錢(qián)的推薦系統(tǒng)【推廣】
不得不承認(rèn),我們遇到的推薦系統(tǒng)都是這樣的:
- 推薦新聞,閱讀了就是推薦成功;
- 推薦音樂(lè),加紅心或者聽(tīng)完了就是推薦成功;
- 推薦商品,點(diǎn)擊了就是推薦成功;
- 推薦好友,加關(guān)注了就是推薦成功;
- 推薦視頻,觀看了就是推薦成功;
……
到底這些推薦系統(tǒng)產(chǎn)生了多大的商業(yè)價(jià)值,我們都無(wú)法確切知道,作為從業(yè)者的我們也無(wú)法確切知道自己工作的價(jià)值是多大。
看到這里,你是不是有點(diǎn)沮喪?
難道沒(méi)有可以直接衡量推薦系統(tǒng)商業(yè)價(jià)值的產(chǎn)品嗎?
當(dāng)然有!
工程師們發(fā)送簡(jiǎn)歷給kaijiang@tiannongtech.com了解更多詳情,你懂的。
參考資料
[1] http://www.slideshare.net/xamat/recsys-2016-tutorial-lessons-learned-from-building-reallife-recommender-systems
[2] http://www.slideshare.net/xamat/strata-2016-lessons-learned-from-building-reallife-machine-learning-systems
[3] https://chatbotnewsdaily.com/10-more-lessons-learned-from-building-real-life-ml-systems-part-i-b309cafc7b5e#.vmuuaznyk
[4] https://medium.com/@xamat/10-more-lessons-learned-from-building-real-life-machine-learning-systems-part-ii-93fe7008fa9#.e4p4bl23f
[5] https://www.youtube.com/watch?v=88tzDSOzVUQ
作者:陳開(kāi)江@刑無(wú)刀,多年個(gè)性化推薦從業(yè)經(jīng)驗(yàn),歡迎加他個(gè)人微信交流:kaijiang_chen,加我時(shí)請(qǐng)自我介紹。
本文由 @刑無(wú)刀 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
- 目前還沒(méi)評(píng)論,等你發(fā)揮!