写点什么

GNN 在下拉推荐的应用

  • 2022 年 5 月 05 日
  • 本文字数:12683 字

    阅读完需:约 42 分钟

  1. 同构邻居 q2q & i2i 相比异构邻居 q2i & i2q 效果更明显。可能的原因是 q2i & i2q 数据比较稀疏,经过统计发现其存在 50%左右的结点邻居个数不足 5 个,而 q2q & i2i 只有 15%左右的这样的结点,更多的数据则意味着更多的信息,详情见图 4.1



图 4.1?邻居个数不足 5 个的结点的占比


  1. **同构邻居和异构邻居均有一些收益,但是同时加入它们却没有进一步的提升。**可能的原因有:一是两种类型的邻居包含的信息有重叠,二是 Graph Context Feature 的方式不利于信息的抽取。


  • 对于 No Aggregator


可以看到,除了同构邻居 q2q & i2i,加入其它邻居收益均为负。可能的原因仍然与上述的数据稀疏有关,q2i 和 i2q 有大量邻居不足 5 个,为了保持维度上的对齐,在代码里这部分被置为了 0,导致经过特征拼接后,Query 和 Item 的 Embedding 中包含了大量 0 值(始终为 0),而这非常不利于深度模型的训练。


???Graph Context Sequence


<table width="744"><tbody><tr><td width="250"><p style="text-align:center;"><strong>Base_50</strong></p></td><td width="494" colspan="2"><p style="text-align:center;">83.43</p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>Base_20</strong></p></td><td width="494" colspan="2"><p style="text-align:center;">83.37</p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>Neighbor/Aggregator-></strong></p></td><td width="250"><p style="text-align:center;"><strong>GCN</strong></p></td><td width="244"><p style="text-align:center;"><strong>No Aggregator</strong></p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>A:</strong> +q2q & i2i & q2i & i2q</p></td><td width="250"><p style="text-align:center;">83.62</p></td><td width="244"><p style="text-align:center;">83.47</p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>B:</strong> +q2i & i2q</p></td><td width="250"><p style="text-align:center;">83.55</p></td><td width="244"><p style="text-align:center;">83.52</p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>C:</strong> +q2q & i2i</p></td><td width="250"><p style="text-align:center;">83.57</p></td><td width="244"><p style="text-align:center;">83.61</p></td></tr><tr><td width="250"><p style="text-align:center;"><strong>D:</strong> +i2q</p></td><td width="250"><p style="text-align:center;">83.49</p></td><td width="244"><p style="text-align:center;">83.52</p></td></tr></tbody></table>


表 4.3 Total AUC


采用 Graph Context Sequence 这种将邻居信息作为单独的序列与待排序的 Query 做 Target Attention 的方式,总体 AUC 见表 4.3。我们可以有如下几个发现:


  1. 对于 GCN

  2. 相比 Graph Context Feature 的方式,有两个方面的提升:


总体 AUC 均有所上涨。相比 Base_20 的最高提升由之前的千分之 1.5 到现在的千分之 2.5


同时加入同构邻居和异构邻居能够带来进一步的提升。可能的原因是将邻居信息作为单独的序列,相比特征拼接的方式,在用 Target Query 做兴趣抽取时,能够最大限度地保留 Graph Context 的信息。至于特征交叉可以交给末层的 MLP 来做。


  1. 同构邻居 q2q & i2i 相比异构邻居 q2i & i2q 效果明显一点。原因同上。

  2. 对于 No Aggregator:当加入 4 个邻居序列后,模型的 AUC 有很明显的下降。可能的原因是序列太长(100)加上参数变多(4 组参数),模型可能难以收敛了。表 4.4 是 A 组结果中 GCN 和 No Aggregator 下 i2i 邻居序列前 4 个位置的 Attention 曲线对比(其他位置情况类似),可以看到,No Aggregator 确实没有收敛。


