提出背景
“迁移学习+多任务”的场景
通过将不同领域的节点、关系都建模在一幅图中,通过图卷积,完成知识从数据丰富的领域向数据稀疏领域的迁移,并兼顾两个领域的指标。
多 域信息的异构图上完成图卷积,每个节点要聚合来自多个领域的异构消息。之前传统的聚合方式,如mean/max pooling,矩阵相乘,可能带来异构消息相互抵销而引入信息损失。
为此微信团队采用了GraphSAGE+FM+Transformer多种手段,从不同粒度来交叉、聚合消息,极大提升了模型的表示能力,这种新的消息聚合方式值得借鉴。
场景及难点
1、微信团队面临的场景是:
每个视频都打有若干tag(人工标注或由内容理解算法打上的)
用户观看视频时,需要有算法从这个视频自带的tag中挑选出与当前用户最相关的若干个tag,展示在视频的下方。
用户点击某个tag,会进入一个沉浸式频道,其中展现的全部是与该tag相关的视频
2、难点在于:用户点击视频的行为比较丰富,但是用户点击tag的行为比较稀疏,训练数据不足。
思路
方案一:
训练一个模型,输入视频的多模态信息(标题、封面图、关键帧),输出是与这个视频最match的tag。训练时,拿人工打标的结果作为label。线上serving时,将预测出来的top-K个标签,展示在视频的下方。
这个方案可行,但是其只利用了视频的静态属性,没有用户的信息,所以推荐出来的tag只有与视频在语义上的相关性,完全没有针对当前用户的个性化,不满足业务需求。
方案二:
1、tag embedding用tag的word embedding。
2、用户的embedding是其过去有过”正交互”的tag embedding的pooling
所谓“正交互”,可以是用户过去一段时间内点击过的tag
但是考虑到user-tag的交互太稀疏,因此可以选用户过去点击过视频所携带的tag
pooling时,也可以考虑进播放完成度、时间衰减等因素,进行加权平均。
3、线上serving时,拿user embedding在当前视频所携带的tag embedding中寻找Top-K近邻,展示在视频下方。
怎么评价这一方案:
1、该方案,考虑了用户的历史,有更强的个性化。
2、但是拿word embedding做tag embedding,仍然只考虑了tag的语义信息。用户行为蕴含的信息,要比语义信息更加重要。
3、用户与tag的交互行为太少了,很难在“用户点击tag的序列”上套用word2vec来学习到tag embedding
方案三:微信的GraphTR模型
优化点
GraphTR是为了要学习优质tag embedding,为此要注重利用用户的行为信息
但是由于user-tag的行为太稀疏,因此GraphTR需要通过user-video的行为学习到tag embedding
要达成以上目标,也有多种作法。而GraphTR的做法是:
1、将user, video, tag(还加上video的来源media)都放入一个大的异构图
通过图卷积,学习到video embedding
2、再建模video与video之间的相关性(比如在同一个session中播放过)
3、因为video embedding融合了tag embedding,因此在优化目标达成之后,一个优质的副产品就是得到tag embedding
GraphTR是如何构建这个异构图的?
1、node:
图上要包括:user, video, tag, media (视频来源)这 4类节点。
因为用户数目太多,而每个用户的行为相对稀疏,GraphTR将用户按照gender-age-location分成84000组,用user group替代user,在图中建模。
2、edge:
video-video:同属一个观看session中的两video之间有边
user-video:某视频被某user group一周观看超过3次
video-tag:video和其携带的tag
video-media:video和其来源
tag-tag:两个 tag属于同一个视频
如何传递、融合图上异构节点的信息?
1、为了完成user, video, tag, media这四类节点的信息融合,GraphTR设计了3层卷积结构,称为Heterogeneous field interaction network (HFIN)。
2、最底层Heterogeneous Feature Layer:
3-hop的embdding是lookup获得的,分别有四个域(user/video/tag/media域的特征),相加得到2-hop邻居的embedding。
3、中间层:Multi-field Interaction Layer:
这一层的任务是由2-hop邻居的embedding,聚合生成1-hop邻居的embedding。
而HFIN采用了GraphSAGE+FM+Transformer三种方式,粒度上从由粗到细,完成聚合。
三种聚合方式
1、GraphSAGE聚合
graphsage聚合
这里的hGraph就是1-hop的最终embding。
2、FM 聚合
FM聚合,区分各域,因此粒度更细一些。
hFM2就是1-hop的最终embding。
3、Multi-field transformer aggregator
GraphTR觉得FM聚合时,各域节点(即各域特征)交叉得还不够:1:FM聚合,只有在第2步才做域与域之间的交叉。2:在一个域内部,这n+1个特征之间,只有简单pooling,不存在交叉。3:FM聚合的第1步,每个域average pooling的是,这1+n个节点的原始特征。
Transformer聚合,希望增强各域节点(即各域特征)的交叉。步骤如下:
S1:Transformer决定在第1步引入交叉。具体方式就是,在一个域的1+n个节点之间进行Transformer变换,重新生成1+n个向量,每个新向量是老向量的加权平均,权重是当前老向量相对于其他老向量的attention score。(一套attention恐怕没有代表性,还引入多头机制)
S2:再拿生成的1+n个新向量,做average pooling。
S3:最后将“域间交叉结果”与”域内交叉结果”拼接在一起返回,作为由Transformer聚合得到的1-hop邻居的embedding。论文的实验结果证明,这个最复杂、最细粒度的聚合,对于模型性能的提升也最大。
4、通过三种聚合方式,我们就可以得到1-hop邻居的最终embedding,是这三种聚合结果的concat。
5、最上层:The Second Aggregation Layer
这一层负责由1-hop邻居节点(1个target node自身,m个邻居节点,一共1+m个)的embedding(下边公式中的矩阵H),生成target node上的embedding。聚合方式也是基于Transformer的。
根据1+m个原向量,生成1+m个新向量,每个新向量是所有老向量的加权平均,权重是当前原向量与其他原向量的attention score
再拿这1+m个新向量,取平均,得到target node上的最终向量表示。
如何定义loss?
通过以上三层卷积,就能够给图上所有类型的所有节点,都产生一个embedding。接下来的问题就是,如何定义优化目标,使这些节点的embedding得到优化?
这一部分的解决方案比较常规,无非就是建模节点之间的相关性,可以有选择是:
建模user-tag之间的相关性,user与点击过的tag之间的距离要尽可能小。但是user-tag之间交互的数据太少;建模user-video之间的相关性,user与点击过的视频之间,距离应该较近。但是图上建模的不是单个user而是user group,一个user group包含的用户兴趣太复杂,拿user-goup与video训练,可能噪声比较大;建模video-video之间的相关性,在同一个session被观看的视频之间,距离要尽可能小。因为video的点击行为比较多,这方面的数据比较丰富,文中采用的是这种方案。
评价
将这些tag emedding代入上文的”第二个方案”,即拿用户观看过视频携带的tag的embedding加权平均得到user embedding,再拿这个user embedding在当前视频所携带的tag的embedding中寻找出距离最近的top-k个tag,作为推荐结果显示在视频的下方。因为这些tag embedding蕴含了丰富的user-video行为信息,不仅有助于提升用户对tag的点击率,也有助于提升进入沉浸式tag频道后的观看时长。
借鉴
1、数据少的领域如何借力于数据多的领域,同时要兼顾两个领域的优化目标:
通过将不同领域的不同节点、关系建立在一张异构图上,通过图卷积,使得每个节点的embedding都浓缩了多个领域的知识,达成了“知识迁移+目标兼顾”。
2、GraphTR采用了GraphSAGE+FM+Transformer多种手段,粒度上从粗到细,交叉、聚合来自不同领域的异构消息,相比于mean/max pooling、浅层FC等传统聚合方式,极大提升了模型的表达能力。
本文链接: https://satyrswang.github.io/2021/03/08/微信的GraphTR模型/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!