必须要GPT3吗?不,BERT的MLM模型也能小样本学习
By 苏剑林 | 2020-09-27 | 149744位读者 |大家都知道现在GPT3风头正盛,然而,到处都是GPT3、GPT3地推,读者是否记得GPT3论文的名字呢?事实上,GPT3的论文叫做《Language Models are Few-Shot Learners》,标题里边已经没有G、P、T几个单词了,只不过它跟开始的GPT是一脉相承的,因此还是以GPT称呼它。顾名思义,GPT3主打的是Few-Shot Learning,也就是小样本学习。此外,GPT3的另一个特点就是大,最大的版本多达1750亿参数,是BERT Base的一千多倍。
正因如此,前些天Arxiv上的一篇论文《It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners》便引起了笔者的注意,意译过来就是“谁说一定要大的?小模型也可以做小样本学习”。显然,这标题对标的就是GPT3,于是笔者饶有兴趣地点进去看看是谁这么有勇气挑战GPT3,又是怎样的小模型能挑战GPT3?经过阅读,原来作者提出通过适当的构造,用BERT的MLM模型也可以做小样本学习,看完之后颇有一种“原来还可以这样做”的恍然大悟感~在此与大家分享一下。
冉冉升起的MLM #
MLM,全称“Masked Language Model”,可以翻译为“掩码语言模型”,实际上就是一个完形填空任务,随机Mask掉文本中的某些字词,然后要模型去预测被Mask的字词,示意图如下:
其中被Mask掉的部分,可以是直接随机选择的Token,也可以是随机选择连续的能组成一整个词的Token,后者称为WWM(Whole Word Masking)。
开始,MLM仅被视为BERT的一个预训练任务,训练完了就可以扔掉的那种,因此有一些开源的模型干脆没保留MLM部分的权重,比如brightmart版和clue版的RoBERTa,而哈工大开源的RoBERTa-wwm-ext-large则不知道出于什么原因随机初始化了MLM部分的权重,因此如果要复现本文后面的结果,这些版本是不可取的。
然而,随着研究的深入,研究人员发现不止BERT的Encoder很有用,预训练用的MLM本身也很有用。比如论文《BERT has a Mouth, and It Must Speak: BERT as a Markov Random Field Language Model》指出MLM可以作为一般的生成模型用,论文《Spelling Error Correction with Soft-Masked BERT》则将MLM用于文本纠错,笔者之前在《从语言模型到Seq2Seq:Transformer如戏,全靠Mask》的实验也表明MLM的预训练权重也可以当作UniLM来用做Seq2Seq任务,还有《无监督分词和句法分析!原来BERT还可以这样用》一文将MLM的思想用于无监督分词和句法分析了。可以说MLM已经是大放异彩了。
将任务转成完形填空 #
在本文里,我们再学习MLM的一个精彩应用:用于小样本学习或半监督学习,某些场景下甚至能做到零样本学习。
怎么将我们要做的任务跟MLM结合起来呢?很简单,给任务一个文本描述,然后转换为完形填空问题即可。举个例子,假如给定句子“这趟北京之旅我感觉很不错。”,那么我们补充个描述,构建如下的完形填空:
______满意。这趟北京之旅我感觉很不错。
进一步地,我们限制空位处只能填一个“很”或“不”,问题就很清晰了,就是要我们根据上下文一致性判断是否满意,如果“很”的概率大于“不”的概率,说明是正面情感倾向,否则就是负面的,这样我们就将情感分类问题转换为一个完形填空问题了,它可以用MLM模型给出预测结果,而MLM模型的训练可以不需要监督数据,因此理论上这能够实现零样本学习了。
多分类问题也可以做类似转换,比如新闻主题分类,输入句子为“八个月了,终于又能在赛场上看到女排姑娘们了。”,那么就可以构建
下面报导一则______新闻。八个月了,终于又能在赛场上看到女排姑娘们了。
这样我们就将新闻主题分类也转换为完形填空问题了,一个好的MLM模型应当能预测出“体育”二字来。
还有一些简单的推理任务也可以做这样的转换,常见的是给定两个句子,判断这两个句子是否相容,比如“我去了北京”跟“我去了上海”就是矛盾的,“我去了北京”跟“我在天安门广场”是相容的,常见的做法就是将两个句子拼接起来输入到模型做,作为一个二分类任务。如果要转换为完形填空,那该怎么构造呢?一种比较自然的构建方式是:
我去了北京?______,我去了上海。
我去了北京?______,我在天安门广场。
其中空位之处的候选词为$\{\text{是的}, \text{不是}\}$。
Pattern-Exploiting #
读到这里,读者应该不难发现其中的规律了,就是给输入的文本增加一个前缀或者后缀描述,并且Mask掉某些Token,转换为完形填空问题,这样的转换在原论文中称为Pattern,这个转换要尽可能与原来的句子组成一句自然的话,不能过于生硬,因为预训练的MLM模型就是在自然语言上进行的。显然同一个问题可以有很多不同的Pattern,比如情感分类的例子,描述可以放最后,变成“这趟北京之旅我感觉很不错。____满意。”;也可以多加几个字,比如“觉得如何?____满意。这趟北京之旅我感觉很不错。”。
然后,我们需要构建预测Token的候选空间,并且建立Token到实际类别的映射,这在原论文中称为Verbalizer,比如情感分类的例子,我们的候选空间是$\{\text{很}, \text{不}\}$,映射关系是$\text{很}\to\text{正面},\text{不}\to\text{负面}$,候选空间与实际类别之间不一定是一一映射,比如我们还可以加入“挺”、“太”、“难”字,并且认为$\{\text{很},\text{挺},\text{太}\}\to\text{正面}$以及$\{\text{不},\text{难}\}\to\text{负面}$,等等。不难理解,不少NLP任务都有可能进行这种转换,但显然这种转换一般只适用于候选空间有限的任务,说白了就是只用来做选择题,常见任务的就是文本分类。
刚才说了,同一个任务可以有多种不同的Pattern,原论文是这样处理的:
1、对于每种Pattern,单独用训练集Finetune一个MLM模型出来;
2、然后将不同Pattern对应的模型进行集成,得到融合模型;
3、用融合模型预测未标注数据的伪标签;
4、用伪标签数据Finetune一个常规的(非MLM的)模型。
具体的集成方式大家自己看论文就行,这不是重点。这种训练模式被称为Pattern-Exploiting Training(PET),它首先出现在论文《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》,本文要介绍的这篇论文则进一步肯定和完善了Pattern-Exploiting Training的价值和结果,并整合了多任务学习,使得它在SuperGLUE榜单上的小样本学习效果超过了GPT3。两篇论文的作者是相同的,是一脉相承的作品。
不过要吐槽一个点是,上图中PET的223M参数,所用的模型是ALBERT-xxlarge-v2,事实上称ALBERT为“小模型”是一种很耍流氓的行为,因为它前向计算的速度并没有得到任何提升。ALBERT-xxlarge共有12层,层与层之间参数是共享的,就前向计算而言,它应该等价于约2700M(12倍)参数的GPT才对。
中文实践,检验效果 #
要真正确认一个方法或模型的价值,看论文的实验表格是不够的,论文给出的实验结果谁都不好说能否复现,其次就算英文上能复现也不代表中文上有价值,因此最实际的还是亲自动手做实验验证。下面是笔者的实验代码,供读者参考:
我们将从以下几个角度来探讨PET的可行性:
1、直接利用现成的MLM模型效果如何?(零样本学习1)
2、用“大量无标签数据”微调现成的MLM模型效果如何?(零样本学习2)
3、用“小量标签数据”微调现成的MLM模型效果如何?(小样本学习)
4、用“小量标签数据+大量无标签数据”微调现成的MLM模型效果如何?(半监督学习)
下面主要给出情感二分类的实验结果。另外还有一个新闻主题的多分类,代码也放到Github了,其结果是类似的,就不重复陈述了。
零样本学习1 #
这里主要探索的是给输入文本补上对应的Pattern后,直接基于现成的MLM模型进行预测,预测的准确率。由于构建模型的整个过程都不涉及到标签数据监督训练,因此这算是一种“零样本学习”。我们需要比较的是不同Pattern、不同MLM模型上的效果:
下面是实验的几个Pattern,其中空位处候选词语都为“很”和“不”:
P1:____满意。这趟北京之旅我感觉很不错。
P2:这趟北京之旅我感觉很不错。____满意。
P3:____好。这趟北京之旅我感觉很不错。
P4:____理想。这趟北京之旅我感觉很不错。
P5:感觉如何?____满意。这趟北京之旅我感觉很不错。
至于MLM模型,则是下面几个:
M1:Google开源的中文版BERT Base(链接);
M2:哈工大开源的RoBERTa-wwm-ext Base(链接):
M3:腾讯UER开源的BERT Base(链接);
M4:腾讯UER开源的BERT Large(链接)。
实验结果如下表(验证集/测试集):
$$\begin{array}{c}
\text{不同模型不同Pattern的零样本学习效果}
\\
{\begin{array}{c|ccccc}
\hline
& \text{P1} & \text{P2} & \text{P3} & \text{P4} & \text{P5} \\
\hline
\text{M1} & 66.94\,/\,67.60 & 57.56\,/\,56.13 & 58.83\,/\,59.69 & 83.70\,/\,83.33 & 75.98\,/\,76.13\\
\text{M2} & 85.17\,/\,84.27 & 70.63\,/\,68.69 & 58.55\,/\,59.12 & 81.81\,/\,82.28 & 80.25\,/\,81.62\\
\text{M3} & 66.75\,/\,68.64 & 50.45\,/\,50.97 & 68.97\,/\,70.11 & 81.95\,/\,81.48 & 61.49\,/\,62.58\\
\text{M4} & 83.56\,/\,85.08 & 72.52\,/\,72.10 & 76.46\,/\,77.03 & 88.25\,/\,87.45 & 82.43\,/\,83.56\\
\hline
\end{array}}
\end{array}$$
最好的效果居然可以达到88%!也就是说,加载现成的MLM,配合适当的Pattern,不需要任何标注数据,就可以正确识别大部分样本情感倾向了。这不得不让我们对MLM模型的潜力刮目相看了。
可以观察到,不同的Pattern、不同的预训练模型之间还是有一定的差异的,整体而言Large版本的效果要明显好于Base版本的模型,说明像GPT到GPT2再到GPT3一样,还是把模型做得更大会更好。此外,这还有可能说明实际上MLM还没有被充分训练好,或许是因为BERT这种Mask掉一部分的训练方式过于低效了,可能用《修改Transformer结构,设计一个更快更好的MLM模型》一文提到的改进版MLM会更好。
零样本学习2 #
看完上述结果,读者可能会想到:如果我用领域内的数据继续预训练MLM模型,那么能不能提升效果呢?答案是:能!下面是我们的实验结果,算力有限,我们只在RoBERTa-wwm-ext(上述的M2,继续预训练后的模型我们称为M2+无监督)的基础上做了比较:
$$\begin{array}{c}
\text{继续MLM预训练的零样本学习效果}
\\
{\begin{array}{c|ccccc}
\hline
& \text{P1} & \text{P2} & \text{P3} & \text{P4} & \text{P5} \\
\hline
\text{M2} & 85.17\,/\,84.27 & 70.63\,/\,68.69 & 58.55\,/\,59.12 & 81.81\,/\,82.28 & 80.25\,/\,81.62\\
\text{M2}^{+\text{无监督}} & 88.05\,/\,87.53 & 71.01\,/\,68.78 & 81.05\,/\,81.24 & 86.40\,/\,85.65 & 87.26\,/\,87.40\\
\hline
\end{array}}
\end{array}$$
要注意的是,这里我们只是用领域内的数据继续做MLM训练,这个过程是无监督的,也不需要标注信号,因此也算是“零样本学习”。同时,从到目前为止的结果我们可以看出,给输入本文加入“前缀”的效果比“后缀”更有优势一些。
小样本学习 #
刚才我们讨论了无标签数据继续预训练MLM的提升,如果回到PET的目标场景,直接用小量的标签数据配合特定的Pattern训练MLM又如何呢?这也就是真正的“小样本学习”训练了,这里我们保留约200个标注样本,构造样本的时候,我们先给每个句子补上Pattern,除了Pattern自带的Mask位置之外,我们还随机Mask其他一部分,以增强对模型的正则。最终实验结果如下:
$$\begin{array}{c}
\text{小样本学习效果}
\\
{\begin{array}{c|ccccc}
\hline
& \text{P1} & \text{P2} & \text{P3} & \text{P4} & \text{P5} \\
\hline
\text{M2} & 85.17\,/\,84.27 & 70.63\,/\,68.69 & 58.55\,/\,59.12 & 81.81\,/\,82.28 & 80.25\,/\,81.62\\
\text{M2}^{+\text{小样本}} & 89.29\,/\,89.18 & 84.71\,/\,82.76 & 88.91\,/\,89.05 & 89.31\,/\,89.13 & 89.07\,/\,88.75\\
\hline
\end{array}}
\end{array}$$
结论就是除了“后缀式”的P2之外,其它结果都差不多,这进一步说明了“前缀式”的Pattern会比“后缀式”更有竞争力一些。在效果上,直接用同样的数据用常规的方法去微调一个BERT模型,大概的结果是88.93左右,所以基于“MLP+Pattern”的小样本学习方法可能带来轻微的性能提升。
半监督学习 #
无监督的零样本学习和有监督的小样本学习都说完了,自然就轮到把标注数据和非标注数据都结合起来的“半监督学习”了。还是同样的任务,标注数据和非标注数据的比例大约是1:99,标注数据带Pattern,非标注数据不带Pattern,大家都Mask掉一部分Token进行MLM预训练,最终测出来的效果如下:
$$\begin{array}{c}
\text{半监督学习效果}
\\
{\begin{array}{c|ccccc}
\hline
& \text{P1} & \text{P2} & \text{P3} & \text{P4} & \text{P5} \\
\hline
\text{M2} & 85.17\,/\,84.27 & 70.63\,/\,68.69 & 58.55\,/\,59.12 & 81.81\,/\,82.28 & 80.25\,/\,81.62\\
\text{M2}^{+\text{半监督}} & 90.09\,/\,89.76 & 79.58\,/\,79.35 & 90.19\,/\,88.96 & 90.05\,/\,89.54 & 89.88\,/\,89.23\\
\hline
\end{array}}
\end{array}$$
还是同样的,“后缀”明显比“前缀”差,“前缀”的效果差不多。具体效果上,则是肯定了额外的无标注数据也是有作用的。直觉上来看,“前缀”比“后缀”要好,大体上是因为“前缀”的Mask位置比较固定,微弱的监督信号得以叠加增强?但这也不能解释为什么零样本学习的情况下也是“前缀”更好,估计还跟模型的学习难度有关系,可能句子前面部分的规律更加明显,相对来说更加容易学一些,所以前面部分就学习得更加充分?这一切都还只是猜测。
汇总与结论 #
将上述结果汇总如下:
$$\begin{array}{c}
\text{结果汇总比较}
\\
{\begin{array}{c|ccccc}
\hline
& \text{P1} & \text{P2} & \text{P3} & \text{P4} & \text{P5} \\
\hline
\text{M2} & 85.17\,/\,84.27 & 70.63\,/\,68.69 & 58.55\,/\,59.12 & 81.81\,/\,82.28 & 80.25\,/\,81.62\\
\text{M2}^{+\text{无监督}} & 88.05\,/\,87.53 & 71.01\,/\,68.78 & 81.05\,/\,81.24 & 86.40\,/\,85.65 & 87.26\,/\,87.40\\
\text{M2}^{+\text{小样本}} & 89.29\,/\,89.18 & 84.71\,/\,82.76 & 88.91\,/\,89.05 & 89.31\,/\,89.13 & 89.07\,/\,88.75\\
\text{M2}^{+\text{半监督}} & 90.09\,/\,89.76 & 79.58\,/\,79.35 & 90.19\,/\,88.96 & 90.05\,/\,89.54 & 89.88\,/\,89.23\\
\hline
\end{array}}
\end{array}$$
读者还可以对比我们之前在文章《泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练》中用虚拟对抗训练(VAT)做半监督学习的结果,可以看到不管是零样本学习、小样本学习还是半监督学习,基于MLM模型的方式都能媲美基于VAT的半监督学习的结果。我们在做短新闻多分类实验时的结果也是相似的。因此,这说明了MLM模型确实也可以作为一个优秀的零样本/小样本/半监督学习器来使用。
当然,基于MLM模型的缺点还是有的,比如MLM所使用的独立假设限制了它对更长文本的预测能力(说白了空位处的文字不能太长),以及无法预测不定长的答案也约束了它的场景(所以当前只能用于做选择题,不能做生成)。我们期待有更强的MLM模型出现,那时候就有可能在所有任务上都能与GPT3一较高下了。
又到了说小结的时候 #
本文介绍了BERT的MLM模型的一个新颖应用:配合特定的描述将任务转化为完形填空,利用MLM模型做零样本学习、小样本学习和半监督学习。在原论文的SuperGLUE实验里边,它能达到媲美GPT3的效果,而笔者也在中文任务上做了一些实验,进一步肯定了该思路的有效性。整个思路颇为别致,给人一种“原来还可以这样做”的恍然大悟感,推荐大家学习一下。
转载到请包括本文地址:https://kexue.fm/archives/7764
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Sep. 27, 2020). 《必须要GPT3吗?不,BERT的MLM模型也能小样本学习 》[Blog post]. Retrieved from https://kexue.fm/archives/7764
@online{kexuefm-7764,
title={必须要GPT3吗?不,BERT的MLM模型也能小样本学习},
author={苏剑林},
year={2020},
month={Sep},
url={\url{https://kexue.fm/archives/7764}},
}
September 28th, 2020
之前用pretrain的中文生成模型,类似的方法做过C3多选数据集,其实效果还是蛮有意思的,准确率能到个50左右,比随机猜(25)好不少。
September 28th, 2020
无监督训练 with_mlm=true时,模型内部会自动 mask 训练集的 部分 字词去 训练吗
我看 data_generator 并没有mask训练集的 字词
因为你没认真看
September 28th, 2020
[“前缀”比“后缀”要好,大体上是因为“前缀”的Mask位置比较固定。]
固定模型长度,并且把padding放前面,就可以让后缀的位置固定了吧。不过带来的mismatch可能是更大的问题。
padding部分会自动mask掉,所以你这个做法等价于自定义position embedding的开始位置(就是一个句子的position不再是从0开始)。感觉效果也不会太好。
是的,我说的mismatch主要就是句首不从零开始。这样一想,如果预训练的时候也会padding和mask,那句子开头部分得到的训练就会比结尾充分,可能也是前缀效果好的原因,还可能是“零样本学习的情况下也是前缀更好”的原因。(也许换相对位置编码的xlnet可以验证这个问题)
都是待定猜测状态~
September 28th, 2020
感谢苏神,学习到了新的思路。有个疑惑,最近开始做小样本学习,发现一些在分类任务上面work的小样本学习策略,在ner任务上面并不work.不知道文中提到的方法在 ner 任务上的效果怎么样?
文中的方法基本上不适用于NER
想了一下 要是有合适的标注数据貌似也能做? 就类似于半指针半标注那种思路 让[MASK]的地方生成'1'来标注首尾?
这种PET方式的关键是用自然语言来描述你要做的事情,并借助自然语言生成的方式来输出你想要的结果,你所设计的怕是过于生硬,不属于自然语言描述了~
October 1st, 2020
config_path = '/root/kg/bert/chinese_roberta_wwm_ext_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/root/kg/bert/chinese_roberta_wwm_ext_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/root/kg/bert/chinese_roberta_wwm_ext_L-12_H-768_A-12/vocab.txt'
苏神,这几个文件在哪里能找到?
October 10th, 2020
老哥,环境可以说一下么
已经在github补充说明了
谢谢老哥,是python2.7版本的是吧
嗯,但理论上也支持py3吧
October 26th, 2020
有没有试过《It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners》里讲的iPET方法,根据https://github.com/timoschick/pet的结果,iPET比MLM直接zero shot高了20个百分点
iPET有一个交互的过程,把多种cloze构造方式,用除了第i种方式的其他方式随机选子集集成,用来标注unlabeled data喂给第i种方式,多轮进行融合
我看到了,本文着重介绍PET的思想,就没有特别介绍iPET了。不过iPET流程实在也是太复杂了,我没有去尝试。
November 6th, 2020
[...]可以看到,这种转化跟GPT2、GPT3、PET的思想都是一致的,都是希望用文字把我们要做的任务表达出来,然后都转化为文字的预测,可以还可以翻看旧作 《必须要GPT3吗?不,BERT的MLM模型也能小样本学习》 了解相关内容。总的来说,在我们的内部实验里边,模型够大、数据够多以及有监督预训练都是T5成功的关键因素,“万事皆可Seq2Seq”则提供了有效地融合这些关键因素的方案。[...]
November 25th, 2020
苏神 那个 半监督文本分类的代码为啥保存两次权重,推理的时候需要加载mlm_model.weights吗
喜欢保存两次不行吗?
同学想问的应该是为什么苏神这样写就是用的MLM , 我的理解是后面在if __name__ == '__main__':的代码中没有加 train_generator = data_generator(train_data, batch_size) 这一句 , 我的理解是没有用自己的任务进行finetune ,所以用的就是单纯的MLM
February 23rd, 2021
请问下博主,如果标签位置是动态的怎么设计代码呢?也就是每条数据的mask_idx的位置不一样
keras4bert输入没有[mask]
自己编程实现有啥难度吗?没看懂问题的焦点。