作者:溫利武? ? 班級: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偽碼: