Multi-label Classification of Short Texts with Label Correlated Recurrent Neural Networks笔记

该文章介绍了一种利用循环神经网络(RNN)结合标签相关性的方法处理短文本多标签分类问题。通过构建标签共现图并采用最大生成树算法形成条件随机场,提升分类准确性。模型包括Embedding、LSTM和Dense层,通过分段训练降低计算复杂度。实验表明,考虑标签相关性能显著提高模型性能。
摘要由CSDN通过智能技术生成
  1. 这篇文章的处理背景,首先是由于应用场景的需求,在一些场景下,一些短文本仍然是具有多个标签的,但是由于上下文的稀疏性以及词的共现率太低,并且对于短文本进行分类处理任务不能像普通的文本那样具有丰富的上下文语义的共享产生,所以之前的一些传统的用于处理短文本单标签的一些方法可能对于处理短文本多标签来来说性能较差。

  2. 为了解决上面的问题,人们首先捕捉到了标签之间的相关性信息,构建了一个标签相关图;在原来神经网络没有发展起来的时候,人们使用主题模型来实现数据特征降维,(但是主题模型这种方式将短文本看成一袋词集合,因此这种方式就丢掉了序列信息和语义信息)后面在神经网络发展的过程中,我们发现它的效率很高,后面就将神经网络引入到处理分类问题上,使用神经网络可以更加有效的捕捉到序列信息和丰富的语义信息;

  3. 文中设计的模型使用的方法在解决上面的问题的贡献点在于:

    1. 本文中的模型是第一个探索了短文本分类过程中的标签相关性的模型;
    2. 正如1中提到的探索短文本的标签相关性,为了探索他的标签相关性使用的方法是通过一些数据集中的标签的频率共现构建了一个树结构的无向图用来表示这汇总共现关系,这种方式构建出来的图实际上就是通过最大生成树算法构建出来的CRF(条件随机场);其中使用了数据的分片训练模式来提取得到这样的一个条件随机场;
    3. 通过在上面构建出来的共现无向图上使用最大乘积算法最终得到精确的标签推断结果;
  4. 文中提到,对于用在短文本上的标签相关性捕捉方法之前是没有的,都是用来捕捉图像和长文本文档的标签相关性方法;同时主流的用来获得丰富的表示信息的方法是通过外部语料库信息来富集当前短文本信息的方法来获取相应的表示;同时也提到了一种通过精简短文本的方式来提取具有表征性的表示进行分类操作;

  5. 对于构建标签相关图上,

    1. 相比于BR模型这种只是单纯的有多少个标签就构建多少个二分类器,最终简单的对于输入的未知数据得到多个二分类器的结果进行简单的拼接,最终得到的标签集作为最终的分类结果,本文中做出了改进,就是考虑上了标签之间的共现相关性信息进来,最终达到提升分类准确性的目的;

    2. 文中使用循环神经网络RNN,比方说它的变体LSTM这种网络结构来获取良好的文本序列和语义信息,然后通过构建一个标签共现图,即这样的一个在训练集上的获取标签的共现信息构建出的树结构的无向标签共现图,这个图实际上就是一个CRF模型;image-20230327113130763

      正如上面的图中的a图中所示,而计算对于输入实例的标签的联合概率是image-20230327113213635

      其中, C C C集合表示对于标签图簇的集合,而 ψ c ( y c , x ) ψ_c(y_c,x) ψc(yc,x) 是一个映射函数,这个函数的目的是将标签簇 y c y_c yc 标签结构和输入实例x 映射到一个正标量值。而 Z ( x ) Z(x) Z(x) 是一个位置函数,来保证有效的条件分布, L L L是标签空间中标签的总数;

  6. Piecewise Training of CRF

    1. 正如上面所说的那样,如果我们需要计算对于指定输入实例所对应的标签集的联合概率时,需要依赖1中的公式,其中的 Z ( x ) Z(x) Z(x)表示一个可以使得条件概率计算有效的规范项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用PyTorch实现 "Learning a Deep ConvNet for Multi-label Classification with Partial Labels" 论文的示例码。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms from sklearn.metrics import f1_score from dataset import CustomDataset from model import ConvNet # 设置随机数种子,保证结果可重复 torch.manual_seed(2022) # 定义超参数 epochs = 50 batch_size = 128 learning_rate = 0.001 weight_decay = 0.0001 num_classes = 20 num_labels = 3 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载数据集 train_dataset = CustomDataset(root='./data', split='train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2) test_dataset = CustomDataset(root='./data', split='test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义模型 model = ConvNet(num_classes=num_classes, num_labels=num_labels) # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay) # 训练模型 for epoch in range(epochs): # 训练阶段 model.train() running_loss = 0.0 for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() train_loss = running_loss / len(train_loader) # 测试阶段 model.eval() y_true, y_pred = [], [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) predicted_labels = torch.round(torch.sigmoid(outputs)) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted_labels.cpu().numpy()) f1 = f1_score(y_true, y_pred, average='macro') print('[Epoch %d] Train Loss: %.3f, Test F1: %.3f' % (epoch + 1, train_loss, f1)) ``` `CustomDataset` 和 `ConvNet` 分别是数据集类和模型类,需要根据您的具体情况进行实现。在训练阶段,使用 `nn.BCEWithLogitsLoss()` 作为损失函数进行优化。在测试阶段,使用 `sklearn.metrics.f1_score()` 计算 F1 值作为模型评估指标。 希望以上示例码对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值