谣言检测论文分享(一)

Rumor Detection on Social Media with Bi-Directional Graph Convolutional Networks

摘要重点:由于用于谣言检测的深度学习方法中只考虑了深度传播的模式,而忽略了广泛分散的结构,而实际上,传播性和分散性是谣言的两个重要特征,因此文中提出了一种新的双向图模型——双向图卷积网络(bi-directional graph Convolutional Networks, Bi-GCN),通过同时操作自上向下和自下向上的谣言传播来探索这两种特征。它利用带有自上而下有向谣言传播图的GCN来学习谣言传播模式;以及一个具有谣言扩散反向有向图的GCN,以捕获谣言扩散的结构。此外,来自源帖子的信息被参与到GCN的每一层中,以增强来自谣言根源的影响。

1 介绍

1.1 传统方法与近期有关研究

传统方法:主要采用用户特征、文本内容和传播模式等手工特征来训练有监督的分类器。如,决策树,随机森林,SVM等。然而,这些方法主要依赖于特征工程,非常耗时耗力。此外,这些手工设计的特征通常缺乏从谣言传播和散布过程中提取的更高层的表示。

近期研究:利用了深度学习方法,从传播路径/树或网络中挖掘高级表示来识别谣言。许多深度学习模型,如长短期记忆(LSTM)、门控递归单元(GRU)和递归神经网络(RvNN)被使用,因为它们能够从谣言的时间传播中学习顺序特征。然而,由于时序结构特征只考虑了谣言的顺序传播,而忽略了谣言弥散度的影响,这些方法在效率上存在明显的局限性。

谣言扩散结构也反映了谣言的一些传播行为。因此,一些研究试图通过调用基于卷积神经网络(CNN)的方法来涉及来自谣言散布结构的信息(Yu et al. 2017;2019)。基于cnn的方法可以获得局部近邻内的关联特征,但无法处理图或树中的全局结构关系(Bruna et al. 2014)。因此,这些方法忽略了谣言扩散的全局结构特征。实际上,CNN不是为了从结构化数据中学习高级表示而设计的,但图卷积网络(GCN)是。

1.2 GCN用于谣言检测的局限性

GCN,或称为无向GCN (UD-GCN),只聚合依赖于相关帖子之间关系的信息,而丢失了谣言的顺序特征。尽管UD-GCN具有处理谣言扩散的全局结构特征的能力,但它没有考虑谣言传播的方向,而这已被证明是谣言检测的重要线索。具体来说,沿着关系链的深度传播(Han et al. 2014)和在社会中的广泛分散是谣言的两个主要特征,迫切需要一种方法来服务于这两者。

1.3 研究意义

为了同时处理谣言的传播和扩散问题,本文提出了一种新的双向GCN (BiGCN)算法,该算法同时处理自顶向下和自底向上的谣言传播。该方法通过自上向下的图卷积网络(TD-GCN)和自下向上的图卷积网络(BU-GCN)两部分分别获得了传播和扩散的特征。

具体思路是:如图1(b)和1(c)所示,TD-GCN转发谣言树中节点的父节点信息,形成谣言传播,BU-GCN聚合谣言树中节点的子节点信息,表示谣言扩散。然后,通过全连接将TD-GCN和BU-GCN嵌入的传播和色散表示合并在一起,得到最终结果。同时,我们将谣言树的根特征与各个GCN层的隐藏特征进行拼接,以增强谣言根的影响。此外,我们在训练阶段使用DropEdge (Rong et al. 2019)来避免模型的过拟合问题。

1.4 本文贡献

  1. 第一个将GCN应用于社交媒体谣言检测的研究。
  2. 提出了Bi-GCN模型,该模型不仅考虑了谣言沿关系链自上而下传播的因果特征,而且通过自下而上的聚集获得了谣言在社区内扩散的结构特征。
  3. 每个图卷积层将源帖子的特征与其他帖子的特征进行拼接,综合利用来自根特征的信息,在谣言检测中取得了优异的表现。

2 相关工作

