深度學(xué)習(xí)在推薦領(lǐng)域的應(yīng)用

作者:溫利武? ? 班級:1402019? ? ? 學(xué)號:14020199041

【嵌牛導(dǎo)讀】:當(dāng)2012年Facebook在廣告領(lǐng)域開始應(yīng)用定制化受眾(Facebook Custom Audiences)功能后,“受眾發(fā)現(xiàn)”這個(gè)概念真正得到大規(guī)模應(yīng)用,什么叫“受眾發(fā)現(xiàn)”?如果你的企業(yè)已經(jīng)積累了一定的客戶,無論這些客戶是否關(guān)注你或者是否跟你在Facebook上有互動(dòng),都能通過Facebook的廣告系統(tǒng)觸達(dá)到。“受眾發(fā)現(xiàn)”實(shí)現(xiàn)了什么功能?在沒有這個(gè)系統(tǒng)之前,廣告投放一般情況都是用標(biāo)簽去區(qū)分用戶,再去給這部分用戶發(fā)送廣告,“受眾發(fā)現(xiàn)”讓你不用選擇這些標(biāo)簽,包括用戶基本信息、興趣等。

【嵌牛鼻子】:深度學(xué)習(xí)

【嵌牛提問】:深度學(xué)習(xí)在推薦領(lǐng)域有何應(yīng)用

【嵌牛正文】:Facebook這種通過一群已有的用戶發(fā)現(xiàn)并擴(kuò)展出其他用戶的推薦算法就叫Lookalike,當(dāng)然Facebook的算法細(xì)節(jié)筆者并不清楚,各個(gè)公司實(shí)現(xiàn)Lookalike也各有不同。這里也包括騰訊在微信端的廣告推薦上的應(yīng)用、Google在YouTube上推薦感興趣視頻等。下面讓我們結(jié)合前人的工作,實(shí)現(xiàn)自己的Lookalike算法,并嘗試著在新浪微博上應(yīng)用這一算法。

調(diào)研

首先要確定微博領(lǐng)域的數(shù)據(jù),關(guān)于微博的數(shù)據(jù)可以這樣分類:

用戶基礎(chǔ)數(shù)據(jù):年齡、性別、公司、郵箱、地點(diǎn)、公司等。

關(guān)系圖:根據(jù)人?人,人?微博的關(guān)注、評論、轉(zhuǎn)發(fā)信息建立關(guān)系圖。

內(nèi)容數(shù)據(jù):用戶的微博內(nèi)容,包含文字、圖片、視頻。

有了這些數(shù)據(jù)后,怎么做數(shù)據(jù)的整合分析?來看看現(xiàn)在應(yīng)用最廣的方式——協(xié)同過濾、或者叫關(guān)聯(lián)推薦。協(xié)同過濾主要是利用某興趣相投、擁有共同經(jīng)驗(yàn)群體的喜好來推薦用戶可能感興趣的信息,協(xié)同過濾的發(fā)展有以下三個(gè)階段:

第一階段,基于用戶喜好做推薦,用戶A和用戶B相似,用戶B購買了物品a、b、c,用戶A只購買了物品a,那就將物品b、c推薦給用戶A。這就是基于用戶的協(xié)同過濾,其重點(diǎn)是如何找到相似的用戶。因?yàn)橹挥袦?zhǔn)確的找到相似的用戶才能給出正確的推薦。而找到相似用戶的方法,一般是根據(jù)用戶的基本屬性貼標(biāo)簽分類,再高級點(diǎn)可以用上用戶的行為數(shù)據(jù)。

第二階段,某些商品光從用戶的屬性標(biāo)簽找不到聯(lián)系,而根據(jù)商品本身的內(nèi)容聯(lián)系倒是能發(fā)現(xiàn)很多有趣的推薦目標(biāo),它在某些場景中比基于相似用戶的推薦原則更加有效。比如在購書或者電影類網(wǎng)站上,當(dāng)你看一本書或電影時(shí),推薦引擎會(huì)根據(jù)內(nèi)容給你推薦相關(guān)的書籍或電影。

第三階段,如果只把內(nèi)容推薦單獨(dú)應(yīng)用在社交網(wǎng)絡(luò)上,準(zhǔn)確率會(huì)比較低,因?yàn)樯缃痪W(wǎng)絡(luò)的關(guān)鍵特性還是社交關(guān)系。如何將社交關(guān)系與用戶屬性一起融入整個(gè)推薦系統(tǒng)就是關(guān)鍵。在神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)算法出現(xiàn)后,提取特征任務(wù)就變得可以依靠機(jī)器完成,人們只要把相應(yīng)的數(shù)據(jù)準(zhǔn)備好就可以了,其他數(shù)據(jù)都可以提取成向量形式,而社交關(guān)系作為一種圖結(jié)構(gòu),如何表示為深度學(xué)習(xí)可以接受的向量形式,而且這種結(jié)構(gòu)還需要有效還原原結(jié)構(gòu)中位置信息?這就需要一種可靠的向量化社交關(guān)系的表示方法。基于這一思路,在2016年的論文中出現(xiàn)了一個(gè)算法node2vec,使社交關(guān)系也可以很好地適應(yīng)神經(jīng)網(wǎng)絡(luò)。這意味著深度學(xué)習(xí)在推薦領(lǐng)域應(yīng)用的關(guān)鍵技術(shù)點(diǎn)已被解決。

