阿里技術團隊有一篇文章,是講淘寶雙十一背後的支持系統的:一天造出10億個淘寶首頁,阿里工程師如何實現?。我對裏面提到的深度召回框架還挺感興趣的,試圖從中解析一下看看。node
阿里的這個深度召回系統來源於《DeepWalk: Online Learning of Social Representations》。咱們今天先來看看這篇文章講了什麼。算法
DeepWalk自己是一個學習網絡中頂點的embedding表達的圖算法。它使用語言模型的方法來學習社交網絡中的頂點的隱藏表達,並得到了很好的效果。總之,DeepWalk輸入是一個網絡,輸出是各個頂點的latent表達。網絡
首先定義一些符號:是一個有向帶權圖,V和E分別表示頂點和邊集。
是一個部分有標籤的社交網絡圖,其中
,
是特徵空間的維度。
,
是label集。在通常的分類算法中,咱們試圖尋找一個map將
的特徵映射到
。而在這篇文章中,咱們使用無監督方法來學習網絡結構。session
咱們的目標是學習一個,d是隱向量維度而且很小。這個d維向量表明了網絡結構特徵。這個表達應該有以下特性:框架
隨機遊走是常見的採樣方法,本文中將它用於序列採樣。文中的隨機遊走過程以下:從頂點開始的一次隨機遊走被標記爲
,那麼下一步要選擇的頂點
是從頂點
的鄰居中隨機選擇的。文章用這種方法完成採樣而且將採樣完成的序列看成語言模型中的語料來使用。dom
通常來講,一個語言模型的預測目標是一個單詞在一段預料中出現的機率,即給定一個單詞序列:,咱們須要經過最大化
來預測
。類比到咱們的問題中,則應該是最大化
。但咱們的目標是學習一個隱表達,設咱們所須要的map爲
,那麼咱們須要最大化
。而新的語言模型容許咱們不考慮詞語之間的順序,把這個問題變成:ide
其中是窗口大小。在這種設定下,擁有相似鄰居的節點會有相近的embedding表達。學習
根據上述理論,DeepWalk的算法以下: 優化
首先, 隨機初始化。從V創建一顆二叉樹,這主要是爲了作hierarchical softmax。以後進行
輪在V上的隨機遊走,每一次都須要打亂V的頂點的訪問順序。每一輪V上的隨機遊走由從每個頂點開始的一次長度爲t的隨機遊走構成。在每個隨機遊走序列造成之後,須要使用一次Skip-Gram算法。網站
Skip-Gram是一個語言模型,該模型用於最大化一個窗口內的單詞的共現機率,咱們在這裏用於更新。具體來講,做者們運用了hierarchical softmax方法來優化完成Skip-Gram過程,並用隨機梯度降低方法來完成更新。關於Skip-Gram,有興趣的讀者能夠看這個blogWord2Vec Tutorial - The Skip-Gram Model。
那麼,仍是根據一天造出10億個淘寶首頁,阿里工程師如何實現?咱們該怎麼把DeepWalk這個模型用到淘寶推薦系統中來呢?
DeepWalk是一個在網絡上生成embedding的模型,咱們首先要生成一個網絡。阿里使用SWING算法生成了一個商品之間的有向帶權圖做爲網絡。SWING實際上是一個在u-i二部圖上,利用一種叫作SWING的三角結構生成i-i類似度的方法,若是不會用SWING的話,應該用其餘的類似度模型也能夠代替這個算法。 SWINGF算法生成的i-i類似度不是對稱的,因此最終造成的形式是有向帶權圖。
固然,有向帶權圖還意味着咱們在random walk的時候須要根據權重對random walk進行調整。
文章說他們借鑑了Node2vec: Scalable Feature Learning for Networks的採樣方法。那麼,這篇文章的採樣方法是什麼呢? node2vec自己是一個用於學習網絡中節點的特徵表達的半監督學習方法。它的流程其實跟DeepWalk很像。阿里在這裏主要借鑑了它的random walk的流程。
首先,咱們分別定義DFS和BFS鄰居,如圖所示:
BFS鄰居是指和節點直接相連的鄰居節點;DFS鄰居指的是sequence的鄰居。BFS很容易理解,爲何要有DFS鄰居這個定義呢?
網絡中的節點有兩種類似性:一種是趨同性,好比u和s1,一種是結構類似性,好比u和s6。BFS鄰居有助於探索趨同性,而DFS鄰居有助於探索結構類似性。在商品推薦中,啤酒和紅酒能夠認爲是結構類似性,而啤酒和炸雞能夠認爲是趨同性(我本身認爲的,可能有誤解)。在實踐中,這兩種類似性都很經常使用。Node2vec定義了同時能夠運用這兩種屬性的random walk機制:
除了random walk以外,node2vec還使用了negative sampling方法,用來取代DeepWalk中的hierarchical softmax方法。淘寶也一樣採用了這個方法。同時,他們還採用了動態採樣器的優化方式。關於Negative Sampling,有興趣的讀者能夠看這個博客Word2Vec Tutorial Part 2 - Negative Sampling.
在上述基礎上,淘寶提出了Sequence+Side-information版本。
就個人理解,所謂sequence,即用真實的用戶session數據取代random walk的數據,做爲訓練樣本。不過在這裏,淘寶這個網站的特殊性是很重要的。做爲一個實時更新的購物網站,用戶的瀏覽記錄之間有很是強的相關性,可是通常的網站可能相關性沒有這麼強,實踐中能不能這麼作依然存疑。
Side Information就比較好理解了,就是至關於加入一些item自己相關而structure無關的數據,加入embedding一塊兒作訓練。畢竟咱們的目標是作item召回,而不是像Deep Walk那樣想衡量社交網絡上的相關性。
「在session內行爲構建全網圖後,引入相似tf-idf的轉移機率鏈接邊,克服哈利波特熱點問題,且在此基礎上進行機率採樣,構建用戶行爲的"虛擬樣本",以擴大後面輸入到深度模型裏面的寶貝覆蓋量及準確度,使多階擴展信息更加完善」這一段我其實沒怎麼理解,若是有理解了的讀者歡迎交流。
最後一個階段的優化實際上是針對淘寶的大規模數據集的,在通常的推薦場景下極可能不須要考慮這部分的優化,固然相對於雙十一這種規模的體量,這是很是重要的一部分。
總而言之,淘寶的深度召回框架大概流程以下:
關於Skip-Gram我以爲還有幾個blog也寫得很好,不過有些是國外博客的中文翻譯: