NLP重铸篇之BERT如何微调文本分类
论文标题: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、选择合适的学习率。
-
长文本预处理
因为BERT-base可接受文本序列最长为512,所以对于超过512个字符的文本需要进行预处理。论文中使用了截断跟分层两种方式处理。截断是只取文本前510个字符,或者后510个字符,或者前128个字符加后382个字符。分层是将文本分成k个片段(k=L//510,L是文本长度),然后将每个片段输入BERT得到句向量,再通过平均、最大、attention等方式获取整个句子的表示。下表中展示了各种方式在两个数据集上的错误率,其中前128+后382的结果最优,后续试验都会取此设定。
-
选择最佳层作为特征
论文中分别选择了12层,前4层,后4层,全部12层做了试验,结果如下表,其中最后层的结果最佳,后续试验都会取此设定。
-
灾难性遗忘
灾难性遗忘指在学习新知识的时候,预训练模型原有的知识会被遗忘,这种问题在迁移学习中很常见。论文试验中发现,使用比较低的学习率可以缓解灾难性遗忘问题,试验中选择了几种不同的学习率,其错误率曲线如下图所示,最终学习率选择了2e-5。
-
逐层递减的层学习率
论文在试验中对各层使用了不同的学习率,表示第k层的学习率,表示第k-1层的学习率,其中小于等于1。下图中显示了不同的初始学习率以及衰减比例的结果,最终选择2e-5的学习率与0.95的衰减比例。
进一步预训练
BERT模型是在通用语料上训练的,但对于特定领域的文本分类,它们的数据分布就会不一致,所以我们可以在特征领域的文本上进行进一步预训练。本文提出了三种方式:在分类文本上进行再训练,在分类任务同领域的文本上进行再训练,结合同领域与其他领域的文本进行再训练。
-
在下游任务训练集上再训练
论文首先在下游任务的训练集上,对BERT进行了进一步训练,下图展示了不同训练步数对最终错误率的影响。
-
在相关领域文本上再训练
除了可以在下游任务训练集上再训练模型,还可以在相关领域文本上训练(自身领域文本或交叉领域文本),论文中分了三种领域:主题型,情感型,问题型。训练结果如下图。
其中all表示使用了所有领域的文本,w/o pretrain表示使用原来的预训练模型没有进行再训练。
-
各种模型结果对比
论文中比较了各种方式得到的新模型与之前论文中的模型结果,如下图所示,其中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顶层效果更好。