在實(shí)現(xiàn)算法前我們主要參考了如下三篇論文:

Audience Expansion for Online Social Network Advertising 2016

http://www.kdd.org/kdd2016/papers/files/adf0483-liuA.pdf

node2vec: Scalable Feature Learning for Networks Aditya Grover 2016

https://arxiv.org/abs/1607.00653

Deep Neural Networks for YouTube Recommendations 2016

http://dl.acm.org/citation.cfm?id=2959190

第一篇論文是LinkedIn給出的,主要談了針對在線社交網(wǎng)絡(luò)廣告平臺,如何根據(jù)已有的受眾特征做受眾群擴(kuò)展。這涉及到如何定位目標(biāo)受眾和原始受眾的相似屬性。論文給出了兩種方法來擴(kuò)展受眾:

與營銷活動(dòng)無關(guān)的受眾擴(kuò)展;

與營銷活動(dòng)有關(guān)的受眾擴(kuò)展。

圖1 LinkedIn的Lookalike算法流程圖

在圖1中,LinkedIn給出了如何利用營銷活動(dòng)數(shù)據(jù)、目標(biāo)受眾基礎(chǔ)數(shù)據(jù)去預(yù)測目標(biāo)用戶行為進(jìn)而發(fā)現(xiàn)新的用戶。今天的推薦系統(tǒng)或廣告系統(tǒng)越來越多地利用了多維度信息。如何將這些信息有效加以利用,這篇論文給出了一條路徑,而且在工程上這篇論文也論證得比較扎實(shí),值得參考。

第二篇論文,主要講的是node2vec,這也是本文用到的主要算法之一。node2vec主要用于處理網(wǎng)絡(luò)結(jié)構(gòu)中的多分類和鏈路預(yù)測任務(wù),具體來說是對網(wǎng)絡(luò)中的節(jié)點(diǎn)和邊的特征向量表示方法。

簡單來說就是將原有社交網(wǎng)絡(luò)中的圖結(jié)構(gòu),表達(dá)成特征向量矩陣,每一個(gè)node(可以是人、物品、內(nèi)容等)表示成一個(gè)特征向量,用向量與向量之間的矩陣運(yùn)算來得到相互的關(guān)系。

下面來看看node2vec中的關(guān)鍵技術(shù)——隨機(jī)游走算法,它定義了一種新的遍歷網(wǎng)絡(luò)中某個(gè)節(jié)點(diǎn)的鄰域的方法,具體策略如圖2所示。

圖2 隨機(jī)游走策略

假設(shè)我們剛剛從節(jié)點(diǎn)t走到節(jié)點(diǎn)v,當(dāng)前處于節(jié)點(diǎn)v,現(xiàn)在要選擇下一步該怎么走,方案如下:

其中dtx表示節(jié)點(diǎn)t到節(jié)點(diǎn)x之間的最短路徑,dtx=0表示會(huì)回到節(jié)點(diǎn)t本身,dtx=1表示節(jié)點(diǎn)t和節(jié)點(diǎn)x直接相連,但是在上一步卻選擇了節(jié)點(diǎn)v,dtx=2表示節(jié)點(diǎn)t不與x直接相連,但節(jié)點(diǎn)v與x直接相連。其中p和q為模型中的參數(shù),形成一個(gè)不均勻的概率分布,最終得到隨機(jī)游走的路徑。與傳統(tǒng)的圖結(jié)構(gòu)搜索方法(如BFS和DFS)相比,這里提出的隨機(jī)游走算法具有更高的效率,因?yàn)楸举|(zhì)上相當(dāng)于對當(dāng)前節(jié)點(diǎn)的鄰域節(jié)點(diǎn)的采樣,同時(shí)保留了該節(jié)點(diǎn)在網(wǎng)絡(luò)中的位置信息。

node2vec由斯坦福大學(xué)提出,并有開源代碼,這里順手列出,這一部分大家不用自己動(dòng)手實(shí)現(xiàn)了。

https://github.com/aditya-grover/node2vec

注:本文的方法需要在源碼的基礎(chǔ)上改動(dòng)圖結(jié)構(gòu)。