<table width="749"><tbody><tr><td width="749"><p style="text-align:center;"><strong>GCN</strong></p></td></tr><tr><td width="749"><p><img width="1200" src="https://img-blog.csdnimg.cn/img_convert/13b28a4d03484ed449ada034cf88fa5d.png" alt="13b28a4d03484ed449ada034cf88fa5d.png"></p></td></tr><tr><td width="749"><p style="text-align:center;"><strong>No Aggregator</strong></p></td></tr><tr><td width="749"><p><img width="1200" src="https://img-blog.csdnimg.cn/img_convert/da95ea0e52a0598a26cbf969d582a15f.png" alt="da95ea0e52a0598a26cbf969d582a15f.png"></p></td></tr></tbody></table>


表 4.4 i2i 邻居序列 Attention 曲线对比


???Hierarchical Attention


<table width="744"><tbody><tr><td width="212"><p style="text-align:center;"><strong>Base_50</strong></p></td><td width="532" colspan="3"><p style="text-align:center;">83.43</p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>Base_20</strong></p></td><td width="532" colspan="3"><p style="text-align:center;">83.37</p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>Neighbor/Model-></strong></p></td><td width="174"><p style="text-align:center;"><strong>+neig atten</strong></p></td><td width="180"><p style="text-align:center;"><strong>+neig & seq atten</strong><strong><sup>neig</sup></strong></p></td><td width="178"><p style="text-align:center;"><strong>+neig & seq atten</strong><strong><sup>all</sup></strong></p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>A:</strong> +q2q & i2i & q2i & i2q (100%)</p></td><td width="174"><p style="text-align:center;">83.46</p></td><td width="180"><p style="text-align:center;">83.47</p></td><td width="178"><p style="text-align:center;">83.49</p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>B:</strong> +q2i & i2q (75%)</p></td><td width="174"><p style="text-align:center;">83.47</p></td><td width="180"><p style="text-align:center;">83.47</p></td><td width="178"><p style="text-align:center;">83.46</p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>C:</strong> +q2q & i2i (75%)</p></td><td width="174"><p style="text-align:center;">83.50</p></td><td width="180"><p style="text-align:center;">83.50</p></td><td width="178"><p style="text-align:center;">83.52</p></td></tr><tr><td width="212"><p style="text-align:center;"><strong>D:</strong> +i2q (60%)</p></td><td width="174"><p style="text-align:center;">83.41</p></td><td width="180"><p style="text-align:center;">-</p></td><td width="178"><p style="text-align:center;">-</p></td></tr></tbody></table>


表 4.5 Total AUC


4.1 和 4.2 结果说明了两点,一是引入邻居信息并用 GNN 建模是有效的,二是 Graph Context Sequence 的方式优于 Graph Context Feature。在此基础上,一方面从图 3.1 的 Score 分布可以看到同种邻居的重要性存在差异,另一方面从之前的实验结果可以看到不同邻居的重要性也存在差异。因此在该部分快速实验了下 Attention 机制:Neighbor Attention 和 Sequence Attention,总体 AUC 见表 4.5。Neighbor Attention 是在聚合邻居时自适应学习边的权重,考虑到这里用 Target Attention 计算量很大,所以使用的是中心结点做 Attention。Sequence Attention 是将 Sequence Embedding 加权融合后再送入最后的 MLP 模块,这里用的是 Target Attentionseq atten****neig 表示只对邻居序列做融合,力求最小限度改动原有的模型**。seq attenall**表示对所有序列一起做融合。我们可以有如下几个发现:


  1. 纵向对比,总体上 AUC 相比 GCN 大降,不符合预期,至少应该不比 GCN 差。可能的原因是模型变复杂以后,仅用 7 天的数据训练已经难以收敛了。表 4.6 是 A 组结果中 GCN 和+neig & seq attenall 最好的结果下 i2i 邻居序列前 4 个位置的 Attention 曲线对比,可以看到,同样存在着没有收敛的问题。

  2. 横向对比Sequence Attention 有非常微小的收益,并且当序列数量越多时越明显,符合预期。

  3. 对比 GCN 或者+neig & seq attenall 与 Base 模型的 Attention 值还能发现,尽管整体上邻居序列也是前几个位置 Attention 值比较大,后几个位置的 Attention 值比较小,但是它们之间的 Gap(0.017)相对 Base 模型(0.12)并不明显。可能的原因是邻居序列中没有使用时间特征。


