基本原理
先从无监督表示学习讲起。表示学习的目标是为输入 x 学习一个表示 z,最好的情况就是知道 z 就能知道 x。这就引出了无监督表示学习的第一种做法:生成式自监督学习。比如还原句子中被mask的字,或者还原图像中被mask的像素。
但这种方式的前提需要假设被mask的元素是相互独立的,不符合真实情况。这句话是什么意思呢,下面会用举例1来说明一下。
另一方面,研究者们也质疑如此细粒度的还原是否真正必要。这句话的意思应该是是否需要模型有能够看到上下文就能对某个字精确预测的能力,才算模型真正理解了这些词,这是否有必要。(我认为还是有必要的,不然你还有什么更好的方法来学习词的表示吗?或者是能够提出一种用在MLM任务上的对比学习)以举例2再做进一步解释。
举例1
比如预训练时输入:“自然[MASK][MASK]处理”,目标函数为p(语|自然处理)·p(言|自然处理),实际实现是用交叉熵做的,最小化交叉熵loss,即让模型可以预测出被MASK位置的两个字是“语言”,等价于最大化上面提到的概率p。
但这没有考虑“语“、”言”这两个字之间的关系,考虑上下文信息的化,实际应该是p(语|自然言处理)·p(言|自然语处理),但这没法实现,因为你同时对“语言”做了MASK,又要在预测“语”的时候,可以看见“言”,又或是在预测“言”的时,可以看见“语”,这是做不到的。
而只考虑上文信息的话,目标函数为p(语|自然)·p(言|自然语),即先预测出“语”,再预测“言”。这样确实可以解决相互独立的问题,但是却没法利用下文信息。
因此XLNET提出了一种既能解决相互独立问题,又利用了上下文信息的方法,这里就不展开讲了。
举例2
假如有人让你凭空画一张一美元,你可能只能画成这样:
而如果给你一张美元照着临摹,可能还画的好看点,比如这样:
所以说我们记住的事物特征,不一定是像素级别的,而是更高维度的。更具体来说,比如用编码去做分类任务,我们不需要知道每个数据的细节,只要抓住每个类别的主要特征,自然就能把他们分开了:
不过感觉这个例子似乎没解释上面提到的那句话,那句话说的是MLM任务,而例子是分类任务。
最大化互信息
对比学习到底在干什么
前文有述,对比学习在做特征表示相似性计算时,要先对表示向量做L2正则,之后再做点积计算,或者直接采用Cosine相似性,为什么要这么做呢?现在很多研究表明,把特征表示 g(f(x)) 映射到单位超球面上,有很多好处。这里有两个关键,一个是单位长度,一个是超球面。首先,相比带有向量长度信息的点积,在去掉长度信息后的单位长度向量 g(f(x)) / || g(f(x)) || 2 上操作,能增加深度学习模型的训练稳定性。另外,当表示向量 g(f(x)) 被映射到超球面上,如果模型的表示能力足够好,能够把相似的例子(比如带有相同类标号的数据)在超球面上聚集到较近区域,那么很容易使用线性分类器把某类和其他类区分开(参考上图)。在对比学习模型里,对学习到的表示向量 g(f(x)) 进行L2正则,然后采用Cosine相似性,就等价于将表示向量 g(f(x)) 投影到了单位超球面上进行相互比较。很多对比学习模型相关实验也证明了:对表示向量进行L2正则能提升模型效果。这是为何一般要对表示向量进行L2正则操作的原因。
那么,好的对比学习系统,应该具备怎么的潜在能力呢?论文“Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere”对这个问题进行了探讨。它提出了好的对比学习系统应该具备两个属性:Alignment和Uniformity(参考上图)。所谓“Alignment”,指的是相似的例子,也就是正例,映射到单位超球面后,应该有接近的特征,也即是说,在超球面上距离比较近;所谓“Uniformity”,指的是系统应该倾向在特征里保留尽可能多的信息,这等价于使得映射到单位超球面的特征,尽可能均匀地分布在球面上,分布得越均匀,意味着保留得信息越充分。乍一看不好理解“分布均匀和保留信息”两者之间得关联,其实道理很简单:分布均匀意味着两两有差异,也意味着各自保有独有信息,这代表信息保留充分。
Uniformity特性的极端反例,是所有数据映射到单位超球面同一个点上,这极度违背了Uniformity原则,因为这代表所有数据的信息都被丢掉了,体现为数据极度不均匀得分布到了超球面得同一个点上。也就是说,所有数据经过特征表示映射过 g(f(x)) 后,都收敛到了同一个常数解,一般将这种异常情况称为模型塌陷(Collapse)。如果对比学习的损失函数定义不好,非常容易出现模型塌陷的情形(参考上图)。
在这些背景信息下,我们再重新审视类似SimCLR结构的对比学习模型,看看它是在干什么。可以看到,对比学习模型结构里的上下两个分枝,首先会将正例对 <xi, xi+> 或者 <xi, xi->,通过两次非线性映射 g(f(x)),将训练数据投影到单位超球面上。然后通过体现优化目标的InfoNCE损失函数,来调整这些映射到单位超球面上的点之间的拓扑关系,希望能将正例在超球面上距离拉近,负例在超球面上,相互之间推远。那么InfoNCE又是怎么达成这一点的呢?
从上面列出的InfoNCE公式可以看出,分子 S(zi, zi+) 部分体现出“Alignment”属性,它鼓励正例在单位超球面的距离越近越好;而分母里的 S(zi, zj) 负例,则体现了“Uniformity”属性,它鼓励任意两对负例,在单位超球面上,两两距离越远越好,这种实例两两之间的推力,会尽量让特征均匀得分布在单位超球面上,保留尽可能多的有用信息。InfoNCE其实是在Alignment和Uniformity之间寻找折中点,因为如果只有Alignment特性,很明显,模型会快速塌陷到常数解。可以说,所有在损失函数中采用负例的对比学习方法,都是靠负例的Uniformity特性,来防止模型塌陷的,这包括SimCLR系列及Moco系列等很多典型对比学习模型。
上图更形象地说明了这一点,只不过没有将数据画在单位超球面上,如果将上图右侧部分,想象成在单位超球面上的正例相互吸引,负例互斥,就是InfoNCE思想的形象表达。
如果你足够细心,会发现InfoNCE损失函数里吗,有个神秘的温度超参 T。那么,这个温度超参T有什么作用呢?这其实是个好问题。目前很多实验表明,对比学习模型要想效果比较好,温度超参 T 要设置一个比较小的值,一般设置为0.1或者0.2。问题是:将这个超参设大或设小,它是如何影响模型优化过程的呢?目前的研究表明,InfoNCE是个能感知负例难度的损失函数,而之所以能做到这点,主要依赖超参。
什么是有难度的负例?什么是容易的负例呢?我们知道,对比学习里,对于某个数据 xi,除了它的唯一正例 xi+ 外,所有其他数据都是负例。但是,这些负例,有些和 xi 比较像,有些则差异比较大,比如假设 xi 是张关于狗的图片,那么另外一张关于狗的图片,或者一张狼的图片,就是有难度的负例,而如果是一张关于人的或者树的图片,则比较好的和 xi 区分开,是容易例子。如果经过 g(f(x)) 将数据映射到单位超球面后,根据Alignment原则,一般来说,比较像的、有难度的负例在超球面上距离 xi 比较近,而比较容易区分的负例,则在超球面上距离 xi 比较远。所以说,对于例子 xi 来说,在超球面上距离 xi 越近,则这个负例越难和 xi 区分,距离 xi 越远,则这个负例越容易和 xi 区分。
总体而言,温度参数 T 起到如下作用:温度参数会将模型更新到的重点,聚焦到有难度的负例,并对它们做相应的惩罚,难度越大,也即是与 xi 距离越近,则分配到的惩罚越多。所谓惩罚,就是在模型优化过程中,将这些负例从 xi 身边推开,是一种斥力。也就是说,距离 xi 越近的负例,温度超参会赋予更多的排斥力,将它从 xi 推远。而如果温度超参 T 设置得越小,则InfoNCE分配惩罚项得范围越窄,更聚焦在距离 xi 比较近的较小范围内的负例里。同时,这些被覆盖到的负例,因为数量少了,所以,每个负例,会承担更大的斥力(参考上图左边子图)。极端情况下,假设温度系数趋近于0,那么InfoNCE基本退化为Triplet,也就是说,有效负例只会聚焦在距离 xi 最近的一到两个最难的实例。从上述分析,可以看出:温度超参越小,更倾向把超球面
想法:对比学习中,可能存在两张都是狗的图片,却被当成了负例,即存在噪音,因此可以把文章、文章的标签作为Aug1、Aug2,并从数据集中挑选标签不一样的数据作为负例,这样就可以去除噪音数据。最后通过对比学习训练得到的模型,会学到文章和文章的标签之间的关系,即对标签来说,融合了很多信息,这些信息包括所有该标签下的文章,也就是说通过对比学习学到的label embedding信息更全,也和当前数据集关联度更高。之后可以将这个学到的label embedding再用于和文章表示进行attention交互,走label attention这一套方法。
基于负例的对比学习:Batch之外
在前文,我们介绍了典型的基于负例的对比学习模型SimCLR,它将Batch内数据作为负例。很多实验证明了:在基于负例的对比学习中,负例数量越多,对比学习模型效果越好。而算力受限原因,我们又不可能无限方法Batch Size,那么很自然的一个想法就是:我们选择负例的时候,不再局限于在Batch内寻找负例,而是在整个无标注训练数据集合内,随机选择任意大小的数据,来作为模型训练的负例。这个想法比较符合直觉,看着也比较简单,但是实际做起来并不容易。
这部分内容,我们选择Moco V2,来作为在整个训练集合内选择负例的典型做法。其实这个做法主要是Moco 提出的,Moco V2吸收了SimCLR的Projector结构,以及更具难度的图像增强方法之后,针对Moco 的改进版本,但是效果比Moco有明显的提升,所以我们以Moco V2来讲解。
非对称结构:模型不坍塌之谜
上文有述,在常见的基于负例的对比学习方法种,负例有着举足轻重的作用,它起到了将投影到超球体平面的各个实例对应的表示向量相互推开,使得图像对应的表示向量在超球体平面均匀分布的作用,以此来避免表示学习方法模型坍塌的问题。