前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年如何科学的“微调”预训练模型?

2021年如何科学的“微调”预训练模型?

作者头像
AI部落联盟
发布2021-04-23 10:17:45
1.7K0
发布2021-04-23 10:17:45
举报
文章被收录于专栏:AI部落联盟AI部落联盟

前言

笔者刚刚入门NLP的时候,其实还和朋友们调侃过“attention is all you need"这么绝对的标题也敢发出来?当然似乎后来还有一个paper是“cnn is all you need”?但2021年,我再看深度学习领域,无论是自然语言处理、音频信号处理、图像处理、推荐系统,似乎都看到attention混得风生水起,只不过更多时候看到的是它的另一个代号:Transformer。

我想大部分深度学习的同学除了在各大paper里看到Transformer,平常与Transformer打交道最多的时候,大概率都是在用一个叫做:HuggingFace/Transformers的Github代码库。用过的同志都说:真香。

那么我们用这个Transformers库里的模型都是在干什么?欢迎大家评论、私聊笔者来探讨你的用途。

我想大部分同学都是在“微调”(fine-tune)基于Transformers的“预训练“模型(比如BERT、Roberta),期望在自己的任务上(比如阅读理解、实体识别、情感分类)取得新的SOTA吧?当然也有少数土豪朋友们在不断训练出新的“预训练“模型,帮助苍生,提高SOTA。

那么如何科学的“微调”“预训练模型”自然而然便成为了一个重要的研究课题/方向/必备知识啦。

什么是“微调”Fine-tune?

为了讲清楚今天的话题,首先得和读者朋友们对齐一下背景知识,即什么是“微调”?如果读者朋友看章节题目就明白了,可以直接跳到下一章节继续阅读。

图1 引用动手学深度学习中的Fine-tune示意图
图1 引用动手学深度学习中的Fine-tune示意图

“微调”这个词并不是NLP的专用名词,早在CV起飞的年代,“微调”就已经被广泛使用了,当时将深度学习模型在ImageNet上预训练,然后在自己的任务上“微调”模型的部分参数,便是当年CV模型训练的常规方法。

“微调”/fine-tune通常指:一种深度学习模型的训练方式/步骤。

  1. 如图1左边所示,假设我们有一个Source model(左边浅蓝色框的Layer组成),先在Source data上进行训练(Pre-train,预训练)。
  2. 如图1右边所示,假设我们还有一个Target model (右边浅蓝色框的Layer+深蓝色的Output Layer组成)。
  3. Target model的浅蓝色框Layer和Source model一样,意味着可以直接复制Source model中训练好的模型参数。
  4. 而右边的深蓝色Output Layer左边浅蓝色Output Layer其实有两种可能:

A、如图中所示,不相同,意味着Target model的任务类型/目标类型与Source model不一致;

B、图中未展示,相同,意味着Target model的任务类型/目标类型与Source model一致;

  1. 如果是情况A,那么Output Layer只能随机初始化,意味着在Target data上需要一定的样本,才能将Target model中的Output Layer训练好。 当然我们可以固定浅蓝色的Layer 1-Layer L - 1,也可以微调这些Layers。
  2. 如果是情况B,那么Target model和Source model完全一样,意味着在Target data上即使没有任何样本,Target model也是可以直接使用的(zero-shot,当然效果可能不好),也可以在Target data上将Target model中的部分/全部参数进行“微调”。

所以“微调”也像字面意思一样,对模型参数“微微”调整。

如果是随机初始化并从头开始训练网络则!=“微调”。

因此常规的“微调”通常也使用更小的learning rate对模型进行训练。

上面的“微调”示意图也告诉我们,任何模型结构都可以进行微调,包括不限于:Transformer、CNN、LSTM等。

预训练模型和常见NLP训练任务

如图1所示,只要Target model中的全部/部分参数在见到Target data之前被训练过,其实都可以叫做“预训练”。

预训练方法包括但不限于:语言模型无监督预训练(BERT),目标类似的其他数据集预训练,目标不类似但相关的其他数据集预训练等。

NLP里常见的训练目标:句子分类、句子相似判断、实体识别、阅读理解(start、end token预测)、语言模型等。

由于训练目标不同,往往Output Layer参数的维度也不同

假设进入Output Layer层的维度是H,那么句子2分类就是Hx2,实体10分类就是Hx10,这也是Output Layer在不同的目标上能否复用的原因。毕竟,一个Hx10维的矩 != Hx2的矩阵

图2 几个常见的NLP训练目标,不同任务往往有着不同的output layer
图2 几个常见的NLP训练目标,不同任务往往有着不同的output layer

学习了什么是“微调”,什么是“预训练”之后,我们来看看近些年“微调”预训练的方法都有哪些。

“微调”预训练模型

我们知道微调的时候存在两种情况:预训练任务和目标任务相同、不相同。

我们也知道常见的预训练可以有这么几种情况:

  1. 无监督+大规模数据预训练(例如BERT、Roberta、XLNet等);
  2. 无监督+domian数据预训练(例如我们要对wikipedia的数据做问答,那可以先用wikipedia的数据预训练一下模型);
  3. 有监督+相似任务预训练(例如我们要对句子做2分类,那么我们可以先用短语2分类、文档2分类的数据进行预训练);
  4. 有监督+相关数据/任务预训练(例如我们要对数据X做句法分析,由于这个数据X同时还标注实体,那么我们可以用实体标注进行预训练);
  5. 多任务学习 ,多任务学习进行预训练的常规方法是:将多个相关的有监督/无监督任务放在一起对模型参数进行预训练。关于多任务学习,读者可以参考我前面写的文章。