<table width="747"><tbody><tr><td width="747"><p style="text-align:center;"><strong>GCN</strong></p></td></tr><tr><td width="747"><p><img width="1200" src="https://img-blog.csdnimg.cn/img_convert/1de8730cbdaa67c1f26438f014d81378.png" alt="1de8730cbdaa67c1f26438f014d81378.png"></p></td></tr><tr><td width="747"><p style="text-align:center;"><strong>Attention</strong></p></td></tr><tr><td width="747"><p><img width="1200" src="https://img-blog.csdnimg.cn/img_convert/8071e06d726b97973890737f33629753.png" alt="8071e06d726b97973890737f33629753.png"></p></td></tr></tbody></table>


表 4.6 i2i 邻居序列 Attention 曲线对比


为了验证 Neighbor Attention 和 Sequence Attention 的有效性,我们可以进一步观察模型学习到的 Attention 的值。Neighbor Attention 如表 4.7 所示,Sequence Attention 如表 4.8 所示。


<table width="750"><tbody><tr><td width="125"><p style="text-align:center;"><strong>location-></strong></p></td><td width="125"><p style="text-align:center;">1</p></td><td width="125"><p style="text-align:center;">2</p></td><td width="125"><p style="text-align:center;">3</p></td><td width="125"><p style="text-align:center;">4</p></td><td width="125"><p style="text-align:center;">5</p></td></tr><tr><td width="125"><p style="text-align:center;">q2q</p></td><td width="125"><p style="text-align:center;">0.2279</p></td><td width="125"><p style="text-align:center;">0.2044</p></td><td width="125"><p style="text-align:center;">0.1946</p></td><td width="125"><p style="text-align:center;">0.1885</p></td><td width="125"><p style="text-align:center;">0.1846</p></td></tr><tr><td width="125"><p style="text-align:center;">q2i</p></td><td width="125"><p style="text-align:center;">0.2160</p></td><td width="125"><p style="text-align:center;">0.2021</p></td><td width="125"><p style="text-align:center;">0.1967</p></td><td width="125"><p style="text-align:center;">0.1936</p></td><td width="125"><p style="text-align:center;">0.1922</p></td></tr><tr><td width="125"><p style="text-align:center;">i2i</p></td><td width="125"><p style="text-align:center;">0.1954</p></td><td width="125"><p style="text-align:center;">0.1975</p></td><td width="125"><p style="text-align:center;">0.2001</p></td><td width="125"><p style="text-align:center;">0.2017</p></td><td width="125"><p style="text-align:center;">0.2034</p></td></tr><tr><td width="125"><p style="text-align:center;">i2q</p></td><td width="125"><p style="text-align:center;">0.2449</p></td><td width="125"><p style="text-align:center;">0.1954</p></td><td width="125"><p style="text-align:center;">0.1895</p></td><td width="125"><p style="text-align:center;">0.1858</p></td><td width="125"><p style="text-align:center;">0.1844</p></td></tr></tbody></table>


表 4.7 Neighbor Attention


在组织邻居结点时,位置 1-N 按照共现频数从高到低排列。从表 4.7 可以看到,整体上邻居的注意力分布确实符合这一趋势。


<table width="749"><tbody><tr><td width="107"><p style="text-align:center;"><strong>sequence-></strong></p></td><td width="107"><p style="text-align:center;">query seq</p></td><td width="107"><p style="text-align:center;">item seq</p></td><td width="107">< 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 p style="text-align:center;">q2q seq</p></td><td width="107"><p style="text-align:center;">q2i seq</p></td><td width="107"><p style="text-align:center;">i2i seq</p></td><td width="107"><p style="text-align:center;">i2q seq</p></td></tr><tr><td width="107"><p style="text-align:center;"><strong>attention-></strong></p></td><td width="107"><p style="text-align:center;">0.2755</p></td><td width="107"><p style="text-align:center;">0.1730</p></td><td width="107"><p style="text-align:center;">0.090</p></td><td width="107"><p style="text-align:center;">0.1156</p></td><td width="107"><p style="text-align:center;">0.2060</p></td><td width="107"><p style="text-align:center;">0.1418</p></td></tr></tbody></table>


