对比学习与自监督任务
笔者在之前上课时候被迫接受学习了NLP的许多相关的知识,BERT GPT等许多的NLP领域的大模型,都采用了半监督或者说是无监督的训练方法,最近在视觉的领域视觉自监督的模型受到了越来越多的关注。现在需要自己了解一下自监督和对比学习是怎么去做的呢?
- 自监督学习,对比学习等,这些事好像都不需要我们准备标签。
- Openai开创了GPT系列,CLIP,Dalle等,都在告诉我们一件事模型在训练的时候,不要被标签所束缚,模型的潜力应该由他自己挖掘。
- 如果我们给定了标签,就可能限制了模型。
有监督的学习是为了解决一个很小的问题方面,比如我们的行人重识别,但是自监督是为了迈向一个更加通用的问题方面。自己监督自己的学习
自监督学习不需要标签,更多的情况下是结合对比学习的概念。-也是自己在之前clip中学习和接触过的概念。
对比学习
深度学习根据有无标签可以分成有监督学习(Supervised Learning)
,半监督学习(Semi-Supervised Learning)
以及无监督学习(Unsupervised Learning)
。自监督学习(Self-Supervised Learning)
是根据数据本身的内容进行学习,无需要人工打标,因此也属于无监督学习的范畴。对比学习属于自监督学习的一类,它的核心思想是判断两个样本是否属于同一类。例如当我们看到足够多的某两种不同动物的照片,尽管我们不知道这个动物具体叫什么名字,我们也能够判断两个动物是不是同一类。
自监督任务
自监督学习的目标是学习更加通用的一种表示。可以实现不同任务之间的迁移。通过自监督学习,模型已经学到了一种十分通用的表示。它一开始就可以处理多种不同的任务在不同的下游任务中,我们可以通过简单的微调来进行调整。
我们在自监督的学习任务中引入了Contrastive Learning(对比学习的概念)
对比学习的一种核心的思想就在于,它引入了一种独特机制的损失函数,可以将相同的表示更好的聚在一起,不同的表示将其进行分开。
下面在介绍具体论文实现的基础上我们先介绍的是在对比学习中最常见的几种损失函数。
The Contrastive Loss
对比损失将一对数据点作为输入,并伴随一个称为"边距"的参数,通常表示为m。它的行为要取决于这对输入点是正例还是负例。
-
如果这对是正的,这意味看这两个点应该是相似的,因此我们希望最小化它们之间的距离。在这种情况下,损失只是这两个点之间的平方距离。我们用D来进行表示。
-
如果这对是负的,我们希望将点拉开,直到它们的距离达到边距m。所以如果它们的距离小于边距,损失就是边距与当前距离的差值。然而,如果距离已经大于边距。损失为零,因为这两个点已经足够远,
L = ( 1 − y ) ⋅ D 2 + y ⋅ max ( 0 , m − D ) 2 \mathcal{L}=(1-y) \cdot D^{2}+y \cdot \max (0, m-D)^{2} L=(1−y)⋅D2+y⋅max(0,m−D)2
分析:的确,当我们有一个正对时,y等于0,通过最小化损失。我们使点靠得更近。当我们有一个负对时,y等于1,损失会推动点拉开,直到达到边距。
我们可以通过优化训练这个损失函数,就可以实现自监督学习的一种思想了。
损失函数通常是对比学习中最重要的一个部分,关于对比学习的损失函数其实还有很多,这里只介绍SimCLR中核心应用的一个部分。
InfoNCE Loss
MOCO这篇论文的出现比SimCLR论文更早。它里面提到的损失函数就是InfoNCE Loss损失函数。
这个损失函数和上面的损失函数不同,它是以概率而非是用距离的形式来进行定义的。
它使用了一个正样本对和多个负样本对来进行实现的。
一
:在SimCLR中正负样本对是如何进行创建的呢?
答:对比样本对是通过数据增强创建的。尽管它们在视觉上有所不同,但两个视图仍然代表同一对象,因此模型学习为它们生成相似的表示。
二
:对于负样本对,SimCLR从同一批次中选择另一张图像,并应用相同的增强过程. 由于负样本对是在同一个批次内采样的,因此需要非常大的批次大小 N在8000以上,更多是是使用集群的方式来进行训练的我自己没有在进行代码的复现了。
从传统的小批量随机梯度下降中的批次 64 -256的批次范围,更改到了 4096-8192的巨大批次范围。在lmageNet分类测试中,SimCLR达到了76%的Top1准确率,接近通过监督学习的ResNet50的表现,同时使用的是自监督学习不需要任何标签数据
更令人印象深刻的是,使用仅1%的lmageNet标签进行微调时,SimCLR达到了86%的Top5准确率,超越了完全监督的AlexNet,35而后者依赖100倍更多的标签数。
后面的Bootstrap Your Own Latent对比学习方法,Bootstrap Your Own Latent(BYOL)是一种自监督对比学习方法,它的核心思想是通过两个神经网络——在线网络(Online Network)和目标网络(Target Network)——的相互作用和学习来实现特征表示的学习。以下是BYOL方法的一些关键点(消除了大量的负样本对的一个影响。)
在介绍损失函数之前,我们下结合多分类的softmax操作从而引入交叉熵损失函数。省略了前面的y
− log exp ( z − ) ∑ i = 0 1 exp ( z i ) -\log \frac{\exp \left(z_{-}\right)}{\sum_{i=0}^{1} \exp \left(z_{i}\right)} −log∑i=01exp(zi)exp(z−)
我们在对比学习中使用的损失函数是InfoNCE LOSS它首先要是 NCE LOSS的一个变形。NCE(二分类 数据分布 + 噪声分布) Loss中是一种粗略的估计(选择的是一部分负样本的数量负样本的数量要尽可能的大。从而导致了模型的批次数变大了)。
L q = − log exp ( q ⋅ k + / τ ) ∑ i = 0 K exp ( q ⋅ k i / τ ) \mathcal{L}_{q}=-\log \frac{\exp \left(q \cdot k_{+} / \tau\right)}{\sum_{i=0}^{K} \exp \left(q \cdot k_{i} / \tau\right)} Lq=−log∑i=0Kexp(q⋅ki/τ)exp(q⋅k+/τ)
这里它重新回到了类似多分类的交叉熵损失,区别在于里面的参数值发生变化 k由原理的分类的类别变成了K:负样本的数量。 通过这个函数来进行对比学习。
它其实做的就是一个分类的任务,将一个正样本,从大量的负样本K(总共k+1个样本)中分离出来。
监督学习
在Imagenet中的训练,对于这种大型的标注数据集来说,我们输入一张图片进入网络,将输出的结果与标签进行比较,反向传播来训练我们的模型。
无监督的学习
在我们常见的机器学习的算法中,比如K-means聚类算法中,可以在没有标签的情况下,在样本足够多时可以将同一类别的物体归为一类来进行处理。
对比学习:其实就是判断异同 相同的就是正例.不同的就是负例让模型学其中规律.
SimCLR
在简单的了解了对比学习和自监督的任务之后我们需要的是结合一个实例来去学习一下自监督或者说是对比学习的一个实现的方式。SimCLR通过将对比学习引入到了图像预训练中,SimCLR的原理并不复杂,即将图像映射到一个潜空间中,然后让正负样本分别靠近和远离
这里我们就用2020年的一篇最早的论文来去学习接触一下对比学习的概念。
论文:A Simple Framework for Contrastive Learning of Visual Representations
视觉表示对比学习的简单框架
介绍:在2020年由谷歌团队提出的。领导者正是Geoffrey Hinton(2024年诺贝尔物理学奖的获得者)
这里模型训练的任务主要是要训练这个简单的网络中的encode的部分对于上面的线性投影的部分我们会在训练完成之后进行丢弃,只保留最后的一个encode的部分用来迁移到其他的任务中来提取特征
从这里也可以简单的了解文章的核心是如何通过对比学习的概念对模型进行预训练(原文使用的Encode的结构就是我们所熟悉的RestNet50的结构了)
- 对原始的图像做一个数据增强的操作得到xi这一张图片 xj是同样过程的一张图片。
- 将两个图片传入得到后面的Encoder的网络中去(参考VIT和RestNet网络)
- 经过encode提取之后,hi和hj两个部分的向量。通过这两个向量经过处理参与后面的相似度的计算。
- 计算loss:计算对比损失并通过两个网络进行反向传播。当来自同一图像的投影相似时,对比损失减少。投影之间的相似度可以是任意的。
- 下游任务:对比学习得到Encoder做为特征提取器,根据下游任务的数据集进行微调Finetuin。
论文的原文中给出了数据增强的相关操作。
原文中所对应的模型结构图如图所示。
通过最后的训练可以实现线性连接层的维度坐标从32到后面的2048的坐标的范围所产生的效果是基本上类似的。
L q = − log exp ( q ⋅ k + / τ ) ∑ i = 0 K exp ( q ⋅ k i / τ ) \mathcal{L}_{q}=-\log \frac{\exp \left(q \cdot k_{+} / \tau\right)}{\sum_{i=0}^{K} \exp \left(q \cdot k_{i} / \tau\right)} Lq=−log∑i=0Kexp(q⋅ki/τ)exp(q⋅k+/τ)