使用DGL实现基于闲鱼图进行边分类算法

本文介绍了如何使用DGL库复现闲鱼团队的基于GNN的Spam评论检测算法。该算法利用GNN处理用户-评论-商品构成的二部图,对边进行分类。通过DGL实现GNN网络,包括定义图结构、模型结构、前向计算等步骤,以发现不正常评论。实验表明,虽然在某些场景下模型表现不优于MLP,但在有噪音的数据中,简化模型可能会提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲鱼图算法解析和使用DGL进行实现

2019年阿里闲鱼团队在CIKM 2019上发了一篇进行Spam评论的检测算法,用到了GNN的思想。论文显示结果比较好。但是由于首先它们并没有开放数据,且也没开源算法的具体实现方法,同时还没有对其中的Attention部分给出具体的公式,所以没法进行复现。虽然这篇论文拿了CIKM 2019的最佳应用研究论文,但是这种无法复现的论文,是否应该给最佳还是要打个问号。

最近由于项目,需要使用这个算法,便尝试使用目前比较好的GNN实现框架——DGL(Deep Graph Library)进行了复现。经过两次迭代后,很顺利地完成了其中最核心部分公式的实现。这里对这次的工作进行一下总结,并形成一个使用DGL的教程,供大家参考。

闲鱼算法的核心部分是对于“用户”->“评论”->“商品”构建的二部图。其基本的数据结构如下图:
XY图例子在这个图里,“用户”- U U U通过“评论”- E E E对“商品”- I I I进行交互,由此构成了一个二部图。其中“用户”和“商品”是点,而“评论”是边。

算法的核心任务是对边进行分类,即发现那些不正常的评论行为。

典型的机器学习方法是对评论进行特征提取,比如text2vec,同时把用户和商品的信息也进行特征提取。然后合并这三组特征,再送入分类器中,比如 XGboost等。
但是这种方法并没有充分利用到边和点之间的关联关系,因此闲鱼团队采用了基于GNN的算法,同时另外还加入了通过KNN构建的评论之间的相似图,进一步加入了一些信息。这样就利用了用户、商品、评论和它们之间的关系,理论上采用了更多的信息,提升了分类的效果。
但是由于论文没有数据和实现的细节,所以也没法确切的评估效果到底好不好。后文也会讨论一下采用这个算法碰到的问题。

一、算法原理

这个部分的算法的基本原理就是:

  • 通过Attention机制把“用户”+“评论”的特征发送给“商品”,并结合“商品”已有的特征,更新“商品”的特征;
  • 通过Attention机制把“商品”+“评论”的特征发送给“用户”,并结合“用户”已有的特征,更新“用户”的特征;
  • “用户”+“评论”+“商品”特征发给“评论”,并更新“评论”的特征;
  • 最后使用“用户” ∣ ∣ || “笔记” ∣ ∣ || “评论”作为特征进行“评论”的分类。其中, ∣ ∣ || c o n c a t e n a t e concatenate concatenate的意思。

这里的Attention的含义是,通过一些可学习的权重,来发现那些对于识别有问题的评论更重要的特征,并且通过GNN来把“用户”和“商品”的特征自动组合给“评论”,从而不用再去做人工的特征工程。

二、具体的公式

根据上面介绍的算法原理,这里把论文里的公式梳理一下。这并不会按照论文里的公式顺序来写,但是会给出原文里的公式编号。首先给出GNN的层上的值的定义:

L − 1 L-1 L1 L L L
h e l − 1 ∈ R ( 1 , D e l − 1 ) h_{e}^{l-1} \isin \Reals^{(1, D_{e}^{l-1})} hel1R(1,Del1) h e l ∈ R ( 1 , D e l ) h_{e}^{l} \isin \Reals^{(1, D_{e}^{l})} helR(1,Del)
h u l − 1 ∈ R ( 1 , D u l − 1 ) h_{u}^{l-1} \isin \Reals^{(1, D_{u}^{l-1})} hul1R(1,Dul1) h u l ∈ R ( 1 , D u l ) h_{u}^{l} \isin \Reals^{(1, D_{u}^{l})} hulR(1,Dul)
h i l − 1 ∈ R ( 1 , D i l − 1 ) h_{i}^{l-1} \isin \Reals^{(1, D_{i}^{l-1})} hil1R(1,Dil1) h i l ∈ R ( 1 , D i l ) h_{i}^{l} \isin \Reals^{(1, D_{i}^{l})} hilR(1,Dil)

这里面, e e e指代“评论”所代表的边; u u u指代“用户”节点; i i i指代“商品”节点。 D D D对应的是每一层的特征维度数。

首先来写原论文里的公式(6),这是对一个 u u u节点计算它所有的相邻 i i i节点和连接的边 e e e的隐藏层的值进行合并。同样的操作也对 i i i节点进行,所以有两个。

公式6:把点和边的特征进行 c o n c a t concat concat
关于“用户”类型的节点: H I E l − 1 = { c o n c a t ( h i l − 1 , h e l − 1 ) , ∀ e = ( u , i ) ∈ E ( u ) } \mathcal{H}_{IE}^{l-1} = \{concat(h_i^{l-1}, h_e^{l-1}), \forall e=(u, i)\isin E(u)\} HIEl1={ concat(hil1,hel1),e=(u,i)E(u)}
关于“商品”类型的节点: H U E l − 1 = { c o n c a t ( h u l − 1 , h e l − 1 ) , ∀ e = ( u , i ) ∈ I ( u ) } \mathcal{H}_{UE}^{l-1} = \{concat(h_u^{l-1}, h_e^{l-1}), \forall e=(u, i)\isin I(u)\} HUEl1={ concat(hul1,hel1),e=(u,i)I(u)}

这里计算后得到的 H I E l − 1 \mathcal{H}_{IE}^{l-1} HIEl1的维度是不固定的,因为这里是一个节点的所有的边的集合,所以是一个不定行数,但是列数量是固定维度: D e l − 1 + D i l − 1 D_{e}^{l-1} + D_{i}^{l-1} Del1+Dil1。同样的情况对于 H U E l − 1 \mathcal{H}_{UE}^{l-1} HUEl1也是一样的, H U E l − 1 \mathcal{H}_{UE}^{l-1} HUEl1的行数量不定,列的维度是固定的: D e l − 1 + D u l − 1 D_{e}^{l-1} + D_{u}^{l-1} Del1+Dul1

这两个计算出来的矩阵将会被用于在公式(7)里面计算Attension机制。但是这里原文写的很含糊,它虽然引用了文献24,但是并没有给出具体的计算方法,而采用基础的加权点积Attention方法是不行的,所以需要自己想办法。我这里采用了文献24里面的思想,给 k e y key key H H H都进行了维度变换。从而保证它们的维度一致,能进行加权点积注意力计算。

公式 5和7: 完成Attention的计算
对于“用户”类型节点: H N ( u ) l = σ ( W U l ∗ A T T N U ( W A U l − 1 ∗ h u l − 1 , W A I E l − 1 ∗ H I E l − 1 ) ) \mathcal{H}_{N(u)}^l = \sigma(W_U^l * ATTN_U(W_{AU}^{l-1} * h_u^{l-1}, W_{AIE}^{l-1} * \mathcal{H}_{IE}^{l-1})) HN(u)l=σ(WU

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值