表 4.8 Sequence Attention


一方面,Query 和 Item Sequence 作为原始序列,所能提供的信息最多,相对邻居序列更重要。另一方面,从之前的结果可以看到,不同的邻居序列的重要性也有差异。表 4.8 的结果与预期基本一致。


总体改进


???样本侧


  • 问题 A


线上排序模型使用的是 14+天的训练数据。在之前的实验中当模型变得复杂以后,仅用 7 天的训练数据模型已经难以收敛了。因此在之后的实验中将训练数据补到了 10 天(20210701-20210710)。


  • 问题 B


模型对邻居序列学习到的 Attention 值之间差异不大,因此在样本中为邻居结点加上了中心结点的时间特征,相当于引入了时间越近越重要的先验知识引导模型学习。


**?? 模型侧**


问题 A:在邻居聚合(Attention)时使用了多套不同的参数,参数量随邻居序列的数量的增加而增长,之前的实验中模型已经难以收敛了,后续加入更多高阶邻居后问题会更加突出。为此通过 Node-Type-Specific Transformation 和 Edge-Type-Specific Attention 建模图的异构性并共享相关参数降低参数量。


问题 B:之前的实验中,对于每种邻居序列都与 Target Query 做 Attention,计算量随邻居序列的数量的增加而增长,尽管这一步是并行的其计算量开销仍然不可忽略。为此加入了融合不同类型邻居信息的操作,以及融合邻居和自身信息的操作(除中心结点),最后分别为 Query 和 Item 序列得到一个融合了异构高阶信息的 Graph Context 序列。



图 5.1 模型结构


模型的整体结构如图 5.1 所示。GNN 部分作为排序模型的一个模块,为 Query 和 Item Sequence 分别学习一个 Graph Context Sequence 作为补充信息。其中比较关键的是:Node-Type-Specific Transformation 和 Transformer-Like Attention(In-Neighborhood Attention,Inter-Neighborhood Attention,Inter-Sequence Attention)。下面以 Query 类型的结点为例具体介绍这几种操作。


  • 5.2.1 Node-Type-Specific Transformation



不同类型的结点的特征维度和特征空间都存在差异,通过特定于结点类型的特征变换操作,一方面可以将特征维度对齐,另一方面尽可能拉近特征空间,便于后续不同类型的结点之间的特征融合(尤其是加法融合)。详情见公式(1),其中



表示 Query 类型的结点对应的变换矩阵,



表示 Query 结点的初始 Embedding。



公式 (1)


  • Hierarchical Heterogeneous Transformer-Like Attention



下拉排序模型中序列与 Target Query 之间用的是 Transformer 中点积的方式计算 Attention。GAT(图注意力神经网络)中用的是一个带 LReLU 的隐层计算 Attention,在计算复杂度上比点积高一些。此外,考虑到计算方式的一致性,在 GNN 部分使用了 Transformer 的方式,并根据图的异构性做了一些修改。共计有 4 个层次的 Attention。


In-Neighborhood Attention


邻域内同种类型的邻居的重要性有差异,这从邻居共现频数分布也能看出(本次实验采用的是 Top N 采样,差异可能不如随机采样明显)。为此在聚合同种类型的邻居时使用 Attention 机制。中心结点是 Q,邻居结点是 K 和 V,由于已经经过了 Node-Type-Specific Transformation,这里不再对 Q,K 和 V 做特征变换。此外,考虑到边的类型对相似性的影响,这里的点积是特定于边的类型的双线性点积。详情见公式(2)-(5),其中



分别表示 Query 的同构(Homogeneous)和异构(Heterogeneous)邻居,



