博客专栏

EEPW首页 > 博客 > 2W字长文 | 漫谈工业界图神经网络推荐系统(3)

2W字长文 | 漫谈工业界图神经网络推荐系统(3)

发布人:数据派THU 时间:2021-12-18 来源:工程师 发布文章

2. 论文总结

该章节对选取的工业界的文章的共性部分进行总结,除了有人比较喜欢用来水论文的模型结构也涉及了图的构建,特征使用,采样方法,结合方式等部分。可以看到,对GNN的应用基本遵循着这套框架。

2.1 应用阶段

推荐系统不同阶段的特点影响着我们对某项技术的使用,召回阶段可以说是样本的艺术,而排序阶段可以说是特征的艺术。其中向量召回是一类常用的个性化召回方法,一般在离线训练时存下User和Item的Embedding,线上推断时通过LSH等方法从海量候选集中快速选出用户可能感兴趣的Items。以下总结了召回阶段常见的几个特点:

召回模型一般不会使用太多复杂的特征,以ID特征为主;排序模型会上很多特征尽可能描述用户,物品及行为过程。

召回模型一般使用PairWise Loss,排序模型一般使用PointWise Loss。个人理解一方面是因为召回阶段的目标是筛选出用户可能感兴趣的Item,至于感兴趣的程度是多少那是排序模型的职责,因此只需要使用PairWise Loss将正负样本尽可能区分开即可。另一方面是因为召回阶段的负样本不一定表示用户不感兴趣,只是没有曝光而已,如果用PointWise Loss建模会导致模型受噪声的干扰。

召回模型一般要从全库随机选取负样本,排序模型一般将曝光未点击作为负样本。在训练召回模型时时将曝光未点击作为负样本存在两个问题,一是线下线上的不一致,线上召回时面对的是全库的候选集;二是在上一轮能够得到曝光的物品已经属于用户比较感兴趣的,只不过同时曝光的还有更符合用户需要的选项,将这些样本直接作为召回模型的负样本不太合适。这里的“全库”也会根据场景变化,例如在搜索场景,由于Query的相关性限制,所以会在同类目下采样负样本。

GNN由于其构图,采样和计算的复杂性,更多被应用在召回阶段做向量召回。常见的一种方式是将Item推荐建模为User结点与Item结点的链接预测任务,同样在离线存下训练好的User和Item Embedding用于线上召回。不过在建模链接预测任务时,很容易产生信息泄露的问题,即在做消息传递时,没有将待预测的边从图中去掉,例如预测user a对item a是否感兴趣,没有去掉图中两者之间的边,user a和item a作为邻居直接融合了彼此的Embedding,导致模型难以学习到有效的信息。在复现一些论文的代码时,我发现这个问题还挺常见的。当然在召回阶段我们也可以结合目标任务端到端地训练。GNN也可以应用在排序阶段[36][37][38][39][40][41][42][43],此时存在两种结合方式,一种是先预训练[42],得到的Embedding以特征初始化或Concat的方式辅助排序模型的训练,另一种是GNN模块与排序模型整体一起做端到端地训练,不过这样需要考虑到线上打分时的效率,特别是GNN采样以及聚合带来的开销。当然我们可以将GNN模块作为Embedding Layer的一部分,在离线训练时得到包含了图信息的Embedding,在线上打分时直接使用该Embedding而无需调用GNN模块。

2.2 图的构建

“Garbage in, garbage out”,图数据构建不好,GNN魔改得再花哨也难奏效。对于构建图的数据,从数据来源来看,分为行为数据,属性数据和社交数据;从时间跨度来看,分为短期数据和长期数据;从用户粒度来看,分为单个用户和群体用户;不同种类的数据构建的图蕴含着不同的特点,下面一一介绍。

行为数据:行为数据是搜推广场景最常见也最重要的一类数据,应用很广的行为序列建模就是建立在该数据上,详情可以参考之前写的一篇文章:没什么大不了:浅谈行为序列建模。该数据可以构建两种类型的图:

