关于自然语言处理:NLP从零入门预训练时代下深度学习模型的文本分类算法超多干货小白友好内附实践代码和文本分类常见中文数据集

39次阅读

共计 7011 个字符,预计需要花费 18 分钟才能阅读完成。

现在 NLP 能够说是预训练模型的时代,心愿借此抛砖引玉,能多多交换探讨以后预训练模型在文本分类上的利用。

1. 工作介绍与理论利用

文本分类工作是自然语言解决(NLP)中最常见、最根底的工作之一,顾名思义,就是对给定的一个句子或一段文本应用文本分类器进行分类。依据文本分类的类别定义,能够分为二分类 / 多分类、多标签、档次分类,以上面的新闻分类为例:

  • 二分类 / 多分类也即标签集中有两个或以上的标签类别,每个样本有且只有一个标签
  • 多标签也即样本可能有一个或多个标签
  • 档次分类是非凡的多分类或多标签工作,数据集的标签之间具备档次关系。比方下图样本的一级标签是体育,二级标签是足球,体育为足球的父标签。

文本分类广泛应用于长短文本分类、情感剖析、新闻分类、事件类别分类、政务数据分类、商品信息分类、商品类目预测、文章分类、论文类别分类、专利分类、案件形容分类、罪名分类、用意分类、论文专利分类、邮件主动标签、评论正负辨认、药物反馈分类、对话分类、税种辨认、复电信息主动分类、投诉分类、广告检测、敏感守法内容检测、内容平安检测、舆情剖析、话题标记等日常或业余畛域中。

  • 情感剖析:情感剖析是针对数据的情感偏向进行分类,能够是二分类(正向或负向)或者是多分类(依照不同的细粒度划分情感),情感剖析在影音评论、商品评估、舆情剖析、股民基金情感剖析等都有重要的利用。
  • 主题分类:主题分类也是常见的文本分类利用场景,依据内容或题目进行分类,即能够是多分类、多标签也能够是档次分类,依据理论场景须要进行标签体系结构和划分。
  • 金融数据分类:金融数据繁多简单,文本分类能够利用于金融新闻分类、股民评论情感剖析、基金类型分类、金融问答分类、金融情绪剖析等多种工作,有助于从大量数据挖掘无效信息。
  • 医疗数据分类:目前,文本分类已有许多医疗畛域的胜利利用,如药物反馈分类、症状和患者问题分类,衰弱问答分类、电子病历分类、药品文本分类等等。
  • 法律数据分类:文本分类在法律畛域也有许多成绩的摸索,如罪名分类、案情因素分类、刑期预测、法律条文分类、法律情感剖析、裁决预测、法律文本开掘、合规审查等等,帮忙咱们从海量的法律数据抽取无效信息。

2. 文本分类中文数据集

2.1 多分类数据集

  • THUCNews 新闻分类数据集:THUCTC: 一个高效的中文文本分类工具
  • 百科问答分类数据集:GitHub – brightmart/nlp_chinese_corpus: 大规模中文自然语言解决语料 Large Scale Chinese Corpus for NLP
  • 头条新闻题目数据集(tnews):https://github.com/aceimnorst…
  • 复旦新闻文本数据集:工作台 – Heywhale.com
  • IFLYTEK app 利用形容分类数据集:https://storage.googleapis.co…
  • CAIL2018 刑期预测、法条预测、罪名预测 https://cail.oss-cn-qingdao.a…
  • CAIL 2022 事件检测:LEVEN

2.2 情感分类数据集

  • 亚马逊商品评论情感数据集:https://github.com/SophonPlus…
  • 财经新闻情感分类数据集:https://github.com/wwwxmu/Dat…
  • ChnSentiCorp 酒店评论情感分类数据集:ChineseNlpCorpus/datasets/ChnSentiCorp_htl_all at master · SophonPlus/ChineseNlpCorpus
  • 外卖评论情感分类数据集:https://github.com/SophonPlus…
  • weibo 情感二分类数据集:https://github.com/SophonPlus…
  • weibo 情感四分类数据集:https://github.com/SophonPlus…
  • 商品评论情感分类数据集:https://github.com/SophonPlus…
  • 电影评论情感分类数据集:https://github.com/SophonPlus…
  • 公众点评分类数据集:https://github.com/SophonPlus…

2.3 多标签数据集

  • 学生评语分类数据集:https://github.com/FBI1314/te…
  • CAIL2019 婚姻因素辨认【疾速上手 ERNIE 3.0】法律文本多标签分类实战 – 飞桨 AI Studio

