对比学习

对比学习

对比学习

1. 什么是对比学习

对比学习是一种机器学习技术,通过训练模型哪些数据点相似或不同,来学习没有标签的数据集的一般特征。

Contrastive learning is a machine learning technique used to learn the general features of a dataset without labels by teaching the model which data points are similar or different. [1]

例如,在一个新的环境中,有两只猫和一只狗,此时你并不认识猫和狗,即并没有猫与狗的标签。但是你会发现,相比于狗来说,两只猫之间的相似度更高。即在你不理解标签情况下,通过对比的方式得知两只猫更相似,例如我们下意识发现两只猫的耳朵都是竖着的,而狗的耳朵是下垂的;或者我们可以发现狗身上没有斑纹而猫身上的斑纹比较多。通过对比的方式让我们可以在更高级的特征方面理解图像 (High-level features),例如在原本的有监督任务中,我们仅仅是通过大规模样本的数据训练一个表征的模型,这个模型只关注于在样本下猫的特征,而缺少了关注类之间不同的高级特征。

猫与猫相似,而与狗并不相似

本质上,对比学习允许我们的机器学习模型做同样的事情。在进行分类或分割等任务之前,它会查看哪些数据点是“相似的”和“不同的”,以便了解数据的更高层次的特征。

为什么对比学习如此强大?因为我们可以在无任何标注或标签的情况下,训练一个模型来学习数据的许多特性,这也是一个术语自监督学习,对比学习是一种自我监督学习的范式。

为什么我们需要对比学习?或者说需要无监督、自监督或半监督学习?绝大多数情况下,例如人脸数据集,或者医学影像数据集,这些数据集都是大规模的数据集,我们往往无法,或者没有精力、代价去将全部的数据集都作标注。通过网络爬虫等手段我们可以很快的采集相当数量的人脸数据集,然而将相当数量的图片做上标注在时间上是困难的;医学影像数据往往需要专业人士花费无数的时间来手动进行分类,分割。因此我们是否可以通过对比学习,在数据仅有一部分标注的情况下,依然能使模型学习到相当好的效果。

2. 对比学习起什么作用?

先举一个例子,是Epstein在2016年做的一个实验,要求实验人员尽可能绘制一张美元的钞票。下图左侧是凭借之前的记忆绘制的美元,右图为给了实验人员一张真实的美元货币对比绘制的。可见,在有没有真实钞票作为对照物的情况下,美元的绘制结果是不一样的。

没有真实美元作为参照物和有真实美元作为参照物情况下的简笔画

最终实验的结果想证明的是,人们很多次的见过美元的照片,但并没有完完整整地记住它的细节。事实上,我们仅保留了足够的High-level特征,便可以用于区别其他的物体。而目前有监督学习分类方法常常关注于像素级细节的表示学习上,是否可以构建一个不关注于像素级别的表示学习方法,仅靠编码高级的特征即可有效地区分不同的物体。

当代的自监督学习的方法大致可以分为两类,一种是生成式的,另一种是对比式的。

自监督学习两种方法,生成式与对比式

生成式的网络,例如GAN方法,通过无监督学习其中的语义特征,生成逼真的模型;或者采用无监督方式进行模型的解耦合,映射到特殊的空间中。通常该方法的损失函数多关注于像素级的损耗。例如在生成式方法解耦合过程中,常常为了保持像素的一致性,采用 \mathcal{L}_{1} 损失函数:

\mathcal{L}_{G}=E{p_{data}}[ \begin{Vmatrix} x_{1}-x_{0} \end{Vmatrix}_{1}]

其中 x_{1}x_{0} 均为图像,可能均为生成式图像,也可能是一个是生成式,一个为对照式。或者常常在生成视频时为了保证图像的平滑性,对时间序列生成图像进行\mathcal{L}_{1}损失:

\mathcal{L}_{Temp} = \sum_{t=1}^{N}\begin{Vmatrix} x_{t-1}-x_{t} \end{Vmatrix}_{1}

不难看出,这些多是关注于像素级的损耗,而非高级的特征区别。

对比学习,则是通过对比肯定与否定的例子在学习模型的表达。

关注点 [2]:

  • 通过对比学习训练的无标签的ImageNet数据和评估线性分类器超过了有监督监督AlexNet的准确性。与有监督学习相比,当从标记数据学习时,它们也表现出显著的数据效率。(Data-Efficient CPC, Hénaff et al., 2019)
  • 对比预训练在ImageNet成功地迁移到其他下游任务,并优于有监督的预训练对手。(MoCo, He et al., 2019)

它们不同于更传统的生成式表征学习方法,后者侧重于像素空间的重构误差来学习表征。

  • 使用像素级损耗会导致这种方法过于关注基于像素的细节,而不是更抽象的潜在因素。
  • 基于像素的目标通常假定每个像素之间是独立的,从而降低了它们建模相关性或复杂结构的能力。

