文本(图书)分类比赛学习笔记

赛题任务:

文本分类是根据文本的特征(内容或属性),将给定文本划分到相应的类别中。文本分类已经成为自然语言处理领域非常经典和基础的应用。其中,图书已经成为人类文本语料的重要来源和组成部分。中国年均出版图书超过50万种,其中新书超过25万种。全球的新出版图书超过百万种。如果有一种自动化的方法可以为图书进行分类,将极大地提升对图书的管理和利用信息的效率。

本次比赛的任务为根据图书的简介(书名和摘要),对图书进行分类。其中,输入数据为图书介绍文本,预测标签是约50个预先设定好的图书分类。本次比赛将提供10万条训练集,2万条验证集和2万条测试集。

数据预处理:

  1. 数据清洗:去除数据集存在的非法字符、书名号、斜杠、括号等,保证了后面模型的输入数据质量。
  2. 数据填充:观察到数据集中存在部分书籍的summary缺失的情况,简单地将其填充为好书
  3. 输入与标签分析:将title和摘要合并构成input,训练集中95%输入数据的长度均小于300,故我们设置max-len大小为300。训练集中存在严重的标签不均衡问题,针对这个问题我们后续做了一定的处理。

    d['text'] = d['title'] + <SEP> + d['summary']

    d['category']: 将22个字母标签转化为数字id 0~21

方案技术细节要点:

1. 数据划分:使用StratifiedKFold进行分层抽样,确保每个fold中各类别样本的比例与原始数据集中相同。

#代码例子

from sklearn.model_selection import StratifiedKFold
import numpy as np
X = np.random.rand(8,4)
y = np.array([1,1,0,0,1,1,0,0])

stratified_folder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)

2. CosineAnnealingWarmRestarts动态调整学习率

import torch
from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts

optimizer_1 = torch.optim.Adam(net_1.parameters(), lr=initial_lr)
scheduler_1 = CosineAnnealingWarmRestarts(optimizer_1, T_0=5, T_mult=2)

for epoch in range(1, 101):
    # train
 
    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    lr_list.append(optimizer_1.param_groups[0]['lr'])
    scheduler_1.step()

3. 分层学习率在使用bert或者其它预训练模型进行微调,下接其它具体任务相关的模块时,会面临这样一个问题,bert由于已经进行了预训练,参数已经达到了一个较好的水平,如果要保持其不会降低,学习率就不能太大,而下接结构是从零开始训练,用小的学习率训练不仅学习慢,而且也很难与BERT本体训练同步。因此在训练时候就需要对预训练层设置较小学习率,对下接层设置较大学习率。

原文链接:https://blog.csdn.net/Ming_LQ/article/details/113763667

4. FGM对抗训练:对抗训练的基本原理就是通过添加扰动构造一些对抗样本,放给模型去训练,提高模型在遇到对抗样本时的鲁棒性,同时一定程度也能提高模型的表现和泛化能力。在NLP领域,对抗训练作为一种正则化手段来提高模型的泛化能力。在NLP问题中,输入是离散的单词序列,如果直接在原始数据上进行扰动,那么扰动的大小和方向可能都没什么意义。在论文[1]Miyato T , Dai A M , Goo Df Ellow I . Adversarial Training Methods for Semi-Supervised Text Classification[C]//International Conference on Learning Representations. 2017.中提出了可以在连续的embedding上做扰动。

参考https://zhuanlan.zhihu.com/p/91269728

5. R-Drop:SimCSE是NLP的一种对比学习方案,对比学习的标准流程是同一个样本通过不同的数据扩增手段得到的结果视为正样本对,而batch内的所有其他样本视为负样本,然后就是通过loss来缩小正样本的距离、拉大负样本的距离了。所以难度主要集中在数据扩增手段上。对于NLP来说,很难人工构建保证语义不变的数据扩增,所以SimCSE干脆不人工进行数据扩增,而是通过“Dropout两次”的方式来得到同一个输入的不同特征向量,并将它们视为正样本对。奇怪的是,这个简单的“Dropout两次”构造正样本,看上去是一种“无可奈何”的妥协选择,但消融实验却发现它几乎优于所有其他数据扩增方法,令人惊讶之余又让人感叹“大道至简”。

参考https://zhuanlan.zhihu.com/p/386085252

6. label smoothing(标签平滑):它将神经网络的训练目标调整如果使用原本的“硬标签”,神经网络在数据较少、不能表征所有的样本特征的情况下,会导致过拟合。而标签平滑减少了真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。

此外,大型数据集通常会包含标签错误的数据,这意味着神经网络在本质上应该对“正确答案”持怀疑态度,以减少一定程度上围绕错误答案的极端情况下的建模。

7. 对易错样本再训练:易错样本包括两部分数据,一部分是模型预测错误数据,一部分是低置信度数据(如何定位这部分数据?),经过实验各一半效果最好。

8. 模型集成:(Nezha, Roberta, Macbert) 模型集成是融合多个训练好的模型,这样来使最终的结果能够“取长补短”,融合各个模型的学习能力,提高最终模型的泛化能力。

加权集成:把各个模型的输出概率进行加权求和,加入权重来调节不同模型输出间的重要程度。投票法:投票法即“少数服从多数”原则,我们可以统计在多个模型的分类结果,哪个类别频数高,即选择哪个类别。





 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值