深度学习推荐系统中各类流行的Embedding方法(下)

Embedding技术概览:
在这里插入图片描述

对其它Embedding技术不熟悉,可以看我的上一篇文章:

深度学习推荐系统中各类流行的Embedding方法(上)地址:https://mp.weixin.qq.com/s/D57jP5EwIx4Y1n4mteGOjQ

1. Graph Embedding简介

Word2Vec和其衍生出的Item2Vec类模型是Embedding技术的基础性方法,二者都是建立在“序列”样本(比如句子、用户行为序列)的基础上的。在互联网场景下,数据对象之间更多呈现的是图结构,所以Item2Vec在处理大量的网络化数据时往往显得捉襟见肘,在这样的背景下,Graph Embedding成了新的研究方向,并逐渐在深度学习推荐系统领域流行起来。

Graph Embedding也是一种特征表示学习方式,借鉴了Word2Vec的思路。在Graph中随机游走生成顶点序列,构成训练集,然后采用Skip-gram算法,训练出低维稠密向量来表示顶点。之后再用学习出的向量解决下游问题,比如分类,或者连接预测问题等。可以看做是两阶段的学习任务,第一阶段先做无监督训练生成表示向量,第二阶段再做有监督学习,解决下游问题。

总之,Graph Embedding是一种对图结构中的节点进行Embedding编码的方法。最终生成的节点Embedding向量一般包含图的结构信息及附近节点的局部相似性信息。不同Graph Embedding方法的原理不尽相同,对于图信息的保留方式也有所区别,下面就介绍几种主流的Graph Embedding方法和它们之间的区别与联系。

2. DeepWalk-Graph Embedding早期技术

早期,影响力较大的Graph Embedding方法是于2014年提出的DeepWalk,它的主要思想是在由物品组成的图结构上进行随机游走,产生大量物品序列,然后将这些物品序列作为训练样本输入Word2Vec进行训练,得到物品的Embedding。因此,DeepWalk可以被看作连接序列Embedding和Graph Embedding的过渡方法。
在这里插入图片描述
论文《Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba》用上图所示的方法展现了DeepWalk的算法流程。DeepWalk算法的具体步骤如下:

  • 图(a)是原始的用户行为序列。
  • 图(b)基于这些用户行为序列构建了物品关系图。可以看出,物品A和B之间的边产生的原因是用户U1先后购买了物品A和物品B。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品关系图中的边之后,全局的物品关系图就建立起来了。
  • 图(c)采用随机游走的方式随机选择起始点,重新产生物品序列。
  • 将这些物品序列输入图(d)所示的Word2Vec模型中,生成最终的物品Embedding向量。

