圖神經網絡-圖遊走算法核心代碼SkipGram、Node2Vec實現

2021-03-02 從零起步學習人工智慧

圖神經網絡-圖遊走算法核心代碼SkipGram、Node2Vec實現

1. DeepWalk採樣算法

對於給定的節點,DeepWalk會等概率的選取下一個相鄰節點加入路徑,直至達到最大路徑長度,或者沒有下一個節點可選。

2. SkipGram模型訓練

在得到節點路徑後,node2vec會使用SkipGram模型學習節點表示,給定中心節點,預測局部路徑中還有哪些節點。模型中用了negative sampling來降低計算量。



loss的計算過程可參考 PGL/examples/node2vec/node2vec.py中的 node2vec_model 函數。

%%writefile userdef_model.pyimport paddle.fluid.layers as l
def userdef_loss(embed_src, weight_pos, weight_negs): """ 輸入:embed_src - 中心節點向量 list (batch_size, 1, embed_size) weight_pos - 標籤節點向量 list (batch_size, 1, embed_size) weight_negs - 負樣本節點向量 list (batch_size, neg_num, embed_size) 輸出:loss - 正負樣本的交叉熵 float """ pos_logits = l.matmul( embed_src, weight_pos, transpose_y=True) neg_logits = l.matmul( embed_src, weight_negs, transpose_y=True)
ones_label = pos_logits * 0. + 1. ones_label.stop_gradient = True pos_loss = l.sigmoid_cross_entropy_with_logits(pos_logits, ones_label)
zeros_label = neg_logits * 0. zeros_label.stop_gradient = True neg_loss = l.sigmoid_cross_entropy_with_logits(neg_logits, zeros_label)
loss = (l.reduce_mean(pos_loss) + l.reduce_mean(neg_loss)) / 2 return loss

運行腳本,可以查看在ArXiv數據集上的效果: 

!python my_node2vec.py  --use_my_model --epoch 5 # 使用自己定義的loss函數!python link_predict.py --ckpt_path ./tmp/node2vec/paddle_model --epoch 100


pgl的官網node2vec_model原始碼:

def node2vec_model(graph, hidden_size=16, neg_num=5):
pyreader = l.py_reader( capacity=70, shapes=[[-1, 1, 1], [-1, 1, 1], [-1, neg_num, 1]], dtypes=['int64', 'int64', 'int64'], lod_levels=[0, 0, 0], name='train', use_double_buffer=True)
embed_init = fluid.initializer.UniformInitializer(low=-1.0, high=1.0) weight_init = fluid.initializer.TruncatedNormal(scale=1.0 / math.sqrt(hidden_size))
src, pos, negs = l.read_file(pyreader)
embed_src = l.embedding( input=src, size=[graph.num_nodes, hidden_size], param_attr=fluid.ParamAttr( name='content', initializer=embed_init))
weight_pos = l.embedding( input=pos, size=[graph.num_nodes, hidden_size], param_attr=fluid.ParamAttr( name='weight', initializer=weight_init)) weight_negs = l.embedding( input=negs, size=[graph.num_nodes, hidden_size], param_attr=fluid.ParamAttr( name='weight', initializer=weight_init))
pos_logits = l.matmul( embed_src, weight_pos, transpose_y=True) # [batch_size, 1, 1] neg_logits = l.matmul( embed_src, weight_negs, transpose_y=True) # [batch_size, 1, neg_num]
ones_label = pos_logits * 0. + 1. ones_label.stop_gradient = True pos_loss = l.sigmoid_cross_entropy_with_logits(pos_logits, ones_label)
zeros_label = neg_logits * 0. zeros_label.stop_gradient = True neg_loss = l.sigmoid_cross_entropy_with_logits(neg_logits, zeros_label) loss = (l.reduce_mean(pos_loss) + l.reduce_mean(neg_loss)) / 2
return pyreader, loss

3. Node2Vec採樣算法

Node2Vec會根據與上個節點的距離按不同概率採樣得到當前節點的下一個節點。

