Contents

对比自监督表征学习的发展——从 CV 到 NLP

对比学习+自监督学习这套范式已经在 CV 和 NLP 领域得到广泛应用,通过这套范式预训练的表征模型为诸多下游任务带来了效果提升。本文将介绍对比自监督表征学习的几个经典工作,从中我们可以了解到迭代思路以及各方法之间异同。

1. 前言

由于文章标题有些拗口,为了避免出现“这几个词都认识,但拼在一起就看不懂”。我们在进入正题之前,先把几个概念以及背景做个简要说明:

什么是对比学习?

👉 对比学习是指一种学习目标,简单来说就是希望模型能够将相同和不同的样本区分开来。

https://amitness.com/images/simclr-contrastive-learning.png

https://amitness.com/images/simclr-contrastive-learning.png

什么是自监督表征学习?

👉 表征学习通过设计合理的学习目标来让模型学习到任务所需特征表示,有时表征学习跟特定下游任务联合优化,也即端到端方式。而自监督表征学习,就是在无监督数据上设计一个学习任务来进行表征学习,其中最富盛名的当属 BERT 模型,其在海量无标注自然文本上通过预测掩盖词来优化表征模型。大量学界和业界经验已经验证这种自监督表征学习的预训练,再结合特定下游任务上微调训练,效果提升较为显著。

什么是对比学习+自监督表征学习?

👉 简单来说就是自监督表征学习中设计的那个学习目标是一个对比学习任务。那随之而来的问题是这个对比学习任务的数据从哪来?换而言之,如何在无监督数据集上构造出上述对比学习任务中的正样本对(相同)和负样本对(不同)?这个问题就跟具体应用场景相关了,比如计算机视觉(CV)领域可通过图像变换操作来构造出正样本对,自然语言处理(NLP)领域可通过同义词替换来构造出正样本对。

总体来看,通过设计对比学习任务,然后在无监督数据集上进行模型的自监督学习,最终可得到强大的表征模型,诸多下游任务将从中受益。本文我们将介绍 CV 和 NLP 领域几个经典的对比自监督表征学习方法。

2. SimCLR

2.1 概述

在大规模图像分类数据集上有监督的训练 CNN 系列模型,是此前 CV 社区中较为经典的表征学习方法。这里表征学习方法由于对监督数据集的依赖,使得模型规模扩展以及泛化能力受到制约。虽然同时期在 NLP 社区,以 BERT 模型为代表的自监督学习方法已经风靡,很多下游任务效果从预训练自监督模型得到极大提升。但 CV 社区中基于无监督/自监督的表征学习方法却进展较为缓慢,这一局面随着 SimCLR 的问世正在被逐渐打破。

SimCLR1 是较为通用的自监督表征学习范式/框架,它不对模型结构有任何假设,只需要提供无标签的图片数据就可以基于对比学习目标来训练优化表征模型。

