Pattern Exploiting Training (PET)

介绍PET范式,可用于半监督或无监督训练。

这篇主要关注两篇相同作者的文章:

《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》

《It’s Not Just Size That Matters:Small Language Models Are Also Few-Shot Learners》

首先看到一个问题比较好:BERT在预训练时学习到的知识或者说参数我们在fine-tunning的时候都有用到吗?

答案是不是的。

BERT的预训练其中一个任务是MLM,就是去预测被 【MASK】掉的token,采用的是拿bert的最后一个encoder(base版本,就是第12层的encoder输出,下图左图蓝色框)作为输入,然后接全连接层,做一个全词表的softmax分类(这部分就是左图的红色框)。但在finetuing的时候,我们是把MLM任务的全连接层抛弃掉,在最后一层encoder后接的初始化层来做具体下游任务。

MLM目标是预测 输入时被挑选的15%的单词,所以在BERT的最后一层(如BERT-base版本就是第12层)的token的embedding后会接一个【embedding维度,词表大小】的全连接矩阵,做token的预测,这个全连接矩阵就是MLM层参数

问题是,能不能通过某些巧妙的设计,把MLM层学习到的参数也利用上?

注意,Prompt设计的这种完形填空和MLM任务是有区别的,二者虽然都是都是词分类,但是候选集不同,MLM的候选词是整个词库,prompt是verbalizer里的词。Prompt使用MLM层把其他的词给忽略掉。

答案当然是可以的,请继续往下看。

现在举一个二分类的例子,输入一条汽车论坛的评论,输出这个评论是属于【积极】or【消极】。但问题是现在我每个类别只有10个labeled数据,1K条unlabeled数据。怎么训练model?

直接做有监督训练?样本量太少,会过拟合。应该优先采用半监督学习的方法,如UDA、MixText这种,而PET采用的是另外一种巧妙的设计思想。

对于”I love this movie”这句输入,可以在后面加上Prompt也就是Pattern:”the movie is _“,组成如下这样一句话:

1
I love this movie, the movie is ___

然后让预训练模型用表示情感的答案(例如”great”、”terrible”等)做完形填空,最后再将该答案转换为情感分类的标签。这里定义一个verblizer作为映射函数,把label【great】映射为+,把label【terrible】映射为- 。

这样一来,我们就可以通过构造合适的「模板」,控制模型的输出空间,从而训练一个完全无监督的预训练模型来解决各种各样的下游任务。BERT预训练时的MLM层的参数能利用上。而且,即使model没有进行fine tunning,这个model其实就会含有一定的准确率

Pattern和verblizer,就是一个PVP(pattern-verbalizer pairs)。

Prompt Notation

设 $M$ 是被mask的语言模型,$V$ 是它的词表,$[MASK]$ 也包含在词表中。令 $L$ 为目标分类任务 A 的一组标签。

我们把任务 A 的输入写成一串短语 $x=(s_1,…,s_k)$,其中 $s_i\in V$.

例如如果 $A$ 是文本推理(两个话虽然句子),$k=2$

我们将pattern定义为一个函数 $P$, 它以 $x$ 为输入,输出一个短语或句子 $P(x)\in V^*$, 其中正好包含一个MASK标记,也就是说,它的输出可以被看作是一个完形填空问题。

此外,将 verbalizer 定义为一个注入函数 $v:L\to V$, 它将每个标签映射到 $M$ 的词表中的一个词。

令 $p=(P,v)$ 是 PVP(pattern-verbalizer pairs)

我们假设可以访问较小的训练集 $T$ 和 通常大得多的一组无标签数据 $D$ 。

对于每个恰好包含一个MASK标签和 $w\in V$ 的序列 $z\in V^*$, 用 $M(w|z)$ 表示语言模型在掩码位置赋予$w$ 的非标准化分数。给定某个输入 $x$,我们将标签 $l\in L$的得分定义为:

并使用Softmax获得标签上的概率分布 :

Auxiliary Language Modeling

只有几个训练示例可用,可能会发生灾难性的遗忘。

由于现在是用MLM做分类任务,所以可以引入无标注数据一起训练!

举个简单的例子,下图样例1是labeled数据,我们利用pattern把它改写后,对 __ 部分做完形填空预测(即MLM任务)。

