【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)
文章目錄
- EGES背景—DeepWalk理論與實現(xiàn)
- DeepWalk引入推薦系統(tǒng)—EGES
在閱讀此文之前建議先學習 word2vec詳解。
2018 年,阿里巴巴公布了其在淘寶應用的Embedding方法EGES(Enhanced Graph Embedding with Side Information)算法,是Graph Embedding最佳實踐。其基本思想是Embedding過程中引入帶權(quán)重的補充信息(Side Information),從而解決冷啟動的問題。
在介紹EGES之前,先了解一下DeepWalk理論,EGES是在DeepWalk的基礎(chǔ)上引入帶權(quán)重的side information。
EGES背景—DeepWalk理論與實現(xiàn)
圖嵌入是指在圖中隨機游走生成頂點的序列,構(gòu)成訓練集,然后采用word2vec中的Skip_gram方法為圖中的每個結(jié)點學習一個低維向量表示,這是一個無監(jiān)督訓練生成表示向量的過程。DeepWalk 出自論文:DeepWalk: Online Learning of Social Representations,最初提出是用于社交網(wǎng)絡(luò)關(guān)系的提取。給定一個關(guān)系: G L = ( V , E , X , Y ) , G_L= (V, E, X, Y ), GL?=(V,E,X,Y), 利用圖結(jié)構(gòu)中的依賴關(guān)系來獲得重要信息。具體算法:
(1)RandomWalk的輸入是圖 G G G、隨機的節(jié)點 v i v_i vi?、生成的序列長度 t t t,返回隨機游走的序列。生成的每一個序列都作為一個句子。
(2)SkipGram的輸入是序列和一些基本參數(shù),返回每個序列中的items的Embedding值。
DeepWalk實現(xiàn)
引入必要的庫
import networkx as nx import random原始的圖文件Wiki_edgelist.txt:
node1 node2 node1 node3這個是有向無權(quán)圖,以下代碼可以隨機生成權(quán)重。
w_f = open('data/wiki/Wiki_edgelist_p.edgelist', 'w') # 新的有向帶權(quán)圖 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)讀取有向帶權(quán)圖:
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:breakreturn walkdef _simulate_walks(nodes, num_walks, walk_length):walks = []for _ in range(num_walks):random.shuffle(nodes)# 為所有的結(jié)點生成序列for v in nodes:walks.append(deepwalk_walk(walk_length=walk_length, start_node=v))return walks核心算法調(diào)用
# 獲取所有結(jié)點 nodes = list(G.nodes()) # 生成序列 walks = _simulate_walks(nodes, num_walks=80, walk_length=10)使用 gensim 中的 Word2Vec 來實現(xiàn)節(jié)點的 Embedding:
from gensim.models import Word2Vec # 默認嵌入到100維 w2v_model = Word2Vec(walks,sg=1,hs=1) # 打印其中一個節(jié)點的嵌入向量 print(w2v_model['1397'])也可以使用庫實現(xiàn),github地址:https://github.com/shenweichen/GraphEmbedding
具體使用方式詳見github。
DeepWalk引入推薦系統(tǒng)—EGES
推薦問題通用框架是分成兩個階段,即matching 和 ranking。
(1)在matching階段,我們會生成一個候選集,它的items會與用戶接觸過的每個item具有相似性;
(2)在ranking階段,我們會訓練一個深度神經(jīng)網(wǎng)絡(luò)模型,它會為每個用戶根據(jù)他的偏好對候選items進行排序。
論文Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba ,關(guān)注的問題在推薦系統(tǒng)的matching階段,也就是從商品池中召回候選商品的階段,核心的任務是計算所有item之間的相似度。論文提出了從用戶行為構(gòu)建圖,其主要思想是:在物品組成的圖上隨機游走,產(chǎn)生大量的物品序列,然后進行w2v訓練,得到每個物品的Embedding。因此,DeepWalk可以被看作連接序列Embedding和Graph Embedding的過渡方法。大致過程如下圖:
先根據(jù)用戶的行為序列構(gòu)造圖(圖a到圖b),在圖中隨機游走生成序列(圖b到圖c),采用word2vec中的SkipGram(負采樣)算法對序列進行訓練。最終生成物品Embedding向量。
注:每個邊具有權(quán)重,在所有的用戶歷史行為中,物品 i i i 轉(zhuǎn)移為物品 j j j 的概率,這也是隨機游走的跳轉(zhuǎn)概率。
這篇論文的額基本思想是Embedding過程中引入帶權(quán)重的補充信息(Side Information),從而解決冷啟動的問題。
對于一些冷門商品,這樣做并不能得到準確的表達向量。因此論文引入了item的side information(item的類別,商店,價格等),假設(shè)side information一共有 n 個,則嵌入過程如下圖 :
圖中的向量 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+11?s=0∑n?Wvs?
其中, 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的嵌入結(jié)果。
(2)EGES
上述的 H v \mathbf H_v Hv?計算方法存在問題,假設(shè)不同種類的邊信息對最終嵌入的貢獻是相等的,這并不能反映現(xiàn)實。例如,一個購買了iPhone的用戶,往往會因為“Apple”這個品牌而去看Macbook或者iPad,而一個用戶為了方便和便宜,可能會在淘寶上同一家商店購買不同品牌的衣服。因此,不同種類的邊信息對用戶行為中項目的共現(xiàn)有不同的貢獻。所以,論文提出了一個加權(quán)平均層來聚合與項目相關(guān)的邊信息的嵌入。
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=0n?eavj?∑j=0n?eavj?Wvj??
在訓練過程中,對于頂點 v v v和他的上下文 u u u,設(shè) Z u ∈ R d \mathbf Z_u \in R^d Zu?∈Rd 是其嵌入結(jié)果,所以其目標函數(shù)如下:
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(σ(HvT?Zu?)+(1?y)log(1?σ(HvT?Zu?)))]
參考
【圖嵌入】DeepWalk原理與代碼實戰(zhàn)
【Graph Embedding】DeepWalk:算法原理,實現(xiàn)和應用
Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba
總結(jié)
以上是生活随笔為你收集整理的【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java: 找不到符号 符号: 变量 l
- 下一篇: 汽车之家股票回购速度远低于预期,面临严重