SDCN框架
框架图
SDCN框架主要由GCN和AE组成。
GCN(图卷积网络)用在文本数据上的好处:
-
捕捉语义关系:文本数据通常具有复杂的语义关系,例如词与词之间的依赖、句子之间的逻辑连接等。GCN可以通过在图结构中传播信息来学习单词或句子之间的相互作用,从而更好地捕捉到这些语义关系。
-
处理长距离依赖:传统基于序列模型(如循环神经网络)处理文本时可能会面临长距离依赖问题,即较远位置上出现的单词对当前位置产生影响。而GCN可以通过多层卷积操作,在不同层级上进行信息传递和聚合,有效地解决了这个问题。
-
无需固定长度输入:相比于循环神经网络等需要固定长度输入序列的方法,使用GCN处理文本时不需要限制输入序列长度,并且可以处理不同长度的文本数据,更加灵活。
AE部分
AE和IDEC中AE相似,唯一不同的是需要获取Encoder中每层的输出,以便提供给GCN进行处理(即图中的H)。pretrain300epoch后将AE模型保存以供后续SDCN使用。
GCN部分
在获取Z,即输入数据后,还需要接收来自Encoder的每层输出。这里通过每层特征的融合,让GCN学习到的表示同时包含原始特征信息和图结构信息。
- 利用x和邻接矩阵adj通过GNN层进行图卷积,得到初级特征h。
- 将h与tra1按比例0.5融合,再通过GNN层,依次类推融合tra2、tra3。
- 最后融合z得到最终特征,通过softmax转换为预测分类分布predict。
def forward(self, x, adj):
# DNN Module
x_bar, tra1, tra2, tra3, z = self.ae(x)
sigma = 0.5
# GCN Module
h = self.gnn_1(x, adj)
h = self.gnn_2((1-sigma)*h + sigma*tra1, adj)
h = self.gnn_3((1-sigma)*h + sigma*tra2, adj)
h = self.gnn_4((1-sigma)*h + sigma*tra3, adj)
h = self.gnn_5((1-sigma)*h + sigma*z, adj, active=False)
predict = F.softmax(h, dim=1)
# Dual Self-supervised Module
q = 1.0 / (1.0 + torch.sum(torch.pow(z.unsqueeze(1) - self.cluster_layer, 2), 2) / self.v)
q = q.pow((self.v + 1.0) / 2.0)
q = (q.t() / torch.sum(q, 1)).t()
return x_bar, q, predict, z
SDCN训练部分
- 构建SDCN模型,初始化聚类中心,开始训练循环。
- 每轮迭代,通过模型进行前向计算,得到聚类分布预测结果q。
- 将q传给eva函数进行评估:
- 将预测类别结果转换为与真实类别对应的编号。
- 计算多个评价指标,包括ACC,NMI,ARI,F1。
- 打印输出评估结果。
- 使用评估结果判断模型效果,若效果不佳,则返回继续训练模型,调整参数改进。
- 训练完成后,获得最终模型及其在测试集上的聚类评估指标。