样例2是一个unlabeled数据,我们就不对 __ 部分做预测,而是对被【MASK】做预测。这里的【MASK】可以采用BERT的方法,随机对句子的15%token进行【MASK】。

训练时两个损失联合训练:

由于 $L{MLM} $ 通常比 $L{CE}$ 大得多,在初步实验中,发现$α=10^{-4}$的值能给出良好的结果

这样做的好处是,能让model更适应于当前的任务,有点像在预训练模型上继续根据任务的domain和task继续做预训练,然后再做fine-tunning呢?

Combining PVPs

引入一个问题,怎么评价我们的pattern定义得好不好?

我们可以造两个pattern,又可以造两个verblizer。其实一共有4个PVP。我们怎么衡量哪一个PVP训练完后在测试集上的效果最好?

答案是我们也不知道,因为我们不能站在上帝视角从一开头就选出最佳的PVP,同样由于是小样本学习,也没有足够的验证集让我们挑选最佳的PVP。既然如此,解决方式就是知识蒸馏

具体的,我们用20个labeled数据训练4个PVP模型,然后拿这四个PVP模型对1K条unlabeled数据进行预测,预测的结果用下式进行平均。

其中 $Z$ 保持概率和为1, $s_p(l|x)$ 就是单个PVP模型对样本预测的概率分布,$w(p)$ 就是PVP的权重。

有uniform和weighted两种方式,uniform就是所有PVP的权重都为1,weighted就是把每个PVP的权重设置为它们在训练集上的准确率。最后还要对上式进行temperature=2的软化。

这就是在做知识的蒸馏。何谓知识的蒸馏?经过这样处理后,噪声减少了,利用多个PVP平均的思想把某些本来单个PVP预测偏差比较大的进行平均后修正。

这样子,利用训练好的PVPs所有1K条unlabeled数据打上soft label,再用这1K条打上软标签的数据进行传统的有监督训练,训练完的model应用于下游任务的model。

注意哦,这里就可以用轻量的模型来做fine tuning了哦,因为从20条labeled数据扩充到1K条有带有soft label的数据,labeled数据量大大增加,这时候轻量级的模型也能取得不错的结果,而且轻量模型对轻量部署、高并发等场景更加友好。

下图就是所有的流程,再总结一下步骤就是

  • 第一步先定义PVPs,然后对每对PVP用labeled数据进行单独的训练,该步可以加入上面提到的Auxiliary Language Modeling一起训练
  • 第二步:用训练好的PVPs,对unlabled数据进行预测,并知识蒸馏,得到大量的soft label;
  • 第三步:用第二步得到的带有soft label的data,用传统的fine tuning方法训练model。

IPET

将所有单个模型的知识提炼到单个分类器C中意味着它们不能相互学习。由于一些 pattern 的表现(明显地)比其他模式差,因此最终模型的训练集 $T_C$可能包含许多标记错误的示例。

在每个PVP训练的过程中,互相之间是没有耦合的,就是没有互相交换信息,IPET的意思就是想通过迭代,不断扩充上面训练PVP的数据集。

这里简单举个例子,现在有20个labeled数据,1K个unlabeled数据,定义5个PVP,

第一轮,利用20个labeled数据分别训练PVP,第二轮,用第2~4个PVP来预测这1K unlabeled数据,然后选一些模型预测概率比较高的加入到第一个PVP的训练集上,同样用第1、3、4、5个PVP来训练这1K条,然后也将这部分加入到第2个PVP的训练集中,然后再训练一轮,训练后,重复,这样每一轮每个PVP的训练样本不断增多,而且PVP之间的信息也发生了交互。

实验

分析

Combining PVPs

作者发现不同PVP之间可能有很大的性能差别,如下图min就是最差的PVP,max就是最好的PVP,可以观察到它们之间的差别就很大。但是又不能站在上帝视角从一开始就选择最好的PVP,所以办法就是做commind PVPs,即上面所提到的知识蒸馏,而且发现蒸馏后会比采用单个最好的PVP效果还要好,并且发现uniform和weighted两个方法效果差不多。

Auxiliary Language Modeling

labeled数据越少,auxiliary task的提升效果越明显。

Iterative PER