PGL/pgl/graph_kernel.pyx 中用Cython語言實現了節點採樣函數node2vec_sample,以下使用numpy實現自己的node2vec_sample函數 ,用於隨機遊走後得到的路徑,然後對這些路徑進行吸收學習,訓練圖結構

%%writefile userdef_sample.pydef node2vec_sample(succ, prev_succ, prev_node, p, q):    """    輸入:succ - 當前節點的下一個相鄰節點id列表 list (num_neighbors,)         prev_succ - 前一個節點的下一個相鄰節點id列表 list (num_neighbors,)         prev_node - 前一個節點id int         p - 控制回到上一節點的概率 float         q - 控制偏向DFS還是BFS float    輸出:下一個節點id int    """                    succ_len = len(succ)                    prev_succ_len = len(prev_succ)          prev_succ_set = np.asarray([])   
for i in range(prev_succ_len): prev_succ_set = np.append(prev_succ_set,prev_succ[i]) probs = [] prob = 0 prob_sum = 0.
for i in range(succ_len): if succ[i] == prev_node: prob = 1. / p elif np.where(prev_succ_set==succ[i]): prob = 1. elif np.where(prev_succ_set!=succ[i]): prob = 1. / q else: prob = 0.
probs.append(prob) prob_sum += prob RAND_MAX = 65535 rand_num = float(np.random.randint(0, RAND_MAX+1)) / RAND_MAX * prob_sum
sampled_succ = 0.
for i in range(succ_len): rand_num -= probs[i] if rand_num <= 0: sampled_succ = succ[i] return sampled_succ

運行腳本

!python my_node2vec.py  --use_my_sample --epoch 5 !python link_predict.py --ckpt_path ./tmp/node2vec/paddle_model --epoch 100 

pgl官網node2vec_sample原始碼

@cython.boundscheck(False)@cython.wraparound(False)def node2vec_sample(np.ndarray[np.int64_t, ndim=1] succ,        np.ndarray[np.int64_t, ndim=1] prev_succ, long long prev_node,        float p, float q):    """Fast implement of node2vec sampling    """    cdef long long i    cdef succ_len = len(succ)    cdef prev_succ_len = len(prev_succ)
cdef vector[float] probs cdef float prob_sum = 0
cdef unordered_set[long long] prev_succ_set for i in xrange(prev_succ_len): prev_succ_set.insert(prev_succ[i])
cdef float prob for i in xrange(succ_len): if succ[i] == prev_node: prob = 1. / p elif prev_succ_set.find(succ[i]) != prev_succ_set.end(): prob = 1. else: prob = 1. / q probs.push_back(prob) prob_sum += prob
cdef float rand_num = float(rand())/RAND_MAX * prob_sum
cdef long long sample_succ = 0 for i in xrange(succ_len): rand_num -= probs[i] if rand_num <= 0: sample_succ = succ[i] return sample_succ

 

