推荐系统论文阅读(三十七)-微信看一看(GraphTR):巧妙利
论文:
论文地址:https://dl.acm.org/doi/pdf/10.1145/3340531.3416021
论文题目:《Graph Neural Network for Tag Ranking in Tag-enhanced Video Recommendation》
在短视频推荐领域中基于tag的推荐可以让用户沉浸式的在短视频中浏览短视频,因此如何建模每个短视频的tag embedding就成了微信算法团队要解决的一个重要问题,但是由于用户点击tag的行为是稀疏的,所以如何学习到这种稀疏场景下的tag embedding呢?让我们一起来看看作者是怎么做的吧。
一 、背景
首先,我们在介绍这篇论文之前,来看一下微信看一看中短视频领域的界面长什么样吧:
我们可以看到,在每个短视频下面都会打上很多tag,这些tag都是可以点击的,当我们点击某个tag后,比如“魔术”,就会进入一个全是跟魔术相关的channel(频道)中。
你可能会想到利用内容理解的技术去简历videa-tag之间的关系,通过视频理解的技术去给一个视频直接进行打tag的操作,但是这种方方法是静态的建模方式,不能跟用户的个性化进行关联,也就是说对于每个user来说,给他们展示的tag都是一样的,具体可以看下面的例子。
每个短视频都会打上很多tag,比如图中这个给视频的标题是“给大家表演个魔术,女人的肚子就是这么神奇”,在这个短视频中,会有一些由人工或者内容理解的方法来为这些视频打上标签,这个视频打上的标签可能是“魔术”,“神奇”,“女人”,“肚子”等,但是呢,这些标签并没有全部展示在视频的下面,因为这些标签中并不是所有的都是用户感兴趣的,比如说呢,喜欢看魔术的用户就只会去点击魔术这个tag,喜欢看美女的用户只会去关注女人这个标签,所以,微信的算法团队就想对这些tag 的embedding进行个性化建模,也就是说,对于不同的用户而言,同一个视频下面显示的tag是不一样的。
论文中也举了个例子,可以看一下:
但是,在看一看的推荐场景中存在这么一个问题,也就是前面说的,用户对于tag的点击行为是十分稀疏的,相比于用户点击videa的数量是十分小的,这也给tag的embedding建模带来了一定的挑战。
假如,我们建模出了所有tag的embedding后,我们又该如何来找用户最感兴趣的tag呢?其实我们可以有几个做法:
1.我们直接将tag当作item来看待,直接将用户点击过的所有tag的embedding进行polling的操作来得到user embedding,然后再通过近邻搜索的技术得到跟这个user embedding最相关的top k个tag
2.或者说我们计算出用户交互过的tag跟target的相似度作为分数,直接用平均相似度最大的top k个tag作为用户最感兴趣的tag
还有很多方法可以在得到tag embedding后来计算出特定用户最感兴趣的tag的方式,这里可以根据自己的情况的决定怎么用,微信这边采用的是第一种方式。
接下来我们就来看看怎么在user-tag行为稀疏的场景下对tag进行表征学习的方法吧。
二 、GraphTR模型结构
首先,我们来先说一下建模的思路:
1.我们要建模学习tag的embedding,就要关注用户的历史行为信息
2.由于user-tag的交互信息过于稀疏,所以希望能通过交互更多的user-videa信息来“顺带”学习tag的embedding
具体而言:
1.论文将user, video, tag(还加上video的来源media)都放入一个大的异构图网络中
2.通过图卷积的方式,学习到video embedding,再建模video与video之间的相关性(比如在同一个session中播放过)
3.因为video embedding融合了tag embedding,因此在优化目标达成之后,tag embedding就“顺带”被充分的学习到了
用于user-tag的交互信息较为稀疏,所以论文利用user profile将用户进行了分组,也就是最后学习到的不是user embedding而是user group umbedding
2.1 构建异构图
图中存在四种节点,分别为user,videa, media(视频的来源),tag
节点之间的关系有五种:
1.video-video:同属一个观看session中的两video之间有边
2.user-video:某视频被某user group一周观看超过3次。 (因为user-tag行为稀疏,因此图中没有user-tag的边)
3.video-tag:video和其携带的tag
4.video-media:video和其来源
5.tag-tag:两个 tag属于同一个视频
根据这些信息构建一张多域节点多关系的大异构图,接下来就来详细介绍下上面的模型结构中的每一个聚合方式,为了完成user, video, tag, media这四类节点的信息融合,GraphTR设计了3层卷积结构,称为Heterogeneous field interaction network (HFIN)。
2.2 Heterogeneous Feature Layer
这层的作用是首先将所有异构节点投影到相同的特征空间中(3-hop邻居),然后是由3-hop的邻居,聚合生成2-hop邻居上的信息
这一层的主要作用就是将原始的videa,tag等信息映射成稠密的embedding,然后用concat的方式来表示节点的2-hop信息:
其中v,t,m,u分别是节点k的邻居节点的videa域,tag域,media域和user域,其中,是邻居节点中的videa embedding进行embedding lookup后得到的emb,其他三个的计算是一样的。
简单的说,就是videa域邻居节点有多个,这些邻居节点的one-hot直接相加后的向量直接跟emb matrix进行相乘后就得到了向量。
但是这里我有个疑问,的向量的在axis=1上的shape不一定相同,这里是怎么进行concat的,也就是说每个域中邻居节点是数量都不一样吧?我的猜想是,有可能用的是multi-hot的embedding lookup的方式映射成一个1×d的向量了。
接下来就是如何利用3-hop的embedding信息来聚合2-hop信息了,文中采用了三种聚合方式,分别是transformer,fm,graphsage,我们一一来介绍。
2.3 GraphSAGE aggregator
GraphSAGE是最传统,也是最粗粒度的一种聚合方式。从Heterogeneous Feature Layer可以看到,每个2-hop邻居的embedding由四个域的向量组成:
聚合的方式如下:
其中就是destination node自身,代表destination node的n个邻居之一。
2.4 FM aggregator
GraphSAGE方式是粗粒度的聚合方式,而FM在特征域之间进行交叉表示出模型在细粒度方面的聚合。
直接看公式吧,如果对FM很熟悉的话,就知道这个主要是对四个域中的向量做二次交叉:
其中:
其中第一个公式是FM本身的公式,第二个公式说的是将自身的节点和n个邻居节点的向量取平均。
2.5 Multi-field transformer aggregator
如果说FM相比于GraphSAGE的聚合方式来说更为细粒度,那么transformer方式就更加细了。
采用的是self-attention的方式,所以首先要生成Q,K,V三个向量,Fv是1+n个向量,其中1个是自身节点的向量,n个邻居节点的向量。
通过这种方式,我们就得到了Hv这个向量,这只是n+1个经过self-att出来的一个向量
对于这1+n个向量,文中同样采用pooling的方式:
观察上面的模型结构图,我们可以看见在经过transformer聚合后,我们对聚合后的向量进行了FM再次聚合,跟前面我们说到的FM聚合方式一样,只不过之前的FM是在3-hop基础上直接交叉的,而这里经过了trm聚合后再进行交叉的。
最后我们将他们concat后形成第三个聚合的向量:
通过三种聚合方式,我们就可以得到1-hop邻居的最终embedding,是这三种聚合结果的concat:
2.6 The Second Aggregation Layer
这个层再模型结构图的最上方,主要是将1+m个节点通过transformer方式聚合成最终的节点的embedding:
2.7 损失函数
在图神经网络中,一般的损失函数构建的方式都是让相邻的节点更加接近,相远的节点更加疏远,所以本论文也是采用这样的损失函数。
现在问题就变成了该选择什么类型的节点呢,前面也说了我们对用户进行了分组,所以学习到的user的emb是相对粗糙的,所以不能学习user-tag或者user-videa直接的关系。
由于用户点击的videa的session信息是丰富的,所以论文建模video-video之间的相关性,在同一个session被观看的视频之间,距离要尽可能小。因为video的点击行为比较多,这方面的数据比较丰富,文中采用的是这种方案。
这时候你可能就会有所疑问了,我们的目标不是建模tag embedding吗,怎么你这里的损失函数只优化videa embedding呢?
实际上,在聚合表示videa信息的过程中已经把tag embedding信息融入到聚合的过程中了,所以在学习videa信息以及整个图的聚合信息的时候也会附加的学习到优质的tag embedding,这也就是本文利用的一个巧妙的方式来解决样本稀疏和选择偏差的问题的方法。
2.8 如何使用tag embedding
有了每个tag的emb后,对于给定的<user,videa>对,我们可以利用用户点击过的tag emb进行求和来得到一个表示user embedding信息,然后采用近邻搜索技术来得到top k个tag,展示在每个videa下面。