2.4 档次分类数据集

  • 头条新闻题目分类(tnews 的升级版):https://github.com/aceimnorst…
  • 网页档次分类数据集:网页档次分类数据集 CSRI_CONTAM_PAGE- 网络空间平安研究院 - 国家网络空间平安人才培养基地
  • Chinese Medical Intent Dataset(CMID): https://github.com/liutongyan…
  • 2020 语言与智能技术比赛事件分类:keras_bert_multi_label_cls/data at master · percent4/keras_bert_multi_label_cls

3. 预训练模型简介

随着 Transformer 和 Bert 的呈现,NLP 模型大步跨向了预训练模型的时代,刚入门的 NLP 的同学可能会纳闷什么是预训练模型?预训练模型和文本分类模型是什么关系?我该应用什么预训练模型?只有 CPU 能训练吗?怎么开源加载预训练模型?

什么是预训练模型?

通常来说模型复杂度越高参数越多,模型越能拟合简单的问题,模型的预测精度越高。随着深度学习的倒退,模型参数的数量飞速增长。为了训练这些参数,须要更大的数据集来防止过拟合,而构建大规模的标注数据集十分艰难(老本过高,标数据的苦ಥ_ಥ)。所以目前的做法是先在超大规模的语料采纳无监督或者弱监督的形式训练模型,模型可能取得语言语义、语法相干的常识,而后再用具体的工作数据训练,这样的模型称为预训练模型。

预训练模型首先会将输出的句子应用分成多个 token,英文句子通常是 subword-level 的分词策略,中文句子因为最小的单位就是字,所以通常是一个字符即为一个 token,例如句子 “ 明天是个好天气!” 切分为 8 个 token [‘ 今 ’, ‘ 天 ’, ‘ 是 ’, ‘ 个 ’, ‘ 好 ’, ‘ 天 ’, ‘ 气 ’, ‘!’];在多语言模型中也有将词作为 token 的状况,还是下面的例子,句子切分为 5 个 token [‘ 明天 ’, ‘ 是个 ’, ‘ 好 ’, ‘ 天气 ’, ‘!’]。(分词细节能够参见 tokenizers 小结)

此外,模型会在每个输出的结尾退出一个 [CLS] 的 token,在句子对间退出一个 [SEP] 的 token。如下图所示,每个输出 token 会映射为一个对应的特色示意,通过预训练模型失去每个 token 的输入特色示意,token 输入的特色示意会用于不同的工作,[CLS]的输入特色通常被认为是整个句子的语义示意。

接下来就是预训练,不同预训练模型的预训练形式略有不同,罕用的无监督工作包含 MLM 和 NSP 工作:

  • Mask Language Model(MLM):掩码预测工作,也行将一个句子中某一个 token 用掩码 [MASK] 替换,而后让模型预测出这个 token。例如:” 明天出太阳了,是个 [MASK] 天气 ”,心愿模型预测 [MASK] -> 好。具体来说就是用[MASK] 的模型输入特色,后接一个分类器进行分类。
  • Next sentence Prediction(NSP):从文章中摘取两个句子 A 和 B,50% 是上下文关系,50% 不是,训练模型预测句子 A 和句子 B 是否为上下文关系,也即在 [CLS] 的模型输入特色后接一个分类器进行二分类。

对于预训练模型构造和训练细节就不在这里赘述了,当初曾经有许多写的很好文章解说。

预训练模型和文本分类模型关系?

预训练模型学习到的文本语义示意可能防止从零开始训练模型,他们之间的关系能够直观地了解为,预训练模型曾经懂得了相干句法、语义的语言常识,用具体任务数据训练使得预训练模型”更懂”这个工作,在预训练过程中学到的常识根底使学习文本分类工作事倍功半。

我该应用什么预训练模型?

目前曾经有许多开源的预训练集模型,尽管英文预训练模型有 GLUE 榜单,中文预训练模型有 CLUE 榜单,多语言模型有 XTREME 榜单,但抉择模型还是要依据具体的工作和硬件条件进行抉择。我中文分类工作做的比拟多,我罕用的预模型包含 ERNIE (多尺寸模型抉择真的香)、Roformer-v2、Mengzi、RoBERTa-wwm-ext。

只有 CPU 能训练吗?