第三篇論文講的是Google如何做YouTube視頻推薦,論文是在我做完結(jié)構(gòu)設(shè)計(jì)和流程設(shè)計(jì)后看到的,其中模型架構(gòu)的思想和我們不謀而合,還解釋了為什么要引入DNN(后面提到所有的feature將會(huì)合并經(jīng)歷幾層全連接層):引入DNN的好處在于大多數(shù)類型的連續(xù)特征和離散特征可以直接添加到模型當(dāng)中。此外我們還參考了這篇論文對于隱含層(FC)單元個(gè)數(shù)選擇。圖3是這篇論文提到的算法結(jié)構(gòu)。

圖3 YouTube推薦結(jié)構(gòu)圖

實(shí)現(xiàn)

(a)數(shù)據(jù)準(zhǔn)備

獲得用戶的屬性(User Profile),如性別、年齡、學(xué)歷、職業(yè)、地域、能力標(biāo)簽等;

根據(jù)項(xiàng)目內(nèi)容和活動(dòng)內(nèi)容制定一套受眾標(biāo)簽(Audience Label);

提取用戶之間的關(guān)注關(guān)系,微博之間的轉(zhuǎn)發(fā)關(guān)系;

獲取微博message中的文本內(nèi)容;

獲得微博message中的圖片內(nèi)容。

(b)用戶標(biāo)簽特征處理

根據(jù)步驟a中用戶屬性信息和已有的部分受眾標(biāo)簽系統(tǒng)。利用GBDT算法(可以直接用xgboost)將沒有標(biāo)簽的受眾全部打上標(biāo)簽。這個(gè)分類問題中請注意處理連續(xù)值變量以及歸一化。

將標(biāo)簽進(jìn)行向量化處理,這個(gè)問題轉(zhuǎn)化成對中文單詞進(jìn)行向量化,這里用word2vec處理后得到用戶標(biāo)簽的向量化信息Label2vec。這一步也可以使用word2vec在中文的大數(shù)據(jù)樣本下進(jìn)行預(yù)訓(xùn)練,再用該模型對標(biāo)簽加以提取,對特征的提取有一定的提高,大約在0.5%左右。

(c)文本特征處理

將步驟a中提取到的所有微博message文本內(nèi)容清洗整理,訓(xùn)練Doc2Vec模型,得到單

個(gè)文本的向量化表示,對所得的文本作聚類(KMeans,在30w的微博用戶的message上測試,K取128對文本的區(qū)分度較強(qiáng)),最后提取每個(gè)cluster的中心向量,并根據(jù)每個(gè)用戶所占有的cluster獲得用戶所發(fā)微博的文本信息的向量表示Content2vec。

(d)圖像特征(可選)

將步驟a中提取到的所有的message圖片信息整理分類,使用預(yù)訓(xùn)練卷積網(wǎng)絡(luò)模型(這里為了平衡效率選取VGG16作為卷積網(wǎng)絡(luò))提取圖像信息,對每個(gè)用戶message中的圖片做向量化處理,形成Image2vec,如果有多張圖片將多張圖片分別提取特征值再接一層MaxPooling提取重要信息后輸出。

(e)社交關(guān)系建立(node2vec向量化)

將步驟a中獲得到的用戶之間的關(guān)系和微博之間的轉(zhuǎn)發(fā)評論關(guān)系轉(zhuǎn)化成圖結(jié)構(gòu),并提取用戶關(guān)系sub-graph,最后使用node2Vec算法得到每個(gè)用戶的社交網(wǎng)絡(luò)圖向量化表示。圖4為簡歷社交關(guān)系后的部分圖示。

圖4 用戶社交關(guān)系

(f)將bcde步驟得到的向量做拼接,經(jīng)過兩層FC,得到表示每個(gè)用戶的多特征向量集(User Vector Set, UVS)。這里取的輸出單元個(gè)數(shù)時(shí)可以根據(jù)性能和準(zhǔn)確度做平衡,目前我們實(shí)現(xiàn)的是輸出512個(gè)單元,最后的特征輸出表達(dá)了用戶的社交關(guān)系、用戶屬性、發(fā)出的內(nèi)容、感興趣的內(nèi)容等的混合特征向量,這些特征向量將作為下一步比對相似性的輸入值。

(g)分別計(jì)算種子用戶和潛在目標(biāo)用戶的向量集,并比對相似性,我們使用的是余弦相似度計(jì)算相似性,將步驟f得到的用戶特征向量集作為輸入x,y,代入下面公式計(jì)算相似性:

使用余弦相似度要注意:余弦相似度更多的是從方向上區(qū)分差異,而對絕對的數(shù)值不敏感。因此沒法衡量每個(gè)維度值的差異,這里我們要在每個(gè)維度上減去一個(gè)均值或者乘以一個(gè)系數(shù),或者在之前做好歸一化。