iPET的效果,因为iPET是迭代多轮,每一轮每个PVP的训练集都会增大,从图可以看到每一轮的模型效果都是越来越好的。

In-Domain Pretraining

这里讨论了一个问题:PET效果比有监督训练好,是不是因为PET在大量无标签上打上软标签,扩大了有标签数据集?

然后作者做了一个实验,有监督训练时,先在所有数据集上进行继续预训练(这一步作者认为相当于把无标签数据也加进来了),然后再fine funing。实验结果表明,即使这样,有监督效果也离PET有一定距离。

It’s Not Just Size That Matters:Small Language Models Are Also Few-Shot Learners

这篇论文是上篇论文的延伸,其实没有太多新的工作,主要是下面提到的处理多个token的mask,这篇论文主要PK GPT3,不断diss GPT3有多少的不环保。

PET with Multiple Masks

PET要定义pattern和verblizer,还拿那汽车评论场景举例,我们能不能定义一个verbilzer,它把不同label映射到长度不一的token,如

1
2
3
4
定义 Pattern: s。真__!  这里s代表原始输入。  
定义Verbilzer, v(积极)=好, V(消极)=不好
样例 x: 保养贵,配件贵,小毛病多,还有烧机油风险。(label为消极)
pattern(x) = 保养贵,配件贵,小毛病多,还有烧机油风险,真__!

因为verbilzer把标签映射到长度不一致的token,那我们究竟定义长度为多少的下划线_,来让model进行完形填空。答案是用最长的那个,例如这里最长的是”不好”,长度为2,所以就挖空两个下划线来让模型做完形填空预测。

做Inference时,

  • $p(\text{积极}|x) =$ 第一个下划线__ 模型预测到token为好的概率。
  • $p(\text{消极}|x)= $ 就麻烦一些,先让模型对两个下划线,进行预测,看是第一个下划线预测token为不,还是第二个下划线预测token为好的概率高一些,把高的那个token先填上去,再重新预测剩下的。举个例子,假如模型预测第一个下划线token为不的概率是0.5,第二个下划线token为好的概率为0.4,即先把不填上第一个下划线,然后再用模型重新预测第二个token为好的概率,假如为0.8,即 $p(\text{消极}|x)= 0.5*0.8=0.4$

做train时,就不考虑这么细致了,具体的,取上面的例子为例,

  • $p(\text{积极}|x) =$ 第一个下划线__,模型预测到token为好的概率,跟inference是一样的
  • $p(\text{消极}|x)= 0.5*0.4 = 0.2$ ,这里就不分成两步,一步KO,目的是一次前向计算就算完,避免训练过慢。

最后,采用的损失函数也跟第一篇的不一样,这里用的是hinge loss,详细的请看论文。

Unlabeled Data Usage

还是下面这幅图,这里讨论了unlabeled数据的利用。

在PET利用到unlabeled数据的有三个地方:

  • 第一处:PET的第二步,用PVPs对unlabeled数据进行知识蒸馏,给数据打上soft label,然后第三步利用这些软标签训练一个模型;
  • 第二处:PET的第一步,假如用的是iPET的话,每一个generation都会把部分的无标签数据打上标签,加入到PVP的训练集;
  • 第三处:PET的第一步,假如采用的是Auxiliary Language Modelling辅助训练,也会引入无标签数据。

首先,讨论上面的第一点,究竟能不能直接用PET训练的第一步的PVPs来做预测,这样就不用给unlabeled数据打软标签了(因为虽然说unlabeled数据比labled数据容易获得,但某些场景下unlabeled数据也有可能是拿不到的),答案是可以的,大家看下表的倒数两列,发现不用PET训练的第二、第三步,直接采用第一步训练好的PVPs来做下游应用的预测,效果也是OK的。

只不过,这样做的话,你应用于下游任务的时候就是一堆PVP模型,而不是单一个模型了,这样对轻量部署不是很友好

还讨论了上面的第二处,发现iPET训练过程中,每一个generation从unlabeled数据中挑选部分加入到PVP的训练集,能让PVP收敛更快,减少不稳定性。

Model Type

不同预训练模型的影响,像BERT这种双向的语言模型会比GPT这种单向的要好,因为假如采用的是单向的语言模型,那么pattern的下划线__部分只能放在句子末尾进行预测。