能,但耗时比拟长。CPU 开发者举荐应用层数比拟少的小模型,或抉择白嫖一些在线 AI 平台收费算力比方 AI Studio(每天白嫖 8 小时 V100,Paddle)、Google Colab(要翻墙,Pytorch Tensorflow 都反对)。

怎么加载开源的预训练模型?

目前最不便的办法就是在 PaddleNLP(Paddle)或 HuggingFace(Pytorch)间接依据模型名称应用 AutoModel 的形式调用,也能够在 github 上找开源模型参数下载链接。

model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME)

4. 基于预训练模型的文本分类算法

讲了这么多,终于到文本分类算法介绍了。文本分类算法最最罕用的就是模型微调,当然也还包含在最近探讨度很高的预训练新范式提醒学习(Prompt Tuning),之前看到基于检索的办法做文本分类也还蛮有意思的。

4.1 罕用办法——预训练模型微调

基于预训练模型微调的想法非常简单间接,也行将 [CLS] 的模型输入特色示意作为输出句子的特色示意,通常为 768 维或 1024 维的向量,而后接入一个线性分类器(通常为单层全连贯层)进行文本分类工作训练。

4.2 小样本——提醒学习(Prompt Tuning)

近来,提醒学习的炽热,次要还是在小样本场景的优良体现。

提醒学习的次要思维是将文本分类工作转换为结构提醒(Prompt)中掩码 [MASK] 的分类预测工作,也即在掩码 [MASK]模型输入特色后接入线性层分类器预测掩码地位可能的字或词。提醒学习应用待预测字的预训练向量来初始化分类器参数(如果待预测的是词,则为词中所有字的预训练向量平均值),充分利用预训练语言模型学习到的特色和标签文本,从而升高样本需要。

咱们以下图情感二分类工作为例来具体介绍提醒学习流程。在输出文本后退出结构提醒 ” 我 [MASK] 喜爱。”,将 ” 负向 ” 或 ” 正向 ” 的情感二分类工作转化为掩码 [MASK]” 不 ” 或 ” 很 ” 的二分类工作,结构提醒[MASK] 分类器预测分类与原始标签的对应关系为 ” 不 ”->” 负向 ”、” 很 ”->” 正向 ”。具体实现办法是在掩码 [MASK] 的输入向量后接入线性分类器(二分类),而后用 ” 不 ” 和 ” 很 ” 的预训练向量来初始化分类器进行训练。

4.3 翻新办法——检索

除了以上两种办法,还试过用检索的形式做文本分类。检索的办法适宜标签类别较多或者是标签类别不固定(有时候会新增标签)。

基于检索的办法做文本分类有两种思路,一种是把标签集作为召回库,一种是把训练数据作为召回库。这两种思路在训练阶段的办法是统一的,能够用双塔模型(也就是两个预训练模型),一个模型输出句子,另一个模型输出标签,进行训练拉近句子和标签的 [CLS] 输入特色示意之间间隔。在预测阶段,召回集有所不同:

思路一把标签作为召回集,每个标签的向量示意(也即 [CLS] 输入特色示意)是固定的,咱们构建一个标签向量库。咱们用待预测的句子的向量在标签向量库进行检索,找到特色类似度最大的标签,也即为待预测句子的标签。

思路二则是把训练数据作为召回集,构建一个训练集文本的向量库,咱们用待预测的句子的向量示意(也即 [CLS] 输入特色示意)在文本向量库进行检索,找到特色类似度最大的训练集文本,待预测句子的标签也即召回文本的标签。

5. 文本分类实战

接下来将带你疾速应用 PaddleNLP 实现实现多分类、多标签、档次分类工作。你能够仿照数据集格局,替换数据集目录,间接训练你本人的数据:

  • 多分类实际代码 notebook(只有一个标签)https://aistudio.baidu.com/ai…
  • 多标签实际代码 notebook(有一个或多个标签):
    https://aistudio.baidu.com/ai…
  • 档次分类实际代码 notebook(标签间存在档次关系):
    https://aistudio.baidu.com/ai…

最好用 GPU 跑,比拟快

代码详解 🚧 施工 ing

6. 实际经验总结

6.1 数据为王时代

在实际代码开始之前更想讨论一下数据,我集体的实践经验来说,进步文本分类精度最快、最无效的办法是既不是模型,也不是算法调参,而是数据品质。文本分类总的来说不是个简单的自然语言解决工作(甚至能够说是最根本的工作),如何更好地进行数据标签地划分缩小混同重合状况和高质量的数据标注(正确标注,规范对立,且训练集与预测数据分布统一)是失去高精度的文本分类模型的要害。

  • 标签体系划分。文本分类工作的标签体系依具体的工作而定,没有固定规范,一个清晰分界明确的标签体系有利于数据标注和分类。如果是多分类工作的话尽量减少标签之间范畴重合,这样有助于标注规范的对立,缩小呈现在标注的时候类似的样本有的被标记为 A,有的标记为 B,升高准确率。
  • 标注正确。”Garbage in, garbage out(垃圾进,垃圾出)”,如果训练数据蕴含很多谬误,可想而知模型不会有很好的预测后果。人工查看所有数据标注是否精确,老本不低,因而能够通过一些算法计算训练数据对模型的扰动,来筛选出脏数据进行从新标注。(这点之后会写新的文章细讲)
  • 训练数据和预测数据分布统一。深度学习模型能够了解为拟合训练数据的散布,尽管大规模语料预训练,可能无效帮忙模型有更好的泛化能力,但只有模型学习与预测场景类似的训练样本,能力在预测数据有更好的体现。在实际场景中遇到许多成果不好的根本是这个问题,比方遇到多标签分类训练集的数据只有一个标签,模型理所应当偏向于只预测一个标签,而测试集有多个标签,成果可想而知不太好。
  • 文本数据精选无效信息。目前预训练模型通常反对的 max_length 最大为 512,有些模型可能会利用一些策略使模型可能承受输出长度最长 2048,当然还有一些反对长文本的模型例如 Longformer,ERNIE-Doc。但输出文本过长,容易爆显存,训练速度过慢,并且因为文本蕴含过多无用的信息烦扰使模型成果变差。因为文本数据非常多样,如何精选文本数据须要按理论数据而定,常见办法按句号对句子截断、利用一些正则式匹配的办法筛选无效文本内容等。
  • 短缺的数据。尽管文本分类在零样本和小样本畛域有许多摸索,但成果临时还是很难超过在短缺训练数据进行微调。短缺的数据优先的办法当然是抉择数据标注的形式,数据加强策略也是常见裁减数据的办法。

总而言之,高质量的训练数据是高精度文本分类模型的要害。

6.2 实践经验记录

事实场景中的数据并不总是那么现实,须要依据一些理论状况进行灵便变动。应用的兴许不肯定是最好的解法,欢送各位大佬们探讨。

  • 文本分类的类别十分多,几百上千甚至万级别。这时候用预训练模型微调的办法,成果体现可能十分个别甚至可能难以收敛。如果还要应用预训练模型微调的话,倡议是应用多个分类模型,先训练一个文本分类模型(大类分类器)把数据分为具体的大类,每个大类再训练一个文本分类模型(子类分类器)对样本类别进行预测(毛病就是要训练多个分类器);另一个办法就是用检索的办法去做,不再是分类,而是召回与文本最类似的标签。
  • 多分类工作预测可能会呈现训练集没有呈现的类别,心愿能够预测成 ” 其余 ”。后面也提到训练数据最好与预测数据统一,否则成果可能无限,但事实场景还是很难防止。最间接的想法是在多分类中构建一个 ” 其余 ” 的类别,但这种办法也有毛病,比方就是训练的时候一点其余类别的数据没有,另外也可能因为 ” 其余 ” 类别的数据分布差别很大,导致这个类别预测成果较差。最终抉择的实际办法是应用多标签的形式进行训练,而后预测时候抉择置信度最高的类别作为标签类别,如果置信度低于阈值(比方 0.5),则这个类别为 ” 其余 ”。训练的时候,如果有 ” 其余 ” 类别的数据,则该数据的标签为[0,0,0…,0]。
  • 对于调参。超参数设置我本人罕用的是 learning rate [1e-5,3e-5,5e-5],batch size[16, 24, 32],应用早停策略,抉择开发集精度最高的模型参数。如果要进一步提高精度的话,会选定 epoch 数(不应用早停策略)利用 warmup 策略。个人感觉,超参设置对模型成果影响不大(除非把 batch size 设为 1,learning rate 设的超大或超小这种),warmup 策略也是小幅度的进步,在文本分类工作通过调参实现精度 10% 幅度这种大进步的可能性十分小。(参考:CLUE 超参搜参后果)

7. 参考

BERT 论文:https://arxiv.org/pdf/1810.04…

PaddleNLP 文本分类利用:PaddleNLP/applications/text_classification at develop · PaddlePaddle/PaddleNLP

正文完
 0