分别表示 q2q 和 q2i 类型的边对应的参数矩阵。



是 Layer Normalization,用于保持数据的分布。



是 Scale Factor,用于将方差缩至 1。



公式 (2)



公式 (3)



公式 (4)



公式(5)


Inter-neighborhood Attention


除了邻域内同种类型的邻居的重要性有差异,邻域间不同类型的邻居的重要性也有差异**,这从之前的加入不同类型邻居序列的实验结果也能看出。为此在融合不同类型的邻居时也使用 Attention 机制。此外,考虑到当存在异构邻居时,Attention 的值更容易被中心结点自身所主导,在进行特征融合时邻居信息就容易被稀释掉,所以这里中心结点不作为 K、V 参与 Attention 的计算**。详情见公式(6)-(7)



公式(6)



公式(7)


最终的 Embedding 见公式(8),其中



为激活函数 ReLU。需要注意的是,最初的 Query 和 Item 自身不参与特征融合,也就是说,最终得到的是最初的 Query 和 Item 的



的 Graph Context 信息。



公式(8)


对于 GCN,以上公式中的重要性系数



则替换为了相应的平均系数,其他地方都保持一致,下文中称之为 HGCN。


  • In-Sequence Attention:这一部分与下拉模型保持一致,使用 Transformer 抽取序列中与 Target Query 相关的用户偏好。

  • Inter-sequence attention:这里延续了快速尝试部分的 Sequence Attention 模块,在新的训练样本上进一步通过实验探究其有效性。


Sequence Attention 相比直接 concat 的一个缺点是,不能经过 MLP 层与 Prefix、User Profile 等特征进行充分的特征交叉。


实验验证


在快速尝试的实验的基础上,扩大了样本规模,新增了样本特征,并针对性地改进了模型。在这一部分,首先会验证 GCN 下是否还有类似的结论,接着验证改进后模型的总体效果如何,然后验证加宽邻居是否会带来收益,最后验证加深邻居是否会带来收益。总体上,之前的改进是有效的,在数据规模变大后,相比之前千分之 2.5 的提升,AUC 不仅没有下降反而进一步提升至千分之 4.1。


?? GCN 下是否还有类似结论


<table width="747"><tbody><tr><td width="375"><p style="text-align:center;"><strong>Base_50</strong></p></td><td width="372"><p style="text-align:center;">84.36</p></td></tr><tr><td width="375"><p style="text-align:center;"><strong>Base_20</strong></p></td><td width="372"><p style="text-align:center;">84.09</p></td></tr><tr><td width="375"><p style="text-align:center;"><strong>Neighbor/Model-></strong></p></td><td width="372"><p style="text-align:center;"><strong>HGCN</strong></p></td></tr><tr><td width="375"><p style="text-align:center;"><strong>A:</strong>+q2q & i2i & q2i & i2q</p></td><td width="372"><p style="text-align:center;">84.44</p></td></tr><tr><td width="375"><p style="text-align:center;"><strong>B:</strong>+q2i & i2q</p></td><td width="372"><p style="text-align:center;">84.42</p></td></tr><tr><td width="375"><p style="text-align:center;"><strong>C:</strong>+q2q & i2i</p></td><td width="372"><p style="text-align:center;">84.47</p></td></tr></tbody></table>


表 6.1 Total AUC


HGCN 与 GCN 唯一的区别是以 Mean 的方式融合了不同类型的邻居,总体 AUC 见表 6.1。可以发现,以下几个结论仍然保持不变:


  1. 加长序列仍然是有效的,并且效果变得更加明显**(千分之 2.5)**。

  2. 加入各种邻居序列都能带来收益,并且同构邻居收益最大**(千分之 3.8)**。


不过我们也能发现,当同时加入所有邻居,模型的效果却下降了。这可能是由于 Mean 的融合方式引起的,实际上不同的邻居重要性是有差异的。


???改进后模型总体效果如何