在上述DeepWalk的算法流程中,唯一需要形式化定义的是随机游走的跳转概率,也就是到达结点 v i v_{i} vi 后,下一步遍历 v i v_{i} vi 的邻接点 v j v_{j} vj 的概率。如果物品关系图是有向有权图,那么从节点 v i v_{i} vi 跳转到节点 v j v_{j} vj 的概率定义如下式所示。
P ( v j ∣ v i ) = { M i j ∑ j ∈ N + ( v i ) M i j , v j ∈ N + ( v i ) 0 , e i j ∉ ε P(v_{j}|v_{i}) =\left\{ \begin{aligned} \frac{M_{ij}}{\sum_{j\in N_{+}(v_{i})}^{}{M_{ij}}} &, v_{j}\in N_{+}(v_{i}) \\ 0 &, e_{ij} \notin \varepsilon \\ \end{aligned} \right. P(vjvi)=jN+(vi)MijMij0,vjN+(vi),eij/ε

其中 ε \varepsilon ε 是物品关系图中所有边的集合, N + ( v i ) N_{+}(v_{i}) N+(vi) 是节点 v i v_{i} vi 所有的出边集合, M i j M_{ij} Mij 是节点 v i v_{i} vi 到节点 v j v_{j} vj 边的权重,即DeepWalk的跳转概率就是跳转边的权重占所有相关出边权重之和的比例。

如果物品关系图是无向无权图,那么跳转概率将是上式的一个特例,即权重 M i j M_{ij} Mij 将为常数 1 1 1,且 N + ( v i ) N_{+}(v_{i}) N+(vi) 应是节点 v i v_{i} vi 所有“边”的集合,而不是所有“出边”的集合。

注意: 在DeepWalk论文中,作者只提出DeepWalk用于无向无权图。DeepWalk用于有向有权图的内容是阿里巴巴论文《Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba》中提出的Base Graph Embedding(BGE)模型,其实该模型就是对DeepWalk模型的实践,本文后边部分会讲解该模型。

DeepWalk相关论文:

【1】Perozzi B, Alrfou R, Skiena S, et al. DeepWalk: online learning of social representations[C]. knowledge discovery and data mining, 2014: 701-710.

【2】Wang J, Huang P, Zhao H, et al. Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba[C]. knowledge discovery and data mining, 2018: 839-848.

3. LINE-DeepWalk的改进

DeepWalk使用DFS(Deep First Search,深度优先搜索)随机游走在图中进行节点采样,使用Word2Vec在采样的序列上学习图中节点的向量表示。LINE(Large-scale Information Network Embedding)也是一种基于邻域相似假设的方法,只不过与DeepWalk使用DFS构造邻域不同的是,LINE可以看作是一种使用BFS(Breath First Search,广度优先搜索)构造邻域的算法。

在Graph Embedding各个方法中,一个主要区别是对图中顶点之间的相似度的定义不同,所以先看一下LINE对于相似度的定义。

3.1 LINE定义图中节点之间的相似度

现实世界的网络中,相连接的节点之间存在一定的联系,通常表现为比较相似或者在向量空间中距离接近。对于带权网络来说,节点之间的权越大,相似度会越高或者距离越接近,这种关系称为一阶近邻。一阶近邻关系用于描述图中相邻顶点之间的局部相似度, 形式化描述为若顶点 u u u v v v之间存在直连边,则边权 w u v w_{uv} wuv即为两个顶点的相似度,若不存在直连边,则一阶相似度为 0 0 0。 如下图所示, 6 6 6 7 7 7之间存在直连边,且边权较大(表现为图中顶点之间连线较粗),则认为两者相似且一阶相似度较高,而 5 5 5 6 6 6之间不存在直连边,则两者间一阶相似度为 0 0 0

但是,网络中的边往往比较稀疏,仅仅依靠一阶近邻关系,难以描述整个网络的结构。论文中定义了另外一种关系叫做二阶近邻。例如下图中的网络,节点 5 5 5和节点 1 , 2 , 3 , 4 {1,2,3,4} 1,2,3,4相连,节点 6 6 6也和节点 1 , 2 , 3 , 4 {1,2,3,4} 1,2,3,4相连,虽然节点 5 5 5 6 6 6之间没有直接联系,但是节点 5 5 5 6 6 6之间很可能存在某种相似性。举个例子,在社交网络中,如果两个人的朋友圈重叠度很高,或许两个人之间具有相同的兴趣并有可能成为朋友;在NLP中,如果不同的词经常出现在同一个语境中,那么两个词很可能意思相近。

LINE通过捕捉网络中的一阶近邻关系和二阶近邻关系,更加完整地描述网络。并且LINE适用于有向图、无向图、有权图、无权图。
在这里插入图片描述

3.2 LINE算法模型

(1)一阶近邻关系模型

一阶近邻关系模型中定义了两个概率,一个是联合概率,如下公式所示:
p 1 ( v i , v j ) = 1 1 + e x p ( − u ⃗ i T ⋅ u ⃗ j ) p_1(v_i, v_j) = \frac1 {1 + exp( - \vec{u}^{T}_i \cdot \vec{ u}_j)} p1(vi,vj)=1+exp(u iTu j)1

其中, u ⃗ i \vec{u}_{i} u i 是图中节点 v i v_{i} vi 的向量表示,上式表示节点 v i v_i vi v j v_j vj 之间的相似程度,这是一个sigmoid函数。

另外一个是经验概率,如下公式所示:
p ^ 1 ( i , j ) = w i j W , W = ∑ ( i , j ) ∈ E w i j \hat{p}_1(i,j)=\frac{w_{ij}}{W} , W=\sum_{(i,j)\in E} w_{ij} p^1(i,j)=Wwij,W=(i,j)Ewij

其中, w i j w_{ij} wij 是节点 v i v_i vi v j v_j vj 之间的权重。优化目标为最小化下式:
O 1 = d ( p ^ 1 ( ⋅ , ⋅ ) , p 1 ( ⋅ , ⋅ ) ) O_1=d(\hat{p}_1(\cdot,\cdot),p_1(\cdot,\cdot)) O1=d(p^1(,),p1(,))
其中, d ( ⋅ , ⋅ ) d(\cdot,\cdot) d(,)是两个分布的距离,目标是期望两个概率分布接近,利用KL散度来计算相似性,丢掉常数项之后,得到下面公式:
O 1 = − ∑ ( i , j ) ∈ E w i j log ⁡ p 1 ( v i , v j ) O_1=-\sum_{(i,j)\in E}w_{ij}\log{p_1(v_i,v_j)} O1=(i,j)Ewijlogp1(vi,vj)
一阶近邻关系模型的优化目标就是最小化 O 1 O_1 O1 。可以看到,上面这些公式无法表达方向概念,因此一阶近邻关系模型只能描述无向图。

(2)二阶近邻关系模型

二阶近邻关系描述的是节点与邻域的关系,每个节点有两个向量,一个是该顶点本身的表示向量,一个是该顶点作为其他顶点的邻居时的表示向量,因此论文中对每个节点定义了两个向量, u ⃗ i \vec{u}_i u i 表示节点 i i i本身, u ⃗ j ′ \vec{u}_j' u j 是节点 j j j作为邻居的向量表示。针对每一个从节点 i i i j j j的有向边 ( i , j ) (i,j) (i,j),定义一个条件概率,如下式:
p 2 ( v j ∣ v i ) = e x p ( u ⃗ j ′ T ⋅ u ⃗ i ) ∑ k = 1 ∣ V ∣ e x p ( u ⃗ k ′ T ⋅ u ⃗ i ) p_2(v_j|v_i)=\frac {exp(\vec{u}_j'^{T} \cdot \vec{u}_i)} {\sum_{k=1}^{|V|} exp(\vec{u}_k'^{T} \cdot \vec{u}_i)} p2(vjvi)=k=1Vexp(u kTu i)exp(u jTu i)
其中, ∣ V ∣ |V| V是图中所有的节点数量,这其实是一个 s o f t m a x softmax softmax函数。同样,还有一个经验概率,如下式:
p ^ 2 ( v j ∣ v i ) = w i j d i , d i = ∑ k ∈ N ( i ) w i k \hat {p}_2(v_j|v_i)=\frac {w_{ij}} {d_i}, d_i=\sum_{k\in N(i)}w_{ik} p^2(vjvi)=diwij,di=kN(i)wik
其中, w i j w_{ij} wij 是边 ( i , j ) (i,j) (i,j)的边权, d i d_i di是从顶点 v i v_i vi出发指向邻居节点的所有边权之和, N ( i ) N(i) N(i)是从节点 i i i出发指向邻居的所有边集合。同样需要最小化条件概率和经验概率之间的距离,优化目标为:
O 2 = ∑ i ∈ V λ i d ( p ^ 2 ( ⋅ ∣ v i ) , p 2 ( ⋅ ∣ v i ) ) O_2=\sum _{i \in V}\lambda_i d(\hat p_2(\cdot |v_i), p_2(\cdot|v_i)) O2=iVλid(p^2(vi),p2(vi))

其中, λ i \lambda_i λi为控制节点重要性的因子,可以通过顶点的度数或者PageRank等方法估计得到。假设度比较高的节点权重较高,令 λ i = d i \lambda_i=d_i λi=di ,采用KL散度来计算距离,略去常数项后,得到公式:
O 2 = − ∑ ( i , j ) ∈ E w i j l o g p 2 ( v j ∣ v i ) O_2=-\sum_{(i,j) \in E} w_{ij}logp_2(v_j|v_i) O2=(i,j)Ewijlogp2(vjvi)
直接优化上式计算复杂度很高,每次迭代需要对所有的节点向量做优化,论文中使用Word2Vec中的负采样方法,得到二阶近邻的优化目标,如下公式所示。从计算的过程可以看到,二阶相似度模型可以描述有向图。
O 2 = − ∑ ( i , j ) ∈ E w i j ⋅ ( l o g σ ( u ⃗ j ′ T ⋅ u ⃗ i ) + ∑ i = 1 K E v n ∼ P n ( v ) [ l o g σ ( − u ⃗ n ′ T ⋅ u ⃗ i ) ] ) O_2=-\sum _{(i,j) \in E} w_{ij} \cdot (log\sigma(\vec{u}'^{T}_j \cdot \vec{u}_i) + \sum _{i=1}^{K} E_{v_n\sim P_n(v)}[log \sigma(- \vec{u}'^{T}_n \cdot \vec{u}_i)]) O2=(i,j)Ewij(logσ(u jTu i)+i=1KEvnPn(v)[logσ(u nTu i)])

对比一阶近邻模型和二阶近邻模型的优化目标,差别就在于,二阶近邻模型对每个节点多引入了一个向量表示。实际使用的时候,对一阶近邻模型和二阶近邻模型分别训练,然后将两个向量拼接起来作为节点的向量表示。

此外有一点需要说明,在Graph Embedding方法中,例如DeepWalk、Node2Vec、EGES,都是采用随机游走的方式来生成序列再做训练,而LINE直接用边来构造样本,这也是他们的一点区别。

LINE论文:

【1】Tang J, Qu M, Wang M, et al. Line: Large-scale information network embedding[C]//Proceedings of the 24th international conference on world wide web. 2015: 1067-1077.

4. node2vec - DeepWalk的改进

2016年,斯坦福大学的研究人员在DeepWalk的基础上更进一步,提出了node2vec模型,它通过调整随机游走权重的方法使Graph Embedding的结果更倾向于体现网络的同质性(homophily)或结构性(structural equivalence)。

4.1 node2vec的同质性和结构性

具体的讲,网络的“同质性”指的是距离相近节点的Embedding应尽量近似,如下图所示,节点 u u u 与其相连的节点 s 1 , s 2 , s 3 , s 4 s_{1},s_{2},s_{3},s_{4} s1,s2,s3,s4 的Embedding表达应该是接近的,这就是网络的“同质性”的体现。

“结构性”指的是结构上相似的节点Embedding应尽量近似,下图中节点 U U U 和节点 s 6 s_{6} s6 都是各自局域网络的中心节点,结构上相似,其Embedding的表达也应该近似,这是“结构性”的体现。
在这里插入图片描述

为了使Graph Embedding的结果能够表达网络的“结构性”,在随机游走过程中,需要让游走的过程更倾向于BFS,因为BFS会更多地在当前节点的邻域中游走遍历,相当于对当前节点周边的网络结构进行一次“微观扫描”。当前节点是“局部中心节点”,还是“边缘节点”,或是“连接性节点”,其生成的序列包含的节点数量和顺序必然是不同的,从而让最终的Embedding抓取到更多结构性信息。

另外,为了表达“同质性”,需要让随机游走的过程更倾向于DFS,因为DFS更有可能通过多次跳转,游走到远方的节点上,但无论怎样,DFS的游走更大概率会在一个大的集团内部进行,这就使得一个集团或者社区内部的节点的Embedding更为相似,从而更多地表达网络的“同质性”。

但是在不同的任务中需要关注的重点不同,可能有些任务需要关注网络的homophily,而有些任务比较关注网络的structural equivalence,可能还有些任务两者兼而有之。在DeepWalk中,使用DFS随机游走在图中进行节点采样,使用Word2Vec在采样的序列学习图中节点的向量表示,无法灵活地捕捉这两种关系。

实际上,对于这两种关系的偏好,可以通过不同的序列采样方式来实现。有两种极端的方式,一种是BFS,如上图中红色箭头所示,从u出发做随机游走,但是每次都只采样顶点u的直接邻域,这样生成的序列通过无监督训练之后,特征向量表现出来的是structural equivalence特性。另外一种是DFS,如上图中蓝色箭头所示,从u出发越走越远,学习得到的特征向量反应的是图中的homophily关系。

4.2 node2vec算法

那么在node2vec算法中,是怎么控制BFS和DFS的倾向性呢?主要是通过节点间的跳转概率。下图所示为node2vec算法从节点 t t t跳转到节点 v v v,再从节点 v v v跳转到周围各点的跳转概率。假设从某顶点出发开始随机游走,第 i − 1 i-1 i1步走到当前顶点 v v v,要探索第 i i i步的顶点 x x x,如下图所示。下面的公式表示从顶点 v v v x x x的跳转概率, E E E是图中边的集合, ( v , x ) (v, x) (v,x)表示顶点 v v v x x x之间的边, π v x \pi_{vx} πvx 表示从节点 v v v跳转到下一个节点 x x x的概率, Z Z Z是归一化常数。

带偏随机游走的最简单方法是基于下一个节点边权重 w v x w_{vx} wvx 进行采样,即 π v x = w v x \pi _{vx} = w_{vx} πvx=wvx Z Z Z是权重之和。对于无权重的网络, w v x = 1 w_{vx}=1 wvx=1。最简单的方式,就是按照这个转移概率进行随机游走,但是无法控制BFS和DFS的倾向性。
P ( c i = x ∣ c i − 1 = v ) = { π v x Z i f ( v , x ) ∈ E 0 o t h e r w i s e P(c_i=x|c_{i-1}=v)=\begin{cases} \frac{\pi_{vx}}{Z} \quad if (v,x)\in E \\ 0 \quad otherwise \end{cases} P(ci=xci1=v)={Zπvxif(v,x)E0otherwise
在这里插入图片描述
node2vec用两个参数 p p p q q q定义了一个二阶随机游走,以控制随机游走的策略。假设当前随机游走经过边 ( t , v ) (t,v) (t,v)到达顶点 v v v,现在要决定从节点 v v v跳转到下一个节点 x x x,需要依据边 ( v , x ) (v,x) (v,x)上的跳转概率 π v x \pi_{vx} πvx 。设 π v x = α p q ( t , x ) ⋅ w v x \pi_{vx}=\alpha_{pq}(t,x)\cdot w_{vx} πvx=αpq(t,x)wvx w v x w_{vx} wvx是顶点 v v v x x x之间的边权; α p q ( t , x ) \alpha_{pq}(t,x) αpq(t,x)是修正系数,定义如下:
α p q ( t , x ) = { 1 p , i f d t x = 0 1 , i f d t x = 1 1 q , i f d t x = 2 \alpha_{pq}(t,x)=\begin{cases} \frac{1}{p}, \quad if\quad d_{tx}=0\\1,\quad if \quad d_{tx}=1\\ \frac{1}{q},\quad if \quad d_{tx}=2 \end{cases} αpq(t,x)=p1,ifdtx=01,ifdtx=1q1,ifdtx=2
上式中 d t x d_{tx} dtx表示下一步顶点 x x x和顶点 t t t之间的最短距离,只有 3 3 3种情况,如果又回到顶点 t t t,那么 d t x = 0 d_{tx}=0 dtx=0;如果 x x x t t t直接相邻,那么 d t x = 1 d_{tx}=1 dtx=1;其他情况 d t x = 2 d_{tx}=2 dtx=2。参数 p p p q q q共同控制着随机游走的倾向性。参数 p p p被称为返回参数(return parameter),控制着重新返回顶点 t t t的概率。如果 p > m a x ( q , 1 ) p > max(q,1) p>max(q,1),那么下一步较小概率重新返回顶点 t t t;如果 p < m a x ( q , 1 ) p < max(q,1) p<max(q,1),那么下一步会更倾向于回到顶点 t t t,node2vec就更注重表达网络的结构性。参数 q q q被称为进出参数(in-out parameter),如果 q > 1 q>1 q>1,那么下一步倾向于回到 t t t或者 t t t的临近顶点,这接近于BFS的探索方式;如果 q < 1 q<1 q<1,那么下一步倾向于走到离 t t t更远的顶点,接近于DFS寻路方式,node2vec就更加注重表达网络的同质性。因此,可以通过设置 p p p q q q来控制游走网络的方式。所谓的二阶随机游走,意思是说下一步去哪,不仅跟当前顶点的转移概率有关,还跟上一步顶点相关。在论文中试验部分,作者对 p p p q q q的设置一般是 2 2 2的指数,比如 { 1 4 , 1 2 , 1 , 2 , 4 } \{ \frac{1}{4}, \frac{1}{2}, 1, 2, 4\} {41,21,1,2,4}

node2vec这种灵活表达同质性和结构性的特点也得到了实验的证实,通过调整参数 p p p q q q产生了不同的Embedding结果。下图中的上半部分图片就是node2vec更注重同质性的体现,可以看到距离相近的节点颜色更为接近,下图中下半部分图片则更注重体现结构性,其中结构特点相近的节点的颜色更为接近。
在这里插入图片描述

4.3 node2vec在推荐系统中的思考

node2vec所体现的网络的同质性和结构性在推荐系统中可以被很直观的解释。同质性相同的物品很可能是同品类、同属性,或者经常被一同购买的商品,而结构性相同的物品则是各品类的爆款、各品类的最佳凑单商品等拥有类似趋势或者结构性属性的商品。毫无疑问,二者在推荐系统中都是非常重要的特征表达。由于node2vec的这种灵活性,以及发掘不同图特征的能力,甚至可以把不同node2vec生成的偏向“结构性”的Embedding结果和偏向“同质性”的Embedding结果共同输入后续的深度学习网络,以保留物品的不同图特征信息。

node2vec论文:

【1】Grover A, Leskovec J. node2vec: Scalable feature learning for networks[C]//Proceedings of the 22nd ACM SIGKDD international conference on Knowledge discovery and data mining. 2016: 855-864.

5. EGES - Graph Embedding最佳实践

2018 年,阿里巴巴公布了其在淘宝应用的Embedding方法 EGES(Enhanced Graph Embedding with Side Information)算法,其基本思想是Embedding过程中引入带权重的补充信息(Side Information),从而解决冷启动的问题。

淘宝平台推荐的三个问题:

  • 可扩展性(scalability):已有的推荐算法(CF、Base-Content、DL)可以在小数据集上有不错效果,但是对于10亿用户和20亿商品这样海量的数据集上效果差。
  • 稀疏性(sparsity):用户仅与小部分商品交互,难以训练准确的推荐模型。
  • 冷启动(cold start):物品上新频繁,然而这些商品并没有用户行为,预测用户对这些商品的偏好是十分具有挑战性的。

现在业界针对海量数据的推荐问题通用框架是分成两个阶段,即matchingranking。在matching阶段,我们会生成一个候选集,它的items会与用户接触过的每个item具有相似性;接着在ranking阶段,我们会训练一个深度神经网络模型,它会为每个用户根据他的偏好对候选items进行排序。论文关注的问题在推荐系统的matching阶段,也就是从商品池中召回候选商品的阶段,核心的任务是计算所有item之间的相似度。

为了达到这个目的,论文提出根据用户历史行为构建一个item graph,然后使用DeepWalk学习每个item的embedding,即Base Graph Embedding(BGE)。BGE优于CF,因为基于CF的方法只考虑了在用户行为历史上的items的共现率,但是对于少量或者没有交互行为的item,仍然难以得到准确的embedding。为了减轻该问题,论文提出使用side information来增强embedding过程,提出了Graph Embedding with Side information (GES)。例如,属于相似类别或品牌的item的embedding应该相近。在这种方式下,即使item只有少量交互或没有交互,也可以得到准确的item embedding。在淘宝场景下,side information包括:category、brand、price等。不同的side information对于最终表示的贡献应该不同,于是论文进一步提出一种加权机制用于学习Embedding with Side Information,称为Enhanced Graph Embedding with Side information (EGES)

5.1 基于图的Embedding(BGE)

在这里插入图片描述
该方案是 DeepWalk 算法的实践,具体流程如下:

  • 首先,我们拥有上亿用户的行为数据,不同的用户,在每个 Session 中,访问了一系列商品,例如用户 u2 两次访问淘宝,第一次查看了两个商品 B-E,第二次产看了三个商品 D-E-F。
  • 然后,通过用户的行为数据,我们可以建立一个商品图(Item Graph),可以看出,物品A,B之间的边产生的原因就是因为用户U1先后购买了物品A和物品B,所以产生了一条由A到B的有向边。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品相关图中的边之后,全局的物品相关图就建立起来了。
  • 接着,通过 Random Walk 对图进行采样,重新获得商品序列。
  • 最后,使用 Skip-gram 模型进行 Embedding 。

Base Graph Embedding 与 DeepWalk 不同的是:通过 user 的行为序列构建网络结构,并将网络定义为有向有权图。 其中:根据行为的时间间隔,将一个 user 的行为序列分割为多个session。session分割可以参考Airbnb这篇论文《Real-time Personalization using Embeddings for Search Ranking at Airbnb》。

5.2 使用Side Information的GE(GES)

通过使用BGE,我们能够将items映射到高维向量空间,并考虑了CF没有考虑的用户序列关系。但是我们依然没有解决冷启动的问题。为了解决冷启动问题,我们使用边信息( category, shop, price, etc)赋值给不同的item。因为边信息相同的两个item,理论而言会更接近。通过DeepWalk方案得到item的游走序列,同时得到对应的边信息(category,brand,price)序列。然后将所有序列放到Word2Vec模型中进行训练。针对每个 item,将得到:item_embedding,category_embedding,brand_embedding,price_embedding 等 embedding 信息。为了与之前的item embedding区分开,在加入Side information之后,我们称得到的embedding为商品的aggregated embeddings。商品 的aggregated embeddings为:
H v = 1 n + 1 ∑ s = 0 n W v s H_v = \frac{1}{n+1}\sum_{s=0}^{n}W_{v}^{s} Hv=n+11s=0nWvs
对上式做一个简单的解释:针对每个 item,将得到:item_embedding,category_embedding,brand_embedding,price_embedding 等 embedding 信息。将这些 embedding 信息求均值来表示该 item的Embedding。

需要注意的一点是,item 和 side information(例如category, brand, price等) 的 Embedding 是通过 Word2Vec 算法一起训练得到的。 如果分开训练,得到的item_embedding和category_embedding(brand_embedding,price_embedding)不在一个向量空间中,做运算无意义。即:通过 DeepWalk 方案得到 item 的游走序列,同时得到对应的(category,brand,price)序列。然后将所有序列数据放到Word2Vec模型中进行训练。

5.3 增强型GES(EGES)

GES中存在一个问题是,针对每个item,它把所有的side information embedding求和后做了平均,没有考虑不同的side information 之间的权重,EGES就是让不同类型的side information具有不同的权重,提出来一个加权平均的方法来聚集这些边界embedding。
在这里插入图片描述
因为每个item对其不同边信息的权重不一样,所以就需要额外矩阵 A A A来表示每个item边信息的权重,其大小为 v ∗ ( n + 1 ) v*(n+1) v(n+1) v v v是item的个数, n n n是边信息的个数,加 1 1 1是还要考虑item自身Embedding的权重。为了简单起见,我们用 a v j a_{v}^{j} avj表示第 v v v个item、第 j j j个类型的side information的权重。 a v 0 a_{v}^{0} av0表示第 v v v个item自身Embedding的权重。这样就可以获得加权平均的方法:
H v = ∑ j = 0 n e a v j W v j ∑ j = 0 n e a v j H_v = \frac{\sum_{j=0}^{n}e^{a_{v}^{j}}W_{v}^{j}}{\sum_{j=0}^{n}e^{a_{v}^{j}}} Hv=j=0neavjj=0neavjWvj
这里对权重项 a v j a_{v}^{j} avj做了指数变换,目的是为了保证每个边信息的贡献都能大于 0 0 0。权重矩阵 A A A通过模型训练得到。

EGES算法应用改进的Word2Vec算法(Weighted Skip-Gram)确定模型的参数。对上图中EGES算法简单说明如下:

  • 上图的Sparse Features代表 item 和 side information 的ID信息;
  • Dense Embeddings 表示 item 和 side information 的 embedding 信息;
  • α 0 , α 1 , . . . , α n \alpha_0,\alpha_1,...,\alpha_n α0,α1,...,αn 分别代表 item 和 side information 的 embedding 权重;
  • Sampled Softmax Classifier中的 N N N代表采样的负样本(见论文中的Algorithm 2 Weighted Skip-Gram描述的第8行), P P P代表正样本(某个item周边上下n个item均为正样本,在模型中表示时不区分远近);

EGES并没有过于复杂的理论创新,但给出了一个工程上的融合多种Embedding的方法,降低了某类信息缺失造成的冷启动问题,是实用性极强的Embedding方法。

EGES论文:

【1】Wang J, Huang P, Zhao H, et al. Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba[C]. knowledge discovery and data mining, 2018: 839-848.

6. 总结

时至今日,Graph Embedding仍然是工业界和学术界研究和实践的热点,除了本文介绍的DeepWalk、LINE、node2vec、EGES等主流方法,SDNE、struct2vec等方法也是重要的Graph Embedding模型,感兴趣的读者可以自己查找相关文献进一步学习。

7. Reference

【1】《深度学习推荐系统》王喆编著。
【2】【Graph Embedding】DeepWalk:算法原理,实现和应用 - 浅梦的文章 - 知乎 https://zhuanlan.zhihu.com/p/56380812
【3】【论文笔记】DeepWalk - 陌上疏影凉的文章 - 知乎 https://zhuanlan.zhihu.com/p/45167021
【4】【Graph Embedding】LINE:算法原理,实现和应用 - 浅梦的文章 - 知乎 https://zhuanlan.zhihu.com/p/56478167
【5】Graph Embedding:从DeepWalk到SDNE - 羽刻的文章 - 知乎 https://zhuanlan.zhihu.com/p/33732033
【6】Graph Embedding之探索LINE - 张备的文章 - 知乎 https://zhuanlan.zhihu.com/p/74746503
【7】【Graph Embedding】node2vec:算法原理,实现和应用 - 浅梦的文章 - 知乎 https://zhuanlan.zhihu.com/p/56542707
【8】node2vec在工业界的应用-《当机器学习遇上复杂网络:解析微信朋友圈 Lookalike 算法》,地址:https://mp.weixin.qq.com/s/EV-25t2lWT2JJMLhXsz4zQ
【9】graph embedding之node2vec - 张备的文章 - 知乎 https://zhuanlan.zhihu.com/p/63631102
【10】Graph Embedding在淘宝推荐系统中的应用 - 张备的文章 - 知乎 https://zhuanlan.zhihu.com/p/70198918
【11】Graph Embedding - 阿里EGES算法 - 王多鱼的文章 - 知乎 https://zhuanlan.zhihu.com/p/69069878
【12】Graph Embedding:深度学习推荐系统的"基本操作" - 顾鹏的文章 - 知乎 https://zhuanlan.zhihu.com/p/68247149
【13】论文阅读:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba,地址:https://blog.csdn.net/Super_Json/article/details/85537938

已标记关键词 清除标记
<p> <br /> </p> <p> <span style="font-size:14px;color:#E53333;">概要介绍</span><span style="font-size:14px;color:#E53333;">:</span><span></span> </p> <p> <span style="font-size:14px;">本课程主要是介绍并实战一款</span><span style="font-size:14px;">java</span><span style="font-size:14px;">间件</span><span style="font-size:14px;">~redisson</span><span style="font-size:14px;">,介绍</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">相关的核心技术栈及其典型的应用场景,其的应用场景就包括布隆过滤器、限流器、短信发送、实时</span><span style="font-size:14px;">/</span><span style="font-size:14px;">定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在</span><span style="font-size:14px;">java</span><span style="font-size:14px;">项目里正确使用</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">的姿势。本课程的目标就在于带领各位小伙伴一起学习、攻克</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">,更好地巩固自己的核心竞争力,而至于跳槽涨薪,自然不在话下!</span><span style="font-size:14px;"> </span> </p> <p> <span style="font-size:14px;color:#E53333;">课程内容</span><span style="font-size:14px;color:#E53333;">:</span><span></span> </p> <p> <span style="font-size:14px;">说起</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">,可能大伙儿不是很熟悉,但如果说起</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">,想必肯定很多人都晓得。没错,这家伙字如其名,它就是架设在</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">基础上的一款综合性的、新型的间件,号称是</span><span style="font-size:14px;">java</span><span style="font-size:14px;">企业级应用开发正确使用</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">的姿势</span><span style="font-size:14px;">/</span><span style="font-size:14px;">客户端实例。</span><span></span> </p> <p> <span style="font-size:14px;">它是架设在</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">基础之上,但拥有的功能却远远多于原生</span><span style="font-size:14px;">Redis</span><span> </span><span style="font-size:14px;">所提供的,比如分布式对象、分布式集合体系、分布式锁以及分布式服务调度等一系列具有分布式特性的对象实例</span><span style="font-size:14px;">…</span> </p> <p> <span style="font-size:14px;">而这些东西</span><span style="font-size:14px;">debug</span><span style="font-size:14px;">将在本门课程进行淋漓尽致的介绍并实战,除此之外,我们将基于</span><span style="font-size:14px;">spring boot2.0</span><span style="font-size:14px;">搭建的多模块项目实战典型的应用场景:对象存储、数据字典、短信发送、实时</span><span style="font-size:14px;">/</span><span style="font-size:14px;">定时邮件发送、布隆过滤器、限流组件、分布式服务调度</span><span style="font-size:14px;">....</span><span style="font-size:14px;">课程大纲如下所示:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202002161014439278.jpg" alt="" /> </p> <p> <span style="font-size:14px;">下面罗列一下比较典型的核心技术栈及其实际业务场景的实战,如下图所示为</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">基于订阅</span><span style="font-size:14px;">-</span><span style="font-size:14px;">发布模式的核心技术</span><span style="font-size:14px;">~</span><span style="font-size:14px;">主题</span><span style="font-size:14px;">Topic</span><span style="font-size:14px;">的实际业务场景,即实时发送邮件:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202002161014551383.png" alt="" /> </p> <p> <span style="font-size:14px;">而下图则是基于“多值映射</span><span style="font-size:14px;">MultiMap</span><span style="font-size:14px;">”数据结构实战实现的关于“数据字典”的缓存管理:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202002161015054368.png" alt="" /> </p> <p> <span style="font-size:14px;">除此之外,我们还讲解了可以与分布式服务调度间件</span><span style="font-size:14px;">dubbo</span><span style="font-size:14px;">相媲美的功能:分布式远程服务调度,在课程我们动手搭建了两个项目,用于分别充当“生产者”与“消费者”角色,最终通过</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">的“服务调度组件”实现服务与服务之间、接口与接口之间的调用!</span><span style="font-size:14px;"> </span> </p> <p> <span style="font-size:14px;color:#E53333;">课程收益</span><span style="font-size:14px;color:#E53333;">:</span><span></span> </p> <p> <span style="font-size:14px;">(</span><span style="font-size:14px;">1</span><span style="font-size:14px;">)认识并掌握</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">为何物、常见的几种典型数据结构</span><span style="font-size:14px;">-</span><span style="font-size:14px;">分布式对象、集合、服务的应用及其典型应用场景的实战;</span><span></span> </p> <p> <span style="font-size:14px;">(</span><span style="font-size:14px;">2</span><span style="font-size:14px;">)掌握如何基于</span><span style="font-size:14px;">spring boot2.0</span><span style="font-size:14px;">整合</span><span style="font-size:14px;">redisson</span><span style="font-size:14px;">搭建企业级多模块项目,并以此为奠基,实战企业级应用系统常见的业务场景,巩固相应的技术栈!</span><span></span> </p> <p> <span style="font-size:14px;">(</span><span style="font-size:14px;">3</span><span style="font-size:14px;">)站在项目管理与技术精进的角度,掌握对于给定的功能模块进行业务流程图的绘制、分析、模块划分、代码实战与性能测试和改进,提高编码能力与其他软实力;</span><span></span> </p> <p> <span style="font-size:14px;">(</span><span style="font-size:14px;">4</span><span style="font-size:14px;">)对于</span><span style="font-size:14px;">Java</span><span style="font-size:14px;">微服务、分布式、</span><span style="font-size:14px;">spring boot</span><span style="font-size:14px;">精进者而言,学完本课程,不仅可以巩固提高间件的实战能力,其典型的应用场景更有助于面试、助力相关知识点的扫盲! 如下图所示:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202002161015169044.png" alt="" /> </p> <p> <span style="font-size:14px;color:#E53333;">关键字</span><span style="font-size:14px;"><span style="color:#E53333;">:</span>Spring Boot,</span><span style="font-size:14px;">Redis,</span><span style="font-size:14px;">缓存穿透</span><span style="font-size:14px;">,</span><span style="font-size:14px;">缓存击穿</span><span style="font-size:14px;">,</span><span style="font-size:14px;">缓存雪崩,红包系统,</span><span style="font-size:14px;">Mybatis</span><span style="font-size:14px;">,高并发,多线程并发编程,发送邮件,列表</span><span style="font-size:14px;">List</span><span style="font-size:14px;">,集合</span><span style="font-size:14px;">Set</span><span style="font-size:14px;">,排行榜,有序集合</span><span style="font-size:14px;">SortedSet</span><span style="font-size:14px;">,哈希</span><span style="font-size:14px;">Hash ,</span><span style="font-size:14px;">进阶实战</span><span style="font-size:14px;">,</span><span style="font-size:14px;">面试,微服务、分布式</span> </p> <p> <span style="font-size:14px;color:#E53333;">适用人群</span><span style="font-size:14px;"><span style="color:#E53333;">:</span>redisson学习者</span><span style="font-size:14px;">,</span><span style="font-size:14px;">分布式间件实战者,微服务学习者,</span><span style="font-size:14px;">java</span><span style="font-size:14px;">学习者</span><span style="font-size:14px;">,spring boot</span><span style="font-size:14px;">进阶实战者,</span><span style="font-size:14px;">redis</span><span style="font-size:14px;">进阶实战者</span> </p>
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页