公众号关注 “ML_NLP”
设为 “星标”,重磅干货,第一时间送达! 【深度学习|NLP重铸篇之BERT如何微调文本分类】
文章图片
论文标题:How to Fine-Tune BERT for Text Classi?cation?
论文链接: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.逐层递减的层学习率
文章图片
进一步预训练 BERT模型是在通用语料上训练的,但对于特定领域的文本分类,它们的数据分布就会不一致,所以我们可以在特征领域的文本上进行进一步预训练。本文提出了三种方式:在分类文本上进行再训练,在分类任务同领域的文本上进行再训练,结合同领域与其他领域的文本进行再训练。
在下游任务训练集上再训练
论文首先在下游任务的训练集上,对BERT进行了进一步训练,下图展示了不同训练步数对最终错误率的影响。
文章图片
在相关领域文本上再训练
除了可以在下游任务训练集上再训练模型,还可以在相关领域文本上训练(自身领域文本或交叉领域文本),论文中分了三种领域:主题型,情感型,问题型。训练结果如下图。
文章图片
各种模型结果对比
论文中比较了各种方式得到的新模型与之前论文中的模型结果,如下图所示,其中BERT-Feat表示使用BERT作为特征,BERT-FiT使用BERT+微调,BERT-ITPT-FiT表示使用下游任务数据再训练BERT然后微调,BERT-IDPT-FiT表示在相关领域上再训练BERT然后微调,BERT-CDPT-FiTmeans表示在交叉领域上再训练BERT然后微调。
文章图片
多任务微调 多任务学习可以从相近的任务上学到有用信息。所有的任务会共享BERT的各层,只有在最后的分类层是不一致的。为了能够充分利用各个分类语料,论文中将几个分类问题合在一起进行了多任务训练,结果如下图。为了让各个子任务的结果更好,在多任务微调之后,还使用更低的学习率对单个任务进行了微调。
文章图片
其他实验 小样本学习
预训练模型的一个优点就是能够在小样本上也表现得比较好,论文使用了BERT-FiT、BERT-ITPT-FiT分别在一部分IMDb数据集上进行实验,下图是实验结果,可以看到在使用了0.4%的IMDb数据的情况下,BERT-ITPT-FiT也取得了较好的结果。
文章图片
在BERT-LARGE上再训练
论文研究了BERT-LARGE跟BERT-base是否有一致的性质,实验结果表示,其结果是类似的。
文章图片
结论 对文本分类来说,BERT最顶层结果更有效
使用合适的逐层递减学习率,可以缓解灾难遗忘问题
在同领域文本(或下游任务数据集)上,进一步预训练可以提高效果
多任务学习对单个任务也有提升
BERT可以提高小样本数据集任务结果
论文之外 就文本分类问题来说,该论文做了相对详细的分析,但由于其发表得较早些,后续有很多表现超过bert的改进模型,比如roBERTa。在中文领域,也有相比更好的模型,比如bert-wwm-ext。除此之外,该论文并没有对bert/pooler层做实验,就我个人经验,在处理句子对分类的时候(如文本蕴涵),bert/pooler层的效果要比encode顶层效果更好。
重磅!忆臻自然语言处理-学术微信交流群已成立
可以扫描下方二维码,小助手将会邀请您入群交流,
注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]
例如 —— 哈工大+张三+对话系统。
号主,微商请自觉绕道。谢谢!
文章图片
文章图片
推荐阅读:
PyTorch Cookbook(常用代码段整理合集) 通俗易懂!使用Excel和TF实现Transformer! 深度学习中的多任务学习(Multi-task-learning)——keras实现
文章图片
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- pytorch|YOLOX 阅读笔记
- 读书笔记|《白话大数据和机器学习》学习笔记1
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- 前沿论文|论文精读(Neural Architecture Search without Training)