传统的工作主要集中在利用特征工程的方法上。近年来,随着深度神经网络的兴起,开始出现一些基于空间结构或时间顺序的方法,如基于核结构的和基于递归神经网络的,为了自动学习高级特征,最近提出了一些基于深度学习模型的谣言检测方法。Ma等人利用循环神经网络(RNN)从时间内容特征中捕获隐藏表示(Ma等人,2016年)。Chen et al. (Chen et al. 2018)通过将注意力机制与RNN相结合来改进这种方法,以关注具有不同注意力的文本特征。Yu et al. (Yu et al. 2017)提出了一种基于卷积神经网络(CNN)的方法,可以学习分散在输入序列中的关键特征,并在重要特征之间形成高级交互。Liu等人(Liu和Wu 2018.Early detection of fake news on social media through propagation path classifification with recurrent and convolutional networks.)结合了RNN和CNN来获得基于时间序列的用户特征。最近,Ma等人(Ma, Gao, and Wong 2019.Detect rumors on twitter by promoting information campaigns with generative adversarial learning.)采用对抗学习方法来提高谣言分类器的性能,其中鉴别器被用作分类器,相应的生成器通过产生冲突噪声来改进鉴别器。此外,Ma等人构建了一个树状结构递归神经网络(RvNN)来捕捉传播结构和文本内容中的隐藏表示(Ma, Gao, and Wong 2018)。然而,这些方法在了解谣言传播结构特征方面效率低下,同时也忽略了谣言传播的全局结构特征。

与上述深度学习模型相比,GCN能够更好地从图或树中捕获全局结构特征。受CNN在计算机视觉领域成功的启发,GCN在使用图数据的各种任务中展示了最先进的性能。Scarselli et al. (Scarselli et al. 2008)首先引入了GCN作为无向图或有向图的特殊的消息传递模型。后来,Bruna et al. (Bruna et al. 2014)从理论上分析了基于谱图理论的无向图的图卷积方法。随后,Defferrard等人(Defferrard, Bresson, and Vandergheynst 2016)开发了一种名为Chebyshev谱CNN (ChebNet)的方法,并使用Chebyshev多项式作为滤波器。本文的谣言检测模型是受到GCN的启发。

3 准备工作

3.1 问题描述

本文问题定义的描述与大多数论文一致

  1. 谣言数据集:

    ,ci是第i个事件,m是事件总数
  2. ,ri是源帖,代表第j个相关的回复帖子,Gi是图传播结构。
  3. ,其中,ri是根节点,Vi,Ei分别是节点集和边集,其中
  4. 特征矩阵为

    ,其中表示ri的特征向量,每行特征表示的特征向量。
  5. 每个事件ci对应事实标签yi∈{F, T}相关联(即虚假谣言或真实谣言)。在某些情况下,标签yi是四个细粒度类别{N, F, T, U}之一(即非谣言、虚假谣言、真实谣言和未经验证的谣言)
  6. 谣言检测的目标是学习分类器:

 3.2 GCN

GCN是最有效的卷积模型之一,其卷积操作被认为是一个一般的“消息传递”体系结构如下:

GCN有多种信息传播函数 ,本文应用的是1stChebNet的一阶近似的表示方法:

 为邻接矩阵的对称归一化,激活函数使用ReLU。

3.3 DropEdge

DropEdge是一种减少基于GCN的模型过拟合的新方法(Rong et al. 2019.The truly deep graph convolutional networks for node classifification)。在每个训练阶段,它从输入图中随机弹出边,以一定的速率生成不同的变形副本。因此,这种方法增加了输入数据的随机性和多样性,就像随机旋转或拍动的图像一样。形式上,假设图A中的边总数为Ne,下降率为p,则DropEdge后的邻接矩阵,

,计算如下:

其中,

是使用从原始边集随机抽样的新边构造的矩阵。

4 Bi-GCN Model

Bi-GCN的核心思想是从谣言传播和谣言扩散中学习合适的高级表示。在Bi-GCN模型中,采用双层1stChebNet作为基本的GCN组件。如图2所示,分4个步骤详细说明了谣言检测过程。

首先讨论了如何将Bi-GCN模型应用于一个事件,即ci→yi表示第i个事件。其他事件的计算方法相同。下文省略下标i。

