首先就是關(guān)于看書這個(gè)話題,我在《這些年,這些挖掘機(jī)算法,這些反思》一文中,曾經(jīng)說到。看書是提升自我的一個(gè)最佳途徑,我說過曾給自己定了一個(gè)每月看完一本書的目標(biāo),說來慚愧,至今只能算面面強(qiáng)強(qiáng)完成任務(wù)。不過關(guān)于看書這個(gè)觀點(diǎn),個(gè)人還是堅(jiān)持自己的看法的。
首先是如何給自己擠出看書的時(shí)間,一是上下班地鐵的零碎時(shí)間,二是睡覺前,三是敲代碼搬磚搬累的時(shí)候。我想說的是,想要提升自己,書是一定要找時(shí)間看的。記住,這個(gè)時(shí)間不是為別人擠的,是為了未來你的薪水能夠提上那么個(gè)一兩檔而擠的!
其次,關(guān)于看書的方法。以前,我看書只是試圖理解作者的意圖,然后從中吸取能夠吸取的知識(shí)。現(xiàn)在,我看書喜歡拿著一支筆,邊看邊涂涂畫畫。
我試圖去理解作者說的話,然后結(jié)合自己的認(rèn)知,寫下自己的感性,甚至是依據(jù)自己的認(rèn)識(shí)反駁作者的觀點(diǎn),然后事后去求證。對(duì)于我不熟悉的領(lǐng)域,我會(huì)寫下看完后的一些體會(huì)。
然后就是對(duì)于部分章節(jié),如果我認(rèn)為其價(jià)值量并不值得我去細(xì)究,我會(huì)迅速的跳過,畢竟時(shí)間還是挺值錢的。
所以,后期以來,只要是我看過的書,一些章節(jié)要么是涂涂畫畫了很多東西,要么是嶄新的頁面??偨Y(jié)起來就是,看書不能看死書,要有一定的效率和方法,找到適合自己的,然后從中獲益!
OK,說了不少題外話,言歸正傳。
一、由這本書想到的一些東西
先來對(duì)這本書(《推薦系統(tǒng)實(shí)踐》)來個(gè)整體評(píng)價(jià)吧。
個(gè)人對(duì)這本書的定位就是:它不是一本推薦系統(tǒng)的工具書,所以他不會(huì)詳細(xì)的介紹推薦系統(tǒng)的一些算法,更多的筆墨在于講述在設(shè)計(jì)個(gè)性化推薦系統(tǒng)中的一些衡量點(diǎn)、一些思維方式(這個(gè)我認(rèn)為更重要,原因后面細(xì)說,甚至于書中的一些實(shí)驗(yàn)參考個(gè)人認(rèn)為可看可不看)。
所以,感覺這本書的題目取的有點(diǎn)稍稍不合理~~
好吧,咱不糾結(jié)他的書名了,說一說一些書中個(gè)人認(rèn)為值得一起分享的東西吧。這些東西都是看書之后,結(jié)合實(shí)踐操作的一些感想。
并且,你會(huì)發(fā)現(xiàn)這章的內(nèi)容,絕對(duì)不會(huì)是書中內(nèi)容的重復(fù),對(duì)于開挖掘機(jī)特別是開推薦系統(tǒng)挖掘機(jī)的人來說,相信我,我的觀點(diǎn)會(huì)有用的!
(1) 首先談一談關(guān)于推薦系統(tǒng)評(píng)測(cè)
我先列一下作者列舉的評(píng)測(cè)指標(biāo):用戶滿意度、預(yù)測(cè)準(zhǔn)確度、覆蓋率、多樣性、新穎度、驚喜度、信任度、實(shí)時(shí)性、健壯性、商業(yè)目標(biāo)。然后作者說,在設(shè)計(jì)推薦系統(tǒng)的時(shí)候,要盡量的考慮這些指標(biāo),特別是推薦的結(jié)果盡量滿足多樣性、新穎、能夠驚喜就更好了。
關(guān)于這一點(diǎn),其實(shí)個(gè)人觀點(diǎn)有點(diǎn)不一樣,我認(rèn)為評(píng)測(cè)推薦結(jié)果只有一個(gè)指標(biāo)就夠了,那就是商業(yè)價(jià)值,能夠提升商業(yè)價(jià)值,給業(yè)務(wù)帶來更多利益的推薦系統(tǒng),就是好的推薦系統(tǒng)。
至于說推薦的多樣性、新穎度,如果多樣化的推薦結(jié)果能夠提升價(jià)值轉(zhuǎn)換,那我們就在設(shè)計(jì)推薦系統(tǒng)的時(shí)候適當(dāng)?shù)奶岣叨鄻有缘臋?quán)重,同樣,如果新穎的東西能夠提升價(jià)值轉(zhuǎn)換,那么我們就提升新穎的權(quán)重。這才是回歸推薦系統(tǒng)的本質(zhì)!
在這一點(diǎn)上,在個(gè)人的實(shí)際操作中也是這樣做的。我們會(huì)首先定好我們需要達(dá)到的目標(biāo),比如轉(zhuǎn)化率或者是收益轉(zhuǎn)換,我們調(diào)整算法的唯一依據(jù)就是:轉(zhuǎn)化率提升了?如果是,那么我們的算法改進(jìn)就是有效;如果不是,那么這次改進(jìn)就是一個(gè)失敗的改進(jìn)。
至于說書中的每次實(shí)驗(yàn),都評(píng)估覆蓋率、多樣性以及其他等幾個(gè)指標(biāo),在我看來,其實(shí)是沒有必要的。
結(jié)合實(shí)踐來說,因?yàn)槟悴桓冶WC提升你的推薦覆蓋度就一定能夠提升轉(zhuǎn)化率,換言之,如果挖掘長(zhǎng)尾能夠提升轉(zhuǎn)化率,那么,我們就適當(dāng)提高覆蓋度,并且盡量支持多樣性。然而實(shí)際的業(yè)務(wù)場(chǎng)景是很復(fù)雜,這種保證并不是絕對(duì)的,需要依據(jù)于實(shí)際的情況而定,說白,那就是實(shí)際操作。
既然說到了實(shí)際操作,那我們說一說評(píng)測(cè)方法相關(guān)的東西吧。
書中列舉了三種方式:離線實(shí)驗(yàn)、用戶調(diào)查、在線實(shí)驗(yàn)。
首先說一下離線實(shí)驗(yàn),個(gè)人認(rèn)為在推薦系統(tǒng)中,利用已經(jīng)現(xiàn)成的用戶行為軌跡(即推薦之后是否點(diǎn)擊之類的數(shù)據(jù)),來預(yù)測(cè)一個(gè)推薦系統(tǒng)并不是很靠譜,只能做為一個(gè)參考。
因?yàn)?,例如推薦這種場(chǎng)景,并不是如分類這種的模型,沒有一個(gè)絕對(duì)值,對(duì)就是對(duì),錯(cuò)就是錯(cuò),它只是一個(gè)預(yù)測(cè)程度的提升。
其次,用戶調(diào)查這種方式,有一定參考性,但是前提是調(diào)查的量要足夠,如果取的量不夠,其意義是不大的。所以,這是一個(gè)耗費(fèi)巨大成本的工程,在實(shí)際的操作中并不可取。
所以,個(gè)人認(rèn)為其重點(diǎn)應(yīng)該是在在線實(shí)驗(yàn),而且嚴(yán)格來說是AB測(cè)試。說白點(diǎn)就是,我們把數(shù)據(jù)分流,一部分?jǐn)?shù)據(jù)走A推薦算法,一部分走B推薦算法,然后收集AB算法的推薦結(jié)果導(dǎo)致的用戶行為,根據(jù)核心價(jià)值一對(duì)比結(jié)果,一目了然。
但這樣,或許就有人有意見了:在線系統(tǒng)是一個(gè)很嚴(yán)肅的事情,怎么能在線上進(jìn)行未知效果的算法實(shí)驗(yàn)?zāi)兀?
關(guān)于這個(gè)問題,首先,算法上線之前對(duì)于新算法肯定是需要進(jìn)行一定的評(píng)估的,比如離線實(shí)驗(yàn),雖然說不能絕對(duì)依靠它,但是作為一個(gè)參考完全是可以的。
其他的一些諸如統(tǒng)計(jì)調(diào)研工作也是不可缺少的,在數(shù)據(jù)量較大的情況下,是能反映一些問題的,然后算法的設(shè)計(jì)總是有依據(jù)的,這些就是依據(jù)。換言之,這些前提工作能夠保證,即使你的新算法不會(huì)比現(xiàn)成的算法好,但也不會(huì)出現(xiàn)大幅度下降的情形。
如果出現(xiàn)了這種情況,只能說明你們的初期工作做的太爛,你們的算法設(shè)計(jì)方案是瞎搞的。
其次,我們?cè)O(shè)計(jì)的AB測(cè)試機(jī)制,必然是可以調(diào)節(jié)流量分配的,如果不是,那么設(shè)計(jì)者去面壁吧。在AB測(cè)試分流中,我們完全可以控制新算法的流量,達(dá)到一個(gè)可以觀察到效果,又能保證失誤在可控的范圍內(nèi)。
(2) 冷啟動(dòng),這是一個(gè)很嚴(yán)肅的問題
關(guān)于推薦系統(tǒng)的冷啟動(dòng),作者專門看了一個(gè)單章來說這個(gè)問題,But,在書的最后又提出了一個(gè)觀點(diǎn):忽略推薦系統(tǒng)冷啟動(dòng)的問題,因?yàn)?,只要你的推薦系統(tǒng)設(shè)計(jì)的足夠好,是不擔(dān)心數(shù)據(jù)問題的。
但在我認(rèn)為,冷啟動(dòng)是個(gè)大問題,特別是對(duì)于初入此道的人來說,是繞不開的一個(gè)問題。對(duì)于冷啟動(dòng),有一個(gè)好的機(jī)制進(jìn)行解決,那么,我們的推薦系統(tǒng)才有一個(gè)好的開端。
諸如推薦系統(tǒng)中的最經(jīng)典的協(xié)同推薦算法,其核心依賴就是用戶行為數(shù)據(jù),在一個(gè)推薦系統(tǒng)初期,用戶行為是很少的,那么這就是我們急需解決的問題。
辣么,如何累積用戶行為數(shù)據(jù)呢?
并且,請(qǐng)注意,在累積用戶行為數(shù)據(jù)的前提下,我們需要盡可能的保證推薦的有效性,也就是說,讓用戶更有可能去點(diǎn)擊你的推薦,對(duì)于公司來說,你盡可能的創(chuàng)造價(jià)值,對(duì)于你本身業(yè)務(wù)來說,你也可以盡快的收集到更多的數(shù)據(jù)嘛!
舉個(gè)簡(jiǎn)單的栗子。我要做一個(gè)類似于今日頭條這種APP,進(jìn)行各種新聞?lì)^條個(gè)性化推送。一句話,咋整?
這就是冷啟動(dòng)中的冷啟動(dòng)了,因?yàn)檎麄€(gè)系統(tǒng)都是新的,文章是新的,用戶是新的,沒有任何用戶數(shù)據(jù),沒有觀看記錄,沒有頂踩行為。無法體現(xiàn)用戶偏好,甚至于連文章是否是熱點(diǎn)我們都不知道。
這個(gè)時(shí)候,怎么辦?按照書中所說,利用用戶的注冊(cè)信息,然后結(jié)合商品信息,進(jìn)行推薦,這個(gè)基本思路是沒有問題的。在這里,商品其實(shí)就是各種新聞?lì)^條。
但是,這種方式局限性也很大,一方面,在注冊(cè)時(shí)信息有限,并且很多時(shí)候這種信息是帶有欺詐性質(zhì)的,所以我們不能過度依賴于其。
這個(gè)時(shí)候,怎么辦?請(qǐng)忽略針對(duì)于用戶個(gè)性化的推薦,我們只要掌握大體趨勢(shì)就好了。那么,如何掌握大體趨勢(shì)。借助外力!
剛才說了嘛,類似今日頭條。今日頭條肯定做了類似的工作,例如在你沒有登陸的情況下,肯定同樣提供了推薦列表。并且可以肯定的是,這個(gè)推薦列表是有數(shù)據(jù)支撐的,并不是胡亂推送的。也就是意味著,這批推薦名單是比較容易被普通大眾所接受的,換言之,是能夠提升點(diǎn)擊率的。
那我們?nèi)绾卫盟??我們?fù)刻一個(gè)推薦列表出來。當(dāng)然,并不是要你直接把人家的文章拿過來直接放上,要是這樣,人家就該告你了。
我們可以通過計(jì)算相似度的方式,針對(duì)于今日頭條的每一個(gè)推擠,在自己的文章庫里計(jì)算一個(gè)最相似的文章出來,頂上去。不依賴于任何己方的數(shù)據(jù),一個(gè)推薦列表就出來了。
至于說效率問題,其實(shí)類似這種新聞?lì)^條的推薦列表,其變化并不是實(shí)時(shí)的,所以,計(jì)算的代價(jià)完全是可以承受的。
至于說如何計(jì)算相似度,那就是另外一個(gè)范疇了,這里只是提供一個(gè)思路。
說到思路,那么,通過這個(gè)栗子,我想要表達(dá)的意思也差不多了,那就是處理這種冷啟動(dòng)的問題,我們的處理思路是:借助類似產(chǎn)品的現(xiàn)有成果,并以此為依據(jù)。
雖然有點(diǎn)無賴,但是能解決問題,無賴就無賴吧~~
在收集到第一手行為軌跡之后,往后的事就方便多了,該怎么滴怎么滴吧~~
(3) 上下文信息與規(guī)則打分模型的關(guān)系
書中有提到,所謂上下文信息,主要兩方面:時(shí)間上下文,地點(diǎn)上下文。
在我認(rèn)為,其實(shí)是遠(yuǎn)遠(yuǎn)不夠的,一切可能對(duì)于結(jié)果有影響的第三方因素都是可以參考的。所謂第三方因素,個(gè)人認(rèn)為可以定義為:與用戶個(gè)性化沒有顯性關(guān)聯(lián)的因子。比如前文說到的時(shí)間、地點(diǎn),又如季節(jié)、天氣等等諸如此類。
說到這些,不得不說到規(guī)則打分模型。
說到規(guī)則打分模型,簡(jiǎn)單解釋一下吧。所謂規(guī)則,即我們自己定義的一系列操作規(guī)范;至于打分,則意味著有某項(xiàng)操作,我們就給某項(xiàng)操作加分。最后看看誰的分多,我們就選擇誰。換個(gè)專業(yè)點(diǎn)的術(shù)語就是規(guī)則權(quán)重模型,好吧,其實(shí)就是權(quán)重計(jì)算。
很簡(jiǎn)單是吧,但是別忽略它的重要性。個(gè)人從來就不認(rèn)為推薦系統(tǒng)就是協(xié)同推薦之類的算法作為代表。
推薦系統(tǒng),這是一個(gè)浩大的工程,以協(xié)同推薦為代表的算法只是其中的一個(gè)因子,它必然是綜合了各種各樣的東西的。而權(quán)重模型是一個(gè)很簡(jiǎn)單,很原始又很有效的方式。
如何定義不同外在因子對(duì)于推薦結(jié)果的影響,也就是如何針對(duì)于不同外在因子賦予其應(yīng)有的權(quán)重比。這需要數(shù)據(jù)的統(tǒng)計(jì)!
特別是在當(dāng)期大數(shù)據(jù)的背景下,這種基于統(tǒng)計(jì)的規(guī)則權(quán)重模型愈顯有效。大規(guī)模的數(shù)據(jù)統(tǒng)計(jì)是能夠體現(xiàn)數(shù)據(jù)趨勢(shì)的,這點(diǎn)毋庸置疑!
好吧,我承認(rèn),這也是為何我把題目中數(shù)據(jù)加了個(gè)“字”的直接原因。
并且在實(shí)際的操作中,很多推薦系統(tǒng)的結(jié)果都是通過規(guī)則權(quán)重模型呈現(xiàn)的;還有就是多種推薦方式時(shí),是通過規(guī)則權(quán)重模型把多種方式結(jié)果整合,以達(dá)到結(jié)果最優(yōu)化。
所以,在你的推薦系統(tǒng)算法沒有絲毫思路的時(shí)候,何不嘗試嘗試走規(guī)則權(quán)重模型的路子?通過權(quán)重模型去修正你的推薦結(jié)果,你會(huì)有驚喜的!
(4) 無處不在的長(zhǎng)尾以及馬太效應(yīng)
長(zhǎng)尾分布或者說長(zhǎng)尾效應(yīng),這個(gè)名詞解釋應(yīng)該不用我多說了吧。實(shí)際上,在現(xiàn)實(shí)生活中,這是一個(gè)很常見的現(xiàn)象。
然后長(zhǎng)尾分布導(dǎo)致的直接結(jié)果就是馬太效應(yīng),即通俗點(diǎn)說就是強(qiáng)者愈強(qiáng),弱者愈弱。
即,比如一些熱點(diǎn)物品,其附帶的行為數(shù)據(jù)越多,其得到的推薦機(jī)會(huì)就越大,然后被展現(xiàn)的機(jī)會(huì)越多,然后再次被推薦的機(jī)會(huì)越多,然后…陷入死循環(huán)了,其他物品還有存在的必要嗎?!
所以,作者在實(shí)驗(yàn)結(jié)果中除了準(zhǔn)確率,另外一直很強(qiáng)調(diào)的一個(gè)指標(biāo)就是:覆蓋率或者說多樣性(這也是為何我我一直跳過他實(shí)驗(yàn)描述部分的原因,感覺參考意義不大)。
對(duì)于說我們是否需要挖掘長(zhǎng)尾,我的觀點(diǎn)跟我之前提到的依然一致:如果挖掘長(zhǎng)尾有益提升我們的商業(yè)價(jià)值,那我們就想方法提高覆蓋度,換言之就是降低熱點(diǎn)物品的權(quán)重;如果挖掘長(zhǎng)尾對(duì)于我們提升價(jià)值轉(zhuǎn)換并沒有益處,那我們?yōu)楹我@么做。
極端點(diǎn)的栗子就是:假如我每天推薦的是固定這幾個(gè)物品,從不改變,但是,它創(chuàng)造的價(jià)值比其他任何流弊推薦系統(tǒng)產(chǎn)生的價(jià)值都高,那么,它就是一個(gè)好的推薦!
這又回歸到了我之前的觀點(diǎn):衡量推薦系統(tǒng)好壞的唯一標(biāo)準(zhǔn)就是,它是否能夠提升價(jià)值轉(zhuǎn)換!
那么,我到底該不該挖掘長(zhǎng)尾呢,大家都挖?還問這個(gè)問題的人一定是個(gè)死腦筋。是否挖掘長(zhǎng)尾,看業(yè)務(wù)場(chǎng)景,然后進(jìn)行充分的AB測(cè)試,來決定是否提升覆蓋度、多樣性,提升多少,這一切的標(biāo)準(zhǔn)唯一衡量就是,它能給我?guī)砀嗟膍oney嗎?
如果它能給我?guī)砀嗟膍oney,長(zhǎng)尾就長(zhǎng)尾吧,馬太就馬太吧,又何妨?
二、我那悲慘的推薦系統(tǒng)實(shí)踐經(jīng)歷
寫這個(gè)之前,我仔細(xì)的反思一下,我策劃并且實(shí)施的那個(gè)推薦系統(tǒng)算是推薦系統(tǒng)嗎?然后我想了想,感覺應(yīng)該還算是,只不過不是典型推薦系統(tǒng),但是在整個(gè)實(shí)施的過程中,思考的方式還是可以借鑒的。
并且,可以預(yù)見的是,實(shí)際的工程操作哪有像教科書似得,都是特定場(chǎng)景,特定條件下的產(chǎn)物。也就是說,沒有通用的推薦系統(tǒng),即使有,肯定也是不好用的!
我想,在整個(gè)過程中,一些思考,一些處理問題的方式,對(duì)大家在以后類似工程的實(shí)施中還是有一些參考意義的。
所以,我還是決定把它寫下來~~
(1) 業(yè)務(wù)場(chǎng)景是這樣滴
還記得那會(huì)兒是三月份還是二月份來著,我所在的A公司上線了在線教育頻道,一段時(shí)間后,主持運(yùn)營(yíng)在線教育的B君突發(fā)感想,博客頻道辣么多流量,隨隨便便不就可以引一大坨流量過來了嗎?于是乎,任務(wù)跑到了我所在的數(shù)據(jù)部。
需要說明的是,A公司主要是做IT技術(shù)論壇社區(qū)博客的,而在線教育客戶也是程序猿,所以業(yè)務(wù)上并不沖突,這個(gè)引流思路也是對(duì)的。
言歸正傳。
我當(dāng)時(shí)一看,這不是推薦系統(tǒng)么!然后再仔細(xì)一看,這是推薦系統(tǒng)嗎?好吧,我承認(rèn),有點(diǎn)繞口了。
我們首先來回顧一遍,我們正經(jīng)的推薦系統(tǒng)是什么樣的。吃個(gè)栗子,啊不,舉個(gè)栗子:我們?cè)谝粋€(gè)視頻網(wǎng)站上看視頻,然后下面給你推薦了一坨視頻,可能是根據(jù)你的偏好,也可能是根據(jù)網(wǎng)站用戶的數(shù)據(jù)給你推,反正不管,這是正經(jīng)的推薦系統(tǒng);你在某寶買東西,然后瀏覽物品的時(shí)候,下面列出一坨東西,這是正經(jīng)的推薦系統(tǒng);等等諸如此類。
然后再回到我們的場(chǎng)景,我在瀏覽一片IT技術(shù)博文,然后下面你給我推薦一坨在線教育視頻。這叫啥事兒!
對(duì)比一下發(fā)現(xiàn)了沒有,上述的場(chǎng)景跟我們的場(chǎng)景哪里不一樣?是的,他們推的東西都是一類,而我們的東西完全是兩套東西,一個(gè)是IT技術(shù)博文,一個(gè)IT在線培訓(xùn)視頻,他們有著不同的屬性。
如果運(yùn)營(yíng)在線教育B君說,blogchong sir,我想在我們?cè)诰€教育頻道做視頻的推薦,來給整一套吧。
那我會(huì)很愉快地按照行業(yè)標(biāo)準(zhǔn),迅速的整一個(gè)推薦系統(tǒng)出來,然后按部就班的調(diào)算法,優(yōu)化效果,從此過上快樂的生活!
But,事實(shí)擺在眼前,需要面對(duì)就是這么一個(gè)業(yè)務(wù)場(chǎng)景。我仔細(xì)想了想,這是一個(gè)推薦系統(tǒng),只不過是一個(gè)不那么正兒八經(jīng)的推薦系統(tǒng)。
然后設(shè)計(jì)方案、組織人手、推動(dòng)項(xiàng)目進(jìn)行等這個(gè)活落到我頭上了。這是上天的安排,對(duì)我的考驗(yàn)嗎?事實(shí)上是組織給我的安排,對(duì)我的考驗(yàn)。頓時(shí)淚牛滿面~~
好吧,那就干吧!
(2) JUST OT IT
在那之前,雖然對(duì)于數(shù)據(jù)挖掘領(lǐng)域有所涉獵,但是在推薦這一塊,還是處于基本理論了解到水平,并且當(dāng)前部門里并沒有其他太多的可參考的東西。
我開始著手調(diào)研這個(gè)業(yè)務(wù)場(chǎng)景,然后很杯具的發(fā)現(xiàn),業(yè)內(nèi)基本沒有出現(xiàn)類似的這種業(yè)務(wù)場(chǎng)景。是的,有誰能夠想到要從X事物關(guān)聯(lián)到Y(jié)事物啊,但事實(shí)就是如此。
然后我開始分析,在博客與視頻之間到底有什么樣的聯(lián)系。我挨個(gè)梳理兩者的屬性列表,然后發(fā)現(xiàn)他們其實(shí)還是有共同點(diǎn)的,比如:他們主要IT方向的,他們都有中文Title,都有tag,都有des也就是詳細(xì)地中文描述。
是的,我們無法從業(yè)界進(jìn)行參考,我們無法通過用戶行為進(jìn)行參考(相當(dāng)冷的啟動(dòng)),那么他們兩唯一的關(guān)聯(lián)就是主題了。
拋開用戶行為,推薦相同或者相似主題的內(nèi)容,這是不會(huì)錯(cuò)的,這是推薦系統(tǒng)的常規(guī)方式之一。
于是按照這個(gè)思路,我開始做設(shè)計(jì)。一開始,對(duì)于很多方面的思考都不成熟,所以映射也比較簡(jiǎn)單,直接通過博客的tag去找視頻。
方案開始實(shí)施,考慮到后期視頻內(nèi)容量的增長(zhǎng),我使用博文tag通過搜索引擎的方式聚合出視頻,于是推薦列表有了。
產(chǎn)品經(jīng)理C君說,光通過博文進(jìn)行推薦不行啊,我們需要考慮那些熱點(diǎn)視頻。好吧,那就加上吧,于是,我在推薦列表中加了一部分觀看次數(shù)TopN的視頻。
C君又說,光有博文推薦出來以及最熱視頻也不行啊,我們得考慮用戶。于是,我和擅長(zhǎng)數(shù)據(jù)批量處理D君把公司里所有活躍用戶近一個(gè)月的博文瀏覽行為跑了一遍,其實(shí)就是看用戶看了寫了那些博文,并且對(duì)所有博文tag根據(jù)讀寫不同權(quán)重進(jìn)行排序,選擇前N作為用戶的核心技能。而且,我們?cè)谡{(diào)度中心做成了定時(shí)任務(wù),定時(shí)更新用戶畫像中技能字段。
好吧,用戶的tag也有了,剩下的過程與博文沒啥區(qū)別了。
接著需要考慮的問題就是,三種方式得來的列表,我們?cè)撛趺捶峙洌驗(yàn)橥扑]位就那么幾個(gè),總的分一分吧。
然后C君說,拍腦袋吧,于是,我們拍腦袋給他們定了個(gè)權(quán)重。
只怪我當(dāng)初太年輕,太好騙,啥也不懂~~
好吧,不管怎么樣,我們的第一版推薦系統(tǒng)正式上線了(沒法離線評(píng)測(cè)),然后我讓BI小組的G君給網(wǎng)頁上埋了點(diǎn),進(jìn)行結(jié)果收集。
BI報(bào)表出來了,結(jié)果差強(qiáng)人意,這是顯然的。
(3) 工作還得繼續(xù)
我和數(shù)據(jù)分析小組的E妹一起跟蹤行為歷史log,發(fā)現(xiàn)了其實(shí)很多博文很多用戶根本就沒有tag,這樣會(huì)導(dǎo)致我們都給人家推的是Hot數(shù)據(jù)。換言之,很多根本是毫不相干的。
于是,我開始著手解決這個(gè)問題。沒有tag,那我就給造tag。在推薦的時(shí)候,我通過博文的Title,進(jìn)行分詞,并且把停用詞去掉,把分出來的詞填充到臨時(shí)tag中,用于視頻的聚合,并且通過直覺略微調(diào)整了下三種方式的權(quán)重。
結(jié)果又好了辣么一點(diǎn)點(diǎn)。
這事被F君知道了,他說,如果要獲取一個(gè)比較客觀的博文主題,為何不從整個(gè)博文中進(jìn)行抽取呢?有道理!
我跟D君開始進(jìn)行主題抽取的研究,并且最終又把800G的較新博文跑了一遍,在數(shù)據(jù)中心為它填充了一個(gè)新的主題詞描述字段。媽媽再也不用擔(dān)心我的tag了!
于是乎,我們的結(jié)果又好了辣么一點(diǎn)點(diǎn)。
又過了一段時(shí)間,數(shù)據(jù)分析小組的G妹通過分析發(fā)現(xiàn),其實(shí)很多視頻課程跟我們的博文相關(guān)度并不是很大的。我說不對(duì)啊,我們抽取tag詞中,雖然有些不相關(guān)的詞,但是基本上對(duì)應(yīng)的技能大部分還是比較靠譜的呀。
然后我再梳理了一遍通過tag詞聚合視頻課程的過程,確實(shí)存在課程不是很匹配的情況。
原因在于主題詞抽取雖然大部分情況下都把對(duì)應(yīng)的技能詞給提取出來了,但是權(quán)重排序很難做到很準(zhǔn)確,而我們的檢索引擎匹配又是匹配更多的詞的結(jié)果,權(quán)重會(huì)較高。
于是,我認(rèn)為應(yīng)該把主題詞分主次。舉個(gè)簡(jiǎn)單栗子,假如主題詞有三個(gè):hadoop、應(yīng)用、開發(fā)。那么,我完全可以認(rèn)為,hadoop其實(shí)才是最主要的詞,其他兩個(gè)都是次要的。
就比如,我希望匹配到是hadoop視頻課程,而目前結(jié)果恰巧那種“XX應(yīng)用開發(fā)視頻教程”會(huì)排在前面。當(dāng)然,如果能完全命中“hadoop應(yīng)用開發(fā)教程”,那就更好了。
我跟G妹開始梳理在線視頻教育的技術(shù)點(diǎn),把認(rèn)為能夠體現(xiàn)技術(shù)特征的詞整理成了一份數(shù)百詞的核心詞字典。
于是,在聚合邏輯上,我會(huì)優(yōu)先考慮核心詞的命中,然后才考慮次要的詞。這樣,我們的結(jié)果似乎又好了一點(diǎn)點(diǎn)。
后續(xù),我們又做了一些小的修改,但發(fā)現(xiàn),結(jié)果提升的幅度越來越小。
如果按照這個(gè)路子下去,估計(jì)我們的結(jié)果也就這樣了。
里程碑式的跨越,是在我跟F君進(jìn)行的一次深度的討論。
(4) 里程碑式的跨越
在討論之中,我們?cè)谏羁谭此?,我們的路子走的?duì)不對(duì)。假設(shè)在主題詞提取的足夠正確的前提下,我們是否全盤考慮了所有詞對(duì)于視頻匹配的貢獻(xiàn)呢?
然后關(guān)于視頻屬性的命中,我們又在考慮,命中位置對(duì)于匹配度的貢獻(xiàn)是一樣的嗎?
除了視頻中文相關(guān)的一些中文描述,難道沒有其他的一些屬性能夠給我們的推薦建議帶來一絲貢獻(xiàn)嗎?
于是,我一方面讓D君繼續(xù)優(yōu)化主題提取的準(zhǔn)確率,一方面思考新的設(shè)計(jì)方案,推翻原來的方案基礎(chǔ)上進(jìn)行思考。
常規(guī)的協(xié)同推薦路子走不通,那我們就走規(guī)則權(quán)重模型。在這個(gè)方向偷摸滾打這么久,總是需要長(zhǎng)點(diǎn)記性的。
于是我列舉了一些可能為模型帶來貢獻(xiàn)的屬性,并且初步設(shè)計(jì)了一個(gè)嵌套了兩層的規(guī)則權(quán)重模型。通過幾次的小組會(huì)議,增刪了一些屬性,并且稍微的修改了一下模型。
其中需要說明的就是,我添加了不少視頻中與博文沒有任何關(guān)系的屬性,我們的目的在于,這些屬性或多或少都是有影響的。
于是我著手開始進(jìn)行視頻相同統(tǒng)計(jì)屬性的量化操作,諸如發(fā)布時(shí)間無窮增長(zhǎng)的值,諸如是否收費(fèi)這樣的二值屬性,進(jìn)行0到1之間的量化。
有了量化,我們的E妹就可以根據(jù)數(shù)據(jù)分析,那些指標(biāo)跟點(diǎn)擊率是正相關(guān)的,那些是無相關(guān)的。我們進(jìn)一步刨除了一些無相關(guān)的統(tǒng)計(jì)屬性。
對(duì)于初始階段,我們沒有任何數(shù)據(jù)可以參考進(jìn)行權(quán)重設(shè)計(jì),于是在慎重考慮之后,我為嵌套的兩層規(guī)則模型設(shè)計(jì)了一個(gè)看起來比較合理的權(quán)重比。
然后在數(shù)據(jù)初篩的階段,使用每一個(gè)主題詞進(jìn)行視頻N值提取,然后在N*M個(gè)初篩的視頻中,根據(jù)規(guī)則模型對(duì)N*M個(gè)視頻進(jìn)行打分(這會(huì)犧牲一部分性能,但是這種思路為部門內(nèi)部搜索優(yōu)化項(xiàng)目提供了參考)。然后按照要求的個(gè)數(shù)進(jìn)行截取就OK了。
其中有一點(diǎn)需要說明的就是,在我們的場(chǎng)景中,登陸用戶的比重與游客的比重是1/60,所以,我們的重心一直不在用戶身上,這個(gè)就不多說了。
還有一個(gè)跨越式的進(jìn)展就是,我設(shè)計(jì)了AB分流測(cè)試機(jī)制。當(dāng)時(shí)回想一下,冷汗淋淋啊,之前辣么多的版本,我們就這樣悶頭直上了,那可是線上的系統(tǒng)啊。之所以沒有出問題,一大部分原因就是,在新版本中,我們進(jìn)行了足夠的思考。
好了,如今,有了AB分流機(jī)制,我在保證系統(tǒng)不受大影響的情形下,在轉(zhuǎn)化率可能下降并且可接受的范圍內(nèi),為新模型分了1/4的流量。別小看這四分之一的流量,那可是上百萬的流量啊。
不用等多久,因?yàn)槲姨崆白孏君埋好了點(diǎn),第二天我們就看到了效果,具體的數(shù)值俺就不多說了。我們果斷的把流量全部切到了新模型中。
此后,我們的工作重點(diǎn)在于如何有效優(yōu)化權(quán)重比例。這一點(diǎn),我跟E妹進(jìn)行討論分析,最后E妹的敏捷思維還是說服了我。
E妹說,我們是在有數(shù)據(jù)傾向的前提下來預(yù)測(cè)權(quán)重值,這不就是邏輯回歸嘛,跟計(jì)算邏輯回歸的參數(shù)有何區(qū)別呢?啊不,區(qū)別還是有的,區(qū)別就是我們需要的是正參數(shù)。
好吧,后續(xù)的我就不多說了,再說這就是一篇小說了。
后續(xù)我們又做了一些其他思考,比如我們認(rèn)為技術(shù)應(yīng)該是分層級(jí),加入一個(gè)技術(shù)水平分高中低三級(jí),如果博文體現(xiàn)出來的技術(shù)水平是初級(jí)的,那我們是不是應(yīng)該適當(dāng)?shù)慕o人家推薦對(duì)應(yīng)中級(jí)的技術(shù)視頻。
又諸如,技術(shù)之間是有關(guān)聯(lián)的,人家看hadoop的博文,是不是可以適當(dāng)?shù)慕o人家推薦spark的視頻課程?這種關(guān)系如何提???
其中涉及到的技術(shù)以及其他種種,我就不多說了,再說下去,我就得寫到凌晨?jī)牲c(diǎn)了。
(5) 做一個(gè)象征性的總結(jié)吧
也不算是總結(jié)吧,整個(gè)過程反倒像是我在記流水賬了。但不管怎么樣,有些觀點(diǎn)我認(rèn)為還是有意義的。
首先對(duì)于我們不熟悉的領(lǐng)域,我們需要果斷的去做,有些東西是需要吃過一點(diǎn)虧才明白的,畢竟書上的東西只是書上的東西,這句話可明白?
其次,在做新算法改進(jìn),乃至于其他改進(jìn),或者諸如其他項(xiàng)目時(shí),我們需要經(jīng)過慎重的思考,然后再做方案,然后再實(shí)施。這也是為何我們?cè)贏B測(cè)試機(jī)制出來之前,無數(shù)次“勇敢”上線,覆蓋線上版本,而沒有出問題,效果沒有下跌的直接原因。
針對(duì)于推薦系統(tǒng)的設(shè)計(jì),我想說的就是,我們需要解決的是主要矛盾。針對(duì)于我們的這個(gè)項(xiàng)目實(shí)踐來說就是,我們的一切努力方向就是提升流量從博客頻道到在線教育頻道的轉(zhuǎn)化率。
至于說試圖挖掘長(zhǎng)尾,我們嘗試過,呈現(xiàn)推薦的多樣性我們也嘗試過,但是,這不是我們的目標(biāo),我們只會(huì)在轉(zhuǎn)化率最合適的地方挺住腳步,而不是一味的提升多樣性。還是那句話:能給你帶來更多money的推薦系統(tǒng),才是好的推薦系統(tǒng),其他的管他呢!
關(guān)于推薦系統(tǒng)另外一個(gè)建議就是,我們不要拘泥于某種形式,我們需要切實(shí)地參考業(yè)務(wù)場(chǎng)景,提出最適合自己的設(shè)計(jì)方案。很多方案,只有你想不到,沒有做不到的,結(jié)果如何,試一下就知道了。
作為項(xiàng)目的推動(dòng)者組織者,我們需要承擔(dān)更多的責(zé)任,例如任何讓各個(gè)方面的人進(jìn)入到其位置中,并且及時(shí)協(xié)調(diào)各個(gè)方面的進(jìn)度,這很重要。
團(tuán)隊(duì)的力量很強(qiáng)大,一個(gè)重要體現(xiàn)就是,初始方案可以你來做,但是通過小組討論,你會(huì)發(fā)現(xiàn)眾人的智慧是很強(qiáng)大的,自己認(rèn)為再完美的方案也是有改進(jìn)之處的。
多多與他人討論溝通交流,每個(gè)人都有其強(qiáng)大之處,我們需要虛心學(xué)習(xí)。他山之石可以攻玉,這句話永遠(yuǎn)都是對(duì)的!
三、題外話,我的小伙伴們都去哪兒了
細(xì)細(xì)想來,如今一晃已經(jīng)是近一年過去了。推薦系統(tǒng)項(xiàng)目已經(jīng)停留了有一段時(shí)間了,又在忙其他項(xiàng)目了。
時(shí)間過得真快,F(xiàn)君離開A公司已經(jīng)很長(zhǎng)一段時(shí)間了,細(xì)細(xì)想來,F(xiàn)君學(xué)識(shí)豐富,每一次和他的討論都有很大的收獲,他亦是我心中半師半友的伙伴。
D君緊隨F君之后不久離開,據(jù)說都去了某視的數(shù)據(jù)云部門。D君是一個(gè)踏實(shí)肯干的人,所以與他相處也很愉快。
就在前一段時(shí)間,E妹也離開了公司。E妹的敏捷思維至今還給我留下深刻的印象,在陷入迷茫之中,往往有很多突發(fā)奇想又有很大幫助的點(diǎn)子。
對(duì)于他們的離開,我頗具悲傷、甚是懷念。
我祝福他們?cè)谛碌墓纠?,能夠過得更快樂,賺更多的money。
至此,我也祝福所有動(dòng)物園里的動(dòng)物,不管是程序猿也好,設(shè)計(jì)獅也好,產(chǎn)品狗也好,希望你們過得好,珍惜每一個(gè)在你身邊與你一起戰(zhàn)斗過的伙伴。記得時(shí)常聯(lián)絡(luò),偶爾聊聊技術(shù),偶爾一起去奧森公園打打三國(guó)殺,哈哈~~
好吧,到這里,我這篇很長(zhǎng)很長(zhǎng)的文章(估計(jì)有近萬字了)也該結(jié)束了,困了=_=,都一點(diǎn)了,差不多洗洗睡了。
總的來說,這篇文章延續(xù)了我以往的風(fēng)格,正如《這些年,這些挖掘機(jī)算法,這些反思》一文那樣,帶點(diǎn)技術(shù)話題,帶點(diǎn)故事性質(zhì)。