【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)

文章目录

  • EGES背景—DeepWalk理论与实现
  • DeepWalk引入推荐系统—EGES

在阅读此文之前建议先学习 word2vec详解。
2018 年,阿里巴巴公布了其在淘宝应用的Embedding方法EGES(Enhanced Graph Embedding with Side Information)算法,是Graph Embedding最佳实践。其基本思想是Embedding过程中引入带权重的补充信息(Side Information),从而解决冷启动的问题。
在介绍EGES之前,先了解一下DeepWalk理论,EGES是在DeepWalk的基础上引入带权重的side information。

EGES背景—DeepWalk理论与实现

图嵌入是指在图中随机游走生成顶点的序列,构成训练集,然后采用word2vec中的Skip_gram方法为图中的每个结点学习一个低维向量表示,这是一个无监督训练生成表示向量的过程。DeepWalk 出自论文:DeepWalk: Online Learning of Social Representations,最初提出是用于社交网络关系的提取。给定一个关系: G L = ( V , E , X , Y ) , G_L= (V, E, X, Y ), GL=(V,E,X,Y), 利用图结构中的依赖关系来获得重要信息。具体算法:

【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)_第1张图片

(1)RandomWalk的输入是图 G G G、随机的节点 v i v_i vi、生成的序列长度 t t t,返回随机游走的序列。生成的每一个序列都作为一个句子。

(2)SkipGram的输入是序列和一些基本参数,返回每个序列中的items的Embedding值。

DeepWalk实现

引入必要的库

import networkx as nx
import random

原始的图文件Wiki_edgelist.txt:

node1 node2 
node1 node3 

这个是有向无权图,以下代码可以随机生成权重。

w_f = open('data/wiki/Wiki_edgelist_p.edgelist', 'w')  # 新的有向带权图
with open('data/wiki/Wiki_edgelist.txt', 'r') as f:
    for line in f.readlines():
        new_line = line.strip() +' '+ str(round(random.random(),2)) + '\n'
        print(new_line)
        w_f.write(new_line)

读取有向带权图:

G = nx.read_edgelist('data/wiki/Wiki_edgelist.txt', create_using=nx.DiGraph(), data=(('weight',float)))

核心算法:

# 随机生成长度为walk_length,起点为start_node的序列
def deepwalk_walk(walk_length, start_node):
    walk = [start_node]
    while len(walk) < walk_length:
        cur = walk[-1]
        cur_nbrs = list(G.neighbors(cur))
        if len(cur_nbrs) > 0:
            walk.append(random.choice(cur_nbrs))
        else:
            break
    return walk

def _simulate_walks(nodes, num_walks, walk_length):
    walks = []
    for _ in range(num_walks):
        random.shuffle(nodes)
        # 为所有的结点生成序列
        for v in nodes:
            walks.append(deepwalk_walk(walk_length=walk_length, start_node=v))
    return walks

核心算法调用

# 获取所有结点
nodes = list(G.nodes())
# 生成序列
walks = _simulate_walks(nodes, num_walks=80, walk_length=10)

使用 gensim 中的 Word2Vec 来实现节点的 Embedding:

from gensim.models import Word2Vec
# 默认嵌入到100维
w2v_model = Word2Vec(walks,sg=1,hs=1)
# 打印其中一个节点的嵌入向量
print(w2v_model['1397'])

【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)_第2张图片

也可以使用库实现,github地址:https://github.com/shenweichen/GraphEmbedding
具体使用方式详见github。

DeepWalk引入推荐系统—EGES

推荐问题通用框架是分成两个阶段,即matching 和 ranking。
(1)在matching阶段,我们会生成一个候选集,它的items会与用户接触过的每个item具有相似性;

(2)在ranking阶段,我们会训练一个深度神经网络模型,它会为每个用户根据他的偏好对候选items进行排序。

论文Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba ,关注的问题在推荐系统的matching阶段,也就是从商品池中召回候选商品的阶段,核心的任务是计算所有item之间的相似度。论文提出了从用户行为构建图,其主要思想是:在物品组成的图上随机游走,产生大量的物品序列,然后进行w2v训练,得到每个物品的Embedding。因此,DeepWalk可以被看作连接序列Embedding和Graph Embedding的过渡方法。大致过程如下图:
【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)_第3张图片

先根据用户的行为序列构造图(图a到图b),在图中随机游走生成序列(图b到图c),采用word2vec中的SkipGram(负采样)算法对序列进行训练。最终生成物品Embedding向量。

注:每个边具有权重,在所有的用户历史行为中,物品 i i i 转移为物品 j j j 的概率,这也是随机游走的跳转概率。
这篇论文的额基本思想是Embedding过程中引入带权重的补充信息(Side Information),从而解决冷启动的问题。
对于一些冷门商品,这样做并不能得到准确的表达向量。因此论文引入了item的side information(item的类别,商店,价格等),假设side information一共有 n 个,则嵌入过程如下图 :
【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)_第4张图片

图中的向量 H \mathbf H H有两种嵌入方法:

(1)GES方法
H v = 1 n + 1 ∑ s = 0 n W v s \mathbf H_v = \frac{1}{n+1} \sum_{s=0}^{n} \mathbf W_v^s Hv=n+11s=0nWvs
其中, S I    0 SI \; 0 SI0代表item本身, S I    n SI\;n SIn是item v v v的side information, W v 0 \mathbf W_v^0 Wv0 是item v v v 的嵌入向量, W v s \mathbf W_v^s Wvs是item v v v的side information的嵌入结果。

(2)EGES

上述的 H v \mathbf H_v Hv计算方法存在问题,假设不同种类的边信息对最终嵌入的贡献是相等的,这并不能反映现实。例如,一个购买了iPhone的用户,往往会因为“Apple”这个品牌而去看Macbook或者iPad,而一个用户为了方便和便宜,可能会在淘宝上同一家商店购买不同品牌的衣服。因此,不同种类的边信息对用户行为中项目的共现有不同的贡献。所以,论文提出了一个加权平均层来聚合与项目相关的边信息的嵌入。
H v = ∑ j = 0 n e a v j W v j ∑ j = 0 n e a v j \mathbf H_v = \frac{\sum_{j=0}^n e^{a_v^j}\mathbf W_v^j}{\sum_{j=0}^n e^{a_v^j}} Hv=j=0neavjj=0neavjWvj
在训练过程中,对于顶点 v v v和他的上下文 u u u,设 Z u ∈ R d \mathbf Z_u \in R^d ZuRd 是其嵌入结果,所以其目标函数如下:
L ( v , u , y ) = − [ y log ⁡ ( σ ( H v T Z u ) + ( 1 − y ) log ⁡ ( 1 − σ ( H v T Z u ) ) ) ] L(v,u,y) = -[y\log(\sigma(\mathbf H_v^T \mathbf Z_u)+(1-y)\log(1-\sigma(\mathbf H_v^T \mathbf Z_u)))] L(v,u,y)=[ylog(σ(HvTZu)+(1y)log(1σ(HvTZu)))]

参考

【图嵌入】DeepWalk原理与代码实战

【Graph Embedding】DeepWalk:算法原理,实现和应用

Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba

你可能感兴趣的:(深度学习,推荐系统,python,深度学习,deepWalk,RandomWalk,图嵌入)