如何提升bert在下游任务中的性能

更好的阅读体验,请跳转至如何提升bert在下游任务中的性能

随着Transformer 在NLP中的表现,Bert已经成为主流模型,然而大家在下游任务中使用时,是不是也会发现模型的性能时好时坏,甚至相同参数切换一下随机种子结果都不一样,又或者自己不管如何调,模型总达不到想象中的那么好,那如何才能让Bert在下游任务中表现更好更稳呢?本文以文本分类为例,介绍几种能帮你提高下游任务性能的方法。

Further Pre-training

最稳定也是最常用的提升下游任务性能的手段就是继续进行预训练了。

二阶段 vs 三阶段 vs 四阶段

首先回顾一下,Bert 是如何使用的呢?我们设通用泛化语料为D_g,下游任务相关的数据为D_t, Bert 即在通用语料D_g 上训练一个通用的Language Model, 然后利用这个模型学到的通用知识来做下游任务,也就是在下游任务上做fine-tune,这就是<code>二阶段模式</code>。大多数情况下我们也都是这么使用的:下载一个预训练模型,然后在自己的数据上直接fine-tune。

三阶段

在论文Universal Language Model Fine-tuning for Text Classification中,作者提出了一个通用的范式ULMFiT:

  1. 在大量的通用语料上训练一个LM(Pretrain);
  2. 在任务相关的小数据上继续训练LM(Domain transfer);
  3. 在任务相关的小数据上做具体任务(Fine-tune)。