3. 对比学习的一般表达

对比学习的一般表达方式,对于任何的数据点 x ,对比学习方法目的在于学习一个编码器 f

score(f(x),f(x^{+}))>>score(f(x),f(x^{-}))

其中 x^{+} 是与 x 相似的数据点,被称为正样本x^{-} 是与x不相似的数据点,被称为负样本score 是度量两个特征之间相似性的函数。

为了优化这一特性,我们可以构造一个能正确分类正样本和负样本的softmax分类器。这将鼓励分数函数将较大的值分配给正的例子,将较小的值分配给负的例子:

\mathcal{L}_{N}=-\mathbb{E}_{X}[\log \frac{\exp(f(x)^T f(x^+))}{\exp(f(x)^T f(x^+))+\sum_{j=1}^{N-1} \exp(f(x)^T f(x_{j}))}]

分母项由一个正样本和 N-1 个负样本组成。这里,我们使用点积作为分数函数:

score(f(x),f(x^+))=f(x)^T f(x^+)

这是N类softmax分类器常见的交叉熵损失,在对比学习文献中通常称为InfoNCE损失。在以往的研究中,它被称为n-pair lossranking-based NCE

4. 对比学习在人脸生成中的应用

CVPR 2020 Oral*一篇人脸生成的文章为例,该方法也称为DiscoFaceGAN

Deng, Yu, et al. "Disentangled and controllable face image generation via 3d imitative-contrastive learning." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020.

仅从实现的角度看这篇文章,不讨论其优缺点以及该领域的发展情况,该方法的整体框图如下所示:

DiscoFaceGAN的Framework

右边绿色框内的即是其的生成框架,通过随机生成的噪声 z_{1-5} ,经过4个解码器,映射为4个参数: \alpha,\beta,\gamma,\theta ,分别代表控制生成身份、表情、光照、姿态的变量,这些变量与3DMM模型生成3D人脸的参数有关, \varepsilon 是一个噪声变量,用于增加生成人脸的多样性。将这5个参数: \alpha,\beta,\gamma,\theta,\varepsilon 输入到生成器中,即可生成一个逼真的人脸。

如何训练这个生成器是一个问题,先提及一下编码器 V_{1-4} 的训练,从人脸数据库中提取各个人脸图片,使用一个R-Net网络提取模型的3DMM参数,用这些参数分别训练4个自编码网络,然后保留四个网络的解码器部分,这样即可生成潜在的随机噪声 z_{1-4} ,生成对应的参数。

自编码器训练过程

首先先简单介绍下前面一般的训练方式,具体包括对抗损失和模仿损失:

对抗损失即判断图像的真假:

V(D,G)=\mathbb{E}_{x\sim p_{data}}[\log D(x)]+\mathbb{E}_{z\sim p_{z}(z)}[\log(1-D(G(z))]

模仿损失,即将生成的图像尽可能与3DMM人脸模型相似,主要包括身份、 表情姿态、光线与色彩。

l_{I}^{id}(x)=\max (1-<f_{id}(x),f_{id}(\hat x)>-\tau,0)

l_{I}^{lm}(x)=\begin{Vmatrix} p(x)-\hat p \end{Vmatrix}^{2}

l_{I}^{sh}(x)=\begin{vmatrix} \gamma(x)-\hat \gamma \end{vmatrix}_{1}

l_{I}^{cl}=\begin{vmatrix} c(x)-c(\hat x) \end{vmatrix}_{1}

其中 f_{id} 是一个提取人脸身份信息的特征, <·,·> 代表余弦相似度, p(·) 是一个检测3D人脸坐标的网络, \gamma 是计算光照相关系数的函数, c 是计算人脸区域平均色彩的函数,在3DMM模型中有定义。

除了对抗损失和模仿学习外,该论文引入了对比学习

因为人脸生成模型中,需要4个主要的变量 \alpha,\beta,\gamma,\theta ,所以任意改变其中一个变量的初始噪声 z_{k} ,而其他的噪声 z_{i} 保持不变。我们只需要惩罚两张生成图像中因为其他变量z_{i}而产生的不同,而z_{k}产生的不同则不惩戒。例如我仅改变了光照不同,则生成图像中光照不同的差异不计入考虑,而身份,表情等信息的更变将惩戒模型。

通过这样的方式,引入对比学习,尽可能让各个变量对生成模型的控制相互独立,使得模型在变量z_{k}改变时,变化不那么敏感。

实证发现,表情和光照可以导致满意的解纠缠解耦合,而姿态变化不需要对比损失。

参考

[1] Ekin Tiu, Understanding Contrastive Learning

[2] Ankesh Anand, Contrastive Self-Supervised Learning

[3] Ram Sagar, What Is Contrastive Learning?

编辑于 2021-05-08 13:04