导读:今天为大家解读一篇复旦大学邱锡鹏老师课题组的研究论文《How to Fine-Tune BERT for Text Classification?》。这篇论文的主要目的在于在文本分类任务上探索不同的BERT微调方法并提供一种通用的BERT微调解决方法。这篇论文从三种路线进行了探索:(1) BERT自身的微调策略,包括长文本处理、学习率、不同层的选择等方法;(2) 目标任务内、领域内及跨领域的进一步预训练BERT;(3) 多任务学习。微调后的BERT在七个英文数据集及搜狗中文数据集上取得了当前最优的结果。作者们发布了实现代码,有兴趣的朋友也可以跑一跑实验。
点评:这篇论文从实战上为大家提供了宝贵的BERT微调经验及方法论,当需要应用BERT到具体的现实任务上时,可以参照这篇论文提供的调参路线进行优化。推荐大家读一读这篇论文。
研究背景及目的
大量任务表明在大规模语料库上预训练的模型对于文本分类及其他NLP任务的性能提升非常有帮助。其中一种预训练模型是词向量,如word2vec、GloVe等静态词向量以及CoVe、ELMo等语境化词向量。另一种预训练模型是句子级别上的向量化表示,如ULMFiT。其他的还有OpenAI GPT及BERT。
虽然BERT在许多自然语言理解任务上取得了惊人的成绩,但是它的潜力还尚未被完全探索出来。很少有研究来进一步改进BERT在目标任务上的性能。这篇论文的主要目的就是通过探索多种方式最大化地利用BERT来增强其在文本分类任务上的性能。
这篇论文的主要贡献在于:
- 提出了一种通用的微调预训练BERT模型的解决方法,有三个步骤:(1)进一步在任务内训练集或领域内数据集上预训练BERT;(2)在有多个相关任务的情况下用多任务学习方法微调BERT;(3)在目标任务上微调BERT
- 探索了在目标任务上BERT的微调方法:长文本预处理,BERT层选择,分层学习率,灾难性遗忘,low-shot学习问题
- 在一个中文新闻分类数据集上及7个英文分类数据集上取得了当前最优的结果
研究内容、方法及结果分析
这篇论文主要按照以下三种方式对BERT进行了微调,路线如下图所示:
微调策略
采用多种方式在目标任务上微调BERT显然是非常有必要的。BERT不同的层可以捕获到不同级别的语法及语义信息,哪些信息是目标任务所需要的呢?如何选择优化算法以及学习率呢?当把BERT适应到某个目标任务时,需要考虑到因素有:(1)长文本序列的预处理(BERT最大序列长度为512);(2)选择哪些BERT层;(3)过拟合问题。
这篇论文分别对这三个因素进行了实验分析:
1. 处理长文本
BERT能够处理的最大序列长度是512,把BERT应用到文本分类任务上面临的第一个问题就是如何处理长度大于512的文本。这篇论文尝试的方法有:
- 截断法 (truncation methods):(1) head-only: 只保留前510个tokens;(2) tail-only: 只保留尾510个tokens;(3) head+tail: 根据经验选择前128个tokens与后382个tokens。
- 层次法 (hierarchical methods): 输入文本首先被分割成 k = L / 510 k=L/510 k=L/510 个切片,然后输入到BERT中得到 k k k 个切片的表征。每个切片的表征就是最后一层的 符号 [CLS] 的隐藏层状态。可以使用 mean pooling、max pooling与self-attention的方式把所有的切片的表征合并起来。
上表的结果显示,head+tail的截断法在IMDb和Sogou数据集上表现最好。后续的实验也是采用这种方式进行处理。
2. BERT不同层的特征
BERT的每一层能够捕获到输入文本的不同特征。这篇论文探索了不同层的特征的有效性,实验结果如下表所示:
3. 灾难性遗忘
Catastrophic forgetting的意思是在学习新知识的过程中,已习得的知识会丢失。这个问题在迁移学习中非常普遍。这篇论文探索了BERT是否也会遭遇这个问题。验证方法是用不同的学习率微调BERT。结果如下图所示:
实验结果表明:更低的学习率,如 2e-5,能够使得BERT克服这个问题。学习率越大,如 4e-4,导致无法收敛。
4. 逐层降低学习率
为不同的BERT设置不同的学习率及衰减因子,BERT的表现如何?把参数 θ \theta