图神经网络--论文精读

论文精读


图神经网络

  • 论文精读
  • 摘要
  • 介绍
  • 问题定义
  • 学习表示
  • 算法
  • 代码实战
    • 加载百科词条,构建无向图
    • 训练Word2Vec模型


摘要

  • DeepWalk用于学习隐式表征的表示学习方法,将节点在图中的连接关系进行编码,形成稠密低维连续的向量空间,可用于统计机器学习
  • 在多类别网络分类任务上表现不错,例如BlogCatalog、Flickr和YouTube
  • DeepWalk基于随机游走的,适用于稀疏标注的场景

介绍

  • 背景:传统机器学习在稀疏性的数据上很难进行处理
  • DeepWalk能够通过随机游走序列(邻域信息和社群信息),学习网络的连接结构信息,将节点转换为向量
  • DeepWalk能用在标注数据稀疏的场景中,可以结合线性分类器,具备并行加速能力
  • 贡献:
  1. DeepWalk能够通过随机游走序列,学习节点在网络中的关联和规律
  2. 在多个节点分类数据集上,DeepWalk在标注数据稀疏场景下能提高5%~10%
  3. 可扩展性非常好,可以适用在YouTube数据集上

问题定义

  • 用随机游走序列采样连接信息,防止迭代产生的误差累计问题
  • 目标:通过反映连接信息的Embedding和反映节点本身的特征,进行学习数据集,结合简单的机器学习算法,解决分类问题。

学习表示

  • 特性:灵活可变、反映社群聚类信息、低纬度、连续
  • 随机游走:从点开始,通过随机过程,得到随机游走序列;可以使用并行方式,在线增量进行随机游走。
  • 幂律分布:在一个无标度网络中,中枢节点的连接数远高于其他节点,会产生长尾现象,也称为Zipf定律(词频排序名次与词频成正比,只有极少数的词被经常使用)

算法

DeepWalk算法:
图神经网络--论文精读_第1张图片
SkipGram算法:
图神经网络--论文精读_第2张图片
分层Sofmax

在这里插入图片描述

代码实战

加载百科词条,构建无向图

import networkx as nx
import pandas as pd
import numpy as np
import random
from tqdm import tqdm
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号
df = pd.read_csv("data/wiki/seealsology-data.tsv", sep = "\t")
df.head()
G = nx.from_pandas_edgelist(df, "source", "target", 
                            edge_attr=True, create_using=nx.Graph())
def get_randomwalk(node, path_length):
    '''
    输入起始节点和路径长度,生成随机游走节点序列
    '''    
    random_walk = [node]
    for i in range(path_length-1):
        # 汇总邻接节点
        temp = list(G.neighbors(node))
        temp = list(set(temp) - set(random_walk))    
        if len(temp) == 0:
            break
        # 从邻接节点中随机选择下一个节点
        random_node = random.choice(temp)
        random_walk.append(random_node)
        node = random_node
    return random_walk                            
all_nodes = list(G.nodes())
# 每个节点作为起始点生成随机游走序列个数
gamma = 10 
# 随机游走序列最大长度
walk_length = 5 
# 生成随机游走序列
random_walks = []

for n in tqdm(all_nodes):
    # 将每个节点作为起始点生成gamma个随机游走序列
    for i in range(gamma): 
        random_walks.append(get_randomwalk(n, walk_length))
                            

训练Word2Vec模型

from gensim.models import Word2Vec
model = Word2Vec(
    vector_size=256, # Embedding维数
    window=4, # 窗口宽度
    sg=1, # Skip-Gram
    hs=0, # 不加分层softmax
    negative=10, # 负采样
    alpha=0.03,  # 初始学习率
    min_alpha=0.0007, # 最小学习率
    seed=14 # 随机数种子
)
# 用随机游走序列构建词汇表
model.build_vocab(random_walks, progress_per=2)
# 训练Word2Vec模型
model.train(random_walks, total_examples=model.corpus_count, epochs=50, report_delay=1)
# 查看某个节点的Embedding
model.wv.get_vector('random forest').shape
# 找相似词语
model.wv.similar_by_word('decision tree')


你可能感兴趣的:(图神经网络,神经网络,机器学习,人工智能)