4.1 构造传播图和扩散图

基于转发和响应关系,我们构建了一个谣言事件ci的传播结构<V,E>。然后,设

X分别为其对应的邻接矩阵和基于谣言传播树的ci的特征矩阵。A只包含从上节点到下节点的边缘,如图1(b).所示在每个训练阶段,通过等式删除边的p个百分比形成(如公式3所示),避免痛苦的过拟合问题。基于和X,我们可以建立Bi-GCN模型。

Bi-GCN由两个组件组成:一个自上向下的GCN(TDGCN)和一个自下向上的GCN(BUGCN)。两个GCN的邻接矩阵是不同的。对于TD-GCN,邻接矩阵表示为

.同时,对于BU-GCN,邻接矩阵为.TD-GCN和BU-GCN采用相同的特征矩阵X。

4.2 计算高级节点表示

将两个GCN的特征矩阵和邻接矩阵代入公式2中,得TD-GCN的2层网络表示如下,BU-GCN的表示也类似。

使用ReLU作为激活函数

4.3 根特征增强

一个谣言事件的来源帖子总是有丰富的信息来产生广泛的影响。有必要更好地利用来自源帖子的信息,并从节点和源帖子之间的关系中学习更准确的节点表示。

因此,除了TD-GCN和BU-GCN的隐藏特征外,本文还提出了一种根特征增强操作来提高谣言检测的性能,如图2所示。具体来说,对于第k个GCL的TD-GCN,我们将每个节点的隐藏特征向量与上一层的(k−1)GCL中根节点的隐藏特征向量连接起来,构造一个新的特征矩阵:

所以

,将新的特征矩阵代入公式5得新的GCN特征矩阵的表示为:

同理,BUGCN的新特征矩阵与公式7和8类似

4.4 谣言分类中传播和分散的表示

传播和分散的表示分别是来自TD-GCN和BU-GCN的节点表示的聚合。在这里,使用平均池操作符来聚合来自这两组节点表示的信息。它被表述为:

        平均池化和最大池化都是卷积神经网络中的一种操作,用于降低特征图的尺寸和维度,以便在后续的网络层中提取更具有抽象性的特征。具体来说: 平均池化是将特征图划分为若干个相同大小的区域,然后对每个区域内的像素取平均值作为该区域的输出。平均池化可以降低特征图的尺寸和维度,同时保留一定的空间信息。 最大池化是将特征图划分为若干个相同大小的区域,然后对每个区域内的像素取最大值作为该区域的输出。最大池化可以降低特征图的尺寸和维度,同时保留最重要的特征信息。 总的来说,平均池化和最大池化都可以用于特征提取和降维,但在不同的场景下表现略有不同,需要根据实际情况选择合适的方式。

连接后:

最后,通过几个完整的连接层和一个软连接层来计算事件ˆy的标签:

我们通过最小化所有事件的预测和真值分布的交叉熵Y,来训练Bi-GCN模型中的所有参数。L2正则项应用于所有模型参数的损失函数中。

5 实验

数据集:Weibo,Twitter15 ,Twitter16

其中微博数据集包含两个二值标签:虚假谣言(F)和真实谣言(T),而Twitter15和Twitter16数据集包含四个标签:非谣言(N)、虚假谣言(F)、真实谣言(T)和未经验证的谣言(U)

实验结果省略,评价标准有ACC,Prec,Rec,F1值。

实验过程包括对比实验,消融实验,早期谣言检测实验

6 总结