(h)受眾擴(kuò)展

獲取種子受眾名單,以及目標(biāo)受眾的數(shù)量N;

檢查種子用戶是否存在于UVS中,將存在的用戶向量化;

計(jì)算受眾名單中用戶和UVS中用戶的相似度,提取最相似的前N個(gè)用戶作為目標(biāo)受眾。

最后我們將以上步驟串聯(lián)起來,形成如圖5所示。

圖5 Lookalike算法示意圖

在以上步驟中特征提取完成后,我們使用一個(gè)2層的神經(jīng)網(wǎng)絡(luò)做最后的特征提取,算法結(jié)構(gòu)示意圖如圖6所示。

圖6 Lookalike算法結(jié)構(gòu)圖

其中FC1層也可以替換成MaxPooling,MaxPooling層具有強(qiáng)解釋性,也就是在用戶特征群上提取最重要的特征點(diǎn)作為下一層的輸入,讀者可以自行嘗試,這里限于篇幅問題就不做展開了。

講到這里,算法部分就已基本完結(jié),其中還有些工程問題,并不屬于本次主題探討范圍,這里也不做討論了。

結(jié)果

我司算法團(tuán)隊(duì)根據(jù)Lookalike思想完整實(shí)現(xiàn)其算法,并在實(shí)際產(chǎn)品中投入試用。針對某客戶(乳品領(lǐng)域世界排名前三的品牌主)計(jì)算出結(jié)果(部分):

表1 部分計(jì)算結(jié)果

可以觀察到以上微博ID的主題基本都是西點(diǎn)企業(yè)或西點(diǎn)培訓(xùn)企業(yè),和品牌主售賣的乳品有很高的關(guān)聯(lián)性:乳品是非常重要的西點(diǎn)原料,除終端用戶外,西點(diǎn)相關(guān)企業(yè)就是乳品企業(yè)主需要尋找的最重要的受眾之一。

探討

特征表達(dá)

除了以上提到的特征外,我們也對其他的重要特征表達(dá)做了處理和變換:根據(jù)我們的需求,需要抽取出人的興趣特征,如何表達(dá)一個(gè)人的興趣?除了他自己生成的有關(guān)內(nèi)容外,還有比較關(guān)鍵的一點(diǎn)是比如“我”看了一些微博,但并沒有轉(zhuǎn)發(fā),大多數(shù)情況下都不會(huì)轉(zhuǎn)發(fā),但有些“我”轉(zhuǎn)發(fā)了,有些“我”評論了;“我”轉(zhuǎn)發(fā)了哪些?評論了哪些?這次距上次的瀏覽該人的列表時(shí)間間隔多久?都代表“我”對微博的興趣,而間接的反應(yīng)“我”的興趣特征。這些數(shù)據(jù)看來非常重要,又無法直接取得,怎么辦?

下面來定義一個(gè)場景,試圖描述出我們對看過的內(nèi)容中哪些是感興趣的,哪些不是感興趣的:

(a)用戶A,以及用戶A關(guān)注的用戶B;

(b)用戶A的每天動(dòng)作時(shí)間(比如他轉(zhuǎn)發(fā)、評論、收藏、點(diǎn)贊)起始時(shí)間,我們定義為蘇醒時(shí)間A_wake(t);

(c)用戶B每天發(fā)帖(轉(zhuǎn)發(fā)、評論)時(shí)間:B_action(t);

(d)簡單假設(shè)一下A_wake(t)> B_action(t),也就是B_action(t)的評論都能看到。這就能得到用戶A對應(yīng)了哪些帖子;

(e)同理,也可知用戶A 在A_wake(t)時(shí)間內(nèi)轉(zhuǎn)發(fā)了、評論了哪些帖子;

(f)結(jié)合上次瀏覽間隔時(shí)間,可以描述用戶A對哪些微博感興趣(post ive),哪些不感興趣(negative)。

全連接層的激活單元比對提升

在Google那篇論文中比對隱含層(也就是我們結(jié)構(gòu)圖中的FC層)各種單元組合產(chǎn)生的結(jié)果,Google選擇的是最后一種組合,如圖7所示。

圖7 YouTube推薦模型隱含層單元選擇對比

我們初期選用了512 tanh→256 tanh 這種兩層組合,后認(rèn)為輸入特征維度過大,512個(gè)單元無法完整的表達(dá)特征,故又對比了 1024→512組合,發(fā)現(xiàn)效果確實(shí)有微小提升大概在0.7%。另外我們的FC層輸入在(-1,1)區(qū)間,考慮到relu函數(shù)的特點(diǎn)沒有使用它,而是使用elu激活函數(shù)。測試效果要比tanh函數(shù)提升0.3%-0.5%。

附node2vec偽碼:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內(nèi)容