于是我们得到了这样一张表格:每一列我们都可以选1个或者多个任务进行预训练,看着这个表格应该可以想到各种花式预训练排列组合啦吧哈哈哈。

如何微调预训练模型

A 目标任务相同

B 目标任务不相同

1 无监督+大规模数据预训练

yes

yes

2 无监督+domain数据预训练

yes

yes

3 有监督+相似任务预训练

yes

no

4 有监督+相关数据/任务预训练

yes

yes

5 多任务学习

yes

yes

这么多花式组合就不一一介绍了,下面终点介绍几种最常用的组合吧:

图3 最常用的Fine-tune:1B(BERT)+ 目标任务(例如句子情感分类)
图3 最常用的Fine-tune:1B(BERT)+ 目标任务(例如句子情感分类)

1B的含义:1无监督+大规模数据预训练,B目标任务和预训练任务不同。

图3展示了最常用的“微调”预训练模型的方法,通俗的讲就是:我们拿一个在大规模数据上训练好的BERT过来,直接在BERt上添加一个Task-specific的Head/网络层,然后在自己的数据集上稍加训练一下,得到新模型,跑出新SOTA。

图4  Adaptive Fine-tune:1B+2B+目标任务
图4 Adaptive Fine-tune:1B+2B+目标任务

图4是图3的一个加强版本,通俗的讲:假设我们要对Wikipedia的问题做阅读理解,由于大部分大规模预训练模型并不只用wikipedia作为训练数据,所以数据分布与wikipedia存在一定的差异,因此我们先在wikipedia数据上跑一下语言模型预训练,再对wikipedia数据上的问答数据进行训练。就像一个全能的新员工,咱们先带着参观一下工位、水吧、食堂,再开始训练干活呗。

图5: Behavior Fine-tune:1B+3A+目标任务
图5: Behavior Fine-tune:1B+3A+目标任务

图5和图4有一定的区别,还是以BERT为例,先将BERT+output layer在相关任务上预训练一下,再上在目标任务上进行训练。这种情况常常存在于:目标任务的数据十分少,并且我们随机初始化了一个output layer。

那么这个output layer十分不容易被训好,并且参数量大大的BERT也十分容易过拟合小数据集,因此效果很糟糕,那么我们先找点相关/相似的任务,把BERT和output layer朝我们想要的方向调整调整,再对目标任务进行训练。

图6: prefix fine-tune:1A+目标任务
图6: prefix fine-tune:1A+目标任务

图6是一种非常有趣的预训练+finetune的方式。也是2020/2021开始热起来的一种。

意思是:我们给预训练模型一点prefix/prompt(提示),让模型通过这个prefix来区分不同的任务,同时我们又将目标任务改造成预训练模型一样的目标(比如将分类问题转化为seq2seq问题)。

由于预训练目标和最终目标一致,那么我们可以不需要新的数据就可以进行预测,同时也可以使用更多的数据进行fine-tune。

举个例子:

图7 目标任务改造成预训练任务
图7 目标任务改造成预训练任务

如图7所示,我们的目标任务是:通过阅读Passage,然后对Question做二分类判断(yes/no);那么我们可以将这个任务改造成一个seq2seq的MLM任务。

passage(绿色)+ prefix/prompt(红色)+Qeustion(蓝色)+MASKED(黄色)。MASKED词库包含yes/no。

因此自然而然,原先的分类任务就变成了一个Mask Language Model啦。so far so cool!

图6的这种“微调”的方式在2020年、2021年逐渐流行起来,在NACCL 2021最新的一篇文章:How many data points is a prompt worth?上直接抛出了这样一个结论:一个好的prompt设计,价值数百个训练样本。具体结果见图8,这里就不展开啦,感兴趣的读者可以阅读原文。

图8 好好指点MLM模型,让你多出好几百个训练样本。

本文暂时不包含微调预训练的另外2个话题:1、微调模型的稳定性;2、如何高效进行微调?感兴趣的同学可以阅读 https://ruder.io/recent-advances-lm-fine-tuning/。

结语

以上便是今天想写的内容啦,总结一下就是:什么是“微调”, 什么是“预训练”,如何“微调”预训练。

看着table是不是觉得可能性更多啦?再看着HugggingFace/Transformers里面那么多模型,是不是觉得SOTA尽在眼前?

最后,笔者个人对图6的prefix fine-tune十分感兴趣,感兴趣的原因是:

  1. 这种方式可以做zero shot,few-shot,大量的数据fine-tune。
  2. 预训练任务和目标任务一致,有效利用了所有预训练参数。
  3. 在自然语言处理中,将prefix设计成自然语言描述,一定程度上能探索语言模型所学到的知识。 好比语言模型就是一个潜力巨大的天才魂兽,一位人类炼丹师对这个天才魂兽稍加指点(给点语言提示),天才魂兽便恍然大悟,悟出了任务真谛,直接对任务进行解决,随后人类炼丹师结合该任务的数据对天才魂兽稍加雕琢,便是新的SOTA!
  4. 我的确在近几年也看到不少工作: 人工设计prefix(提示prompt),自动设计prefix(提示)来帮助自己在特定的任务达到新SOTA。

感兴趣的同学可以评论哦哈哈哈,有时间挑几篇经典进行学习~~。

今天的总结就写到这里啦。觉得有帮助的同学帮忙点个赞、在看、转发。谢谢!

后记

当然“微调”预训练模型是一个十分广泛的方法,不仅限于基于“transformer“结构的预训练模型的“微调“(本文也在以更通用的角度讲解“微调”预训练模型),只是“transformers”恰好站在了这个正确的时代~~~。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI部落联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是“微调”Fine-tune?
  • 预训练模型和常见NLP训练任务
  • “微调”预训练模型
  • 结语
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档