首先,为邻居结点加上时间特征后,前后位置的 Attention 值的 Gap 由之前的 0.017 扩大到了 0.11,说明时间特征可以更好地引导 Attention 的学习。


<table width="747"><tbody><tr><td width="747"><p style="text-align:center;"><strong>HGCN</strong></p></td></tr><tr><td width="747"><p style="text-align:center;"><img src="https://img-blog.csdnimg.cn/img_convert/1937029952ba0b0e575115003783e682.png" alt="1937029952ba0b0e575115003783e682.png"></p></td></tr><tr><td width="747"><p style="text-align:center;"><strong>Attention</strong></p></td></tr><tr><td width="747"><p style="text-align:center;"><img src="https://img-blog.csdnimg.cn/img_convert/7a40204e7f0343df5aa8f7fea77039e2.png" alt="7a40204e7f0343df5aa8f7fea77039e2.png"></p></td></tr></tbody></table>


表 4.6 Item neighbor Sequence Attention 曲线对比


其次,经过扩充数据规模,加入时间特征,改进模型结构后,模型已经能够收敛得很好了,见图 6.1 所示。


<table width="740"><tbody><tr><td width="210"><p style="text-align:center;"><strong>Base_50</strong></p></td><td width="530" colspan="3"><p style="text-align:center;">84.36</p></td></tr><tr><td width="210"><p style="text-align:center;"><strong>Base_20</strong></p></td><td width="530" colspan="3"><p style="text-align:center;">84.09</p></td></tr><tr><td width="210"><p style="text-align:center;"><strong>Neighbor/Model-></strong></p></td><td width="167"><p style="text-align:center;"><strong>+In-neighd attention</strong></p></td><td width="177"><p style="text-align:center;"><strong>+In-neighd attention</strong></p><p style="text-align:center;"><strong>& Inter-neighd attention</strong></p></td><td width="186"><p style="text-align:center;"><strong>+In-neighd attention</strong></p><p style="text-align:center;"><strong>& Inter-neighd attention</strong></p><p style="text-align:center;"><strong>& Inter-seq attention</strong></p></td></tr><tr><td width="210"><p style="text-align:center;"><strong>A:</strong>+q2q & i2i & q2i & i2q</p></td><td width="167"><p style="text-align:center;">84.45</p></td><td width="177"><p style="text-align:center;">84.50</p></td><td width="186"><p style="text-align:center;">83.49</p></td></tr><tr><td width="210"><p style="text-align:center;"><strong>B:</strong>+q2i & i2q</p></td><td width="167"><p style="text-align:center;">84.43</p></td><td width="177"><p style="text-align:center;"><strong>--</strong></p></td><td width="186"><p style="text-align:center;"><strong>--</strong></p></td></tr><tr><td width="210"><p style="text-align:center;"><strong>C:</strong>+q2q & i2i</p></td><td width="167"><p style="text-align:center;">84.50</p></td><td width="177"><p style="text-align:center;"><strong>--</strong></p></td><td width="186"><p style="text-align:center;"><strong>--</strong></p></td></tr></tbody></table>


表 6.2 Total AUC


那么,相比之前加入 Attention 后效果大降,改进后 Attention 模型的效果如何呢?总体 AUC 见表 6.2 所示。我们可以有以下几个发现:


纵向对比,相比之前加入 Attention 后效果大降,现在总体上相比 HGCN 均有微小提升,这说明之前的改进是有效的


  1. 加入 In-neighd attention 后有微小提升,说明 Top N 邻居的重要性差异并不明显。

  2. 加入 Inter-neighd attention 有进一步提升,并改善了 HGCN 加入所有邻居后效果下降的问题,说明不同类型的邻居的重要性确实有差异。

  3. 加入 Inter-seq attention 后效果仍然持平,说明对 Sequence Embedding 的融合必要性不大。


???加宽邻居是否会带来收益



图 6.1 AUC 随邻居宽度的变化趋势


