https://blog.csdn.net/hy_jz/article/details/78877483
基於meta-path的異質網絡Embedding-metapath2vec
metapath2vec: Scalable Representation Learning for Heterogeneous Networks
metapath2vec https://dl.acm.org/citation.cfm?id=3098036是17年發表的,使用基於meta-path的隨機游走重構節點的異質鄰居,並用異質的skip-gram模型求解節點的網絡表示。DeepWalk 是同質網絡中的表示學習方法,並不能直接應用到異質網絡。比如:並不能解決多種類型節點的“word-context”對的問題,異質網絡中的random walk問題。
本文提出了兩種模型,metapath2vec 和 metapath2vec++。模型框架如下圖所示:
- Heterogeneous Skip-Gram
對於一個的異質網絡,metapath2vec通過skip-gram模型學習網絡表示。給定一個節點v, 它最大化節點的異質上下文(context)
條件概率定義為soft-max函數。
這個公式,每計算一次,就會遍歷所有的節點,計算起來並不高效,根據Word2vector中的負采樣優化,上式可以寫為
metapath2vec在構建P(u)分布的時候,忽略了節點的類別信息。
- Meta-path-based Random Walks
跟deep walk是類似的,本文也是通過隨機游走的方式保留網絡結構。但是在異質網絡中,決定游走下一步的條件概率 不能像deep walk那樣,直接在節點的所有鄰居上做標准化(Normalized Probability)。如果這樣做忽略了節點的type信息。yizhou su etc.在論文PathSim http://web.engr.illinois.edu/~hanj/pdf/vldb11_ysun.pdf中指出:異質網絡上的隨機游走生成的路徑,偏向(biased)於高度可見的節點類型(具有優勢/主導數量的路徑的節點)和 集中(concentrated)的節點(即:具有指向一小組節點路徑的 大部分百分比)。因而,本文提出了基於元路徑的隨機游走,捕獲不同類型節點之間的語義和結構相關性。
給定一個異質網絡 G=(V,E,T) 和meta-path 那么第i步的轉移概率可定義為:
其中, 並且代表的是節點的鄰居中屬於t+1type的節點集合。換句話說,游走是在預先設定的meta-path 的條件上。而且,meta-path一般都是用在對稱的路徑上:
部分源代碼
meta-path-based Random Walk的源代碼連接https://www.dropbox.com/s/0ss9p4dh91i3zcq/py4genMetaPaths.py?dl=0
作者在論文中用的meta-path是”APVPA”。
-
metapath2vec++
這就為skip-gram最后一層輸出層中的 每個類型都指定了一個多項分布。負采樣的目標函數:
metapath2vec在計算softmax時,忽略了節點類型。換句話說,在采集負樣本時,沒有考慮樣本是否與正樣本屬於同一個節點類型。因而本文提出,異質的負采樣 (Heterogeneous negative sampling)。也就說條件概率在特定的節點類型上做標准化。 -
實驗
在實驗方面,本文主要做了multi-class分類,節點聚類,相似性搜索,可視化。
本文將AMiner數據集按照論文發表的會議分為八大類,對於每個作者節點的標簽,則是選擇作者曾經發表的論文中,占比例較大的標簽;如果是相等的,那么從中隨機選擇一個標簽。
在聚類任務上,作者使用的是K-Means的方法,NMI指標。
從代碼實現來看,本文主要研究的是作者-會議之間的一種關系,這種關系並不能直接觀察到,而是通過作者-論文-會議這樣一種路徑構建的。因而,最終學到的只是作者、會議節點的embedding向量表示。在分類等任務上也是針對的作者,會議節點。
metapath2vec: Scalable Representation Learning for Heterogeneous Networks 閱讀筆記
轉載請注明出處:
每周一篇機器學習論文筆記zhuanlan.zhihu.com
論文來源:KDD 2017
論文鏈接:2017_KDD_metapath2vec...
論文原作者:Yuxiao Dong , Microsoft Research , Homepage
(侵刪)
Abstract
這篇文章是關於異構網絡的特征表示學習。異構網絡的最大挑戰來源於不同種類的節點與連接,因此限制了傳統network embedding的可行性。論文提出了兩種特征學習模型:metapath2vec以及metapath2vec++,它們的具體做法是基於元路徑的隨機游走來指定一個節點的鄰居,之后利用異構skip-gram模型來實現embedding。
Introduction
傳統的網絡挖掘方法,一般都是先將網絡轉化成鄰接矩陣,然后再用機器學習的模型從而完成網絡挖掘任務,比如社區檢測,連接預測,離群點檢測等等。然而這樣的話,鄰接矩陣通常都很稀疏,且維數很大。network embedding是近來比較火的領域,近幾年也是發展迅猛。它主要是從網絡中學到隱式的表達矩陣,使得網絡重要的信息能夠被包含在一個新的相對低維的空間向量中,之后再對這個隱式表達矩陣采樣機器學習的算法,從而能夠更好地完成網絡挖掘任務。
近年來各種頂會上也出現了很多network embedding的文章,公認不錯的一些算法有deepwalk, node2vec, line等等,然而它們大多數都是針對同構網絡的,也就是忽略了網絡的異質性,只考慮一種節點對象中的一種關系。然而,現實生活中更多存在的網絡是包含不多種類的節點以及連接。比如在DBLP網絡,節點種類有會議,論文,作者等,而不同種類節點之間的連接也代表着不同語義,比如說論文和論文之間存在着引用和被引用關系,作者和作者存在合著關系,論文和會議存在發表/被發表關系。因此相比於同構網絡,異構網絡融合了更多信息,以及包含更豐富的語義信息。所以作者提出了兩個在異構網絡做network embedding的算法模型,metapath2vec以及metapath2vec++。
Algorithm
這篇論文的算法還是比較簡單的。首先回顧deepwalk算法,它的原型是NLP領域中Mikolov提出的word2vec算法,本質上是基於神經網絡建立統計語言模型的表示學習。
word2vec算法在網上已經有很多大牛進行過淺談詳解,感興趣的可以查一查。
word2vec主要有兩種模型,一種是CBOW,一種是Skip-Gram。 CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。經過學習,隱層到輸出層的權重參數就是最后所需的該單詞的詞向量,也就是我們需要的embedding空間。
將word2vec的想法應用到網絡分析中是14年KDD的Deepwalk提出來的。思路很簡單,就是通過在網絡上隨機游走,從而保存“單詞上下文”這樣一個概念。將每一條隨機游走路徑看做一句話,節點看做單詞,節點的鄰居節點看做上下文,之后同樣是利用Skip-Gram模型來完成network embedding。
隨機游走從局部上一定程度保持了節點與它鄰居之間的連接性,即網絡結構信息,然而對於異構信息網絡來說,由於節點與連接的異質性的存在,所以異構network embedding最大的難點在於如何有效地在多種類型節點之間保存“節點上下文”的概念。
論文提出的想法是:基於預先指定的元路徑來進行隨機游走來進行隨機游走,構造路徑,從而能夠保持“節點上下文”的概念。
meta-path-based random walks:
這樣一來就可以產生一條在不同類型的節點之間且能同時捕捉到網絡結構信息以及語義的路徑。
在得到隨機游走路徑后,就可以進行skip-gram的建模。論文提出了兩種算法:metapath2vec以及metapath2vec++,它們唯一的不同是skip-gram不同。在metapath2vec中,softmax值是在所有節點無論什么類型上進行歸一化;而在metapath2vec++中,softmax值是在相同類型節點上進行歸一化。
softmax in metapath2vec:
softmax in metapath2vec++:
由於網絡的節點一般很多,歸一化會耗時嚴重,所以會采樣負采樣進行優化加速。直接用原始softmax函數里的分子定義了邏輯回歸的函數,所以objective function為:
Experiment
(作者主頁分享了代碼以及數據)
對比實驗主要有Deepwalk,node2vec,LINE,PTE,實驗進行了三個任務,分別是:節點多分類,社區挖掘,相似度搜索。數據采用的是AMiner Academic Network,包含3m個論文節點,3800+會議節點,1.7m作者節點,人為地划分了8個領域,給會議以及作者節點標上類標。
節點多分類任務用的是邏輯回歸分類,測量指標為Macro-F1和Micro-F1;社區挖掘用的是KMeans算法,測量指標是NMI;相似度搜索是一個case study,用的是cosine similarity進行相似度測量。實驗結果顯示,論文提出的算法效果更好。
除此之外,論文提出的算法也適用於並行化運行。
個人看法
這篇論文的思路比較簡單:就是通過一個基於元路徑的隨機游走,從而將異構信息網絡和network embedding這個領域結合在了一起。不過最后embedding得到的隱式表達矩陣是在同一個向量空間的,意思就是雖然異構信息網絡的節點種類不同,但都是通過同一個embedding向量空間去表示它們,個人覺得這里會有點欠乏解釋性。
network embedding在異構信息網絡這一塊的話還有很多地方可以探究,需要繼續努力學習,希望能有自己的發現。
在論文筆記《Inductive Representation Learning on Large Graphs》中,我們介紹了一種歸納式學習圖節點特征表示的算法--GraphSAGE。 在該筆記的最后提到了該方法的一些不足,如1)為了計算方便,每個節點采樣同等數量的鄰居節點;2)鄰居的特征通過Mean、 LSTM、Max-Pooling等方式聚集,平等對待所有鄰居節點。基於GraphSAGE,本篇論文引入了注意力機制,通過學習賦予不同鄰居節點差異化的重要性且避免了采用過程。同時,鄰居節點的特征是根據權值來聚集的,即相似的節點貢獻更大。
模型:
給定圖上所有節點在當前層的輸入h,假設我們當前需要更新節點i的表示,j表示節點i的一個鄰居。那么節點j對i的重要性系數的計算公式如下:
其中,a為注意力模型,線性變換參數W為可學習的權值矩陣,h_i和h_j分別是i和j節點在上一層的輸出,亦即本層的輸入。在上面的計算中,節點i是可以attend到全部的節點。考慮圖本身的結構特征后,使用掩碼將節點i的非鄰居節點全部掩蓋。由於下面的公式使用了softmax函數,mask中非i鄰居節點的位置可以置為負無窮。
N_i表示節點i的所有鄰居。本篇論文中,注意力機制是由一層全連接網絡實現的,如下:
Alpha為權值向量。在最終的聚集過程中,按注意力機制得到的權值進行加權求和並緊跟一層非線性變換,如下:
進一步,參考谷歌機器翻譯中采用的“multi-head self attention",本文也使用了“multi-head”機制,最后將各個頭attention的結果進行拼接或取平均(本文實驗用了拼接)。
模型的優點:
-
計算高效。模型中的注意力機制可以在所有的邊上並行,節點的特征計算也是可以並行的。模型不需要類似特征分解這樣高復雜度的矩陣操作。
-
不同於GCN,模型允許為不同的鄰居賦予不同的權值。對注意力權值的分析可以增加模型的解釋性。
-
注意力機制的參數是共享的,且可以區分對待有向邊,因此可以擴展到有向圖上。同時,使用局部鄰居聚集的方式也保證了模型可以擴展到訓練過程未見過的節點。
-
避免了GraphSAGE中采用固定數量的鄰居。
模型的缺點:
因為attention本質上是在所有的節點(不僅僅是鄰居節點)上計算的,當圖的節點數目過大時,計算會變得非常低效。作者在論文中提出了這個問題,並留作未來的工作。
評估:
使用的數據集有:Cora,Citeseer和PPI。 在transductive learning任務上,GAT相比之前的state-of-the-art GCN有顯著提升。 在inductive learning任務航,GAT相比GraphSAGE的提升更為明顯,micro-averaged F1由0.612提升到0.942。
總結:
本篇論文提出的方法能夠有效的進行鄰居特征聚集,但是問題是還不能在大規模圖上應用(全局attention的限制)
Inductive Representation Learning On Large Graphs【閱讀筆記】
前言
Network Embedding 旨在為圖中的每個頂點學習得到特征表示。近年的Deepwalk,LINE, node2vec, SDNE, DNGR等模型能夠高效地、直推式(transductive)地得到節點的embedding。然而,這些方法無法有效適應動態圖中新增節點的特性, 往往需要從頭訓練或至少局部重訓練。斯坦福Jure教授組提出一種適用於大規模網絡的歸納式(inductive)學習方法-GraphSAGE,能夠為新增節點快速生成embedding,而無需額外訓練過程。
大部分直推式表示學習的主要問題有:
- 缺乏權值共享(Deepwalk, LINE, node2vec)。節點的embedding直接是一個N*d的矩陣, 互相之間沒有共享學習參數。
- 輸入維度固定為|V|。無論是基於skip-gram的淺層模型還是基於autoencoder的深層模型,輸入的維度都是點集的大小。訓練過程依賴點集信息的固定網絡結構限制了模型泛化到動態圖的能力,無法為新加入節點生成embedding。
模型
本文提出了一種基於鄰居特征聚集的方法,由以下三部分組成:
- 鄰居采樣。因為每個節點的度是不一致的,為了計算高效, 為每個節點采樣固定數量的鄰居。
- 鄰居特征聚集。通過聚集采樣到的鄰居特征,更新當前節點的特征。網絡第k層聚集到的 鄰居即為BFS過程第k層的鄰居。
-
訓練。既可以用獲得的embedding預測節點的上下文信息(context),也可以利用embedding做有監督訓練。
在實踐中,每個節點的receptive field設置為固定大小,且使用了均勻采樣方法簡化鄰居選擇過程。作者設計了四種不同的聚集策略,分別是Mean、GCN、LSTM、MaxPooling。
-
Mean Aggregator: 對所有對鄰居節點特征取均值。
- GCN Aggregator: 圖卷積聚集W(PX),W為參數矩陣,P為鄰接矩陣的對稱歸一化矩陣,X為節點特征矩陣。
- LSTM Aggregator: 把所有節點按隨機排列輸入LSTM,取最終隱狀態為聚集之后對表示。
- Pooling Aggregator: 鄰接特征經過線性變換化取各個位置上對最大值。
模型最終的損失函數為edge-wise loss,也使用了負采樣方法。
代碼解析
GraphSAGE代碼的開源地址here。在此,我針對部分關鍵代碼進行解析。
首先,鄰接表的構建和采樣分布在minibatch.py和neigh_samplers.py中,
def construct_adj(self):
adj = len(self.id2idx)*np.ones((len(self.id2idx)+1, self.max_degree))
deg = np.zeros((len(self.id2idx),))
for nodeid in self.G.nodes():
if self.G.node[nodeid]['test'] or self.G.node[nodeid]['val']:
continue
neighbors = np.array([self.id2idx[neighbor]
for neighbor in self.G.neighbors(nodeid)
if (not self.G[nodeid][neighbor]['train_removed'])])
deg[self.id2idx[nodeid]] = len(neighbors)
if len(neighbors) == 0:
continue
if len(neighbors) > self.max_degree:
neighbors = np.random.choice(neighbors, self.max_degree, replace=False)
elif len(neighbors) < self.max_degree:
neighbors = np.random.choice(neighbors, self.max_degree, replace=True)
adj[self.id2idx[nodeid], :] = neighbors
return adj, deg
class UniformNeighborSampler(Layer):
"""
Uniformly samples neighbors.
Assumes that adj lists are padded with random re-sampling
"""
def __init__(self, adj_info, **kwargs):
super(UniformNeighborSampler, self).__init__(**kwargs)
self.adj_info = adj_info
def _call(self, inputs):
ids, num_samples = inputs
adj_lists = tf.nn.embedding_lookup(self.adj_info, ids)
adj_lists = tf.transpose(tf.random_shuffle(tf.transpose(adj_lists)))
adj_lists = tf.slice(adj_lists, [0,0], [-1, num_samples])
return adj_lists
可以看出:在構建鄰接表時,對度數小於max_degree的點采用了有重復采樣,而對於度數超過max_degree的點采用了無重復采樣。
接下來,在真正為每個batch內的目標點選取receptive field點時,其代碼在model.py中,如下:
def sample(self, inputs, layer_infos, batch_size=None):
""" Sample neighbors to be the supportive fields for multi-layer convolutions.
Args:
inputs: batch inputs
batch_size: the number of inputs (different for batch inputs and negative samples).
"""
if batch_size is None:
batch_size = self.batch_size
samples = [inputs]
# size of convolution support at each layer per node
support_size = 1
support_sizes = [support_size]
for k in range(len(layer_infos)):
t = len(layer_infos) - k - 1
support_size *= layer_infos[t].num_samples
sampler = layer_infos[t].neigh_sampler
node = sampler((samples[k], layer_infos[t].num_samples))
samples.append(tf.reshape(node, [support_size * batch_size,]))
support_sizes.append(support_size)
return samples, support_sizes
這里采樣的過程與BFS過程相似,首先找到一個目標節點,之后是該節點的一階鄰居節點,再之后是所有一階節點的一階節點。參見該issue。
資源列表
Paper: https://arxiv.org/abs/1706.02216
Code: https://github.com/williamleif/GraphSAGE
Project page: http://snap.stanford.edu/graphsage
Inductive 表示學習 on Large Graphs
Inductive Representation Learning on Large Graphs
摘要
大的圖結構中,低維的節點的embedding,被證明在很多任務十分有效,
然而,現在大多的做法,在訓練embedding的時候 需要所有節點都在圖結構中出現,
即之前的做法本質是transductive的 不能泛化到之前未見的節點,
所以我們提出GraphSAGE,一個inductive模型 可以使用 比如文本屬性信息的節點特征 來產生之前未見節點的embedding,
不再訓練所有節點的每個embedding,我們訓練一個函數,通過從節點的鄰節點采樣和收集特征來產生embedding
在節點分類等任務超越業界最佳
一,引言
把圖結構embedding成向量表示,再輸入下一個神經網絡,進行節點分類等任務,是大家的做法,
然而,之前的做法,是針對一個固定的圖結構,但現實需要快速產生未見節點的embedding,或者產生一個全新圖結構的所有節點embedding,
我們利用節點特征,(如文本屬性,節點屬性,節點等級)來訓練一個embedding函數 以泛化到沒見的節點
我們訓練一組aggregator函數來從一個節點的鄰節點aggregate特征信息,每個aggregator函數從不同的hops或搜索深度aggregate信息,
二,相關工作
三,GraphSAGE
三,1,Embedding生成
假設現在模型已經訓練好,也就是假設已經訓練好K個aggregator函數,
表示節點v在步驟k的embedding向量表示
三,2,損失函數
兩兩節點u和v的embedding向量表示z的無監督的損失函數:
三,3,Aggregator結構
Mean aggregator:
表示節點v在步驟k的embedding向量表示
LSTM aggregator:
Pooling aggregator:
四,實驗
節點分類結果: