如今NLP可以说是预练习模型的年代,期望借此抛砖引玉,能多多沟通讨论当时预练习模型在文本分类上的运用。

1. 使命介绍与实际运用

文本分类使命是自然言语处理(NLP)中最常见、最根底的使命之一,顾名思义,便是对给定的一个语句或一段文本运用文本分类器进行分类。依据文本分类的类别定义,可以分为二分类/多分类、多标签、层次分类,以下面的新闻分类为例:

  • 二分类/多分类也即标签集中有两个或以上的标签类别,每个样本有且只有一个标签
  • 多标签也即样本或许有一个或多个标签
  • 层次分类是特殊的多分类或多标签使命,数据集的标签之间具有层次联系。比方下图样本的一级标签是体育,二级标签是足球,体育为足球的父标签。

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

文本分类广泛运用于长短文本分类、情感剖析、新闻分类、事情类别分类、政务数据分类、产品信息分类、产品类目猜测、文章分类、论文类别分类、专利分类、案件描绘分类、罪名分类、意图分类、论文专利分类、邮件主动标签、谈论正负辨认、药物反响分类、对话分类、税种辨认、来电信息主动分类、投诉分类、广告检测、敏感违法内容检测、内容安全检测、舆情剖析、话题符号等日常或专业范畴中。

  • 情感剖析:情感剖析是针对数据的情感倾向进行分类,可所以二分类(正向或负向)或者是多分类(依照不同的细粒度区分情感),情感剖析在影音谈论、产品点评、舆情剖析、股民基金情感剖析等都有重要的运用。
  • 主题分类:主题分类也是常见的文本分类运用场景,依据内容或标题进行分类,即可所以多分类、多标签也可所以层次分类,依据实际场景需求进行标签系统结构和区分。
  • 金融数据分类:金融数据繁多杂乱,文本分类可以运用于金融新闻分类、股民谈论情感剖析、基金类型分类、金融问答分类、金融心情剖析等多种使命,有助于从大量数据发掘有用信息。
  • 医疗数据分类:现在,文本分类已有许多医疗范畴的成功运用,如药物反响分类、症状和患者问题分类,健康问答分类、电子病历分类、药品文本分类等等。
  • 法令数据分类:文本分类在法令范畴也有许多成果的探究,如罪名分类、案情要素分类、刑期猜测、法令条文分类、法令情感剖析、判定猜测、法令文本发掘、合规查看等等,协助咱们从海量的法令数据抽取有用信息。

2. 文本分类中文数据集

2.1 多分类数据集

  • THUCNews新闻分类数据集: THUCTC: 一个高效的中文文本分类工具
  • 百科问答分类数据集: GitHub – brightmart/nlp_chinese_corpus: 大规模中文自然言语处理语料 Large Scale Chinese Corpus for NLP
  • 头条新闻标题数据集(tnews):github.com/aceimnorstu…
  • 复旦新闻文本数据集:工作台 – Heywhale.com
  • IFLYTEK app运用描绘分类数据集:storage.googleapis.com/cluebenchma…
  • CAIL2018 刑期猜测、法条猜测、罪名猜测 cail.oss-cn-qingdao.aliyuncs.com/CAIL2018_AL…
  • CAIL 2022事情检测: LEVEN

2.2 情感分类数据集

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

2.3 多标签数据集

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

2.4 层次分类数据集

  • 头条新闻标题分类(tnews的升级版):github.com/aceimnorstu…
  • 网页层次分类数据集: 网页层次分类数据集CSRI_CONTAM_PAGE-网络空间安全研究院-国家网络空间安全人才培养基地
  • Chinese Medical Intent Dataset(CMID): github.com/liutongyang…
  • 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]的输出特征一般被认为是整个语句的语义表明。

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

接下来便是预练习,不同预练习模型的预练习办法略有不同,常用的无监督使命包括MLM和NSP使命:

  • Mask Language Model(MLM):掩码猜测使命,也行将一个语句中某一个token用掩码[MASK]替换,然后让模型猜测出这个token。例如:”今天出太阳了,是个[MASK]天气”,期望模型猜测[MASK] -> 好。详细来说便是用[MASK]的模型输出特征,后接一个分类器进行分类。
  • Next sentence Prediction(NSP):从文章中摘取两个语句A和B,50%是上下文联系,50%不是,练习模型猜测语句A和语句B是否为上下文联系,也即在[CLS]的模型输出特征后接一个分类器进行二分类。

关于预练习模型结构和练习细节就不在这儿赘述了,现在现已有许多写的很好文章解说。

预练习模型和文本分类模型联系?

预练习模型学习到的文本语义表明可以防止从零开端练习模型,他们之间的联系可以直观地理解为,预练习模型现已懂得了相关句法、语义的言语常识,用详细使命数据练习使得预练习模型”更懂”这个使命,在预练习过程中学到的常识根底使学习文本分类使命事半功倍。

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

我该运用什么预练习模型?

现在现已有许多开源的预练习集模型,尽管英文预练习模型有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维的向量,然后接入一个线性分类器(一般为单层全连接层)进行文本分类使命练习。

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

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

近来,提示学习的火热,主要仍是在小样本场景的优异体现。

提示学习的主要思维是将文本分类使命转换为结构提示(Prompt)中掩码 [MASK] 的分类猜测使命,也即在掩码 [MASK]模型输出特征后接入线性层分类器猜测掩码位置或许的字或词。提示学习运用待猜测字的预练习向量来初始化分类器参数(假如待猜测的是词,则为词中一切字的预练习向量平均值),充分利用预练习言语模型学习到的特征和标签文本,从而下降样本需求。

咱们以下图情感二分类使命为例来详细介绍提示学习流程。在输入文本后参加结构提示”我[MASK]喜欢。”,将”负向”或”正向”的情感二分类使命转化为掩码[MASK]”不”或”很”的二分类使命,结构提示[MASK]分类器猜测分类与原始标签的对应联系为”不”->”负向” 、”很”->”正向” 。详细完结办法是在掩码[MASK]的输出向量后接入线性分类器(二分类),然后用”不”和”很”的预练习向量来初始化分类器进行练习。

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

4.3 创新办法——检索

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

依据检索的办法做文本分类有两种思路,一种是把标签集作为召回库,一种是把练习数据作为召回库。这两种思路在练习阶段的办法是共同的,可以用双塔模型(也便是两个预练习模型),一个模型输入语句,另一个模型输入标签,进行练习拉近语句和标签的[CLS]输出特征表明之间间隔。在猜测阶段,召回集有所不同:

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

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

思路二则是把练习数据作为召回集,构建一个练习集文本的向量库,咱们用待猜测的语句的向量表明(也即[CLS]输出特征表明)在文本向量库进行检索,找到特征类似度最大的练习集文本,待猜测语句的标签也即召回文本的标签。

5. 文本分类实战

接下来将带你快速运用PaddleNLP完结完结多分类、多标签、层次分类使命。你可以仿照数据集格式,替换数据集目录,直接练习你自己的数据:

  • 多分类实践代码notebook(只有一个标签)aistudio.baidu.com/aistudio/pr…

  • 多标签实践代码notebook(有一个或多个标签): aistudio.baidu.com/aistudio/pr…

  • 层次分类实践代码notebook(标签间存在层次联系): aistudio.baidu.com/aistudio/pr…

最好用GPU跑,比较快

【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)

代码详解 施工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 论文: arxiv.org/pdf/1810.04…

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