关于推荐的一个算法工程师访谈,有一些内容值得看看
http://www.csdn.net/article/2015-09-30/2825828
?
基于Spark GraphX,棄GBDT和LR用FM
發(fā)表于2015-09-30 09:53|?9644次閱讀| 來(lái)源CSDN|?7?條評(píng)論| 作者楊鵬 摘要:9月29日20:30-21:30,算法工程師楊鵬在CSDN人工智能用戶群分享了“世紀(jì)佳緣推薦和機(jī)器學(xué)習(xí)算法實(shí)踐”。他主要介紹了基于圖算法產(chǎn)生候選集、排序算法的選擇,以及建模過(guò)程中的一些經(jīng)驗(yàn)心得。 以下為楊鵬分享實(shí)錄:
大家好,我叫楊鵬,主要關(guān)注于推薦和機(jī)器學(xué)習(xí)方面。我今天分享一下世紀(jì)佳緣在推薦方面的嘗試和心得。
世紀(jì)佳緣推薦場(chǎng)景
先說(shuō)一下我們的推薦場(chǎng)景。我們使用推薦的場(chǎng)景跟電影、商品推薦有很大的不同,商品的推薦可能只考慮到轉(zhuǎn)化就可以了,我們要考慮推薦鏈的更長(zhǎng)一些。
我們的情況:用戶登錄網(wǎng)站,算法推薦出用戶可能感興趣的人,用戶發(fā)信,收信用戶看信。最大的不同點(diǎn)在于,我們的item也是人,設(shè)計(jì)算法時(shí)也要考慮item的感受。
拿亞馬遜來(lái)類(lèi)比,亞馬遜可能只需要考慮把一本書(shū)推薦給某個(gè)人,我們還要考慮這本書(shū)是不是想被推薦給這個(gè)人。舉一個(gè)極端的例子,如果我們只是想提高男性用戶發(fā)信,我們只需要給所有人推薦美女,這樣發(fā)信量一定會(huì)暴漲。但是這樣做會(huì)引發(fā)很多問(wèn)題:1)美女一天不可能讀上千封信;2)美女對(duì)于一些條件不好的男性根本沒(méi)興趣;3)非美女收不到信。
所以無(wú)論是在產(chǎn)生候選,還是在排序的時(shí)候,我們都要同時(shí)考慮user和item。
以上是我們?cè)谕扑]場(chǎng)景上比較特殊的地方。
基于圖算法產(chǎn)生候選集
下面我主要說(shuō)兩個(gè)主題,先說(shuō)我們?nèi)绾萎a(chǎn)生推薦。今天主要說(shuō)一下基于圖的算法,我們的圖算法是在Spark上實(shí)現(xiàn)的,使用用戶歷史發(fā)信數(shù)據(jù),計(jì)算得到用戶的推薦列表。(世紀(jì)佳緣對(duì)Spark的理解,可以參考這個(gè)文檔:世紀(jì)佳緣吳金龍:Spark介紹——編輯注)
我們的數(shù)據(jù)很稀疏,在圖算法中,對(duì)于數(shù)據(jù)比較多的用戶使用一跳節(jié)點(diǎn),對(duì)于數(shù)據(jù)少的用戶使用二跳甚至三跳節(jié)點(diǎn)的數(shù)據(jù),這樣可以避開(kāi)CF中計(jì)算相似度的問(wèn)題,對(duì)數(shù)據(jù)少的用戶也能產(chǎn)生足夠多的推薦。
當(dāng)時(shí)遇到的主要問(wèn)題是數(shù)據(jù):一是數(shù)據(jù)太大,二是數(shù)據(jù)質(zhì)量不高。
對(duì)那些出度(發(fā)信)和入度(收信)很多的點(diǎn)都要想辦法進(jìn)行抽樣,否則會(huì)在計(jì)算時(shí)會(huì)耗盡內(nèi)存。抽樣時(shí)也盡量提高數(shù)據(jù)質(zhì)量。
對(duì)于收信很多的用戶,抽樣方法很簡(jiǎn)單,留下用戶看了的信,去掉沒(méi)看過(guò)的。對(duì)于發(fā)信的抽樣,當(dāng)然也可以只留下被看過(guò)的信,但是種方法有一點(diǎn)講不通,因?yàn)榭床豢葱攀钦驹趇tem的角度考慮的,對(duì)發(fā)信抽樣,應(yīng)該站在user的角度。
我們嘗試了直接扔掉發(fā)信過(guò)多的用戶,隨機(jī)抽樣,保留最近數(shù)據(jù)幾種方法。但是這樣的方法都是很盲目的。對(duì)于發(fā)信而言,最主要的度量應(yīng)該是:發(fā)信那一刻,用戶是不是認(rèn)真的。如果用戶發(fā)信是很隨意的,沒(méi)有經(jīng)過(guò)篩選,那這個(gè)數(shù)據(jù)其實(shí)沒(méi)有多大意義。
解決這個(gè)問(wèn)題當(dāng)然也可以做個(gè)模型,但是太復(fù)雜了,我們使用了一種簡(jiǎn)單的方法:根據(jù)用戶的發(fā)信間隔判斷,比如這封信與上一封信時(shí)間間隔10s以上,我們就認(rèn)為用戶在用心的發(fā)信,保留這個(gè)數(shù)據(jù),否則扔掉。方法很簡(jiǎn)單,但是最終線上的效果卻很好。
我取了一個(gè)發(fā)信很隨意的用戶數(shù)據(jù),統(tǒng)計(jì)了收信人在某個(gè)維度的分布,如下圖所示。
以下則是一個(gè)認(rèn)真發(fā)信的用戶,判斷標(biāo)準(zhǔn)就是剛才說(shuō)的時(shí)間間隔。
可以明顯看出來(lái),認(rèn)真發(fā)信的用戶,只給符合自己要求的人發(fā)信,所以分布會(huì)更集中一些。但是不認(rèn)真的用戶,分布就很散了。
排序算法的實(shí)現(xiàn)
第二個(gè)主題,說(shuō)一下排序。主要是對(duì)上邊產(chǎn)生的候選集排序后把最終結(jié)果展示給用戶。用到的算法也是CTR預(yù)測(cè)中常用到的LR、FM、GBDT等。
前邊說(shuō)過(guò),我們除了要考慮user發(fā)信,還要考慮item會(huì)不會(huì)看信,甚至item會(huì)不會(huì)回信。
因此一次排序通常會(huì)組合好幾個(gè)模型:點(diǎn)擊模型預(yù)測(cè)user從展示里點(diǎn)item的概率,發(fā)信模型預(yù)測(cè)發(fā)信概率,讀信模型預(yù)測(cè)item讀信概率。然后對(duì)這幾種概率做個(gè)組合后得到最終的權(quán)重值。
用到的工具,數(shù)據(jù)怎么處理,都跟大家一樣,沒(méi)什么要說(shuō)的,這里重點(diǎn)提一個(gè)我們用到的評(píng)估方法。
大致就是上圖這條曲線,橫座標(biāo)是預(yù)測(cè)概率的一個(gè)區(qū)間,縱座標(biāo)是在這個(gè)區(qū)間內(nèi)真實(shí)值的平均。比如圖中(0.45, 0.46)的點(diǎn),計(jì)算方法是:
?
?
這條曲線最完美的情況應(yīng)該是只有(0, 0),(1, 1)點(diǎn)有值,當(dāng)然算法不可能做到這樣。次好的情況,畫(huà)出來(lái)的線應(yīng)該與 y=x 重合。
之前說(shuō)過(guò),我們的排序是把多個(gè)算法出來(lái)的概率值作組合,所以對(duì)每個(gè)算法的效果除了要求排序正確,還希望預(yù)測(cè)的概率值也盡量接近真實(shí)值。
ROC、NDCG可以很好的度量排序,但是沒(méi)法度量真實(shí)值與預(yù)測(cè)值的偏差,這就是為什么我們特別關(guān)注這條線。
經(jīng)驗(yàn)心得
最后說(shuō)一下我們幾次算法嘗試時(shí)遇到的問(wèn)題。
1.測(cè)試Facebook論文中提到的用GBDT提取特征的方法。
當(dāng)時(shí)為了方便,我們直接把給LR的特征作為GBDT的特征,然后把得到的葉子節(jié)點(diǎn)作為特征,與原來(lái)的特征組合到一起再扔給LR。(可以參考這篇博客:CTR預(yù)估中GBDT與LR融合方案——編輯注)
線下效果和線上效果都有提升,我們推廣了這個(gè)方法,但是發(fā)現(xiàn)其中一個(gè)模型沒(méi)有任何效果。
排查問(wèn)題的時(shí)候發(fā)現(xiàn),這個(gè)模型對(duì)所有特征作了離散化,出來(lái)的特征值全部非0即1。GBDT本來(lái)就是個(gè)樹(shù)模型,能很好的處理非線性特征,使用離散化后的特征反而沒(méi)什么效果。而且對(duì)于這種只有0、1值的情況,GBDT出現(xiàn)了不收斂的現(xiàn)象。
2.不同的場(chǎng)景,使用不同的算法。
LR是我們最常使用的,所以在做點(diǎn)擊模型時(shí),自然也是先上了LR,但是線上效果并不好。后來(lái)上FM,效果卻好的出奇。
如果登錄過(guò)我們的網(wǎng)站,很容易發(fā)現(xiàn)原因:展示的場(chǎng)景,只能看到頭像、地區(qū)、年齡等幾個(gè)屬性,LR使用了大量用戶看不到的特征,這些特征對(duì)于模型來(lái)說(shuō)是沒(méi)有意義的。
That's all,我今天分享就到這里了。
Q&A
問(wèn):能否再詳細(xì)介紹一下推薦系統(tǒng)所采用的工具?
答:R的話,我們主要用Liblinear;FM主要用SVDFeature;數(shù)據(jù)主要放Hive;Redis、Memcache和MongoDB都會(huì)用到;實(shí)時(shí)計(jì)算,會(huì)對(duì)接Kafka。
問(wèn):不實(shí)時(shí)計(jì)算可以嗎?哪些方面是需要實(shí)時(shí)計(jì)算?
答:最主要的計(jì)算,還是離線算好的。比如實(shí)時(shí)的排序,因?yàn)橥扑]列表動(dòng)態(tài)生成,排序只能做成實(shí)時(shí)的。
問(wèn):請(qǐng)問(wèn)主要的算法用得什么語(yǔ)言開(kāi)發(fā)的?
答:線上Java,線下的代碼就很隨意了,Python/Java/Shell/Hive,什么方便用什么。
問(wèn):做算法時(shí),你覺(jué)的最大的障礙是啥?如何解決這些障礙?可以談?wù)劸唧w實(shí)現(xiàn)上遇到的一些困難。
答:很多時(shí)候,一個(gè)模型效果不好,但是卻不知道從哪里著手改進(jìn)。不知道加什么樣的特征會(huì)有效,換模型也沒(méi)有效果,試過(guò)了能想到的所有方法。
問(wèn):對(duì)數(shù)學(xué)要求高嗎?
答:我自己主要做開(kāi)發(fā)工作,數(shù)學(xué)有要求,但是不是那么高,能看懂論文就好。
問(wèn):楊老師,你們對(duì)用戶的習(xí)慣有研究嗎?如何做的?
答:用戶習(xí)慣,我們主要會(huì)統(tǒng)計(jì)一些數(shù)據(jù),比如用戶經(jīng)常給多少歲的人發(fā)信,然后把這個(gè)統(tǒng)計(jì)作為特征放到模型里。
問(wèn):請(qǐng)問(wèn)下,在使用算法的過(guò)程中,對(duì)于對(duì)應(yīng)算法的具體推演過(guò)程你們需要全部理解透么。感覺(jué)有時(shí)候一個(gè)算法對(duì)數(shù)學(xué)的要求好高啊,想理清緣由難度蠻大的。
答:不需要全部理解透,至少我看了很多遍EM的推導(dǎo),現(xiàn)在推,我還是不會(huì)。但是我知道EM推導(dǎo)大概怎么回事。
問(wèn):一般你們?cè)趺礃訌臑榻鉀Q某個(gè)問(wèn)題,而選擇需要利用哪些維度,然后出發(fā)去構(gòu)建模型的?
答:這個(gè)主要還是個(gè)人經(jīng)驗(yàn),做的多了,很容易就能找到最有效的特征。
問(wèn):模型是基于已有的一些文章的還是在實(shí)驗(yàn)過(guò)程中改進(jìn)的,有專門(mén)的算法部?
答:模型主要還是基于已有的,除非很不符合我們的需要,否則很少去改。
問(wèn):一些常用算法的推導(dǎo),特性,用法都的知道嗎?
答:常用算法肯定是要知道的。
問(wèn):楊老師,你剛剛學(xué)習(xí)的時(shí)候,從哪個(gè)簡(jiǎn)單示例或者文檔入手的?
答:《集體智慧編程》。
問(wèn):能否介紹佳緣的推薦目前的實(shí)際效果,下一步的改進(jìn)方向?
答:分算法和場(chǎng)景,整體上看,如果原來(lái)什么算法都沒(méi)有,可能會(huì)有50%左右的提升。下一步的方向,主要是具體細(xì)分用戶,或者從其它維度細(xì)分算法。之前的只關(guān)注了按場(chǎng)景細(xì)分,以后細(xì)分的維度會(huì)拓寬些。
問(wèn):請(qǐng)問(wèn)您認(rèn)為應(yīng)屆生應(yīng)該怎樣往機(jī)器學(xué)習(xí)方向發(fā)展呢?
答:環(huán)境是最重要的,如果真想做,找個(gè)真正做這個(gè)的公司。我一直想做游戲,到現(xiàn)在都沒(méi)做成[Smile]。
總結(jié)
以上是生活随笔為你收集整理的关于推荐的一个算法工程师访谈,有一些内容值得看看的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android测试提升效率批处理脚本
- 下一篇: View绘制--onMeasure()