相關焦點

  • 【圖神經網絡】萬物皆可Graph | 當推薦系統遇上圖神經網絡
    NewBeeNLP原創出品  公眾號專欄作者@上杉翔二 悠閒會 · 信息檢索圖神經網絡可以說是現在AI領域的超級寵兒。不過首先來看一下對於user-item二部圖的一般處理方法「GCMC」,通用的捕捉主要是需要處理四步,PS!文末有我們新建立的『圖神經網絡』專題討論組,名額有限,趕緊加入一起精準交流吧!
  • 萬物皆可Graph | 當推薦系統遇上圖神經網絡
    NewBeeNLP原創出品  公眾號專欄作者@上杉翔二 悠閒會 · 信息檢索圖神經網絡可以說是現在AI領域的超級寵兒。不過首先來看一下對於user-item二部圖的一般處理方法「GCMC」,通用的捕捉主要是需要處理四步,PS!文末有我們新建立的『圖神經網絡』專題討論組,名額有限,趕緊加入一起精準交流吧!
  • Graph neural networks-圖神經網絡
    (3)很多圖有我們可以利用的特徵,淺編碼沒法把節點特徵也反映在嵌入向量裡。02Graph Neural NetworksGraph neural networks是一種用於圖狀數據結構的深度學習網絡。左圖是輸入的圖,A點是目標節點。A的嵌入向量由底而上生成。B的鄰節點是A和C,C的鄰節點是ABEF,D的鄰節點是A,B,C,D是A的直接鄰節點。每個節點都會有獨一無二而的計算網絡。
  • 圖神經網絡10-GraphSAGE論文全面解讀
    GraphSAGE的核心:GraphSAGE不是試圖學習一個圖上所有node的embedding,而是學習一個為每個node產生embedding的映射。In KDD, 2015node2vec: Scalable feature learning for networks. In KDD, 2016Deepwalk: Online learning of social representations.
  • 圖什麼?圖採樣GraphSAGE呀
    ,算法可以泛化到完全未見過的圖上。一些神經網絡方法用於圖結構上的監督學習,本文的方法在概念上受到了這些算法的啟發。Discriminative embeddings of latent variable models for structured data.
  • Word2vec, Fasttext, Glove, Elmo, Bert, Flair訓練詞向量教程+數據+源碼
    1、genism庫gensim庫中提供了word2vec的cbow模型和skipgram模型的實現,可直接調用完整版參考代碼 2、tensorflow實現skipgram模型skipgram模型使用中心詞預測上下文,網上介紹很多了也可直接去看論文本模型實驗採用的數據時wiki百科中文數據,
  • GraphSAGE 圖神經網絡算法詳解
    今天我們就梳理一下這篇文章的核心思路,和一些容易被忽視的細節。為什麼要用 GraphSAGE大家先想想圖為什麼這麼火,主要有這麼幾點原因,圖的數據來源豐富,圖包含的信息多。所以現在都在考慮如何更好的使用圖的信息。那麼我們用圖需要做到什麼呢?
  • 人工神經網絡之正反向傳播
    hW(xi) 和 yi 差異需要選擇一個損失函數 l,以平方差類型為例定義如下:接下來我們需要編寫一個函數,它的輸入是 {權重,每層節點個數,圖片像素,圖片數字,懲罰係數},輸出是 {代價函數值,梯度},函數如下:    [ J, grad ] = ANN_CF( W_vec, node_size, X, y, lambda )代價函數值 J 是由正向傳播算出,而梯度 grad 是由反向傳播算出。
  • 【基礎算法】word2vec詞向量
    其模型結構如下圖所示而基於這兩種模型結構,word2vec作者又提出了兩種改進方法,用來提升模型訓練速度,因此,word2vec可細分為四種模型:基於Hierarchical Softmax的CBOW模型基於Hierarchical Softmax的skip-Gram模型基於Negative Sampling的CBOW模型基於Negative Sampling的skip-Gram模型
  • 對話清華NLP實驗室劉知遠:NLP搞事情少不了知識庫與圖神經網絡
    Google、DeepMind 等研究機構很重視這個方向,現在比較流行的圖神經網絡可以看做這方面的重要嘗試。我們有望通過圖神經網絡將結構化知識融入深度學習,實現各種計算與推理任務。我認為,未來這兩個大方向都非常重要,它們會相互補充與促進:網際網路上有海量的非結構化數據,需要 BERT 等深度學習模型發揮重要作用;我們也積累了海量結構化知識,如何利用這些知識也具有重要意義。
  • 2021年必火的圖神經網絡到底是什麼?
    )是一種基於圖結構的深度學習方法,從其定義中可以看出圖神經網絡主要由兩部分組成,即「圖」和「神經網絡」。只展示如下兩圖典型的CNN和RNN的結構:1.3圖神經網絡根據上述對圖和神經網絡的回顧,我們可以看出,圖神經網絡就是藉助神經網絡的「能力」如深度特徵抽取等來處理圖結構的數據,因此對於圖神經網絡,其直觀的結構應該如下圖:其中圖結構的數據有許多,如社交網絡圖、交通路線圖、人物關係圖、分子結構圖、計算結網絡拓撲圖等等。這些數據都可以作為圖神經網絡的輸入。
  • 圖神經網絡三劍客:GCN、GAT與GraphSAGE
    ©PaperWeekly 原創 · 作者|桑運鑫學校|上海交通大學研究方向|圖神經網絡在金融領域的應用2019 年號稱圖神經網絡元年,在各個領域關於圖神經網絡的研究爆發式增長。本文主要介紹一下三種常見圖神經網絡:GCN、GAT 以及 GraphSAGE。
  • 掌握圖神經網絡GNN基本,看這篇文章就夠了
    圖神經網絡(GNN)在各個領域越來越受歡迎,本文介紹了圖神經網絡的基本知識,以及兩種更高級的算法:DeepWalk和GraphSage。
  • 【A】性能超越圖神經網絡,將標籤傳遞和簡單模型結合實現SOTA
    圖神經網絡(GNNs)是圖學習中一種主流的技術。
  • 【神經網絡搜索】Efficient Neural Architecture Search
    從一個大的計算圖中挑選出最優的子圖就是ENAS的核心思想,而子圖之間都是共享權重的。https://arxiv.org/pdf/1802.03268v2.pdf1. 摘要ENAS是一個快速、代價低的自動網絡設計方法。在ENAS中,控制器controller通過在大的計算圖中搜索挑選一個最優的子圖來得到網絡結構。
  • 圖異常檢測丨異常(子)圖檢測算法概述
    大綱根據算法模型的檢測級別圖異常檢測任務大體上分為三類:Node-Level:圖異常檢測丨異常節點檢測算法綜述Edge-Level:圖異常檢測丨異常邊檢測算法綜述(Sub)Graph-Level:圖異常檢測丨異常(子)圖檢測算法綜述在上述分類下可以根據圖數據類型可以進一步區分,主要包括
  • 用粒子群優化算法訓練神經網絡
    PSO-for-Neural-Nets大家知道,使用反向傳播對神經網絡進行訓練是非常有效的。但如果網絡參數的初始值設得不好時,各位可能也有過訓練十分緩慢的經歷。本篇是一項實驗工作,目的是在訓練神經網絡時不使用反向傳播以及梯度下降算法,而是先使用粒子群優化算法(Particle Swarm Optimization,PSO)對網絡參數進行初始化,之後可以再次使用反向傳播對網絡進行正式訓練。
  • word2vec模型深度解析
    ,對於掌握word2vec算法細節和原理非常有幫助!「3、word2vec模型訓練機制(優化方法)」一般神經網絡語言模型在預測的時候,輸出的是預測目標詞的概率,也就是說我每一次預測都要基於全部的數據集進行計算,這無疑會帶來很大的時間開銷。
  • 忘掉PS,進入神經網絡修圖時代
    要求的訓練數據能輕易獲得——機器學習從業人員都知道,數據有時候要比算法貴很多。使用先進的機器學習算法(谷歌、亞馬遜等公司仍未在其雲平臺上提供的),但不要太過先進(這樣我們就還能在網上找到一些實例)有實現「生產就緒」的潛力。我們早期的想法是從一些醫療項目下手,因為這個領域深得人心,我們(仍然)感覺深度學習在醫療領域有很多容易實現的應用。
  • 防止神經網絡模型過擬合的6種方法及keras代碼實現
    這些常見的模型比如卷積神經網絡、循環神經網絡、自編碼器等等。這種在訓練集上表現的好,在測試集上效果差,模型泛化能力弱,則是典型的過擬合問題。下面將結合實際介紹幾種解決過擬合的方法。每次使用梯度下降時,只使用隨機的一般神經元進行更新權值和偏置,因此我們的神經網絡是在一半的隱藏神經元被丟棄的情況下學習的。可以理解為,當dropout不同神經元集合時,有點像在訓練不同的神經網絡。而不同的神經網絡會以不同的方式過擬合,所以dropout就類似於不同的神經網絡以投票的方式降低過擬合。其原理如圖右邊所示。