這篇文章的技術(shù)難度會低一些生蚁,主要是對推薦系統(tǒng)所涉及到的各部分內(nèi)容進行介紹你弦,以及給出一些推薦系統(tǒng)的常用算法畜伐,比起技術(shù)莹规,產(chǎn)品色彩會強不少。參考了《長尾理論》沸柔、《推薦系統(tǒng)實踐》以及大量相關(guān)博客內(nèi)容眼俊。
什么是推薦系統(tǒng)
我之前寫過一篇《長尾理論》精讀慎颗,里面有這樣的觀點:
推動市場由熱門經(jīng)濟學(xué)向長尾經(jīng)濟學(xué)轉(zhuǎn)變有三種力量:第一種是生產(chǎn)普及的力量(生產(chǎn)者)腹泌,第二種是傳播普及的力量(集合器)嘶卧,第三種是供需相連的力量(過濾器)。
生產(chǎn)普及的力量指凉袱,當(dāng)下大眾制作內(nèi)容(圖像芥吟、音視頻侦铜、文字等)的門檻大大降低,人們有能力制作并有意愿分享自己產(chǎn)生的內(nèi)容钟鸵。使得可供展示的內(nèi)容量大大增加钉稍。
傳播普及的力量指,相當(dāng)一部分內(nèi)容由原子存在變?yōu)楸忍卮嬖诠姿#辉傩枰紦?jù)物理世界中的『貨架』贡未,而是存儲在硬盤之中,存儲成本的降低使得大量非熱門的長尾內(nèi)容可以被擺上虛擬世界中的『貨架』烈掠,真的有了對外展示的機會羞秤。
而供需相連的力量缸托,就是指推薦系統(tǒng)左敌。
既然存在大量的長尾內(nèi)容,那如何供需相連俐镐?推薦系統(tǒng)要做的矫限,就是聯(lián)系用戶和內(nèi)容,一方面幫助用戶發(fā)現(xiàn)對自己有價值的內(nèi)容佩抹;另一方面讓內(nèi)容能夠展現(xiàn)在對它感興趣的用戶面前叼风,從而實現(xiàn)內(nèi)容消費者和內(nèi)容生產(chǎn)者的雙贏。
為了聯(lián)系用戶和內(nèi)容棍苹,其實過去也有很優(yōu)秀的解決方案无宿,有代表性的比如分類目錄和搜索引擎。
隨著互聯(lián)網(wǎng)規(guī)模的不斷擴大枢里,分類目錄網(wǎng)站也只能覆蓋少量的熱門網(wǎng)站孽鸡,越來越不能滿足用戶的需求,因此搜索引擎誕生了栏豺。搜索引擎可以讓用戶搜索關(guān)鍵詞來找到自己所需要的信息彬碱,但是,搜索的前提就是用戶要主動提供準(zhǔn)確的關(guān)鍵詞奥洼,但是如果用戶無法準(zhǔn)確的描述自己需求的關(guān)鍵詞時巷疼,搜索引擎就無能為力了。
而推薦系統(tǒng)不同灵奖,它不需要用戶提供明確的需求嚼沿,甚至連用戶主動提出需求都不需要。推薦系統(tǒng)通過分析用戶的歷史行為給用戶的興趣建模瓷患,從而主動給用戶推薦能夠滿足它們興趣和需求的內(nèi)容伏尼。
什么是好的推薦系統(tǒng)?
先總體來說尉尾,一個完整的推薦系統(tǒng)一般存在三個參與方:用戶爆阶、內(nèi)容提供者和提供推薦系統(tǒng)的網(wǎng)站。
首先,推薦系統(tǒng)要滿足用戶的需求辨图,給用戶推薦那些讓他們感興趣的內(nèi)容班套;其次,推薦系統(tǒng)要讓內(nèi)容提供者的內(nèi)容都能被推薦給對其感興趣的用戶故河;最后吱韭,好的推薦系統(tǒng)設(shè)計,能夠讓推薦系統(tǒng)本身收集到高質(zhì)量的用戶反饋鱼的,不斷提高推薦的質(zhì)量理盆,提高推薦系統(tǒng)的效益。
推薦系統(tǒng)實驗方法
評價推薦系統(tǒng)效果的實驗方法主要有三種凑阶,分別是離線實驗猿规、用戶調(diào)查和在線實驗。
離線實驗一般是:
- 通過日志系統(tǒng)獲得用戶行為數(shù)據(jù)宙橱,并按照一定格式生成一個標(biāo)準(zhǔn)的數(shù)據(jù)集
- 將數(shù)據(jù)集按一定規(guī)則分成訓(xùn)練集和測試集
- 在訓(xùn)練集上訓(xùn)練用戶興趣模型姨俩,在測試集上進行預(yù)測
- 通過事先定義的離線指標(biāo)評測算法在測試集上的預(yù)測結(jié)果
離線實驗在數(shù)據(jù)集上完成,不需要真實用戶參與师郑,可以快速的計算出來环葵。主要缺點是離線指標(biāo)往往不包含很多商業(yè)上關(guān)注的指標(biāo),比如點擊率宝冕、轉(zhuǎn)化率张遭。
用戶調(diào)查是理論上最有效的方法,因為高預(yù)測準(zhǔn)確率不等于高用戶滿意度地梨,還是要從用戶中來菊卷,到用戶中去。
用戶調(diào)查需要有一些真實的用戶湿刽,讓他們在需要測試的推薦系統(tǒng)上完成一些任務(wù)的烁,同時我們觀察和記錄他們的行為,并讓他們回答一些問題诈闺,最后通過分析他們的行為和答案了解測試系統(tǒng)的性能渴庆。
但是用戶調(diào)查成本很高,而且測試用戶也需要精心挑選雅镊,太麻煩了襟雷。
在線實驗一般在離線實驗和必要的用戶調(diào)查之后,一般是將推薦系統(tǒng)上線做AB測試仁烹,將它和舊的算法進行比較耸弄。
AB測試是一種很常用的在線評測算法的實驗方法,不僅是算法卓缰,對產(chǎn)品設(shè)計的改動也可以采用這種方法计呈。它通過一定的規(guī)則將用戶隨機分成幾組砰诵,并對不同組的用戶采用不同的算法,然后通過統(tǒng)計不同組的各種不同的評測指標(biāo)比較不同的算法性能捌显,比如點擊率茁彭。
AB測試的缺點是周期較長,影響較大扶歪,我們通常只用它測試那些在離線實驗和用戶調(diào)查中表現(xiàn)很好的算法理肺。
一般而言,我們需要證明新的推薦算法在很多離線指標(biāo)上優(yōu)于現(xiàn)有算法善镰,而且用戶滿意度不低于現(xiàn)有的算法妹萨,最后在線上AB測試后,發(fā)現(xiàn)在我們關(guān)心的指標(biāo)上也優(yōu)于現(xiàn)有的算法炫欺。這樣新的推薦系統(tǒng)才能最終上線發(fā)布乎完。
推薦系統(tǒng)評測指標(biāo)
用戶滿意度
用戶滿意度是推薦系統(tǒng)最重要的指標(biāo),但是用戶滿意度沒法離線計算竣稽,只能通過用戶調(diào)查和在線實驗獲得囱怕。
用戶調(diào)查前面講了霍弹,是找一些真實的用戶去試用毫别,然后統(tǒng)計行為以及詢問一些問題。
在線實驗一般是對一些線上用戶的行為進行統(tǒng)計來得到用戶滿意度典格,比如在電子商務(wù)網(wǎng)站中岛宦,用戶如果購買了推薦的商品,就表示他們在一定程度上滿意耍缴;或者也可以設(shè)計一些用戶反饋頁面收集用戶滿意度砾肺。更一般的,我們可以統(tǒng)計點擊率防嗡、用戶停留時間和轉(zhuǎn)化率等指標(biāo)变汪。
預(yù)測準(zhǔn)確度
在過去,很多人將推薦準(zhǔn)確度作為推薦系統(tǒng)唯一追求的指標(biāo)蚁趁,比如一個推薦系統(tǒng)預(yù)測一個用戶將來會購買一本書裙盾,而最后用戶買了,這樣推薦的準(zhǔn)確度很高他嫡。
但是番官,如果用戶本來就準(zhǔn)備買這本書,無論推薦與否钢属,都會購買徘熔,那這個推薦系統(tǒng),實際上并沒有讓用戶購買更多的書淆党。
沒有幫助用戶找到新的感興趣的內(nèi)容酷师,沒有幫內(nèi)容生產(chǎn)者找到新用戶讶凉,也沒增加推薦系統(tǒng)的總成交量(姑且叫成交量)。
所以山孔,預(yù)測準(zhǔn)確度當(dāng)然很重要缀遍,但推薦系統(tǒng)也要能擴展用戶的視野,幫助他們發(fā)現(xiàn)那些他們可能會感興趣饱须,但卻不那么容易發(fā)現(xiàn)的東西域醇。同時,推薦系統(tǒng)還要能夠把那些埋沒在長尾中的內(nèi)容推薦給可能會對它們感興趣的用戶蓉媳。
預(yù)測準(zhǔn)確度在不同研究方向中表現(xiàn)形式也不同譬挚,比如評分預(yù)測中,就是需要預(yù)測酪呻,該用戶在將來看到一個他沒有評過分的物品時减宣,會給這個物品評多少分。
在評分預(yù)測中玩荠,預(yù)測準(zhǔn)確度一般通過均方根誤差(RMSE)和平均絕對誤差(MAE)計算漆腌,如下式:
式子都很好理解,主要思想就是誤差累加阶冈,RMSE因為使用了平方項的懲罰闷尿,對系統(tǒng)的評測更加苛刻。
除了評分預(yù)測女坑,還有TopN推薦填具,TopN推薦就是給用戶一個個性化的推薦列表。而TopN推薦的預(yù)測準(zhǔn)確度一般通過準(zhǔn)確率和召回率度量匆骗,如下式:
至于準(zhǔn)確率和召回率劳景,我在《淺談機器學(xué)習(xí)基礎(chǔ)》中有特別詳細(xì)的講解,還專門畫了個圖碉就。而且在《淺談自然語言處理基礎(chǔ)》中盟广,我還講了F1測度,F(xiàn)1測度等于(2*準(zhǔn)確率*召回率)/(準(zhǔn)確率+召回率)瓮钥,F(xiàn)1測度越高越好筋量,這樣就給出了判定兩個在準(zhǔn)確度和召回率各有優(yōu)勢算法優(yōu)劣的簡單方法。除了F1測度骏庸,《淺談機器學(xué)習(xí)基礎(chǔ)》還提到了ROC曲線毛甲,用于協(xié)助決策。
其實TopN推薦要比評分預(yù)測更有價值具被,因為判斷用戶對內(nèi)容是否感興趣要比預(yù)測用戶對內(nèi)容的評價更有意義玻募,而且現(xiàn)在新的產(chǎn)品,也已經(jīng)很少用評分來收集用戶反饋了一姿。TopN更直接也更有效七咧。
覆蓋率
覆蓋率描述一個推薦系統(tǒng)對長尾內(nèi)容的發(fā)掘能力跃惫,也就是著力于達成前面的『推薦系統(tǒng)要讓內(nèi)容提供者的內(nèi)容都能被推薦給對其感興趣的用戶』
先給一個最簡單的覆蓋率定義,就是對所有用戶的推薦列表取并集艾栋,看看其是否覆蓋率所有的內(nèi)容爆存,覆蓋比例是多少。
但是上面的定義過于粗糙蝗砾,為了更細(xì)致的描述推薦系統(tǒng)對長尾內(nèi)容的發(fā)掘能力先较,我們選擇統(tǒng)計所有用戶的推薦列表中,不同物品出現(xiàn)次數(shù)的分布悼粮。
如果所有的物品都出現(xiàn)在推薦列表中闲勺,并且出現(xiàn)的次數(shù)差不多,那么推薦系統(tǒng)發(fā)掘長尾的能力就很好扣猫,那么如何度量這種定義下的覆蓋率呢菜循?
前面的文章不止一次的講過熵,熵指混亂程度申尤,熵最大的分布癌幕,就是各種物品出現(xiàn)的概率均勻,熵越小昧穿,就代表分布越集中勺远,混亂程度越小。所以我們可以計算物品分布的熵值粤咪,并希望熵越大越好谚中,熵越大指分布越平均渴杆,推薦系統(tǒng)也就更接近全覆蓋寥枝,而不是只集中在少數(shù)熱門的物品。熵的計算公式這里不給了磁奖,到處都是囊拜。
第二個指標(biāo)是基尼系數(shù),先給出計算公式:
p
函數(shù)是流行度從小到大的排序比搭,ij
是按照流行度從大到小排序物品列表中的第j個物品冠跷。
公式不好理解,這里給張圖:
這張圖怎么解釋呢身诺,黑色曲線表示最不熱門的x%物品的總流行度的流行度占系統(tǒng)的比例y%蜜托,為什么相交在(0, 0)和(1, 1)呢,(0, 0)是說霉赡,空物品的流行度之和占總物品流行度之和的0%橄务,(1, 1)是說,所有物品的流行度之和占總物品流行度之和的100%穴亏,這個很好理解蜂挪。
然后為什么肯定在y=x
之下重挑,考慮這樣一個情況,最均勻的情況棠涮,所有物品的流行度都相同谬哀,那么每增加固定百分比的物品,那增加的流行度在總流行度中占的比例也是固定的严肪,而且也是相同的史煎。看起來很繞驳糯,實際上很容易直觀的感覺出來劲室。
實際上,所有物品的流行度不會是相同的结窘,有熱門物品也有冷門物品很洋,因為是從最不熱門的物品開始計算的,所以剛開始可能很高百分比的冷門物品的流行度也不多隧枫,所以這條線就會在y=x
下面喉磁,增加的非常緩慢;后面到了熱門物品官脓,很少的熱門物品就能增加很多的流行度协怒,所以這條曲線增加的速度開始越來越快,最后到達(1, 1)卑笨。
然后基尼系數(shù)就是SA/(SA+SB)了孕暇,基尼系數(shù)越小,就越接近y=x
赤兴,最理想情況下妖滔,基尼系數(shù)為0,流行度完全均勻分布桶良。
社會學(xué)中有種現(xiàn)象叫做馬太效應(yīng)座舍,強者愈強,弱者愈弱陨帆。這樣曲秉,越熱門的物品會越熱門,越冷門的物品越會無人問津疲牵,推薦系統(tǒng)就希望盡量消除這種馬太效應(yīng)承二,讓冷門物品也能找到對自己感興趣的用戶,讓用戶也不必只看排行榜纲爸,自己的興趣和需求也能得到更好的滿足亥鸠。所以我們先根據(jù)初始用戶行為(根據(jù)用戶行為定義的熱門/冷門)計算物品的基尼系數(shù),然后再根據(jù)推薦系統(tǒng)行為(根據(jù)推薦系統(tǒng)的推薦次數(shù)定義的熱門/冷門)計算物品的基尼系數(shù)缩焦,如果后者的基尼系數(shù)反而大了读虏,那說明推薦算法加劇了馬太效應(yīng)责静。
稍微解釋一下,如果推薦系統(tǒng)只瘋狂推薦某一種物品盖桥,其他物品都不推薦灾螃,這樣的馬太效應(yīng)就反而更甚于初始的情況了,又會進一步加劇整個生態(tài)的馬太效應(yīng)揩徊。只有推薦系統(tǒng)對物品均勻的推薦腰鬼,初始的熱門/冷門物品的推薦次數(shù)都差不多,才能讓初始的冷門產(chǎn)品熱起來塑荒。
多樣性
多樣性描述了推薦列表中物品兩兩之間的不相似性熄赡,推薦系統(tǒng)的整體多樣性可以定義為所有用戶推薦列表多樣性的平均值。
相似性或者不相似性的度量方式有多種齿税,比如用物品的內(nèi)容相似度彼硫,我們就可以得到內(nèi)容多樣性函數(shù);如果用協(xié)同過濾的相似度函數(shù)描述物品之間的相似度凌箕,就可以得到協(xié)同過濾的多樣性函數(shù)拧篮。
其實提高覆蓋率也能在側(cè)面對提高多樣性起到積極作用。
新穎性
新穎的推薦是指給用戶推薦那些他們之前沒聽說過的物品牵舱,最簡單的方式當(dāng)然是串绩,把那些用戶之前在系統(tǒng)中有過行為的物品從推薦列表中過濾掉。
還有種方式是讓推薦結(jié)果中物品的平均熱門程度較低芜壁,這樣就更可能有較高的新穎性礁凡。犧牲精度提高新穎性是很容易的,困難的是不犧牲精度慧妄,同時提高新穎性顷牌。
驚喜度
驚喜度是,如果推薦結(jié)果和用戶的歷史興趣不相似腰涧,但卻讓用戶覺得滿意韧掩。提高推薦驚喜度需要提高用戶滿意度,同時降低推薦結(jié)果和用戶歷史興趣的相似度窖铡。
新穎度和驚喜度的區(qū)別在,新穎度說的是沒聽過的物品坊谁,沒聽過的物品是有可能與用戶的歷史興趣相似的费彼,就沒有了驚喜度。驚喜度可以說是新穎度的升級口芍,因為沒聽過的物品中包含與歷史興趣相似的和不相似的物品箍铲。也許驚喜度的核心在于讓用戶無法理解推薦原因。
信任度
信任度是指用戶對于推薦系統(tǒng)的信任程度鬓椭。我們可以通過提供給用戶推薦理由以及利用用戶的好友/信任的人的信息給用戶做推薦來提高信任度颠猴。
但是其實很多情況下关划,對于一些很容易直觀感受到推薦結(jié)果好壞的物品,比如音樂翘瓮,信任度就不那么重要了贮折。
實時性
在很多網(wǎng)站中,因為物品具有很強的實時性资盅,比如新聞调榄、微博等,所以推薦系統(tǒng)的實時性就顯得至關(guān)重要呵扛。
推薦系統(tǒng)的實時性包含兩部分每庆,一部分是推薦系統(tǒng)需要實時地更新推薦列表來滿足用戶新的需求;另一部分是推薦系統(tǒng)需要能夠?qū)⑿录尤胂到y(tǒng)的物品推薦給用戶今穿。
實時性對完成推薦系統(tǒng)的冷啟動也有著重要作用缤灵。
健壯性
健壯性指一個推薦系統(tǒng)防止作弊的能力。
設(shè)計推薦系統(tǒng)時蓝晒,應(yīng)盡量使用代價比較高的用戶行為凤价。在使用數(shù)據(jù)前,可以進行攻擊檢測拔创,從而對數(shù)據(jù)進行清理利诺。
商業(yè)目標(biāo)
推薦系統(tǒng)也需要滿足自身商業(yè)目標(biāo)的需求。
總結(jié)
在上面提到的指標(biāo)里剩燥,預(yù)測準(zhǔn)確度慢逾、覆蓋率、多樣性灭红、新穎性是可以離線計算的侣滩。實際評測算法時,我們一般采用預(yù)測準(zhǔn)確度的正確率和召回率变擒,覆蓋率君珠,還有推薦商品的平均流行度。
綜合一下上面的指標(biāo)娇斑,我們前面說了三個目標(biāo)策添,分別是讓用戶滿意、讓物品提供者滿意毫缆、讓推薦系統(tǒng)滿意唯竹。用戶滿意度對應(yīng)第一個目標(biāo),覆蓋率對應(yīng)第二個目標(biāo)苦丁,商業(yè)目標(biāo)對應(yīng)第三個目標(biāo)浸颓。因為用戶滿意度不容易獲得,所以實際上預(yù)測準(zhǔn)確度替代用戶滿意度成為了最重要的指標(biāo)。然后我們回到推薦列表上产上,將其與物品類型結(jié)合棵磷,物品種類多就是多樣性;將其與用戶認(rèn)知結(jié)合晋涣,用戶沒聽過就是新穎性仪媒。驚喜度是新穎性的升級。然后是整個推薦系統(tǒng)姻僧,推薦系統(tǒng)需要實時性和健壯性规丽,來穩(wěn)定保證好的推薦結(jié)果。而且有的場景的推薦系統(tǒng)還要考慮到用戶對推薦系統(tǒng)的信任度的問題撇贺。
這樣就把這十個指標(biāo)串起來了赌莺,也更方便記憶。
當(dāng)然我們在采用以上指標(biāo)進行評測時松嘶,也要考慮到評測的用戶維度艘狭、物品維度、時間維度翠订,也就是涉及評測的用戶群巢音,物品的種類屬性和評測的季節(jié)、時間等尽超。這可以讓我們發(fā)現(xiàn)不同算法在不同場景下的優(yōu)缺點官撼。
利用用戶行為數(shù)據(jù)
實現(xiàn)個性化推薦最理想的情況,是用戶告訴我們他喜歡什么似谁,但這種方法有三個缺點:
- 第一個是傲绣,現(xiàn)在的自然語言處理技術(shù)還很難理解用戶用來描述興趣的自然語言;
- 第二個是巩踏,用戶的興趣是不斷變化的秃诵;
- 第三個是,用戶也不知道自己喜歡什么塞琼,或者說菠净,用戶也很難用語言描述自己喜歡什么。
這里考慮代入HMM的思想彪杉,用戶的需求會不斷變化毅往,就是狀態(tài)序列。而且這個狀態(tài)序列是隱藏的在讶,也就是我們無法直接獲知用戶的興趣煞抬,不管是因為用戶自己沒意識到還是無法表達。我們需要通過觀察序列构哺,也就是用戶的行為數(shù)據(jù)去做推測,去根據(jù)EM算法估計這個HMM的參數(shù)扒磁,然后再用其來得到用戶的需求序列效览,也就是隱狀態(tài)序列。
基于用戶行為分析的算法是個性化推薦系統(tǒng)的重要算法瑞侮,學(xué)術(shù)界一般將這種算法稱為協(xié)同過濾算法碟嘴。
我們能拿到的用戶行為一般分為兩種溪食,顯性反饋行為和隱性反饋行為,顯性反饋行為就是點擊喜歡不喜歡娜扇,或者評5分1分错沃。隱性反饋行為指的是那些不能明確反應(yīng)用戶喜好的行為。最具代表性的隱性反饋行為就是頁面瀏覽行為雀瓢,雖然不明確枢析,但數(shù)據(jù)量更大。而且隱性反饋只有正反饋刃麸,沒有負(fù)反饋醒叁。
即便是反饋也分為有無上下文,實際上就是是否記錄了用戶反饋行為的時間以及前后行為泊业,這里先只考慮無上下文的隱性反饋數(shù)據(jù)集把沼。
用戶行為分析
用戶活躍度和物品流行度的分布
互聯(lián)網(wǎng)上的很多數(shù)據(jù)其實都滿足長尾分布,也叫PowerLaw分布吁伺,我在《淺談自然語言處理基礎(chǔ)》中還提到過饮睬,就是講平滑方法,古德圖靈估計法那里篮奄。里面提到了Zipf定律捆愁,也即,如果將英文單詞出現(xiàn)的頻率按照由高到低排列宦搬,則每個單詞出現(xiàn)的頻率和它在熱門排行榜中排名的常數(shù)次冪成反比牙瓢。也可以這么說,如果x1
间校,x2
矾克,x3
是三個熱門排名相鄰的三類單詞,x1
最靠前憔足,那么出現(xiàn)的頻率x2/x1 < x2/x3
胁附,也就是最開始下降的最快,然后下降速度越來越慢滓彰。
我們發(fā)現(xiàn)控妻,用戶活躍度和物品流行度都滿足長尾分布。
用戶活躍度和物品流行度的關(guān)系
我們認(rèn)為揭绑,新用戶傾向于瀏覽熱門的物品弓候,老用戶會逐漸開始瀏覽冷門的物品郎哭。用戶越活躍,越傾向于瀏覽冷門的物品菇存。
僅僅基于用戶數(shù)據(jù)設(shè)計的推薦算法一般稱為協(xié)同過濾算法夸研,協(xié)同過濾算法也分為不同種類,比如基于鄰域的方法依鸥、隱語義模型亥至、基于圖的隨機游走算法等。其中應(yīng)用的最廣的是基于鄰域的方法贱迟,而基于鄰域的方法主要包括以下兩種:
- 基于用戶的協(xié)同過濾算法:給用戶推薦和他興趣相似的用戶喜歡的物品
- 基于物品的協(xié)同過濾算法:給用戶推薦和他之前喜歡的物品相似的物品
簡便起見姐扮,我們通常使用準(zhǔn)確率、召回率衣吠、覆蓋率和新穎度來對算法進行離線實驗茶敏,覆蓋率就用最簡單的覆蓋率定義,新穎度用推薦物品的平均流行度代替蒸播。
基于鄰域的算法
基于用戶的協(xié)同過濾算法
基于用戶的協(xié)同過濾算法主要包括兩個步驟:
- 找到和目標(biāo)用戶興趣相似的用戶集合
- 找到這個集合中的用戶喜歡的睡榆,且目標(biāo)用戶沒有聽說過的物品推薦給目標(biāo)用戶
第一步的關(guān)鍵就是找到和目標(biāo)用戶興趣相似的用戶,我們可以用兩個用戶興趣的交集比上興趣的并集來求得相似度(Jaccard相似度)袍榆,或者利用余弦相似度計算胀屿。
如果用余弦相似度:
分子是兩個用戶興趣交集的模,分母是兩個用戶興趣的模的乘積的平方根包雀。
要注意的是宿崭,有很多用戶之間根本就沒有興趣的交集,所以就不需要浪費時間在這種情況的計算上才写。
得到用戶之間的興趣相似度之后葡兑,UserCF算法會推薦給用戶和他興趣最相似的K個用戶最喜歡的若干個物品。
判斷該用戶u
對某一件物品i
的感興趣程度時的公式如下:
也即用K個和他興趣最相似用戶的平均興趣代表這個用戶的興趣赞草。w
代表兩個用戶興趣之間的相似程度讹堤,r
指感興趣程度的大小,這里統(tǒng)一為1厨疙。Σ下面的意思是洲守,K個和u
興趣最相似的用戶,而且同時要對物品i
有過行為沾凄」4迹可以這么理解,如果這K個用戶都沒有對某個物品有過行為撒蟀,那基本就可以認(rèn)為他們對該物品都不感興趣叙谨,就不應(yīng)該加到式子中。
換句話說保屯,這K個用戶手负,與用戶u
的相似度決定了他們的話語權(quán)涤垫,他們表決的方式就是自己是否對該物品有過正面行為。
最后我們只需要取感興趣程度TopN的物品出來推薦給用戶就好了虫溜,當(dāng)然還要去掉該用戶已經(jīng)有過行為的物品雹姊。
K是UserCF算法的一個重要參數(shù)股缸。K的選取會影響UserCF算法的結(jié)果衡楞。
一般進行算法評測時,我們會有兩個標(biāo)準(zhǔn)算法敦姻,分別是MostPopular和Random算法瘾境,一個是按最高流行度來,一個是完全隨機镰惦,都只是簡單的去掉用戶有過行為的物品迷守。
UserCF算法的平均性能要遠(yuǎn)好于以上兩個算法。
當(dāng)然UserCF算法也有改進的空間旺入,比如在計算用戶相似度的時候兑凿,大家同樣購買了熱門物品其實沒有什么說服力,并不能以此說明兩個用戶就相似了茵瘾,所以我們需要對熱門物品進行降權(quán)礼华,如下式:
該公式與原公式相比,懲罰了用戶u
和用戶v
共同興趣列表中熱門物品對他們相似度的影響拗秘。這里先提一下TF-IDF圣絮,后面還要提,《淺談機器學(xué)習(xí)基礎(chǔ)》中講K-means的時候就講過TF-IDF雕旨,TF-IDF里的這個IDF扮匠,就是對出現(xiàn)在幾乎所有文檔中的熱門詞進行降權(quán)懲罰。
基于物品的協(xié)同過濾算法
基于物品的協(xié)同過濾算法是目前業(yè)界應(yīng)用最多的算法凡涩。
如果網(wǎng)站的用戶數(shù)目增加較快棒搜,計算用戶興趣的相似度矩陣就越來越難。而ItemCF算法不計算用戶興趣的相似度矩陣活箕,而是計算物品之間的相似度力麸。還有,我們前面說過基于鄰域的這兩個算法都是協(xié)同過濾算法讹蘑,協(xié)同過濾算法的定義就是只使用用戶行為數(shù)據(jù)末盔,所以這里所定義的物品的相似度,不利用物品本身的內(nèi)容信息去計算座慰,而是主要通過分析用戶的行為記錄計算物品之間的相似度陨舱。
如果喜歡A的用戶大多都喜歡B,那么A和B可以講擁有一定的相似性版仔。或者說游盲,就算不相似误墓,那我們把B推薦給喜歡A的用戶也是沒錯的。
基于物品的協(xié)同過濾算法主要分為兩步:
- 計算物品之間的相似度
- 根據(jù)物品的相似度和用戶的歷史行為給用戶生成推薦列表
我們可以用下面的公式定義物品之間的相似度:
意思就是益缎,買了i
的用戶有多少也買了j
谜慌。如果兩者的用戶群重合比例越大,那么認(rèn)為i
和j
就更相似莺奔。
但是還有個問題欣范,就是如果按照上面的公式算,所有的物品都和熱門商品相似令哟,如果j
是大熱門商品的話恼琼,基本上喜歡i
的全都喜歡j
,這樣就有問題屏富,為了提高覆蓋率晴竞,我們要對熱門物品進行懲罰:
上面的式子就對熱門物品的權(quán)重進行了懲罰。
得到物品的相似度之后狠半,ItemCF通過如下公式計算用戶u
對物品i
的興趣:
與UserCF對比著來說噩死,UserCF是用K個和用戶u
興趣最相似用戶的平均興趣代表這個用戶u
的興趣;ItemCF就是用K個和物品j
最相似的物品來代表這個物品j
神年。UserCF是已维,這K個用戶,與用戶u
的相似度決定了他們的話語權(quán)瘤袖,他們表決的方式就是自己是否對該物品有過正面行為衣摩;ItemCF是,這K個物品捂敌,與物品j
的相似度決定了他們的話語權(quán)艾扮,他們表決的方式就是自己是否被該用戶有過正面行為。
然后我們再回到物品相似度占婉,雖然上面已經(jīng)給熱門物品降了權(quán)泡嘴,但是我們還要考慮到熱門用戶的問題。我們認(rèn)為逆济,一個活躍用戶可能會喜歡很多種類的物品酌予,他對物品相似度的貢獻應(yīng)該小于不活躍的用戶,因為不活躍的用戶往往喜歡比較專一奖慌,在衡量物品相似度上更有價值抛虫,這叫IUF(Inverse User Frequence)。如下式:
又進一步對活躍用戶進行了降權(quán)简僧。
另外建椰,在有物品分類的情況下,我們需要對類內(nèi)物品相似度進行歸一化岛马,因為通常熱門類別類內(nèi)相似度也較高棉姐。如果一個用戶同時喜歡了熱門類別和非熱門類別的物品屠列,如果純按照相似度推薦,那就會都推薦給用戶熱門類別中的物品伞矩,會降低覆蓋度笛洛、多樣性。所以我們利用類內(nèi)最大的相似度乃坤,對類內(nèi)所有的相似度進行歸一化苛让。
UserCF和ItemCF的綜合比較
主要從兩個方面來講,第一個侥袜,UserCF的推薦結(jié)果著重于反應(yīng)和用戶興趣相似的小群體的熱點蝌诡,著重于維系用戶的歷史興趣,因為就是根據(jù)歷史興趣計算出來的相似用戶枫吧,進而計算出來的推薦商品。而ItemCF的推薦更加個性化宇色,反映用戶自己的興趣傳承九杂,因為一旦用戶的興趣有了更新,喜歡了新物品宣蠕,那么與該物品相關(guān)的物品在參與ItemCF進行計算時例隆,就會馬上有權(quán)重提高,被推薦出來抢蚀。
這么說镀层,UserCF幫你找了一些用戶來代表你,他們的興趣是不可能統(tǒng)一的發(fā)生大幅改變的皿曲,所以你得到的推薦結(jié)果都是這一類的東西唱逢;而ItemCF,一旦你興趣列表變了屋休,那接著就認(rèn)為你興趣變了坞古,喜歡你這個新興趣的人喜歡的物品就會被推薦給你。
UserCF認(rèn)為喜歡同樣物品的人相似劫樟,ItemCF認(rèn)為被同樣人喜歡的物品相似痪枫。UserCF對用戶聚類,整體對待他們的喜好叠艳,ItemCF對物品聚類奶陈,喜歡一個就是喜歡一堆。
對于UserCF和ItemCF附较,再舉一下典型的例子吃粒,首先是新聞網(wǎng)站,新聞網(wǎng)站必然要用UserCF翅睛,相似用戶的興趣基本相同声搁,沒問題黑竞;如果用了ItemCF,難道要推薦和這篇新聞相似的舊新聞疏旨?當(dāng)然這兩種方法也不是一定要絕對分開很魂。
比如音樂網(wǎng)站,網(wǎng)易云音樂的推薦算法檐涝,就更接近ItemCF遏匆,你喜歡了一種新風(fēng)格,這一風(fēng)格的歌就會被推薦給你谁榜,而不是認(rèn)為你一輩子只喜歡聽一種類型的音樂幅聘,把你和與過去的你相似的人綁在一起。
第二個是從技術(shù)角度想窃植,物品和用戶表帝蒿,哪個穩(wěn)定就用哪個建模。物品迅速增加那就建立用戶相似度表巷怜,用戶迅速增加就建立物品相似度表葛超。
隱語義模型
隱語義模型(latent factor model,LFM)是最近幾年推薦系統(tǒng)最為熱門的研究話題延塑,它的核心思想是通過隱含特征聯(lián)系用戶興趣和物品绣张。
前面已經(jīng)詳細(xì)的介紹了UserCF和ItemCF,這里說一下LFM的主要思想关带,首先回憶一下SVD侥涵,SVD將矩陣拆解為三部分的乘積∷纬《淺談機器學(xué)習(xí)基礎(chǔ)》中這樣講過:
SVD的第二個用途是在自然語言處理中芜飘,我在《數(shù)學(xué)之美》這本書上讀到。我們用A矩陣來描述成千上萬篇文章和幾十上百萬個詞的關(guān)聯(lián)性好芭,A里面每一列是一篇文章燃箭,每一行代表一個詞,對應(yīng)位置上是這個詞的加權(quán)詞頻(比如TF-IDF值)舍败,然后我們對A進行奇異值分解招狸,分成這樣:A=XBY,這里和前面的:A=XY的關(guān)聯(lián)性在于邻薯,兩式的X相同裙戏,第二式的Y等于第一式中的BY,X是M*K厕诡,B是K*K累榜,Y是K*N。
第一個矩陣X是對詞分類的結(jié)果,它的每一行表示一個詞壹罚,每一列表示一個同義詞類葛作,對應(yīng)位置的值表示該詞和該同義詞類的相關(guān)性大小。
第三個矩陣Y是對文章分類的結(jié)果猖凛,它的每一列對應(yīng)一篇文章赂蠢,每一行表示一個主題,對應(yīng)位置的值表示該文章和該主題的相關(guān)性大小辨泳。
第二個矩陣則展示了不同同義詞類和不同文章主題的相關(guān)性大小虱岂。
推薦系統(tǒng)這里也是同理,如果將原數(shù)據(jù)按照SVD分解成三個矩陣的話菠红,所得到的就是對用戶興趣的分類第岖、對物品的分類以及用戶興趣類別與物品類別之間的關(guān)系。當(dāng)然我們也知道SVD不僅能分解成三個矩陣的形式试溯,也能分解為兩矩陣的形式蔑滓,意義是用戶興趣與某隱類的關(guān)系和該隱類與物品的關(guān)系。SVD的詳細(xì)講解可以參考前面的《淺談機器學(xué)習(xí)基礎(chǔ)》耍共,其實下面要講的LFM方法烫饼,也就是《淺談機器學(xué)習(xí)基礎(chǔ)》所講的,SVD在推薦系統(tǒng)中的應(yīng)用试读。
當(dāng)然對用戶興趣和物品進行分類這件事情人工也是可以做的,但成本較大荠耽,而且效果也并不太好钩骇,所以這里就不詳細(xì)說了。
隱含語義分析技術(shù)其實有很多著名的模型和方法铝量,其中和該技術(shù)相關(guān)的有pLSA倘屹、LDA、隱含類別模型慢叨、隱含主題模型纽匙、矩陣分解等。這些方法在本質(zhì)上是相通的拍谐。這里主要講解LFM烛缔。
LFM通過如下公式計算用戶u
對物品i
的興趣:
累加式子中的p
代表用戶u
的興趣和第k
個隱類之間的關(guān)系,q
代表第k
個隱類和物品i
之間的關(guān)系轩拨。對所有隱類求和的結(jié)果就是總的興趣程度践瓷。
這其實是種機器學(xué)習(xí)方法,模型就是這個模型亡蓉,然后我們可以用平方誤差來做損失函數(shù)晕翠,就是給定訓(xùn)練集下,度量用戶感興趣與否的實際情況與預(yù)測結(jié)果是否相符砍濒,再用梯度下降最小化損失函數(shù)淋肾,減小模型預(yù)測結(jié)果與實際情況的誤差硫麻,最終收斂就可以了。我們還可以在損失函數(shù)中添加正則項來防止過擬合樊卓。這些都是《淺談機器學(xué)習(xí)基礎(chǔ)》里面反復(fù)講過的東西拿愧。
而且為了應(yīng)對隱性反饋數(shù)據(jù)集只有正樣本的情況,我們傾向于從用戶沒有行為的熱門物品中選取適量(與正樣本數(shù)平衡)的負(fù)樣本简识。適量就不用說了赶掖,選擇熱門物品的原因在于,物品熱門而用戶對其無正面反饋七扰,比冷門物品更能說明用戶對其不感興趣奢赂,而不是因為也許根本就沒有發(fā)現(xiàn)。
LFM還有個問題颈走,就是它很難實現(xiàn)實時的推薦膳灶,因為經(jīng)典的LFM模型每次訓(xùn)練時都要掃描所有的用戶行為記錄,不是分分鐘就能訓(xùn)練好就能更新用戶隱類向量p
和物品隱類向量q
的立由。如果要將LFM應(yīng)用在新聞網(wǎng)站這種內(nèi)容實時更新的系統(tǒng)中轧钓,那是肯定無法滿足需求的。
雅虎為了解決傳統(tǒng)LFM不能實時化的問題锐膜,提出了一個解決方案毕箍,公式如下:
后面那部分就是原先的用戶隱類向量和物品隱類向量,幾個小時更新一次道盏。實時性體現(xiàn)在前面的式子上而柑,x
是根據(jù)用戶歷史行為特別訓(xùn)練的用戶向量,y
是根據(jù)物品的內(nèi)容(關(guān)鍵詞荷逞、屬性媒咳、種類)去生成的物品內(nèi)容特征向量。這樣兩者的乘積就能實時的估計出用戶對該物品的興趣种远,幾小時后涩澡,通過傳統(tǒng)的LFM就能得到更精確的數(shù)據(jù)。
就像上面說的坠敷,LFM與基于鄰域的這兩種方法UserCF和ItemCF相比妙同,LFM不能在線實時推薦,需要提前訓(xùn)練好模型常拓,而ItemCF可以渐溶,至于UserCF,只要和他相似的用戶喜歡了新的物品弄抬,也可以做到實時推薦茎辐。
基于圖的方法較麻煩,而且效果也比不上LFM,這里就不詳細(xì)說了拖陆。
推薦系統(tǒng)冷啟動問題
前面我們講過如何使用用戶行為數(shù)據(jù)去設(shè)計一個推薦系統(tǒng)弛槐,但是推薦系統(tǒng)該如何完成冷啟動?
冷啟動問題主要分為三種依啰,一種是用戶冷啟動乎串,對于一個新用戶,我們沒有他的歷史行為數(shù)據(jù)速警,該怎么為其做個性化推薦叹誉;第二種是物品冷啟動,就是如何將新的物品推薦給可能對它感興趣的人闷旧;第三種是系統(tǒng)冷啟動长豁,也就是整個系統(tǒng)沒有用戶,只有一些物品的信息忙灼,該怎么辦匠襟。
利用專家做初始標(biāo)注
我們可以利用專家在若干個維度上對物品完成初始標(biāo)記,后面再利用機器學(xué)習(xí)算法去計算相似度该园。這里不詳細(xì)說了酸舍。
利用用戶注冊信息
比如我們可以利用用戶的人口統(tǒng)計學(xué)信息、用戶興趣描述(很少)里初、從其他網(wǎng)站導(dǎo)入的用戶站外行為數(shù)據(jù)啃勉。
我們可以計算擁有每種特征的人對各個物品的喜好程度盯荤,比如可以簡單的定義為喜歡某種物品的人在擁有這種特征的人中所占的比例辑莫,而且我們還要注意要對熱門物品降權(quán)汽馋,免得給所有特征的人都推薦熱門物品论悴。
選擇合適的物品啟動用戶的興趣
比如我們可以在用戶注冊后給用戶提供一些物品,讓用戶反饋他們對這些物品的興趣烤镐。
那啟動物品集合該怎么選?該怎么設(shè)置題目給新用戶做才最有效果?
回想一下《淺談機器學(xué)習(xí)基礎(chǔ)》里講的決策樹算法哑诊,這也就是一個對用戶的分類問題,決策樹算法里面及刻,我們的思想是依次選擇讓整個數(shù)據(jù)集熵減小最大的特征對用戶進行劃分镀裤。如果我們已經(jīng)擁有對用戶興趣的劃分,也即可以方便的計算熵缴饭,那直接用決策樹算法是最好的暑劝,但是如果我們沒有,那也可以選擇一種近似的決策樹算法颗搂。
不過與決策樹的思想相同担猛,仍然要去選擇區(qū)分度最大的物品對用戶進行分類,我們可以用用戶對物品評分的方差來度量,方差越大說明意見分歧越大傅联,越有區(qū)分度先改。我們先選擇最有區(qū)分度的物品對用戶分類,然后再對不同類別的用戶選擇對該類別下的用戶最有區(qū)分度的物品進行分類蒸走,不斷迭代仇奶。在決策樹算法中,我們用熵減比驻,或者叫信息增益定義物品的區(qū)分度该溯,而這里我們用的是評分方差。
利用社交網(wǎng)絡(luò)
我們可以導(dǎo)入用戶在其他系統(tǒng)中的社會化關(guān)系别惦,然后按照UserCF算法的思想狈茉,把與用戶有好友關(guān)系的用戶臨時當(dāng)做相似用戶,熟悉度替代相似度來使用UserCF算法進行推薦步咪。
如果推薦系統(tǒng)是直接用來起到推薦好友的作用论皆,那要考慮到網(wǎng)站的類型,如果用戶的目的是為了獲取內(nèi)容猾漫,那盡量為其推薦與他愛好相似的用戶点晴;如果用戶的目的是認(rèn)識熟人,那根據(jù)社交關(guān)系鏈推薦會更有效果悯周,比如推薦給他朋友的朋友粒督,利用手機通訊錄也是很好的選擇。
還有一種是信息流推薦禽翼,這里也一并講了屠橄,F(xiàn)acebook的EdgeRank是很流行的信息流推薦算法,該算法綜合考慮了每個會話的時間闰挡、長度和與用戶興趣的相似度锐墙。
比如這樣定義一條對話的權(quán)重:
u
指產(chǎn)生行為的用戶和當(dāng)前用戶的熟悉度,熟悉度可以用共同好友數(shù)量來衡量长酗;w
指行為的權(quán)重溪北,比如原創(chuàng)、評論夺脾、點贊之拨、轉(zhuǎn)發(fā)等,不同的行為應(yīng)該有不同的權(quán)重咧叭;d
指時間權(quán)重蚀乔,越早的行為權(quán)重越低。
除了上面這些社會化因素之外菲茬,我們還可以進一步考慮用戶本身對會話內(nèi)容的偏好吉挣,比如會話的長度派撕、會話話題與用戶興趣之間的相關(guān)性,這樣再結(jié)合前面的社會化屬性听想,就會比較全面了腥刹。
利用物品的內(nèi)容信息
其實UserCF算法對物品冷啟動并不敏感,新加入的物品汉买,如果有推薦系統(tǒng)之外的方式能讓用戶看到衔峰,只要一個用戶群中有一個人喜歡了,那這個物品就會擴散開來蛙粘,然后又帶動了進一步擴散垫卤。離線訓(xùn)練的用戶相似度表是不需要動的。
但是ItemCF算法就不行了出牧,對于新的物品穴肘,我們根本不知道它跟哪些物品相似,推薦系統(tǒng)就推薦不出來它舔痕,這涉及到物品相似度表评抚,解決方案只能是頻繁的更新相關(guān)表了,比如半小時更新一次伯复。
我們還可以利用物品的內(nèi)容信息來解決基于ItemCF的推薦系統(tǒng)的冷啟動問題慨代,我們可以將物品通過向量空間模型表示,維度可以是一些導(dǎo)演啸如、演員之類的實體侍匙,如果內(nèi)容是文本的,可以利用NLP技術(shù)抽取一些關(guān)鍵詞叮雳,也就是《淺談自然語言處理基礎(chǔ)》里面提過的命名實體識別想暗。
這樣我們就得到了物品的一個關(guān)鍵詞向量,里面的維度是較能夠體現(xiàn)物品特征的關(guān)鍵詞帘不,然后再回想一下TF-IDF算法说莫,我們就把一個個物品當(dāng)成一篇篇文章,一個個關(guān)鍵詞當(dāng)做文章里的詞寞焙。如果物品真的是文本唬滑,那就可以直接用TF-IDF算法,把每個維度替換成相應(yīng)的TF-IDF值棺弊;如果不是文本,可以根據(jù)知識擒悬,人工的賦予TF權(quán)重模她,當(dāng)然還可以計算出相應(yīng)的IDF值來使模型更為精確。
然后我們的關(guān)鍵詞向量就可以利用余弦相似度去參與計算物品的內(nèi)容相似度了懂牧。對物品歸類的話侈净,可以直接用KNN尊勿,這樣就得到了內(nèi)容過濾算法ContentItemKNN。
內(nèi)容過濾算法忽視了用戶行為畜侦,從而也忽視了物品的流行度以及用戶行為中所包含的規(guī)律元扔,所以它的精度比較低,但新穎度卻比較高旋膳。
為了優(yōu)化內(nèi)容過濾算法澎语,這里提出主題模型LDA(Latent Dirichlet Allocation),先說一下LDA和LFM的關(guān)系验懊,它們最相似的部分都是發(fā)現(xiàn)內(nèi)容背后的隱含主題擅羞,但其它的關(guān)系真是不大,有人講它們是雷鋒和雷峰塔义图,Java和Javasript的關(guān)系减俏。
LFM用的是矩陣分解的思想,然后梯度下降去學(xué)習(xí)碱工,與SVD的思想相似娃承。
而LDA由pLSA、LSA這兩種主題模型演化而來怕篷,這里詳細(xì)講解一下历筝,參考了主題模型-LDA淺析,不過我覺得我講的好理解得多_(:з」∠)_
LDA模型對的基本思想是匙头,一篇文章的每個詞都是通過以一定概率選擇了某個主題漫谷,并從這個主題中以一定概率選擇某個詞語來得到的。
我們先引入一個問題蹂析,如何生成M篇文章舔示,每篇文章包含N個單詞。
先說第一種最簡單的方法:
我們先搞一批訓(xùn)練語料电抚,學(xué)出單詞w
的概率分布p(w)
惕稻,然后把這個分布用N次,得到一篇N個單詞的文章蝙叛,然后把這個方法用M次俺祠,得到M篇N個單詞的文章。實際上也就是連著用p(w)
這個分布M*N次借帘。
這個方法的缺點就是單詞沒有主題蜘渣,沒有聯(lián)系,亂七八糟肺然。
然后是第二種方法:
這種方法增加了主題z
蔫缸,主題z
也有主題的分布p(z)
。
先只看圖际起,這個z
在方框N外面拾碌,說明一篇N個詞的文章只有一個主題吐葱;其次,這個z
在方框M里面校翔,M篇不同的文章有不同的主題z
弟跑。
這樣,這M篇文章防症,我們?yōu)槊恳黄恼露枷雀鶕?jù)p(z)
生成一個z
孟辑,然后在這篇文章內(nèi),再使用N次條件概率p(w|z)
生成N個單詞告希,由此得到M篇N個單詞的文章扑浸。一個任務(wù)里面有M篇不同主題的文章,每篇文章的單詞都是根據(jù)自己的主題生成的燕偶。
這個方法的缺點在于喝噪,每篇文章里只能有一個主題。
然后就是LDA方法了:
LDA一下子多了三個參數(shù)α指么、β和θ酝惧,我們先只看圖,我們發(fā)現(xiàn)主題z
放在了方框N里面伯诬,說明N個詞晚唇,每個詞都有自己的主題了,一個詞的分布就成了p(w|z)*p(z)
盗似。然后我們看到θ哩陕,θ是一個主題向量,決定了p(z)
赫舒,θ在方框N外面悍及,說明每篇文章的N個詞都有一個相同的θ,用于決定這篇文章內(nèi)所有N個詞的p(z)
接癌。θ在方框M里面心赶,說明M篇文章,每篇文章都有一個不同的θ缺猛,而p(θ)
也就被需要了缨叫,p(θ)
是θ的分布,具體為Dirichlet分布荔燎,決定每篇文章的所有N個詞都對應(yīng)哪一個θ耻姥。然后再外面是α,α在方框M外面有咨,也就說對于一個任務(wù)的這M篇文章咏闪,都是同一個α,而這個α決定了p(θ)
摔吏。此外還有一個β鸽嫂,這個β是希望,詞的分布概率不只被z
決定征讲,也即詞的分布不是p(w|z)*p(z)
而是p(w|z,β)*p(z)
据某。
上面扯了這么多,都是為了方便理解诗箍,實際上就是這個公式:
這么說癣籽,對于一個任務(wù),我們先給定α滤祖、β(一個任務(wù)一個α筷狼、β),這個α決定了M篇文章都分別對應(yīng)哪個主題向量θ(一篇文章一個θ)匠童,然后每篇文章的主題向量θ決定了這篇文章的主題分布p(z)
埂材,也就是這篇文章每個詞都分別對應(yīng)哪個主題z
(一個詞一個z
)。然后每個詞是由這個詞的z
和β共同決定的汤求。
再精簡一點俏险,一個任務(wù)一個α、β扬绪,一篇文章一個主題向量θ竖独,一個詞一個主題z
,α決定主題向量θ挤牛,主題向量θ決定主題z
莹痢,主題z
和β一塊決定詞w
。
傳統(tǒng)判斷兩個文檔相似性的方法是通過查看兩個文檔共同出現(xiàn)的單詞的多少墓赴,如TF-IDF等竞膳,這種方法沒有考慮到文字背后的語義關(guān)聯(lián),可能在兩個文檔共同出現(xiàn)的單詞很少甚至沒有竣蹦,而LDA是主題模型顶猜,可以通過隱含主題發(fā)現(xiàn)沒有重復(fù)單詞的文檔的相似性。LDA在個性化推薦痘括、社交網(wǎng)絡(luò)长窄、廣告預(yù)測等各個領(lǐng)域的應(yīng)用都非常廣泛。
然后LDA的訓(xùn)練與HMM相似纲菌,采用的也是EM算法挠日,最后會收斂到一個合理的分布上去。
我再嘗試回答幾個更本質(zhì)的問題翰舌。
為什么一個重復(fù)單詞都沒有嚣潜,還能判定文章相似?
用的單詞雖然不重復(fù)椅贱,但都語義上相似懂算。
怎么判斷單詞語義上相似只冻?
出現(xiàn)在了相似文章中。
那這不是個雞生蛋蛋生雞的問題嗎计技?
EM算法就是解決這種雞蛋問題的喜德,回憶《淺談自然語言處理》里面對EM算法的講解即可。
LDA可以合理的將單詞歸類到不同的隱含主題之中垮媒。而且如果文檔的主題向量θ舍悯,也即主題z
的分布較為相似,那我們就可以認(rèn)為兩篇文檔具有較高的相似度睡雇,計算分布的相似度可以用KL散度萌衬,也就是相對熵。
與上下文信息結(jié)合
之前提到的推薦算法主要研究了如何聯(lián)系用戶興趣和物品它抱,將最符合用戶興趣的物品推薦給用戶秕豫,但卻都沒有考慮到上下文。
比如舉幾個例子抗愁,不能因為用戶在夏天喜歡過某件T恤馁蒂,就在冬天也給該用戶推薦類似的T恤;用戶在中關(guān)村打開一個美食推薦系統(tǒng)時蜘腌,不能給他推薦河北省的餐館沫屡;用戶在上班時和下班后的興趣會有區(qū)別,在平時和周末的興趣會有區(qū)別撮珠,甚至上廁所時和在辦公桌旁閱讀的喜好也是不同的沮脖。
時間上下文信息
一般認(rèn)為,時間對用戶興趣的影響表現(xiàn)在用戶的興趣是變化的芯急、物品也是有生命周期的勺届、季節(jié)\節(jié)日效應(yīng)。
推薦系統(tǒng)需要擁有實時性來滿足用戶變化的興趣娶耍,比如用戶一旦產(chǎn)生了新的行為免姿,推薦系統(tǒng)就應(yīng)該有恰當(dāng)?shù)姆磻?yīng)。而且還有一點需要注意的是榕酒,推薦系統(tǒng)需要有時間多樣性胚膊,也就是,即便是用戶實際上沒有進行任何操作想鹰,但我們也不應(yīng)該每天給用戶推薦相同的內(nèi)容紊婉。
比如我們可以在生成推薦結(jié)果時加入一定的隨機性,或者記錄用戶每天看到的推薦結(jié)果辑舷,對這些推薦結(jié)果進行適當(dāng)?shù)慕禉?quán)喻犁,又或者每天給用戶使用不同的推薦算法。
這里我們主要考慮,時間上下文信息對我們經(jīng)典的基于鄰域的兩個算法ItemCF和UserCF能夠起到什么優(yōu)化作用肢础。
對于ItemCF还栓,考慮第一點,用戶在相隔很短的時間內(nèi)喜歡的物品具有更高的相似度传轰;然后是第二點蝙云,用戶近期行為比用戶很久之前的行為,更能體現(xiàn)用戶現(xiàn)在的興趣路召。
對于UserCF,考慮第一點波材,如果兩個用戶同時喜歡相同的物品股淡,那么這兩個用戶應(yīng)該有更大的興趣相似度;然后是第二點廷区,與當(dāng)前用戶最相似的這一組用戶最近的興趣唯灵,應(yīng)該比這組用戶很久之前的興趣更加接近當(dāng)前用戶今天的興趣。
畢竟ItemCF和UserCF都各有兩個過程隙轻,只要將兩個過程分別與時間結(jié)合起來埠帕,很容易就能知道該往哪個方向優(yōu)化。
地點上下文信息
地點上下文與用戶興趣也有一定的關(guān)系玖绿,比如不同城市/國家的人的興趣愛好會有不同敛瓷,這叫興趣本地化,還有用戶往往在附近地區(qū)活動斑匪,一般不會因為要吃個飯坐高鐵去別的地方呐籽,這叫活動本地化。
所以我們在分析用戶行為數(shù)據(jù)時蚀瘸,可以考慮到用戶位置和物品位置狡蝶,當(dāng)然這是一些實體化的服務(wù)提供者需要考慮的問題,如果講網(wǎng)購贮勃,用戶和物品位置對喜好的影響就小多了贪惹,但也并不是完全消失。
推薦系統(tǒng)實例
這里主要是講好四張圖寂嘉,首先是第一張奏瞬,推薦系統(tǒng)和其他系統(tǒng)之間的關(guān)系:
我們通過用戶行為以及其他數(shù)據(jù)設(shè)計推薦系統(tǒng),推薦系統(tǒng)通過前臺頁面與用戶產(chǎn)生交互垫释,所得到的數(shù)據(jù)又被日志系統(tǒng)記錄丝格,處理后又回到用戶行為數(shù)據(jù)庫中,被用來設(shè)計更好的推薦系統(tǒng)棵譬。
然后是第二張显蝌,基于特征的推薦系統(tǒng)架構(gòu)思路:
其實推薦系統(tǒng)做的就是文章最開頭長尾理論里面講的供需相連,就是連接用戶與物品,那么用戶與物品通過什么相連呢曼尊,我們統(tǒng)一的定義其為『特征』酬诀。
比如ItemCF,用戶喜歡了一個物品骆撇,就相當(dāng)于是有了一個特征瞒御,我們根據(jù)這個特征找到相似物品推薦給用戶。
比如UserCF神郊,用戶和某K個用戶最相似肴裙,這就也是一個特征,我們根據(jù)這個特征找到這K個用戶最喜歡的物品推薦給用戶涌乳。
至于LFM蜻懦,那就與本質(zhì)更接近了,它的隱含主題/語義就是特征夕晓。
還有LDA宛乃,LDA與ItemCF其實同理,用戶喜歡了一篇文檔蒸辆,就相當(dāng)于是有了一個特征征炼,那根據(jù)主題向量θ找到相似的文檔推薦給用戶即可。
然后是第三張躬贡,推薦系統(tǒng)的架構(gòu)圖:
我們可以看到推薦系統(tǒng)可以有不止一個推薦引擎谆奥,有了多個推薦引擎,我們可以統(tǒng)籌兼顧逗宜,方便的配置不同特征和任務(wù)的權(quán)重雄右,推薦系統(tǒng)只負(fù)責(zé)將多個推薦引擎的結(jié)果按照一定權(quán)重或者優(yōu)先級合并、排序然后返回纺讲。
然后是第四張擂仍,推薦引擎的架構(gòu)圖:
推薦引擎架構(gòu)主要包括三部分:
- 部分A負(fù)責(zé)從數(shù)據(jù)庫或緩存中拿到用戶行為數(shù)據(jù),通過分析不同行為熬甚,生成當(dāng)前用戶的特征向量逢渔,如果使用非行為特征,就不需要行為提取和分析模塊了乡括,該模塊的輸出就是用戶特征向量肃廓。
- 部分B負(fù)責(zé)將用戶的特征向量通過特征-物品相關(guān)矩陣轉(zhuǎn)化為該推薦引擎的初始推薦物品列表。
- 部分C負(fù)責(zé)對初始的推薦列表進行過濾诲泌、排名等處理盲赊,從而生成該引擎的最終推薦結(jié)果。
部分A和部分B都和算法的選擇有關(guān)敷扫,這里主要說一下部分C哀蘑,首先是過濾模塊,我們通常要過濾掉用戶已經(jīng)產(chǎn)生過行為的物品、過濾掉候選物品以外的物品绘迁、過濾掉某些質(zhì)量很差的商品合溺。
過濾掉候選物品以外的物品有些難理解,意思是缀台,比如說棠赛,有產(chǎn)品需求,是要求推薦這個種類的產(chǎn)品膛腐,或者用戶自主設(shè)置了篩選條件睛约,比如一定的價格區(qū)間或者限定了SPU等。
然后是排名模塊哲身,這個各個算法都有考慮痰腮,不過這里還是統(tǒng)一的說一下,對于各種推薦算法律罢,我們往往都需要對熱門物品進行降權(quán),排名模塊這里往往也需要一個對熱門物品進行降權(quán)的子模塊棍丐,來再一次提高新穎性误辑。而且還可以考慮這樣一個問題,與用戶喜歡的物品相似的熱門物品歌逢,用戶更有可能已經(jīng)知道了巾钉,可以在對熱門物品降權(quán)時著重照顧一下這部分物品。
說完了新穎性秘案,這里提一下多樣性砰苍,如果僅按相似度去計算,很可能推薦出的物品都屬于同一個類別阱高。我們可以將原始推薦結(jié)果按某種內(nèi)容屬性分為幾類赚导,然后推薦每類前幾名的物品。就像星際爭霸比賽赤惊,雖然說是要看實力吼旧,但是也總是要分賽區(qū)的,每個賽區(qū)多少個名額未舟,要是純按實力圈暗,可能所有的名額都是韓國人的了。盡量讓推薦結(jié)果來自不同的特征裕膀。
還有時間多樣性员串,前面也提過了,即便是用戶不操作昼扛,也盡量不讓用戶每天看到相同的推薦內(nèi)容寸齐。可以引入隨機、記錄用戶看過的推薦結(jié)果進行降權(quán)或者直接每天用不同的推薦算法访忿。
排名模塊最重要的部分就是用戶反饋模塊瞧栗,用戶反饋模塊主要是通過分析用戶之前和推薦結(jié)果的交互日志,預(yù)測用戶會對什么樣的推薦結(jié)果比較感興趣海铆,然后根據(jù)用戶的興趣進一步優(yōu)化推薦結(jié)果虎锚。
比如推薦系統(tǒng)的目標(biāo)是提高用戶對于推薦結(jié)果的點擊率,那么可以利用點擊模型預(yù)測用戶是否會點擊推薦結(jié)果农曲。比如搜索結(jié)果的點擊預(yù)測援奢、搜索廣告的點擊預(yù)測、上下文廣告的點擊預(yù)測珍语。
構(gòu)建這個預(yù)測模型首先需要提取特征锤岸,比如:
- 用戶相關(guān)的特征:年齡、性別板乙、活躍度
- 物品相關(guān)的特征:流行度是偷、內(nèi)容屬性、評分
- 物品在推薦列表中的位置
- 用戶之前是否點擊過和推薦物品有同樣推薦解釋的其他推薦結(jié)果
- 用戶之前是否點擊過和推薦物品來自同樣推薦引擎的其他推薦結(jié)果
本篇文章的推薦算法基本以推薦物品的推薦算法為主募逞,上面的架構(gòu)也更傾向于去解決物品推薦問題蛋铆,不太適合解決社會化推薦問題。