自从深度学习流行起来,embedding就成为深度学习推荐系统方向最火热的话题之一。
什么是Embedding?
简单来说Embedding就是用一个数值向量“表示”一个对象的方法,这里的对象可以是一个词、物品、也可以是一部电影等。但是“表示”这个词怎么理解呢?用一个向量表示一个物品,一个物品能被向量表示,是因为这个向量跟其他物品向量之间的距离反应了这个物品的相似性,也就是两个向量间的距离向量甚至能够反应他们之间的关系。
在Netflix应用的电影Embedding向量方法,就是一个非常直接的推荐系统的应用。从Netflix利用矩阵分解方法生成的电影和用户的embedding 向量示意图中,我们可以看出不同的电影和用户分布在一个二维空间内,由于Embedding内存保存了他们之间的相似性关系,因此有了这个Embedding空间之后,我们再进行电影推荐就非常容易了。具体来说就是直接找出某个用户向量周围的电影向量,然后把这些电影推荐给这个用户就可以了。这个就是Embedding技术在推荐系统中最直接的应用。
Embedding技术对深度学习推荐系统的重要性
- 首先,Embedding是处理稀疏特征的利器。在推荐场景下类别、ID特征非常多,大量使用Onehot编码会导致样本儿特征向量极度稀疏,而深度学习结构特点又不利于稀疏特征向量的处理,因此几乎所有深度学习推荐模型都会由Embedding层负责将稀疏高维特征向量转成稠密低纬度特征向量。所以说各类Embedding技术是构建深度学习推荐模型的基础。
- 其次,Embedding可以融合大量有价值的信息,本身就是及其重要的特征向量。相比原始信息直接处理得来的特征向量,Embedding表达能力更强,特别是GrapEmbedding技术被提出后,Emebdding几乎可以引入任何信息进行编码,使其本身就包含大量有价值的信息,所以通过预训练得到的Embeddings向量本身就是及其重要的特征向量。
Embedding不仅是处理稀疏特征的方法,也是融合大量基本特征,生成高阶特征向量的有效手段。
经典的Embedding 方法
word2vec
非常经典,CBOW和SkipGram 两个模型,层次softmax 和负采样优化方法减少计算复杂度。
推荐阅读:Word2vec Parameter Learning Explained 这篇文章,详细讲解了为什么word2vec训练出的词向量可以具有空间相似关系的原因,如何产生这样的结果的,以及层次softmax和负采样的具体实现等。
Item2vec
Item2vec是word2vec的推广。既然word2vec可以对词序列中词进行Embedding,那么对于用户购买“序列”中的一个商品,用户观看“序列”中的一个电影,也应该存在相应的Embedding方法。
于是微软与2015年提出了item2vec方法,使得Embedding适用于几乎所有的序列数据,Item2vec模型的技术细节与word2vec完全一致,只要能够用序列数据的形式把我们要表达的对象表示出来,再把序列数据“喂”给word2vec模型,我们就能够得到任意物品的Embedding了。
GraphEmbedding
只有能用序列数据表示的物品,都可以通过item2vec训练Embedding,但是互联网数据不仅仅是序列数据这么简单,越来越多的数据被我们以图的形式表达出来,所以基于图的emebdding又被提出。
图结构数据在互联网几乎无处不在,最典型的就是 社交网络,这里可以发现 意见领袖、社区等,再根据这些社区特性进行社交化的推荐,如果可以对社交网络中的节点进行Embedding编码,社交化推荐过程会非常方便。
知识图谱,不仅包含不同类型的知识主体(如人物、地点等),附着在知识主体上的属性(如人物描述、物品特点),以及主体与主体之间、主体与属性之间的关系。如果我们能够对知识图谱中的主题进行Embedding化,就可以发现主体之间的潜在关系,这对于就要内容和知识的推荐系统非常有帮助。
还有一类非常重要的图数据就是行为关系类图数据。这类数据几乎存在于所有互联网应用中,它事实上是由用户和物品组成的“二分图”,物品和用户之间的相互行为生成了行为关系图。借助这样的关系图,我们自然能够利用Emebdding技术挖掘物品和物品、用户与用户、以及用户与物品之间的关系,从而应用于推荐系统的进一步推荐。
基于随机游走的GraphEmbedding方法,DeepWalk
工业界影响比较大,应用比较广的方法,2014年由美国石溪大学研究者提出的。主要思想是由物品组成的图结构上进行随机游走,产生大量物品序列,然后将这些序列作为训练样本输入word2vec进行训练,最终得到物品的Embedding.
- 首先基于原始的用户行为序列(a)建立物品关系图。比如用户的购买物品序列、观看视频序列等,来构建物品关系图(b),从中,我们可以看出,因为用户Ui先后购买了A和B,所以产生了一条由A到B的有向边,如果后续产生了多条相同的有向边,则有向边的权重被加强。再将所有用户行为序列都转换成物品相关图中的边之后,全局的物品相关图就建立起来了。
- 然后,采用随机游走的方式随机选择起始点,重新产生物品序列,其中,随机游走采样的次数、长度等都属于超参数,需要我们根据具体应用进行调整。
- 最后,我们将这些随机游走生成的物品序列输入图的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
)
;
P(v_j|v_i) = \frac {M_{ij}}{\sum_{j\in N_+}(v_i)M_{ij}}, 其中v_j \in N_+(v_i);
P(vj∣vi)=∑j∈N+(vi)MijMij,其中vj∈N+(vi);
其中,N+(vi)是节点vi所有的出边集合,Mij是节点vi到节点vj边的权重,即DeepWalk的跳转概率就是跳转边的权重占所有相关出边权重之和的比例。
通过随机游走得到新的物品序列,我们就可以通过经典的word2vec的方法生成物品Embedding了。
在同质性和结构性间权衡的方法,Node2vec
2016年,斯坦福大学研究员在DeepWalk的基础上更进一步,提出了Node2vec模型。Node2vec通过调整随机游走跳转概率的方法,让GraphEmbedding的结果在网络的同质性和结构性中进行权衡,可以进一步把不同的Embedding输入推荐模型,让推荐系统学习到不同的网络结构特点。
- 这里所说的“同质性”指的是距离相近节点的Embedding应该尽量近似,节点u与其相连的节点s1,s2,s3,s4的embedding表达应该是接近的,这就是网络的同质性的体现,在电商网站中,同质性的物品可能是同类品、同属性,或者经常被一同购买的物品。
- 而“结构性”指的是结构上相似的节点的Embedding应该尽量接近。比如图中节点u和节点s6都是各自局域网络的中心节点,他们在结构上相似,所以他们的Embedding表达也应该近似,这就是“结构性”的体现。在电商网站中,结构性相似的物品一般是各品类的爆款、最佳凑单商品等拥有类似趋势或者结构性属性的物品。
GraphEmbedding 是怎么表达结构性和同质性的呢?
- 首先为了使GraphEmbedding的结果能够表达网络的**“结构性”,在随机游走的过程中,我们需要让游走的过程更倾向于BFS(宽度优先搜索)**,因为BFS会跟多地在当前节点的邻域中进行游走遍历,相当于对当前节点周边的网络结构进行一次“微观扫描”。当前节点是“局部中心节点”,还是“边缘节点”,或者是“连接性节点”,其生成的序列包含的节点数量和顺序必然是不同的,从而让最终的embedding 抓取到更多的结构性信息。
- 为了表达同质性,随机游走要更倾向于**DFS(深度优先搜索)**才行,因为DFS更有可能通过多次跳转,游走到远方的节点上,但是无论怎样,DFS的游走更大概率会在一个大的集团内部进行,这就使得一个集团或者社区内部节点的Embedding更为相似,从而更多地表达网络的“同质性”。
那在Node2vec算法中,是怎样控制BFS和DFS的倾向性呢?
其实主要是空过节点间的跳转概率来控制跳转的倾向性,如下图所示Node2vec算法从节点t跳转到节点v后,再从节点v跳转到周围各点的跳转概率。这里要注意几个节点的特点:比如t是随机游走上一步访问的节点,节点v是当前访问的节点,节点x1,x2,x3是与v相连的非t节点,但是节点x1还与节点t相连,这些不同的特点决定了随机游走时下一次跳转的概率。
这些概率我们还可以用具体的公式来表示,从当前节点v跳转到下一个节点x的概率KaTeX parse error: Undefined control sequence: \pai at position 1: \̲p̲a̲i̲_{vx}=a_{pq}(t,…, 其中 wvx是边vx的原始权重,
a
p
q
(
t
,
x
)
a_{pq}(t,x)
apq(t,x)是Node2vec定义的一个跳转权重。到底是倾向于DFS还是BFS,主要就与这个跳转权重的定义有关了。
a
p
q
(
t
,
x
)
a_{pq}(t, x)
apq(t,x)里的
d
t
x
d_{tx}
dtx是指节点t到x的距离,比如节点
x
1
x_1
x1其实与节点t直接相连,所以这个距离
d
t
x
d_{tx}
dtx就是1, 节点t到节点t自己的距离
d
t
t
d_{tt}
dtt就是0, 而
x
2
,
x
3
x_2,x_3
x2,x3这些不与t相连的节点,
d
t
x
d_{tx}
dtx就是2.
此外, a p q ( t , x ) a_{pq}(t,x) apq(t,x)中的参数p和q 共同控制着随机游走的倾向性,参数p被称为“返回参数”,p越小,随机游走回节点t的可能性越大,Node2Vec就更注重表达网络的结构性。参数q被称为”进出参数“,q越小,随机游走到远方节点的可能性越大,Node2vec更注重表达网络的同质性。反之,当前接额点更可能在附近节点游走。
Node2Vec 这种灵活表达同质性与结构性的特点也得到了实现的验证,可以通过调整p和q参数让他们产生不同的Emebdding结果,下图中 (上)更注重同质性(距离相近的节点颜色更相近),(下)更注重结构性(结构特点相近的节点颜色更为接近)。
Node2vec所体现的网络的同质性和结构性,在推荐系统中都是非常重要的特征表达。由于Node2vec的这种灵活性,以及挖掘不同图特征的能力,我们可以把不同Node2Vec生成偏向”结构性“的Embedding结果,以及偏向”同质性“的Embedding结果共同输入后续深度学习网络以保留物品的不同图特征信息。
Embedding是如何应用在推荐系统的特征工程中?
以上列举了好几种主流的emebdding的方法,包括序列数据的Embedding方法, Word2vec和Item2Vec,以及图数据的Embdding方法DeepWalk和Node2Vec。那Embedding又是怎么应用到推荐系统中的呢?
- Embedding的产出就是一个数值型特征向量,所以Emebdding技术本身就可以视作特征处理方式的一种。只不过简单的One-hot编码的方式不同,Embedding是一种更高阶的特种处理方法,它局别了把序列结构、网络结构、甚至其他特征融合到一个特征向量中的能力。
- Embedding在推荐系统中的应用方式大致有三种,分别是“直接应用”,“预训练应用”和“End2End应用”。
其中“直接应用”最简单,就是在我们得到Embedding向量后,直接利用Embedding向量的相似性实现某些推荐系统的功能。典型的功能有, 利用物品Emebdding间的相似性实现相似物品推荐,利用物品Emebdding和用户Embedding的相似性实现“猜你喜欢”等经典推荐功能,还可以利用物品Embedding实现推荐系统中的召回层等。
“预训练应用“指的是在我们预先训练好物品和用户的Emebdding之后,不直接应用,而是把这些Embedding向量作为特征向量的一部分,跟其余的特征向量拼接起来,作为推荐模型的输入参数训练。这样做能够更好地把其他特征引入进来,让推荐模型做出更为全面且准确的预测。
”End2End应用“,全称为”End to End Training“, 也就是端到端训练,指的是我们不预先训练Emebdding,而是把Embedding的训练与深度学习推荐模型结合起来,采用统一的、端到d端的方式一起训练, 直接得到包含Embedding层的推荐模型。这种方式非常流行,下图展示了3种包含Emebdding层的经典模型,分别是微软的DeepCrossing, UCL的FNN和谷歌的Wide&Deep。