摘要
什麼是embedding?
Embedding在數學上表示的是一個映射關係,F: X -> Y,也就是一個函數。該函數具有兩個性質:injective和structure-preserving。Injective,即我們所說的單射函數,對於每個 Y 只有唯一的 X 對應,反之亦然;structure-preserving,結構保存,比如在X所屬的空間上X1<X2,那麼映射後在Y所屬空間上Y1<Y2。
深度學習中,Embedding特指用一個低維度向量表示一個實體,可以是一個詞(Word2Vec),可以是一個物品(Item2Vec),亦或者網絡關係中的節點(Graph Embedding)。
Embedding的初始化狀態可以理解爲是一組隨機數,隨着算法的優化與不斷迭代更新,當網絡達到收斂狀態的時候,網絡中各個層的參數就相對固化,這樣就得到了隱層權重表,此時就相當於得到了我們想要的embedding。在實際應用中,通常將神經網絡倒數第二層的權重參數當作對應樣本的embedding。
什麼是Graph Embedding?
Graph Embedding用低維、稠密、實值的向量表示網絡中的節點。目前,Graph Embedding已經是推薦系統、計算廣告領域非常流行的做法,並且在實踐後取得了非常不錯的線上效果。
Graph Embedding技術將圖中的節點以低維稠密向量的形式進行表達,要求在原始圖中相似(不同的方法對相似的定義不同)的節點其在低維表達空間也接近。得到的表達向量可以用來進行下游任務,如節點分類,鏈接預測,可視化或重構原始圖等。
Graph Embedding是把圖結構轉化成一個向量或者一組向量的變換,在這裏,Embedding能夠捕捉到圖的拓撲結構、節點到節點的關係、其他關於圖、子圖和節點的相關信息等。
Graph Embedding算法的演進
DeepWalk(2014)Line(2015)Node2vec(2016)EGES(2018)
DeepWalk: Online Learning of Social Representations
- 論文地址:https://arxiv.org/pdf/1403.6652.pdf 【KDD 2014】
- Github地址:https://github.com/phanein/deepwalk
- deepwalk工具:http://www.perozzi.net/projects/deepwalk/
算法講解:
1、Random Walk
假設以節點爲根的隨機遊走爲,那麼生成隨機變量,,...,將是一個隨機選擇的過程,這裏,是從節點的鄰居節點中隨機選擇的一個節點。
RandomWalk是一種可重複訪問已訪問節點的深度優先遍歷算法。DeepWalk採用隨機遊走採樣圖的節點序列。給定當前訪問起始節點,從其鄰居中隨機採樣節點作爲下一個訪問節點,重複此過程,直到訪問序列長度滿足預設條件。這裏的隨機遊走長度是一個明確規定的指定值。
2、Skip Gram
首先SkipGram是一個語言模型,這個語言模型能夠最大化一個句子中出現在同一個窗口內的詞的共現概率。SkipGram通過一個獨立分佈假設,計算如下的條件概率:
爲了避免巨大的計算開銷和加速訓練時間,SkipGram同樣應用了HierarchicalSoftmax來計算概率分佈。
DeepWalk利用word2vec的思想將RandomWalk中拿到的隨機遊走的節點序列作爲語料庫,訓練神經網絡模型,進而學習每個節點的向量表示。
3、Deep Walk
DeepWalk算法核心過程包含兩個步驟:第一步使用隨機遊走採樣節點序列,直到採樣序列的長度達到預設長度(通常是一個指定值),第二步使用SkipGram進行向量表達。論文中特別說明了兩個case:(1)隨機遊走的長度是一個固定值,但並沒有限制。(2)隨機遊走可以有相同的根,但這並沒有什麼用。
DeepWalk僞代碼:
Algorithm_1的第3-9行是DeepWalk的核心代碼,外層循環指明瞭每個節點需要的隨機遊走次數爲,內層循環遍歷了圖中的每個節點,然後對每個節點進行一次深度爲t的隨機遊走,然後使用該隨機遊走序列來SkipGram模型依據提出的目標函數來更新節點的向量表示。
line3:次隨機遊走
line5:迭代圖中的每個頂點(進行一個隨機遊走和向量更新)
line6:頂點生成一個深度爲t的隨機遊走
line7:SkipGram算法更新頂點的向量表示
Algorithm_2以滑動窗口的方式遍歷隨機遊走的頂點序列,窗口的大小爲,在每個窗口內,針對當前中心頂點,使用上文的目標函數更新當前頂點的表示,從而學得每個頂點的一般表示。
DeepWalk應用在推薦系統領域,首先需要獲取的是用戶的一個行爲序列,基於這些用戶的行爲序列才能構建了item的相關圖,圖中的邊是由用戶行爲產生的,比如用戶先後瀏覽了item-A和item-B,那麼就會產生了一條有向邊由A指向B。其他的有向邊也是一樣的道理,假如有多個有A指向B的有向邊,那麼該條邊的權重就會被加強。經過這樣的方法就可以將所有用戶的行爲序列轉換成item的一個相關圖,也就是DeepWalk需要的全局的item相關圖。在這個圖中應用Algorithm_1就得到了每個item的向量表示。
需要注意的是,deepwalk中的遊走是完全隨機的,所以纔有了後面其他的改進算法。
參考代碼:
deepwalk_walk方法對應Algorithm_1中僞代碼的第6行:
def deepwalk_walk(self, walk_length, start_node):
walk = [start_node]
while len(walk) < walk_length:
cur = walk[-1]
cur_nbrs = list(self.G.neighbors(cur))
if len(cur_nbrs) > 0:
walk.append(random.choice(cur_nbrs))
else:
break
return walk
_simulate_walks方法對應Algorithm_1僞代碼中的第3行開始的外層循環:
def _simulate_walks(self, nodes, num_walks, walk_length,):
walks = []
for _ in range(num_walks):
random.shuffle(nodes)
for v in nodes:
walks.append(self.deepwalk_walk(alk_length=walk_length, start_node=v))
return walks