该文提出了一种基于GCN的社交媒体谣言检测模型Bi-GCN。模型内固有的GCN模型赋予了所提方法处理图或树结构的能力,并学习更有利于谣言检测的更高层次表示。此外,我们还通过在GCN的每个GCL之后连接源帖子的特征来提高模型的有效性。同时,构建了几种Bi-GCN变体来建模传播模式,即UD-GCN、TD-GCN和BU-GCN。在三个真实的数据集上的实验结果表明,基于gcn的方法在准确性和效率方面都具有非常大的优势。特别地,Bi-GCN模型既考虑了谣言沿关系链自上向下传播模式传播的因果特性,又考虑了谣言自下向上聚集在社区内部传播的结构特性,取得了最好的性能。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
谣言检测是指通过分析文本内容来判断该文本是否包含谣言或虚假信息。Transformer是一种基于注意力机制的神经网络模型,被广泛应用于自然语言处理任务中,包括谣言检测。 在谣言检测中,我们可以使用Transformer的编码器作为语义提取器。编码器将整个句子作为输入,并通过注意力机制和多层感知机(MLP)为每个字生成一个编码向量。这些编码向量包含了整个句子的语义信息。然后,我们可以将这些向量输入到全连接网络中进行分类,判断文本是否为谣言。 需要注意的是,由于Transformer的注意力机制可以同时处理整个句子,因此它具有较好的并行能力。然而,与循环神经网络(RNN)相比,Transformer缺少了上下文信息,即没有考虑到不同词之间的顺序。因此,在使用Transformer进行谣言检测时,需要注意这一点。 下面是一个基于PyTorch和Transformer实现谣言检测的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim from torchtext.data import Field, TabularDataset, BucketIterator from torch.nn import TransformerEncoder, TransformerEncoderLayer # 定义模型 class RumorDetectionTransformer(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, n_layers, n_heads, dropout): super().__init__() self.embedding = nn.Embedding(input_dim, hidden_dim) self.encoder_layer = TransformerEncoderLayer(hidden_dim, n_heads) self.encoder = TransformerEncoder(self.encoder_layer, n_layers) self.fc = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, text): embedded = self.embedding(text) embedded = embedded.permute(1, 0, 2) output = self.encoder(embedded) output = output.permute(1, 0, 2) pooled = torch.mean(output, dim=1) pooled = self.dropout(pooled) return self.fc(pooled) # 数据预处理 TEXT = Field(tokenize='spacy', lower=True) LABEL = Field(sequential=False, is_target=True) fields = [('text', TEXT), ('label', LABEL)] train_data, test_data = TabularDataset.splits( path='data', train='train.csv', test='test.csv', format='csv', fields=fields ) TEXT.build_vocab(train_data, vectors='glove.6B.100d') LABEL.build_vocab(train_data) # 模型训练 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') BATCH_SIZE = 64 train_iterator, test_iterator = BucketIterator.splits( (train_data, test_data), batch_size=BATCH_SIZE, device=device ) INPUT_DIM = len(TEXT.vocab) HIDDEN_DIM = 100 OUTPUT_DIM = 1 N_LAYERS = 2 N_HEADS = 2 DROPOUT = 0.2 model = RumorDetectionTransformer(INPUT_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, N_HEADS, DROPOUT).to(device) optimizer = optim.Adam(model.parameters()) criterion = nn.BCEWithLogitsLoss().to(device) def train(model, iterator, optimizer, criterion): model.train() epoch_loss = 0 for batch in iterator: optimizer.zero_grad() text = batch.text label = batch.label.float() predictions = model(text).squeeze(1) loss = criterion(predictions, label) loss.backward() optimizer.step() epoch_loss += loss.item() return epoch_loss / len(iterator) def evaluate(model, iterator, criterion): model.eval() epoch_loss = 0 with torch.no_grad(): for batch in iterator: text = batch.text label = batch.label.float() predictions = model(text).squeeze(1) loss = criterion(predictions, label) epoch_loss += loss.item() return epoch_loss / len(iterator) N_EPOCHS = 10 best_valid_loss = float('inf') for epoch in range(N_EPOCHS): train_loss = train(model, train_iterator, optimizer, criterion) valid_loss = evaluate(model, test_iterator, criterion) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'rumor_detection_transformer.pt') # 模型使用 model.load_state_dict(torch.load('rumor_detection_transformer.pt')) def predict_rumor(text): model.eval() tokenized = [tok.text for tok in TEXT.tokenizer(text)] indexed = [TEXT.vocab.stoi[t] for t in tokenized] tensor = torch.LongTensor(indexed).unsqueeze(1).to(device) prediction = torch.sigmoid(model(tensor)) return prediction.item() # 示例使用 text = "这是一条谣言" prediction = predict_rumor(text) print(f"谣言概率:{prediction}") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨MG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值