加宽邻居是一种常见的操作,更多的邻居意味着更多信息(也可能引入更多噪声),这里通过实验来验证加宽邻居的有效性,AUC 随邻居宽度的变化趋势如图 6.1 所示。这里对 HGCN 和 Attention 都+q2q & i2i & q2i & i2q,其中 Attention 为+In-neighd attention & Inter-neighd attention。我们可以有如下几个发现:


  1. 2-6 个邻居基本已经足够了。

  2. Attention 整体上优于 HGCN,但是优势并不突出。


以上两点可能都是由 Top N 的采样方式引起的,前 Top N 个邻居的重要性差异不大,并且所提供的的信息可能也是重叠的。


???加深邻居是否会带来收益


<table width="742"><tbody><tr><td width="253"><p style="text-align:center;"><strong>Base_50</strong></p></td><td width="489" colspan="2"><p style="text-align:center;">84.36</p></td></tr><tr><td width="253"><p style="text-align:center;"><strong>Base_20</strong></p></td><td width="489" colspan="2"><p style="text-align:center;">84.09</p></td></tr><tr><td width="253"><p style="text-align:center;"><strong>Model</strong></p></td><td width="247"><p style="text-align:center;"><strong>2 hop size=0</strong></p></td><td width="242"><p style="text-align:center;"><strong>2 hop size=3</strong></p></td></tr><tr><td width="253"><p style="text-align:center;">HGCN</p></td><td width="247"><p style="text-align:center;">84.39</p></td><td width="242"><p style="text-align:center;">84.45</p></td></tr><tr><td width="253"><p style="text-align:center;">Attention</p></td><td width="247"><p style="text-align:center;">84.40</p></td><td width="242"><p style="text-align:center;">84.47</p></td></tr></tbody></table>


表 6.3 Total AUC


加深邻居也是一种常见的操作,更深的邻居可能蕴含高阶的信息。这里考虑到实现方式的限制,只验证了 2 阶邻居相对 1 阶邻居是否存在收益,其中 1 hop size=6,2 hop size=3。事实上,在 GNN 的相关研究中,2-3 阶的邻居基本已经足够了,引入太高阶的邻居反而有副作用(源于图的直径一般都不大),总体 AUC 见表 6.3 所示。此外,这里只使用了邻居结点的 ID 特征和时间特征。我们可以有以下几个发现:


  1. 2 hop 邻居确实能够提供更多信息,其 AUC 有较明显的提升。

  2. **即使只使用 1 阶邻居,只使用 ID 特征,只使用 HGCN,也能够达到比 Base_50 略好的效果。**也就是说我们可以使用更少的数据,而且不引入额外的模型参数,就能够达到 Base_50 的效果。

  3. Attention 的效果和 HGCN 相比仍然相差不大**。**


问题解决


至此,基于以上的实验结果可以回答开篇提到的三个问题,分析引入邻居信息并用 GNN 建模是否起到了作用。


???问题 1:加长序列无法作用于历史行为稀疏的不活跃用户



图 7.1 在不同活跃度用户上的 AUC(20210711)


GNN 对不活跃用户有明显效果。模型在不同活跃度用户上的 AUC 对比见图 7.1 所示,可以有以下几点发现:


  1. base_50 在低活用户上效果与 base_20 几乎持平,但是 GNN 在低活用户上效果却有显著提升。

  2. 即使在 base_50 表现优异的高活用户上,GNN 在只使用长 20 的序列的基础上,效果也比 base_50 略好。


???问题 2:加长序列对曝光次数较少的长尾 Query 的效果较弱



图 7.2 在不同 PV 的 Query 上的 AUC(20210711)


GNN 对长尾 Query 也有明显效果。模型在不同 PV 的 Query 上的 AUC 见图 7.2 所示,可以发现在长尾 Query 上 GNN 相对 Base_20 和 Base_50 均有所提升,在 Base_50 表现优异的高频 Query 上 GNN 也能够保持持平。


???问题 3:加长序列带来的收益与巨大的存储消耗之比不高



图 7.3 存储消耗与 AUC 对比


