对比学习从目标来看,是要做在NLP类型类似Bert预训练的事,即通过自监督学习,充分挖掘模型从海量无标注数据中学习通用知识的能力。
大致分类
对比学习目前可大致可分为
- 基于负例的对比学习方法
- 基于对比聚类的方法
- 基于不对称网络结构的方法
- 基于冗余消除损失函数的方法
- ……
基于负例的对比学习方法
SimCLR
对比学习是自监督学习,没有标注数据,因此需要自行构建相似数据(正例)和不相似数据(负例)。
来自知乎-张俊林老师
正负例构建
对于某张图片,首先需要一个增强操作集合,随机抽取两个 以及,分别作用在原始图像上,形成两张经过增强的新图像,两者互为正例。训练时,Batch内的任意其他图像,都可作为或的负例。
表示学习系统构造
构造原则:构造一个表示学习系统,通过它可以将训练数据投影到某个表示空间内,并采取一定的方法,使得正例距离能够比较接近,负例距离比较远。
来自知乎-张俊林老师-SimCLR模型结构
SimCLR由对称的上下两个分支构成,随机从无标训练数据中获取N个构成一个Batch,对于Batch内的任意图像,根据上述方法构造正例,形成两个图像增强视图:和。和各自包含N个增强数据,并分别经过上下两个分支,对增强图像做非线性变换,这两个分支就是SimCLR设计出的表示学习所需的投影函数,负责将图像数据投影到某个表示空间。
由于上线分支时对称的,所以以增强视图为例来介绍,首先经过特征编码器Encoder(一般采用Resnet作为模型结构,此处以函数代表),经过CNN转换成对应的特征表示。紧随其后,是另外一个非线性变换结构Projector(由两层MLP构成,这里以函数表示),进一步将特征表示映射成另外一个空间里的向量。
相似性计算函数
表示向量L2正则后的点积或者表示向量间的Cosine相似性
InfoNCE损失
其中代表两个正例相应的表示向量。从这InforNCE可以看出,函数的分子部分鼓励正例相似度越高越好,也就是在表示空间内距离越近越好;而分母部分,则鼓励任意负例之间的向量相似度越低越好,也就是距离越远越好。
SimCLR小结
SimCLR有两个最大的贡献,一个是证明了复合图像增强很重要;另外一个是Projector结构很有必要。(具体原因阐述可见张老师博客)。
Moco V2
基于负例的对比学习:Batch外
很多实验证明了:在基于负例的对比学习中,负例数量越多,对比学习模型越好。但是受限算力,我们又不能无限放大Batch size,那么有什么办法在算力有限的情况,也可以在整个无标注训练数据集内随机挑选负例,而不再局限于Batch内寻找呢,Moco提出了一个解决方案(但由于Moco v2吸收了SimCLR的Projector结构,以及更具难度的图像增强方法,所以这里讲解Moco v2)。
来自知乎-张俊林老师-Moco v2框架图
Moco v2的图像增强方法、Encoder结构、Projector结构、相似性计算方法以及InfoNCE损失函数,和SimCLR基本一致,最主要的特点和创新点在两个分支中的下分枝:SimCLR里上下两个分支时对称的,两者可参数共享,而Moco v2的下分枝模型更新参数,采用的是动量更新(Momentem Update)。下分枝的模型结合与上分支保持一致,但是模型参数更新不再使用损失函数的反向传播来进行梯度更新,而是采用移动平均机制来更新
其中,是上分枝对应的模型参数,是下分枝对应的模型参数,是权重调节系数(一般会取较大数值,eg:0.9甚至0.99)。
此外Moco v2维护了一个较大的负例队列,当对比学习需要在正例和负例之间进行对比计算是,就是这个负例队列里去K个。
基于对比聚类的方法
SwAV 对比聚类:负例隐身
来自知乎-张俊林老师-SwAV模型
SwAV的模型结构,其中的图像增强、Encoder以及Projector结构,与SimCLR基本保持一致,而且也是上下分枝对称结构。对于Batch内某张图像来说,假设其经过图像增强后,在Aug1和Aug2里对应增强后的图像分别是和,数据对和互为正例。增强视图走上分枝,经过投影到单位超球面中某个点,增强视图走下分枝,经过投影到单位超球面中某个点。之后SwAV对Aug1和Aug2种的表示向量,根据Sinkhorn-Knopp算法,在线对Batch内数据进行聚类。假设走下分枝的聚到了类,则SwAV则要求表示学习模型预测分类成类。
损失函数
损失函数采用和Prototype中每个类中心向量的交叉熵:
其中,为第k个聚类的类中心向量,为温度超参数。
基于不对称网络结构的方法
BYOL 非对称结构
上文有述,在常见的基于负例的对比学习方法中,负例有着举足轻重的作用,它起到了将投影到超球体平面的各个实例对应的表示向量相互推开,使得图像对应的表示向量在超球体表面分布均匀的作用,以此来避免表示学习方法模型坍塌问题。
那么,问题来了:如果我们只使用正例,不使用负例来训练对比学习模型,这种思路是可行的吗?乍一看,这几乎是不可能的:假设只有正例,模型推动正例在表示空间内相互靠近。如果只有这一优化目标,很明显,理论上,模型会很快收敛到常数解,也就是所有数据会被映射到表示空间里同一个点上。就是说,很容易出现模型坍塌的结局
但是,BYOL模型就是这么做的,关键是,它还做成功了,更关键的是,不仅做成功了,它还是目前效果最好的对比学习模型之一。那么,BYOL是怎么做到的呢?
来自知乎-张俊林老师-BYOL模型
BYOL模型与Moco V2基本是一致的,但是区别在于,在上线分支中,在Projector之后,新增了一个非线性变换模型Predictor。Predictor与Projector类型([FC->BN->ReLU->FC]构成的MLP映射网络),产生表示向量,并对做L2正则化。此外,BYOL不需要分离,所以并不需要为辅Moco v2中的负例队列了。
损失函数
经过改写,也是Cosine相似性的一个变体,它的最小值对应两个表示向量的Cosine最大值,也即优化目标是在单位超球面上,正例之间的距离越近越好。
论文中指出BYOL之所以它没有坍塌到常数解,是由于online和Target两者结构的不对称造成的。
基于冗余消除损失函数的方法
Barlow Twins 冗余消除损失:越简单越快乐
来自知乎-张俊林-Barlow Twins
Barlow Twins和BYOL一样也只使用了正例,其模型结构与SimCLR保持一致。其特点是在激情增强图像经过投影之后,在Batch维度分别做了类似BN的正则,再顺着Batch为,对aug1和agu2两个正例表示矩阵做矩阵乘法,求出两者的互相关性矩阵(cross-correlatin matrix),其损失函数定义在这个互相关性矩阵上
损失函数第一个子项成为“不变项”,第二个子项称为“冗余消除项”。可以看出,它的优化目标是希望互相关性矩阵的对角线元素为1,非对角线元素为0,也就是希望互相关性矩阵是个单位矩阵。“不变项”,起到了把正例在表示空间相互拉近的作用,而“冗余消除项”,其实是希望Aug1和Aug2矩阵里的特征表示向量中,向量每个元素相互之间增强独立性,也就是尽可能消除表示向量里各个bit位之间的冗余信息表达,这个子项起到了类似负例的作用,避免模型坍塌。
从Barlow Twins我们可以看出,如果能够合理设置损失函数,那么光靠损失函数,也可以避免模型坍塌现象。
2021-12 对比学习精要- Contrastive learning - 简书
对比学习(Contrastive Learning):研究进展精要 - 知乎