NLP重铸篇之BERT如何微调文本分类

image

论文标题:How to Fine-Tune BERT for Text Classification?

论文链接:https://arxiv.org/pdf/1905.05583.pdf

重铸系列会分享论文的解析与复现,主要是一些经典论文以及前沿论文,但知识还是原汁原味的好,支持大家多看原论文。分享内容主要来自于原论文,会有些整理与删减,以及个人理解与应用等等,其中涉及到的算法复现都会开源在:https://github.com/wellinxu/nlp_store ,更多内容关注知乎专栏(或微信公众号):NLP杂货铺。

介绍

已经证明了,自然语言预训练模型可以学习有效地学习到通用语言表示。BERT作为最杰出的代表,在各种NLP任务中都取得了很好的结果。本文就使用BERT进行文本分类问题,通过详细的实验进行研究,并提出了通用的微调策略:1、在相关数据上进一步进行预训练,2、如果可以进行多任务微调,3、分类任务微调。

BERT进行文本分类

BERT-base模型可接受的最长文本序列长度是512,文本序列可以有一个或者两个子句,子句之间以[SEP]分隔,序列以[CLS]开头。对于文本分类任务,通常取[CLS]最终的隐藏状态代表整个句子,后面接一个简单的softmax分类器即可。

实验基础

论文中使用的模型是:uncased BERT-base和中文BERT-base。BERT-base模型的隐藏层是768维,attention head是12,有12层Transformer。进行预训练的时候,batch size是32,最大序列长度是128,学习率是5e-5,训练步数100000,warm up步数10000。微调的时候,batch size是24,dorpout是0.1。使用的是Adam算法,\beta_1=0.9,\beta_2=0.999,学习率是2e-5,warm up率是0.1,epoch设置的是4,并且保存在验证集上的最优模型。使用的数据是7个英文数据集和一个中文数据集。

微调策略

BERT不同层的结果往往得到的是不同层次的语义跟句法信息。使用BERT进行文本分类任务,我们需要关注这几点:1、因为BERT有最大长度限制,所有需要对长文本进行预处理;2、官方的BERT-base模型包含embedding层、12层encode和一层pooler层,所以需要选择最有效的层;3、选择合适的学习率。

  1. 长文本预处理

    因为BERT-base可接受文本序列最长为512,所以对于超过512个字符的文本需要进行预处理。论文中使用了截断跟分层两种方式处理。截断是只取文本前510个字符,或者后510个字符,或者前128个字符加后382个字符。分层是将文本分成k个片段(k=L//510,L是文本长度),然后将每个片段输入BERT得到句向量,再通过平均、最大、attention等方式获取整个句子的表示。下表中展示了各种方式在两个数据集上的错误率,其中前128+后382的结果最优,后续试验都会取此设定。

  2. 选择最佳层作为特征

    论文中分别选择了12层,前4层,后4层,全部12层做了试验,结果如下表,其中最后层的结果最佳,后续试验都会取此设定。

  3. 灾难性遗忘

    灾难性遗忘指在学习新知识的时候,预训练模型原有的知识会被遗忘,这种问题在迁移学习中很常见。论文试验中发现,使用比较低的学习率可以缓解灾难性遗忘问题,试验中选择了几种不同的学习率,其错误率曲线如下图所示,最终学习率选择了2e-5。

  4. 逐层递减的层学习率

    论文在试验中对各层使用了不同的学习率,表示第k层的学习率,表示第k-1层的学习率,其中小于等于1。下图中显示了不同的初始学习率以及衰减比例的结果,最终选择2e-5的学习率与0.95的衰减比例。

进一步预训练

BERT模型是在通用语料上训练的,但对于特定领域的文本分类,它们的数据分布就会不一致,所以我们可以在特征领域的文本上进行进一步预训练。本文提出了三种方式:在分类文本上进行再训练,在分类任务同领域的文本上进行再训练,结合同领域与其他领域的文本进行再训练。

  1. 在下游任务训练集上再训练

    论文首先在下游任务的训练集上,对BERT进行了进一步训练,下图展示了不同训练步数对最终错误率的影响。

  2. 在相关领域文本上再训练

    除了可以在下游任务训练集上再训练模型,还可以在相关领域文本上训练(自身领域文本或交叉领域文本),论文中分了三种领域:主题型,情感型,问题型。训练结果如下图。

    其中all表示使用了所有领域的文本,w/o pretrain表示使用原来的预训练模型没有进行再训练。

  3. 各种模型结果对比

    论文中比较了各种方式得到的新模型与之前论文中的模型结果,如下图所示,其中BERT-Feat表示使用BERT作为特征,BERT-FiT使用BERT+微调,BERT-ITPT-FiT表示使用下游任务数据再训练BERT然后微调,BERT-IDPT-FiT表示在相关领域上再训练BERT然后微调,BERT-CDPT-FiTmeans表示在交叉领域上再训练BERT然后微调。

多任务微调

多任务学习可以从相近的任务上学到有用信息。所有的任务会共享BERT的各层,只有在最后的分类层是不一致的。为了能够充分利用各个分类语料,论文中将几个分类问题合在一起进行了多任务训练,结果如下图。为了让各个子任务的结果更好,在多任务微调之后,还使用更低的学习率对单个任务进行了微调。

其他实验

  1. 小样本学习

    预训练模型的一个优点就是能够在小样本上也表现得比较好,论文使用了BERT-FiT、BERT-ITPT-FiT分别在一部分IMDb数据集上进行实验,下图是实验结果,可以看到在使用了0.4%的IMDb数据的情况下,BERT-ITPT-FiT也取得了较好的结果。

  2. 在BERT-LARGE上再训练

    论文研究了BERT-LARGE跟BERT-base是否有一致的性质,实验结果表示,其结果是类似的。

结论

  1. 对文本分类来说,BERT最顶层结果更有效

  2. 使用合适的逐层递减学习率,可以缓解灾难遗忘问题

  3. 在同领域文本(或下游任务数据集)上,进一步预训练可以提高效果

  4. 多任务学习对单个任务也有提升

  5. BERT可以提高小样本数据集任务结果

论文之外

就文本分类问题来说,该论文做了相对详细的分析,但由于其发表得较早些,后续有很多表现超过bert的改进模型,比如roBERTa。在中文领域,也有相比更好的模型,比如bert-wwm-ext。除此之外,该论文并没有对bert/pooler层做实验,就我个人经验,在处理句子对分类的时候(如文本蕴涵),bert/pooler层的效果要比encode顶层效果更好。

推荐阅读

AINLP年度阅读收藏清单

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

太赞了!Springer面向公众开放电子书籍,附65本数学、编程、机器学习、深度学习、数据挖掘、数据科学等书籍链接及打包下载

数学之美中盛赞的 Michael Collins 教授,他的NLP课程要不要收藏?

自动作诗机&藏头诗生成器:五言、七言、绝句、律诗全了

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

这门斯坦福大学自然语言处理经典入门课,我放到B站了

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章