GNN 可以用更少的存储获得更好的效果。模型使用的训练数据存储消耗与取得的 AUC 的对比见图 7.3 所示,其中*表示只使用了邻居结点的 ID 特征和时间特征,此处 HGCN 和 Attention 都只使用了 1 阶 q2q 和 i2i 邻居。可以看到,在存储量只有 Base_50 的 60%情况下,GNN 却能取得比 Base_50 略好的效果;在存储量只有 Base_50 的 80%的情况下,GNN 相对 Base_20 可以取得千分之 4 的提升,相对 Base_50 可以取得千分之 1.5 的提升。


未来工作


本次实习工作针对下拉排序模型存在的三个问题,引入邻居信息并用 GNN 建模取得了一定的效果,也为如何在序列上进一步提效提供了另一个角度。相比加长序列,GNN 可以显著提升模型在不活跃用户和长尾 Query 上的效果,并且可以用更少的存储量取得更高的总体收益。同时也能看到仍然存在着一些也许可以改进的地方:


  1. Top N 采样方式是否合理。考虑到采样带来的消耗,基于数据的长尾分布,本次实验中采用了 Top N 的采样方法进行简化近似。但是 Top N 采样可能会导致采样到的 N 个邻居区分度不大,包含的信息重合,这可能是 Attention 无法发挥优势的原因,以及加宽邻居存在严重的边际效应的原因。同时,如果未来部署到线上,面对线上的数据分布,Top N 采样可能会限制模型的泛化能力。

  2. 给 Target Query 加上邻居信息。本次实验中只引入了序列中 Query 和 Item 的邻居信息,由于 Query 之间共享 Embedding 可以间接地作用于 Target Query。后续也可以给 Target Query 也加上邻居信息,以更直接的方式促进对长尾 Query 的学习。

  3. 用 Prefix Attention 代替 Neighbor Attention。对于邻居信息我们需要的同样只是与 Target Query 相关的部分。本次实验没有用 Target Attention 是考虑到计算量的问题,而 Prefix Attention 则不存在这个问题,并且 Prefix 在大多数情况下足以表明用户当前的意图。后续可以实验对比下序列建模中 Target Attention 和 Prefix Attention 的效果,然后再决定邻居聚合中是否使用 Prefix Attention。


总结展望


本次暑期实习收获很多,经历了一个完整的发现问题分析问题到解决问题的过程。相比之前在学校搞科研接触到的工作,不再是使用现成的玩具数据集,而是自己处理百亿级的数据集;不再是魔改模型后对着结果讲故事,而是针对真实的问题使用合适的技术;模型效果的提升不是意义不大的数字,而是有可能在线上产出实际的商业价值。同时学习了 DataWork,AOP,语雀的使用,感受到了先进工具对生产力的提升。未来的计划方面,主要有以下几点:


  1. 将现在的工作上线一个简单的版本,看一下是否能够在线上也取得效果。

  2. 将现在的工作继续完善,包括更好的采样方法,更优质的邻居数据,Target Query 侧加上邻居信息,Prefix Attention 代替 Neighbor Attention。在这之后将工作整理成论文投一个会议。

  3. 系统深入广泛地学习一下推广搜方面的资料。

  4. 在实际业务中解决更多问题获得更多成长。


最后,非常感谢谷仁老师,筠荻老师和开锋老师的支持与帮助。


参考文献


[1] Wu Z, Pan S, Chen F, et al. A comprehensive survey on graph neural networks[J]. IEEE transactions on neural networks and learning systems, 2020.


[2] Wu S, Sun F, Zhang W, et al. Graph neural networks in recommender systems: a survey[J]. arXiv preprint arXiv:2011.02260, 2020.


[3] Wang S, Hu L, Wang Y, et al. Graph learning approaches to recommender systems: A review[J]. arXiv preprint arXiv:2004.11718, 2020.


[4] Kipf T N, Welling M. Semi-supervised classification with graph convolutional networks[J]. arXiv preprint arXiv:1609.02907, 2016.

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
GNN在下拉推荐的应用_Java_爱好编程进阶_InfoQ写作社区