./images/simclr-general-architecture.png
SimCLR Framework (https://amitness.com/images/simclr-general-architecture.png)

SimCLR 的核心思路也很简单,一幅图像经过两次随机图像变换操作后将得到两个副本 $(x_i, x_j)$,可以认为这两个副本就是正样本对,然后将它们送入一个共享的表征模型(Encoder)得到两个隐含向量表示 $(h_i, h_j)$,再经过 MLP 对它们非线性变换后得到 $(z_i, z_j)$,最终的优化目标是最大化正样本对之间的匹配概率。

2.2 方法

SimCLR 思路虽然简单,不过其中有几个关键部分,需要详细讨论下:

  1. 图像随机变换的数据增强操作具体什么,又能起到多大用处
  2. 我们的目标是训练表征模型(Encoder),那在训练中引入非线形变换 MLP 又能起到什么作用
  3. 训练时优化目标是最大化正样本对之间的匹配概率,那具体怎样做的
  4. 模型训练过程有哪些超参会对效果有较大影响,又有哪些调参经验可借鉴

2.2.1 数据增强

这里数据增强的目的就是构造既有差异性又保持语义一致的正样本对,论文采用了几何空间变换(如裁剪、翻转、缩放等)和外观变换(如亮度调节、高斯模糊等)两类数据增强手段,一个图像将随机使用变换操作来得到两个副本。论文指出数据增强手段对于优化表征模型具有重要意义,并系统性研究了变换组合对效果的影响:

./images/simclr_1.png
各种数据增强策略的两两组合效果

两种变换组合的效果要比单独使用一种变换要好,其中随机裁剪+颜色变换效果最好。论文还进一步分析了仅使用随机裁剪变换效果不佳的原因,随机裁剪后得到图片块颜色分布十分接近,因此正样本对识别较为容易,使得对比学习任务简单了很多。

2.2.2 表征模型和非线性变换

SimCLR 没有对表征模型有任何假设,该方法既可以用于 CNN 类模型,也可以用于 Transformer 类模型。论文中实验的表征模型采用了经典的 CNN 架构 ResNet-50 模型,并对不同规模大小的模型进行了表征学习效果对比,指出当 ResNet-50 放大 4 倍后自监督对比学习效果可以跟有监督学习的 ResNet-50 打平,而且自监督对比学习方法可以从模型规模放大中受益更多。

随着 ResNet 模型规模不断放大到 4 倍(宽度放大),自监督方法 R50 跟有监督方法 Sup. R50 之间的差距逐渐缩小,并且 R50(4x) 的 Top-1 分类准确率几乎可以追平 Sup. R50。

SimCLR 训练时会在表征模型后接一个非线性 MLP 变换层,而其它下游任务使用时则直接用表征模型的输出结果即可。这样做的目的从直观上看,由于对比学习预训练和具体下游任务之间存在一定差异,所以在预训练时应该为对比学习任务引入一个特定参数层。论文中还对比了不加变换、添加线性变换、添加非线性变换三种策略下,对表征学习效果的影响,其中非线性变换效果最好(比线性变换高出 +3%,比不加变换高出 +10%)。

2.2.3 训练优化目标

SimCLR 并没有采用显式负采样方式来构造训练负样本,而是在训练时从 batch 随机采样负样本的。假定输入数据 batch 大小为 $N$,在经过数据增强处理后 batch 内一共有 $2N$ 个样本,那么对于某个正样本对 $(z_i, z_j)$ 来说 batch 内其它样本共计 $2*(N-1)$ 个都是负样本,损失函数如下:

$$ l(i, j) = -log\frac{exp(sim(z_i, z_j)/\tau)}{ \sum_{k=1}^{2N} 1_{[k!= i]} exp(sim(z_i, z_k)/\tau)} $$

最终将所有正样本对的损失累加构成最终的优化目标,论文中将该方法称之为 NT-Xent (the normalized temperature-scaled cross entropy loss):

$$ L = \frac{1}{ 2{N} } \sum_{k=1}^{N} [l(2k-1, 2k) + l(2k, 2k-1)] $$

这里假设 $2N$ 个样本中正样本对依次相邻(也即 $2k-1$ 和 $2k$ 是一对正样本),并且损失函数 $l(i,j)$ 还要反转再计算一次。

2.2.4 调参经验

损失函数中的温度系数 $\tau$ 以及相似性度量函数 $sim$ 是否对向量 L2 规范化,一起控制着学习时的样本权重,适当调节更利于模型从难负样本中学习。

可见对向量 L2 规范化(也即用 cosine 而非 dot product)并且采用合适的温度系数,在下游图像分类任务上 Top-1 准确率可达 64.4。而不采用 L2 规范化时,虽然对比学习训练效果更好,但下游任务上表现较差。

此外由于训练时负样本来自于 batch 内,所以 batch size 大小对模型训练会有较大影响。论文指出当训练步数较小时,batch size 越大则学习效果越好,不过随着训练步数不断增加这种差距就逐渐减小了。

2.3 效果

由于不同表征模型结构不同,而且表征效果好坏需要各种下游任务来反映,为了公平且全面的评估表征模型效果,论文采用了三种评估方式。

线性分类器,将表征学习得到的向量表示输入一个线性分类器中进行训练,也即固定住表征模型,仅训练线性分类器,然后观察分类效果好坏。

跟自监督方法相比,对于不同模型架构 SimCLR 方法都有一定程度的提升,并且 SimCLR(4x) 效果接近有监督的 ResNet-50。

少量监督样本微调训练,也即通过提供少量标签样本给表征模型来衡量表征模型的预训练效果。

有监督模型 ResNet-50 由于从零开始训练,因此少量标签训练时效果较差,但 SimCLR 进行自监督预训练后在少标签微调训练时效果依然较好。

广泛数据集上的迁移学习能力,验证模型在其它图像分类数据集上的基于线性分类和微调训练两种方式的迁移学习效果。

./images/simclr_7.png

跟监督方法相比,在其它图像分类数据集上的效果,有的 SimCLR 好些,有的监督方法要好些,并不存在压倒性优势。

2.4 小结

SimCLR 利用数据增强手段构造正样本对,再结合对比学习优化目标来训练图像表征模型,其最优的自监督预训练模型在线性分类评测任务中跟有监督 ResNet-50 几乎打平。验证了仅依靠自监督方法同样可以预训练表征模型这一思路,也为后续许多工作开辟一个新方向。更多关于 SimCLR 内容,可以参考 👉 教程2以及官方代码 👉 仓库3

3. ConSERT

3.1 概述

对比自监督学习方法在 CV 领域取得进展后,逐渐有研究人员开始将其引入到 NLP 领域的表征学习问题中。ConSERT4 对 BERT 为代表的 NLP 表征学习方法现存问题进行了分析,由于预训练跟下游任务的目标不一致,因此直接将预训练模型用于检索、聚类、去重等语义度量任务时,效果极不理想。

./images/consert_1.png
BERT VS. ConSERT-BERT

Info
左图是原始预训练模型在 STS 数据集上的效果,右图是经过 ConSERT 微调后模型在 STS 的效果;预测分数和 STS 真实分数构成的散点图,越正相关越好,因此可见预训练直接用于语义度量任务效果较差。已经有较多研究者指出该问题,并将此现象称为坍缩问题(collapse),从左图可见不论 gold score 等于 0 还是等于 5,相应的 predicted cosine 都接近 1.0,也即在向量空间中不同文本都聚集在较近的空间中,难以根据向量距离来划分语义关系。

要解决该问题,一种思路是借助于有监督语义相似数据集对预训练模型进行微调训练,然后再用于语义度量任务,这里有监督数据可能来自开源外部数据或者特定业务的数据,具体可以参考 Sentence-BERT5 的做法。不过大多数场景下,有监督数据获取困难、标注成本较高,此时可以借助无监督方法来优化模型,虽然效果跟有监督方法比略差一些,但也是一种低成本普适性强的方案。

ConSERT 方法主要受到 SimCLR 的启发,背后的动机都是:好的表征模型应该能够将相同的东西辨别出来,同时也可以将不同的东西区分开来。方法架构如下:

./images/consert_2.png
ConSERT Framework

无监督文本数据经过数据增强手段得到正样本对,然后用 BERT-like 模型抽取文本的向量表示,最终利用对比学习损失函数对其进行训练优化。

3.2 方法

ConSERT 方法跟 SimCLR 类似,同样有以下几个关键部分组成:

  • 数据增强,作用于 token embedding 层来得到正样本对
  • 表征模型,采用 like-BERT 模型来抽取文本的向量表示,并且是共享双塔结构
  • 优化目标采用无监督+有监督,无监督学习采用了对比学习,有监督基于 NLI 数据集进行,并探索了有监督和无监督的各种组合方式

3.2.1 数据增强

由于 CV 中数据是连续型的,数据增强手段可以直接作用于原始图片数据。而 NLP 中的文本数据是离散的,并且局部数据的微小变化就可能导致整个文本语义发生巨大变化,因此直接作用于原始文本数据的增强手段会存在问题。ConSERT 论文采用了作用于 token embedding 层的数据增强手段,具体有如下几种:

./images/consert_3.png
数据增强策略图示

左图是未增强的情况,右图是各种数据增强方法的示意图;adversarial 方式对整个 embedding 矩阵添加了对抗噪音;shuffling 方式则随机把矩阵行序打乱;cutoff 方式有两种,一种基于行,一种基于列,会将某些行列置为零;dropout 则对整个矩阵中任意元素随机置零;

论文对各种数据增强方法进行了两两组合实验:

./images/consert_4.png
两两组合实验

Note
注意上图是非对角线对称的,因为行是第一个应用的增强策略,列是第二个应用的策略,也即对称位置应用的增强策略顺序不同;在所有增强策略中 Shuffle 和 Token Cutoff 表现最好,但从两策略组合情况来看却是 Shuffle 和 Feature Cutoff 组合效果最优。值得注意的是 None-None 组合也即没有任何增强策略的情况,此时的评测效果 63.84 已经比原始 BERT 的 53.86 高出近 10%,说明训练过程中仅仅是把不相同的样本推的更远也是有收益的。

3.2.2 表征模型

不同于 SimCLR,ConSERT 中使用的 like-BERT 表征模型并非从随机初始化开始训练,而是基于已经在大规模开放预料上预训练好的模型进行微调训练。因为 ConSERT 一开始的出发点就是解决预训练模型的坍缩问题,并且基于已有预训练结果进行微调,所需要的数据和算力都极大的降低。

3.2.3 优化目标

ConSERT 除了基于对比学习的无监督任务 $L_{con}$,还通过 NLI 数据集引入了有监督分类任务 $L_{ce}$。具体来说,在得到文本的向量表示之后,会输入到一个线性分类层中,预测属于 contradiction, entailment, neutral 中的哪个类别。

$$ L_{con}(i,j) = -log\frac{exp(sim(r_i, r_j)/\tau)}{ \sum_{k=1}^{2N} 1_{[k!= i]} exp(sim(r_i, r_k)/\tau)} \

L_{ce} = \text{CrossEntropy}(W*\text{Concat}(r_1, r_2, |r_1 - r_2|) + b, \ y) $$

论文中对无监督和有监督训练尝试了三种组合方式:

  • 联合优化,$L_{joint}=L_{ce}+\alpha L_{con}$
  • 先有监督再无监督,也即先优化 $L_{ce}$,再以该训练权重为起点来优化 $L_{con}$
  • 先联合优化再无监督,也即先优化 $L_{joint}$,再以该训练权重为起点来优化 $L_{con}$

各种训练组合策略的效果如下:

./images/consert_5.png

各训练策略效果:joint < sup-unsup < joint-unsup,可见模型即便已经利用有监督数据训练后,依然可以从无监督训练中受益(注意这里有监督指的是 NLI 数据集,训练中没有使用任何 STS 评测集的标签数据)。

3.2.4 调参经验

温度系数 $\tau$ 在对比学习损失函数中起到重要的作用,它用来调节预测分布的平滑程度,$\tau$ 越大则分布越平滑,反之越小则分布越陡峭。

论文实验指出温度系数对实验效果影响很大,太大或太小都不行,论文中使用的最佳取值为 0.1。

在 SimCLR 论文中研究了训练 batch 大小对收敛速度以及评测效果的影响,同样在 ConSERT 中发现类似的结论:更大的 batch 由于会引入更多的负样本,因此会加速模型收敛,并且效果会有一定程度的提升。

./images/consert_10.png
Batch 大小实验

3.3 效果

论文开篇提到预训练 like-BERT 模型具有坍缩问题,文本中的高频词汇会主导整个文本的向量表示,为此论文比较了原始预训练模型和经过对比学习调优后的模型在剔除高频词时的影响:

ConSERT 和 BERT 剔除 Top-50 以内高频词时表现是不同的:ConSERT 效果在下降,说明剔除高频词损失了信息;而 BERT 效果反而在上升,说明向量表示受高频词主导。

论文对比了当时先进的无监督文本表征模型,ConSERT 不改变或增加模型结构的同时在效果上超越了 BERT-flow 模型:

论文还验证了 ConSERT 方法在少量样本时(无监督和有监督都考虑),对训练效果的影响:

可以看到仅提供 1000 训练样本,模型在无监督和有监督方式就可以达到全量数据的效果。这个在实际数据稀缺的业务场景还是很有用的,只需要拿到千级别的无监督数据就可以对预训练模型进行微调。

3.4 小结

ConSERT 整体学习框架借鉴了 SimCLR1,不同之处在于针对 NLP 文本数据设计了特定的数据增强方法,并且其动机在于解决 BERT 预训练模型二次微调情形。此外 ConSERT 还引入了 NLI 监督数据集,并尝试了各种有监督和无监督多任务训练的组合方式。从整体效果上看,在句向量表征任务 STS 上超过了当时的 SOTA 模型 BERT-flow,而且 ConSERT 没有引入额外模型结构,只是一种训练方式,同时在小样本数据集上表现优异。更多关于 ConSERT 内容可以参考 👉 教程6以及官方代码 👉 仓库7

4. SimCSE

4.1 概述

SimCSE8 跟 ConSERT4 是同期工作,其动机和方法较为相似,整体感觉 SimCSE 更加简洁而且效果也不错。二者差异较大的地方主要有:

  • SimCSE 采用的数据增强策略只有 dropout,并且是整个 encoder 中的 dropout,而非 ConSERT 仅针对 embedding 层
  • SimCSE 同样使用了 NLI 监督数据,不同于 ConSERT 对 NLI 进行分类,SimCSE 将 NLI 数据扩展为含有难负样本的 triplet 形式
  • SimCSE 和 ConSERT 使用的无监督预料数据不同,前者使用了 100w 英文维基百科数据,后者使用了 STS 数据集的语料数据

4.2 方法

SimCSE 介绍了无监督和有监督(基于 NLI 数据集)两种学习范式,二者都是基于对比学习目标来训练的:

./images/simcse_1.png
SimCSE Framework

Info
图(a)是无监督方式,一段文本过两次 BERT 编码表示得到正样本对;图(b)是有监督方式,用 NLI 中 entailment 样本对作为正例,用 contradiction 样本对作为难负例;

整体上来看跟 ConSERT 类似,这里就不再赘述相关细节。论文对方法中的数据增强以及优化目标等关键部分也做了充分的对比实验。

先来看数据增强部分,论文指出 NLP 数据是离散的,不像 CV 数据可以利用随机裁剪、变换等增强手段。论文对比了各种字面维度的增强方式:

./images/simcse_2.png
字面增强对比实验

可见字面增强方式并没有 SimCSE 采用的 dropout 效果好,这主要由于字面数据被改动后往往伴随着语义的变化,也即构造的样本对可能是伪正例。

论文还对优化目标进行了比较实验:

./images/simcse_3.png
优化目标对比实验

SimCSE 对比学习优化目标具有明显的优势,并且双塔结构共享 BERT 编码器比不共享效果要好。

论文对可用的各种监督数据集进行了对比,发现 NLI 数据集效果较好,主要由于该数据集质量较高(正样本对之间的词汇重叠度较低,也即正例较难):

./images/simcse_4.png
监督任务&数据对比实验

4.3 效果

SimCSE 在无监督和有监督训练方式下效果都有较大提升:

./images/simcse_5.png

无监督 BERT-base 72.05% -> 76.25%,有监督 BERT-base 79.39% -> 81.57%。

4.4 小结

SimCSE 思路十分简单,仅使用 dropout 进行数据增强,并且巧妙的将有监督 NLI 数据集构造为正样本对和难负样本对,使得有监督和无监督都统一到对比学习范式之下。更多内容参见 SimCSE 代码仓库9。尽管在当时 SimCSE 也取得了 SOTA 效果,但随后有研究人员对该方法进行了升级,提出了 ESimCSE10,在 STS 任务上比 SimCSE 高出 2.02%。ESimCSE 主要有两个创新点:一个是发现 SimCSE 仅靠 dropout 数据增强,正样本对由于长度相同,这个信息可能会引导模型倾向于认为长度相似的就是正例,为此论文引入词汇重复的增强手段来弥补该缺陷;另一个创新在于,论文借鉴了 CV 领域动量对比(momentum contrast)的思路,在训练过程中利用另外一个动量更新的表征模型来产生更多负样本。关于 ESimCSE 介绍比较简单,大家要感兴趣就去肝论文吧 🌱 🌱 🌱

参考资料


  1. SimCLR 论文:https://arxiv.org/pdf/2002.05709.pdf ↩︎ ↩︎

  2. SimCLR 解读:https://amitness.com/2020/03/illustrated-simclr/ ↩︎

  3. SimCLR 代码:https://github.com/google-research/simclr ↩︎

  4. ConSERT 论文:https://arxiv.org/pdf/2105.11741.pdf ↩︎ ↩︎

  5. Sentence-BERT 论文:https://arxiv.org/pdf/1908.10084.pdf ↩︎

  6. ConSERT 解读:https://tech.meituan.com/2021/06/03/acl-2021-consert-bert.html ↩︎

  7. ConSERT 代码:https://github.com/yym6472/ConSERT ↩︎

  8. SimCSE 论文:https://arxiv.org/pdf/2104.08821.pdf ↩︎

  9. SimCSE 代码:https://github.com/princeton-nlp/SimCSE ↩︎

  10. ESimCSE 论文:https://arxiv.org/pdf/2109.04380.pdf ↩︎