Graph Embedding(用户历史行为的特征挖掘)
https://zhuanlan.zhihu.com/p/133870768
https://zhuanlan.zhihu.com/p/140508936
image.png
经典的Graph Embedding方法——DeepWalk
早期影响力较大的graph embedding方法是2014年提出的DeepWalk,它的主要思想是在由物品组成的图结构上进行随机游走,产生大量物品序列,然后将这些物品序列作为训练样本输入word2vec进行训练,得到物品的embedding。
- 采用skip-gram生成词向量
对于随机选择的点,下一步选择哪里作为落脚点需要计算各边的权重占比。
image.png其中N+(vi)是节点vi所有的出边集合,Mij是节点vi到节点vj边的权重
如果物品相关图是无相无权重图,那么跳转概率将是上面公式的一个特例,即权重Mij将为常数1,且N+(vi)应是节点vi所有“边”的集合,而不是所有“出边”的集合。
Node2vec
通过调整随机游走权重的方法使graph embedding的结果在网络的同质性(homophily)和结构性(structural equivalence)中进行权衡权衡。
image.png网络的“同质性”指的是距离相近节点的embedding应该尽量近似,如图,节点u与其相连的节点s1、s2、s3、s4的embedding表达应该是接近的,这就是“同质性“的体现
“结构性”指的是结构上相似的节点的embedding应该尽量接近,图4中节点u和节点s6都是各自局域网络的中心节点,结构上相似,其embedding的表达也应该近似,这是“结构性”的体现。
BFS反映了结构性(周边结构相似),DFS反应了同质性(周游世界才知道我们相似)
- 那么在node2vec算法中,是怎样控制BFS和DFS的倾向性的呢?
从节点v跳转到下一个节点x的概率为:(是边vx的权重)
image.png image.png其中,指的是节点t到节点x的距离,参数p和q共同控制着随机游走的倾向性。参数p被称为返回参数(return parameter),p越小,随机游走回节点t的可能性越大,node2vec就更注重表达网络的同质性,参数q被称为进出参数(in-out parameter),q越小,则随机游走到远方节点的可能性越大,node2vec更注重表达网络的结构性,反之,当前节点更可能在附近节点游走。
同质性相同的物品很可能是同品类、同属性、或者经常被一同购买的物品。结构性相同的物品则是各品类的爆款、各品类的最佳凑单商品等拥有类似趋势或者结构性属性的物品。
由于node2vec的这种灵活性,以及发掘不同特征的能力,甚至可以把不同node2vec生成的embedding融合共同输入后续深度学习网络,以保留物品的不同特征信息。
阿里EGES(Enhanced Graph Embedding with Side Information)
基本思想是在DeepWalk生成的graph embedding基础上引入补充信息。
如果单纯使用用户行为生成的物品相关图,固然可以生成物品的embedding,但是如果遇到新加入的物品,或者没有过多互动信息的长尾物品,推荐系统将出现严重的冷启动问题。为了使“冷启动”的商品获得“合理”的初始Embedding,阿里团队通过引入了更多补充信息来丰富Embedding信息的来源,从而使没有历史行为记录的商品获得Embedding。
生成Graph embedding的第一步是生成物品关系图,通过用户行为序列可以生成物品相关图,利用相同属性、相同类别等信息,也可以通过这些相似性建立物品之间的边,从而生成基于内容的knowledge graph。而基于knowledge graph生成的物品向量可以被称为补充信息(side information)embedding向量,当然,根据补充信息类别的不同,可以有多个side information embedding向量。
- 怎么融合一个物品的多个序列的embedding结果形成最后的物品embedding?
最简单的方法是在深度神经网络中加入average pooling层将不同embedding平均起来,阿里在此基础上进行了加强,对每个embedding加上了权重,如图7所示,对每类特征对应的Embedding向量,分别赋予了权重a0,a1…an。图中的Hidden Representation层就是对不同Embedding进行加权平均操作的层,得到加权平均后的Embedding向量后,再直接输入softmax层(中间类似skip-gram的后半段),这样通过梯度反向传播
,就可以求的每个embedding的权重ai(i=0…n)
- 什么是side info?: category, shop, price,brand, etc,注意side info和 item 具有相同维度。我们通过DeepWalk方案得到item的游走序列,同时得到对应的side info的category(brand, price)序列。然后将所有序列放到word2vec模型中进行训练。(将side info和item一起训练并投射到同一个空间才有意义)
是商品v的n个side info+原商品embedding的融合,是商品u的embedding表达,代表节点u对应的label(skip-gram中的正样本(上下文中存在)1,负样本0)
使用方便求导,而且不用担心变0
- 对于新商品冷启动中缺失的graph embedding(购买序列的历史记录)内容怎么办?
使用side embedding的平均值予以填充。
噪音消除:
当然在实际使用中,数据肯定存在噪声,需要对做一些处理,来消除噪声:
- 在点击后停留的时间少于1秒,可以认为是误点,需要移除。
- 还有一些过度活跃用户,三月内购买商品数超过1000,或者点击数超过3500,就可以认为是一个无效用户,需要去除。
- 还有一些商品频繁的修改商品内容的,造成前后同一id的商品信息不对应,需要移除。
数据筛选
然而,不可能使用一个用户的整个历史,因为:
- 用户的历史记录太多,计算代价和存储代价昂贵;
- 用户的兴趣往往会随时间改变。
因此,我们设置了一个时间窗口,只选择用户在该窗口内的行为。这被称为是基于session的用户行为(session-based)。
Embedding与深度神经网络的训练分开(Embedding离线,深度网络实时)
因为用户的兴趣爱好和商品的属性基本上变化很少(短时间内),所以embedding不需要太高的频率。甚至可以降到周的级别(可以离线训练),但是上层神经网络为了抓住最新的数据整体趋势信息,往往需要高频训练甚至实时训练。这也是平衡训练开销与精度后的最优方案。