二分图:最常见的方式是使用行为数据直接构建User-Item二分图,在user和其行为过的Item之间构建边,不过二分图的1阶邻居往往非常稀疏,因此有工作通过二分图的2阶邻居分别导出User-User和Item-Item同构子图[39],一方面通过2阶邻居的丰富性缓解了1阶邻居的稀疏性,另一方面也避免了对异构图的复杂建模,可以直接在子图上使用同构GNN。User-Item二分图的另一个缺点是难以及时反映用户的新的行为(即需要考虑图的动态性)。

共现图:共现关系表达了物品之间的关联,一方面可以在行为序列相邻的Item之间构建共现邻居关系[36],前后行为的Item一般比较相关;另一方面对于部分场景例如搜索场景,可以在某个Query下点击过的Item之间构建共现邻居关系,这些Item一般也比较相关。在这一过程中我们还可以统计共现频数[44],共现频数一方面可以用来去噪,共现频数较低的两个Item相关程度也低;另一方面可以用来计算权重分布用于Node-Wise采样,相比GraphSage随机采样,可以最大程度保留有效信息;对于计算的权重分布还可以用于指导对邻居的聚合过程。值得注意的是,在由User-Item二分图导出User-User或Item-Item子图时也可以统计类似的共现频数。

属性数据:行为数据构建的图往往是比较稀疏的,因此可以引入属性数据构建属性关系[45]。例如,Item a和Item b都具有属性Brand a,即两个商品都是同一个品牌的,这是我们可以引入Entity结点Brand,然后在Item a,b与Brand a之间构建属性邻居关系。这里让人不禁疑问为什么不直接将Brand作为Item的特征呢(Feature concat)?在上文讨论图神经网络的优点时已经提到,将Brand作为图的一部分可以用多层GNN学习高阶的属性关联信息。此外,当我们用属性数据与行为数据共同构建一张更复杂的异构图,此时还可以用GNN学习到异构的复合关联信息。

社交数据:我们还以用社交网络进一步丰富User之间的邻居关系,不过对于盲目使用社交数据的有效性我是存疑的。具有社交关系的人真的存在相似的偏好吗?首先,不同的社交关系含义不同,例如,亲戚关系更多表示血缘上的联系,不足以表达偏好上的关联。其次,社交关系表达的关联真的适用于我的场景吗?例如,朋友关系表达的更多是观点或思想上的关联,在电商场景下一对朋友不一定对商品拥有相似的偏好,但是在内容场景下例如抖音上,我和朋友确实都喜欢刷猫猫狗狗的视频。

短期数据 & 长期数据:对于行为数据,我们可以用第T-1的数据构建图用于第T天,也可以用连续N天的数据构建图用于第T天。短期数据更容易保留最近的流行趋势,例如,这两天人们抢着买压缩饼干啥的,但是构建的图会非常稀疏;长期数据更容易保留稳定的一般规律,例如,人们买完手机过阵子又买手机壳钢化膜啥的。

单个用户 & 群体用户:单个用户的行为数据构建的图更具个性化[43],所谓“一人一图”,但是同样会存在稀疏问题;群体用户的行为数据构建的图更具泛化性,并且可以缓解某些长尾物品的冷启动问题。

以上几种模式并不是孤立的,可以根据不同的场景进行组合。此外,还存在着其他一些图模式。例如,GMCM[38]构建的图的结点是各种微观行为,边是它们的转移过程,权重是其转移概率,并且将CVR预测建模为了图分类任务。

2.3 特征使用

毫无疑问,ID特征是最重要的,但是利用其他特征诸如Item的Shop,Brand,Category等可以增强我们模型的泛化能力。对于这些泛化特征,一方面,我们可以直接使用Feature Concat的方式统一作为结点的特征,另一方面,也可以把这些特征建模为Entity结点从而学习高阶的属性关联信息。利用它们的难点在于特征维度和语义空间的对齐(异构性),可以从图的构建或模型结构方面加以解决。

2.4 采样方法

在第一部分已经介绍了三种常用的采样方法,搜推中用的比较多的是Node-Wise Sampling,在这里我们进一步完善讨论下该方法。必须强调的是只有当图的规模比较大时才需要采样,对于像UaG[43]中用单个用户行为数据构建的图(一人一图)就不需要采样。我们可以将Node-Wise Sampling抽象为两个步骤:Root结点的采样和邻居结点的采样。

