首页 > 编程知识 正文

一起读论文 文本分类任务的BERT微调方法论

时间:2023-05-05 02:15:54 阅读:281231 作者:627

导读:今天为大家解读一篇复旦大学邱锡鹏老师课题组的研究论文《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 θ划分成 { θ 1 , … , θ L } {theta^1,dots,theta^L} {θ1,…,θL},其中 θ l theta^l θl包括了BERT第 l l l层的参数。按照如下规则进行更新:
θ t l = θ t − 1 l − η l ⋅ ∇ θ l J ( θ ) theta_t^l = theta_{t-1}^l - eta^lcdotnabla_{theta^l}J(theta) θtl​=θt−1l​−ηl⋅∇θl​J(θ)
其中, η l eta^{l} ηl代表第 l l l层的学习率。设置基础学习率为 η L eta^L ηL,使用 n k − 1 = ξ ⋅ η k n^{k-1}=xicdoteta^k nk−1=ξ⋅ηk,衰减因子 ξ ≤ 1 xileq1 ξ≤1。当 ξ < 1 xi<1 ξ<1是,靠下的层比靠上面的层的学习率要低;当 ξ = 1 xi=1 ξ=1时,所有层的学习率一样,此时等价于正常的SGD算法。实验结果如下:

实验结果表明:较低的BERT层赋予较低的学习率能够有效地微调BERT,推荐的恰当的设置是: ξ = 0.95 xi=0.95 ξ=0.95 与 lr = 2.0 e − 5 =2.0e-5 =2.0e−5。

进一步预训练

对于特定领域的文本分类任务,其数据分布会不同于在通用领域的语料库中进行预训练的BERT模型的数据分布,需要针对此特定领域的数据用Masked Language Model及Next Sentence Prediction进一步预训练BERT。此时,会有三种可行的预训练的方法:

Within-task pretraining(目标任务内的预训练):在目标任务的训练集上预训练BERT;In-domain pre-training(领域内预训练):在来自于与目标任务相同的领域的数据集上对BERT进行预训练;Cross-domain pre-training(跨领域预训练):在来自于与目标任务相同或不同的领域的数据集上对BERT进行预训练。

1. Within-task pretraining
实验结果表明:进一步预训练对于提升BERT在目标任务上的表现非常有用,在100K训练步后能够取得最优性能。

2. In-domain 与 cross-domain pretraining


这篇论文与其他模型进行了比较,结果如下表所示:

多任务微调

所有任务都会共享BERT层及Embedding层,唯一不共享的层就是最终的分类层,每个任务都有各自的分类层。

这篇论文还额外进行了两个实验:少样本学习及在BERT Large模型是哪个进行进一步预训练。

Few-Shot Learning

这篇论文评估了BERT-FiT与BERT-ITPT-FiT两种模型在不同数量的训练集上的表现。结果如下:

实验表明:BERT能够为小规模数据打来显著的性能提升。

BERT Large模型上进一步预训练

这篇论文进一步探索了BERT Large模型是否也会有跟BERT Base模型一样的结果。实验结果如下:

实验结果表明:在特定任务上微调BERT Large模型能够获得当前最优的结果。

想要了解更多的自然语言处理最新进展、技术干货及学习教程,欢迎关注微信公众号“语言智能技术笔记簿”或扫描二维码添加关注。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。