深度學習在推薦領域的應用:Lookalike 算法
本文主人公 英特 是一名傳統的軟件工程師,讓我們與英特一起來研究如何實現自己的Lookalike算法,並嚐試著在新浪微博上應用這一算法。
當2012 年Facebook 在廣告領域開始應用定製化受眾(Facebook CustomAudiences)功能後,受眾發現這個概念真正得到大規模應用。什麼是受眾發現?如果你的企業已經積累了一定的客戶,無論這些客戶是否關注你或者是否和你在Facebook 上有互動,你都能通過Facebook 的廣告係統觸達到。受眾發現實現了什麼功能?在沒有這個係統之前,廣告投放一般情況都是用興趣標簽去區分用戶,再去給這部分用戶發送廣告,受眾發現讓你不用選擇這些標簽,包括用戶基本信息、興趣等。你需要做的隻是上傳一批你目前已有的用戶或者你感興趣的一批用戶,剩下的工作就等著受眾功能幫你完成了。
像Facebook 這樣通過一群已有的用戶發現並擴展出其他用戶的推薦算法就叫Lookalike,當然英特並不清楚Facebook 的算法細節,而各個公司實現Lookalike 的方式也各有不同。這裏也包括騰訊在微信端的廣告推薦上的應用、Google 在YouTube上推薦感興趣視頻等。下麵讓我們與英特一起結合前人的工作,實現自己的Lookalike算法,並嚐試著在新浪微博上應用這一算法。
1 調研
首先要確定微博領域的數據,關於微博的數據可以采用下麵這幾個分類維度。
- 用戶基礎數據:用戶的年齡、性別、公司、郵箱、地點、公司等。
- 關係圖:根據人-人和人-微博的關注、評論、轉發信息建立關係圖。
- 內容數據:用戶的微博內容,包含文字、圖片、視頻。
有了這些數據後,怎麼做數據的整合分析?來看看現在應用最廣的方式——協同過濾、或者叫關聯推薦。協同過濾主要是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶可能感興趣的信息,協同過濾的發展有以下三個階段。
第一階段:基於用戶的喜好去做推薦。用戶A 和用戶B 相似,用戶B 購買了物品a、b、c,用戶A 隻購買了物品a,那就將物品b、c 推薦給用戶A。這就是基於用戶的協同過濾,其重點是如何找到相似的用戶。因為隻有準確地找到相似的用戶才能給出正確的推薦。而找到相似用戶的方法,一般是根據用戶的基本屬性貼標簽分類,再高級點可以用上用戶的行為數據。
第二階段:某些商品光從用戶的屬性標簽找不到聯係,而根據商品本身的內容聯係倒是能發現很多有趣的推薦目標,它在某些場景中比基於相似用戶的推薦原則更加有效。比如在購書或者電影類網站上,當你看一本書或電影時,推薦引擎會根據內容給你推薦相關的書籍或電影。
第三階段:如果隻把內容推薦單獨應用在社交網絡上,準確率會比較低,因為社交網絡的關鍵特性還是社交關係。如何將社交關係與用戶屬性一起融入整個推薦係統就是關鍵。另外一個問題就是僅僅用興趣標簽過於粗獷,人與人的興趣差異不光光是興趣標簽決定的,往往和時間、環境等其他的影響息息相關,如何將人在社交網絡的所有特征盡可能提取出來並且計算呢?在神經網絡和深度學習算法出現後,提取特征任務就變得可以依靠機器完成了,人們隻要把相應的數據準備好就可以了,其他數據都可以提取成向量形式,而社交關係作為一種圖結構如何表示為深度學習可以接受的向量形式,而且這種結構還能有效還原原結構中位置信息?這就需要一種可靠的向量化社交關係的表示方法。基於這一思路,在2016 年的論文中出現了一個算法node2vec,使社交關係也可以很好地適應神經網絡。這意味著深度學習在推薦領域應用的關鍵技術點已被解決。
在實現算法前英特主要參考了以下三篇論文:
- Audience Expansion for Online Social Network Advertising ,2016
- node2vec: Scalable Feature Learning for Networks Aditya Grover ,2016
- Deep Neural Networks for YouTube Recommendations ,2016
第一篇論文是Linkedin 給出的,主要談了針對在線社交網絡廣告平台如何根據已有的受眾特征做受眾群擴展。這涉及如何定位目標受眾和原始受眾的相似屬性。論文給出了兩種方法來擴展受眾,一是與營銷活動無關的受眾擴展,二是與營銷活動有關的受眾擴展。
Linkedin 的lookalike 流程圖
在流程圖中,Linkedin 給出了如何利用營銷活動數據、目標受眾基礎數據去預測目標用戶行為進而發現新的用戶。在今天的推薦係統或廣告係統裏越來越多地利用了多維度信息。如何將這些信息有效地加以利用,這篇論文給出了一條路徑,而且在工程上這篇論文也論證得比較紮實,值得參考。
第二篇論文主要講的是node2vec,這也是本文用到的主要算法之一。node2vec主要用於處理網絡結構中的多分類和鏈路預測任務,具體來說是對網絡中的節點和邊的特征向量表示方法。
簡單點來說就是將原有社交網絡中的圖結構,表達成特征向量矩陣,每一個node(可以是人或物品或內容等)表示成一個特征向量,用向量與向量之間的矩陣運算來得到相互的關係。
下麵來看看node2vec 中的關鍵技術——隨機遊走算法,它定義了一種新的遍曆網絡中某個節點的鄰域的方法,具體策略如下圖所示。
隨機遊走策略
假設我們剛剛從節點t 走到節點v,當前處於節點v,現在要選擇下一步該怎麼走,方案如下:
其中dtx表示節點t 到節點x 之間的最短路徑,dtx= 0表示會回到節點t 本身,dtx = 1表示節點t 和節點x 直接相連,但是在上一步卻選擇了節點v,dtx= 2表示節點t 不與x 直接相連,但節點v 與x 直接相連。其中p 和q 為模型中的參數,形成一個不均勻的概率分布,最終得到隨機遊走的路徑。與傳統的圖結構搜索方法(如BFS和DFS)相比,這裏提出的隨機遊走算法具有更高的效率,因為本質上相當於對當前節點的鄰域節點的采樣,同時保留了該節點在網絡中的位置信息。
node2vec 由斯坦福大學提出,並有開源代碼,這一部分大家不用自己動手實現了.
第三篇論文講的是Google 如何做YouTube 視頻推薦,論文是在英特做完結構設計和流程設計後看到的,其中模型架構的思想和英特的不謀而合,還解釋了為什麼要引入DNN:引入DNN 的好處在於大多數類型的連續特征和離散特征可以直接添加到模型當中。此外英特還參考了這篇論文對於隱含層(FC)單元個數的選擇。下圖是這篇論文提到的算法結構。
YouTube 推薦算法結構圖
2 實現
(1)數據準備
① 獲得用戶的屬性(User Profile),如性別、年齡、學曆、職業、地域、能力標簽等;
② 根據項目內容和活動內容製定一套受眾標簽(Audience Label);
③ 提取用戶之間的關注關係,微博之間的轉發關係;
④ 獲取微博message 中的文本內容;
⑤ 獲得微博message 中的圖片內容。
(2)用戶標簽特征處理
① 根據步驟1 中用戶屬性信息和已有的部分受眾標簽係統。利用GBDT 算法(可以直接用xgboost)將沒有標簽的受眾全部打上標簽。這個分類問題中請注意處理連續值變量以及歸一化。
② 將標簽進行向量化處理,這個問題轉化成對中文單詞進行向量化,這裏用word2vec 處理後得到用戶標簽的向量化信息Label2vec。這一步也可以使用word2vec在中文的大數據樣本下進行預訓練,再用該模型對標簽加以提取,對特征的提取有一定的提高,大約在0.5%左右。
(3)文本特征處理
清洗整理步驟1 中提取到的所有微博message 文本內容,訓練doc2vec 模型,得到單個文本的向量化表示,對所得的文本作聚類(KMeans,在30 萬的微博用戶的message 上測試,K 取128 對文本的區分度較強),最後提取每個cluster 的中心向量,並根據每個用戶所占有的cluster 獲得用戶所發微博的文本信息的向量表示Content2vec。
(4)圖像特征
將步驟1 中提取到的所有的message 圖片信息進行整理分類,使用預訓練卷積網絡模型(這裏為了平衡效率選取VGG16 作為卷積網絡)提取圖像信息,對每個用戶message 中的圖片做向量化處理,形成Image2vec,如果有多張圖片則將多張圖片分別提取特征值再接一層Max Pooling 提取重要信息後輸出。
(5)社交關係建立(node2vec 向量化)
將步驟1 數據準備中獲得的用戶之間的關係和微博之間的轉發評論關係轉化成圖結構,並提取用戶關係sub-graph,最後使用node2vec 算法得到每個用戶的社交網絡圖向量化表示。下圖為社交關係化後的部分圖示。
用戶的社交關係
將步驟2345 得到的向量做拚接,經過兩層FC,得到表示每個用戶的多特征向量集(User Vector Set, UVS)。這裏取的輸出單元個數時可以根據性能和準確度做平衡,目前英特實現的是輸出512 個單元,最後的特征輸出表達了用戶的社交關係、用戶屬性、發出的內容、感興趣的內容等的混合特征向量,這些特征向量將作為下一步比對相似性的輸入值。
分別計算種子用戶和潛在目標用戶的向量集,並比對相似性。英特使用的是餘弦相似度計算相似性,將步驟6 得到的用戶特征向量集作為輸入x 和y,代入下麵公式計算相似性。
注意:餘弦相似度更多是從方向上區分差異,而對絕對的數值不敏感,因此沒法衡量每個維度值的差異。這裏要在每個維度上減去一個均值或者乘以一個係數,或者在之前做好歸一化。
(6)受眾擴展。
① 獲取種子受眾名單,以及目標受眾的數量N;
② 檢查種子用戶是否存在於UVS 中,將存在的用戶向量化;
③ 計算受眾名單中用戶和UVS 中用戶的相似度,提取最相似的前N 個用戶作為目標受眾。
最後將以上步驟串聯起來,形成流程圖。
Lookalike 算法流程圖
在以上步驟提取完特征後,英特使用一個兩層的神經網絡做最後的特征歸並提取,算法結構示意圖如下。
Lookalike 算法結構示意圖
其中FC1 層也可以替換成Max Pooling,Max Pooling 層具有強解釋性,也就是把用戶特征群上提取的最重要的特征點作為下一層的輸入,讀者可以自行嚐試,這裏限於篇幅問題就不做展開了。
3 結果
英特根據Lookalike 思想完整實現了算法,並在實際產品中投入試用,針對某客戶(乳品領域世界排名前三的品牌主)計算出結果(部分)如下。
可以觀察到以上微博ID 的主題基本都是西點企業或西點培訓企業,和品牌主售賣的乳品有很高的關聯性:乳品是非常重要的西點原料,除終端用戶外,西點相關企業就是乳品企業主需要尋找的最重要的受眾之一。
4 總結探討
英特在這個案例中學到了關於用深度學習做推薦的相關知識,在最終的總結會中,英特也列出了兩點通過本項目學習到的經驗。
(1)特征表達。
除了前文提到的特征外,英特也對其他重要特征表達做了處理和變換:根據業務需求,需要抽取出人的興趣特征,如何表達一個人的興趣?除了他自己生成的有關內容外,還有比較關鍵的一點是比如“我”看了一些微博,但並沒有轉發他們,大多數情況下都不會轉發,但有些“我”轉發了,有些“我”評論了;“我”轉發了哪些?
評論了哪些?這次距上次的瀏覽該人的列表時間間隔多久?都代表“我”對微博的興趣,而間接地反映出“我”的興趣特征。這些數據看來非常重要,但又無法直接取得,怎麼辦?
下麵來定義一個場景,試圖描述出我們對看過的內容中哪些是感興趣的,哪些是不感興趣的:
a)用戶A,以及用戶A 關注的用戶B;
b)用戶A 的每天動作時間(比如轉發、評論、收藏、點讚的時間點)。其中起始時間定義為蘇醒時間A_wake(t);
c)用戶B 每天發帖(轉發、評論)時間:B_action(t);
d)簡單假設一下A_wake(t)> B_action(t),也就是B_action(t)的評論都能看到。這就能得到用戶A 對應了哪些帖子;
e)同理,也可知用戶A 在A_wake(t)時間內轉發、評論了哪些帖子;
f)結合上次瀏覽間隔時間,可以描述用戶A 對哪些微博感興趣(postive),哪些不感興趣(negative);
(2)全連接層的激活單元比對提升。
英特在學習Google 那篇論文後,比對隱含層(也就是結構圖中的FC 層)各種單元組合產生的結果。
YouTube 推薦模型隱含層單元選擇對比
Google 選擇的是最後一種組合,英特在初期選用了512 tanh→256 tanh 這種兩層組合,後認為輸入特征維度過大,512 個單元無法完整地表達特征,故又對比了1024→512 組合,發現效果確實有微小提升,大概提升了0.7%。另外模型的FC 層輸入在[-1,1]區間,考慮到relu 函數的特點故沒有使用它,而是使用elu 激活函數。測試效果比tanh 函數提升了0.3%~0.5%。
本文選自《深度學習算法實踐》,點此鏈接可在博文視點官網查看此書。
想及時獲得更多精彩文章,可在微信中搜索“博文視點”或者掃描下方二維碼並關注。
最後更新:2017-08-25 11:02:52