Root结点的采样:Root结点是我们在训练或推断时需要直接用到的结点,例如,使用User和Item之间的链接预测任务建模Item推荐时,首先需要采样一个Batch的待预测的边,这些边两端的User和Item作为Root结点;或者我们想用图信息丰富用户行为序列中Item的表征,则行为数据中的Item作为Root结点[36]。

邻居结点的采样:这一步为每个Root结点采样其邻居结点,都是以迭代的方式采样1-K阶邻居(包括Random Walk)。

全采样:即保留所有1-K阶邻居,邻居数量会非常庞大,适用于离线“预训练”的方式,即线上只用到训练好的Embedding,不然单采样带来的开销就无法承受。

均匀分布采样:即GraphSage中的采样方式,每个邻居结点被采样到的概率相同。

概率分布采样:区别于GraphSage的均匀分布采样,例如上文提到的在构建图时统计的共现频数,归一化后可以作为采样的概率分布,这样更容易采样到重要的邻居。

Meta-Path采样[41]:按照预定义的Meta-Path去采样邻居,实际上相当于在异构图中采样高阶邻居,例如,按照Meta-Path User-Item-User采样User的User邻居。

Random Walk采样[46]:使用Random Walk方法采样邻居,本质上也是一种概率分布采样,每个邻居被采用的概率由度数计算。我们可以使用不同的Random Walk策略,例如个性化PageRank。

2.5 模型结构

在第一部分已经介绍了一些常用的GNN模型,这里我们进一步将GNN抽象为两个步骤:邻居聚合和表征融合。在应用GNN到推荐系统时,主要从异构建模和特征交互两个角度改进模型,Attention机制和Layer Aggregation贯穿其中。

邻居聚合:顾名思义,即聚合邻居结点的信息,得到中心结点的邻域的表征。GCN是在每一层对每个结点聚合1阶邻居,则第K层的输出则包含了K-Hop范围的邻居信息,但是它需要操作全图无法扩展到大规模图数据。这里我们讨论Node-Wise Samling下邻居聚合的过程。

迭代聚合:Node-Wise Sampling实际上围绕中心结点构造了一个1-K阶的层次邻域结构,因此可以迭代地聚合K-1阶的邻居直到中心结点,这也是GraphSage采用的方式,它的一个缺点是计算是串行的,计算完第i阶才能继续第i-1阶的计算,如果线上需要用到该过程会导致RT过高。

并行聚合:我们可以直接并行地聚合1,2,...,K阶邻居,然后再融合它们得到最终的邻域表征,避免了串行计算带来的高时间开销。

28.png

Parallel-GCNs

表征融合:经过邻居聚合得到邻域表征后,我们还需要将它与自身表征融合。常用的几种方式是:Add[11],Concat[5],Attention。Attention主要是考虑到自身与邻域表征的重要性差异。

异构建模:第一部分提到真实场景中的图数据大多是异构的,在使用GNN时需要考虑到结点与边类型的差异性。考虑异构性后我们可以将上述过程扩展为三个步骤:邻居聚合,邻域融合,自身融合。在模型结构上基本都遵循着第一部分提到的Node or Edge Type-Specific Transformation+Attention的框架。

邻居聚合:邻居结点存在不同的类型,因此一般按类型分别聚合邻居。一种比较特殊的方式是将原来的异构图转化为一系列的同构子图,在这些子图上可以直接使用同构GNN。

邻域融合:融合上一步骤得到的不同类型的邻域表征

自身融合:最后再融合自身表征

特征交互:部分工作认为GNN缺少对邻居之间的交互[47][48],邻域之间的交互[48][49],邻域与自身的交互[50]的建模,因此引入元素积,self-Attention,co-attenive等方式增强特征交互。

Attention机制:Attention可以说是万金油技术了,这里主要被用来建模邻居之间的重要性差异,邻域之间的重要性差异,自身与邻域的重要性差异。

Layer Aggregation[51]:在Deeper GNN部分提到过,第K层输出包含了K-Hop邻居信息,Layer Aggregation即组合不同范围的邻居信息。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。



关键词: AI

相关推荐

技术专区

关闭