那我们在使用Bert 时能不能也按这种范式,进行三阶段的fine-tune 从而提高性能呢?答案是:<code>能!</code>
比如邱锡鹏老师的论文How to Fine-Tune BERT for Text Classification?和[Don't Stop Pretraining: Adapt Language Models to Domains and Tasks](arXiv:2004.10964 [cs])中就验证了,在任务数据D_t 继续进行pretraining 任务,可以提高模型的性能。
那如果我们除了任务数据没有别的数据时,怎么办呢?简单,任务数据肯定是相同领域的,此时直接将任务数据看作相同领域数据即可。所以,在进行下游任务之前,不妨先在任务数据上继续进行pre-training 任务继续训练LM ,之后再此基础上进行fine-tune。

四阶段

我们在实际工作上,任务相关的label data 较难获得,而unlabeled data 却非常多,那如何合理利用这部分数据,是不是也能提高模型在下游的性能呢?答案是:<code>也能! </code>

  1. 在大量通用语料上训练一个LM(Pretrain);
  2. 在相同领域D_{in_domain}上继续训练LM(Domain transfer);
  3. 在任务相关的小数据上继续训练LM(Task transfer);
  4. 在任务相关数据上做具体任务(Fine-tune)。

而且上述两篇论文中也给出了结论:先Domain transfer 再进行Task transfer 最后Fine-tune 性能是最好的。

如何further pre-training

how to mask

首先,在further pre-training时,我们应该如何进行mask 呢?不同的mask 方案是不是能起到更好的效果呢?
在Roberta 中提出,动态mask 方案比固定mask 方案效果更好,此外,在做Task transfer 时,由于数据通常较小,固定的mask 方案通常也容易过拟合,所以further pre-training 时,动态随机mask 方案通常比固定mask 效果更好。
而ERNIE 和 SpanBert 中都给出了结论,更有针对性的mask 方案可以提升下游任务的性能,那future pre-training 时是否有什么方案能更有针对性的mask 呢?
刘知远老师的论文Train No Evil: Selective Masking for Task-Guided Pre-Training就提出了一种更有针对性的mask 方案<code>Selective Mask</code>,进行further pre-training 方案,该方案的整体思路是:

  1. D_t上训练一个下游任务模型 Model_0;
  2. 利用Model_0判断token 是否是下游任务中的重要token,具体计算公式为:S(w_i) = P(y_t|s) - P(y_t|s^{'}_{i-1}W_i), 其中s为完整句子(序列),s^{'}为一个初始化为空的buffer,每次将句子中的token 往buffer中添加,如果加入的token 对当前任务的表现与完整句子在当前任务的表现差距小于阈值,则认为该token 为重要token,并从buffer 中剔除;
  3. 利用上一步中得到的token label,训练一个二分类模型Model_b,来判断句子中的token 是否为重要token;
  4. 利用Model_b,在domain 数据上进行预测,根据预测结果进行mask ;
  5. 进行Domain transfer pre-training;
  6. 在下游任务进行Fine-tuning。
    上述方案验证了更有针对性的mask 重要的token,下游任务中能得到不错的提升。综合下来,<code>Selective Mask > Dynamic Mask > Static Mask</code>

虽然selective mask 有提升,但是论文给出的思路太过繁琐了,本质上是判断token 在下游任务上的影响,所以这里给出一个笔者自己脑洞的一个方案:通过Model_0在unlabeled 的Domain data 上直接预测,然后通过不同token 下结果的熵的波动来确定token 对下游任务的影响。这个方案我没有做过实验,有兴趣的可以试试。

when to stop

在further pretraining 时,该何时停止呢?是否训练的越久下游任务就提升的越多呢?答案是否定的。在进行Task transfer 时,应该训练多少步,论文How to Fine-Tune BERT for Text Classification?进行了实验,最后得出的结论是<code>100k</code>步左右,下游任务上提升是最高的,这也与我自己的实验基本吻合,训练过多就会过拟合,导致下游任务上提升小甚至降低。

step.png

此外,由于下游任务数据量的不同,进行多少步结果是最优的也许需要实验测试。这里给出一个更快捷稳妥的方案:借鉴PET本质上也是在训练MLM 任务,我们可以先利用利用PET做fine-tuning,然后将最优模型作为预训练后的模型来进行分类任务fine-tuning,这种方案我实验后的结论是与直接进行Task transfer性能提升上相差不大。不了解PET的可以查看我之前博文PET-文本分类的又一种妙解.

how to fine-tuning

不同的fine-tuning 方法也是影响下游任务性能的关键因素。

optimizer

关于优化方案上,Bert 的论文中建议使用与bert 预训练时一致的方案进行fine-tuning,即使用weighted decay修正后的Adam,并使用warmup策略 搭配线性衰减的学习率。不熟悉的同学可以查看我之前的博文optimizer of bert

learning rate

不合适的learning rate可能会导致<code>灾难性遗忘</code>,通常learning rate 在[-e^{-5}, 1e^{-4}]之间,更大的learning rate可能就会发生灾难性遗忘,不利于优化。

lrt.png

此外,对transformer 逐层降低学习率也能降低发生灾难性遗忘的同时提升一些性能。

multi-task

Bert在预训练时,使用了两个task:NSP 和 MLM,那在下游任务中,增加一个辅助的任务是否能带来提升呢?答案是否定的。如我之前尝试过在分类任务的同时,增加一个相似性任务:让样本与label desc的得分高于样本与其他样本的得分,但是最终性能并没有得到提升。具体的实验过程请看博文模型增强之从label下手
此外,论文How to Fine-Tune BERT for Text Classification?也任务multi-task不能带来下游任务的提升。

which layer

Bert的结构上是一个12层的transformer,在做文本分类时,通常我们是直接使用最后一层的<code>[CLS]</code>来做fine-tuning,这样是最优的吗?有没有更好的方案?
论文How to Fine-Tune BERT for Text Classification?中针对这个问题也做了实验,对比了不同的layer不同的抽取策略,最终结论是所有层拼接效果最好,但是与直接使用最后一层差距不大。

layer.png

而论文Hate Speech Detection and Racial Bias Mitigation in Social Media based on BERT model中,作者通过组合多种粒度的语义信息,即将12层的<code>[CLS]</code>拼接后,送人CNN,在Hate Speech Detection 中能带来<code>8个点</code>的提升!

cnn.png

所以在fine-tuning时,也可以想一想到底是哪种粒度的语义信息对任务更重要。

Self-Knowledge Distillation

self-knowledge distillation(自蒸馏)也是一种常用的提升下游任务的手段。做法是先在Task data上fine-tuning 一个模型,然后通过模型得到Task data 的soft labels,然后使用soft labels 代替hard label 进行fine-tuning。更多细节可以查看之前的博文Knowledge Distillation之知识迁移

知识注入

通过注入外部知识到bert中也能提升Bert的性能,常用的方式主要有两种:

  1. 在bert embedding 层注入:通过将外部Embedding 与Bert token-embedding 拼接(相加)进行融合,然后进行transformer一起作用下游;
  2. 在transformer的最后一层,拼接外部embedding,然后一起作用下游。
    Enriching BERT with Knowledge Graph Embeddings for Document Classification中,通过在
    transformer的最后一层中拼接其他信息,提高模型的性能。
    kg.png

数据增强

NLP中数据增强主要有两种方式:一种是保持语义的数据增强,一种是可能破坏语义的局部扰动增强。保持语义通常采用回译法,局部扰动的通常使用EDA,更多细节可以查看之前博文NLP中的数据增强

总结

本文总结了使用bert 时,当前主要的提升Bert 在下游任务上的性能的方法,遇到相关问题时,可以尝试一下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容