2021-12 对比学习精要- Contrastive lear

2021-12-26  本文已影响0人  破阵子沙场秋点兵

本文完全参考 张俊林 老师的博客 对比学习(Contrastive Learning):研究进展精要

前言

对比学习从目标来看,是要做在NLP类型类似Bert预训练的事,即通过自监督学习,充分挖掘模型从海量无标注数据中学习通用知识的能力。

大致分类

对比学习目前可大致可分为

基于负例的对比学习方法

SimCLR

对比学习是自监督学习,没有标注数据,因此需要自行构建相似数据(正例)和不相似数据(负例)。

来自知乎-张俊林老师
正负例构建
对于某张图片,首先需要一个增强操作集合T,随机抽取两个 t_1 \in T以及t_2 \in T,分别作用在原始图像上,形成两张经过增强的新图像\{{x_1, x_2 \}},两者互为正例。训练时,Batch内的任意其他图像,都可作为x_1x_2的负例。\color{red}{思考题1:模型此处假定Batch内的任意其他图像都为负例,但实际训练会保证如此吗,如果保证的话,那岂不是监督学习了}
表示学习系统构造
构造原则:构造一个表示学习系统,通过它可以将训练数据投影到某个表示空间内,并采取一定的方法,使得正例距离能够比较接近,负例距离比较远。
来自知乎-张俊林老师-SimCLR模型结构
SimCLR由对称的上下两个分支构成,随机从无标训练数据中获取N个构成一个Batch,对于Batch内的任意图像,根据上述方法构造正例,形成两个图像增强视图:Aug1Aug2Aug1Aug2各自包含N个增强数据,并分别经过上下两个分支,对增强图像做非线性变换,这两个分支就是SimCLR设计出的表示学习所需的投影函数,负责将图像数据投影到某个表示空间。
由于上线分支时对称的,所以以增强视图Aug1为例来介绍,Aug1首先经过特征编码器Encoder(一般采用Resnet作为模型结构,此处以函数f_\theta(x)代表),经过CNN转换成对应的特征表示h_i。紧随其后,是另外一个非线性变换结构Projector(由[FC\rightarrow BN \rightarrow ReLU \rightarrow FC]两层MLP构成,这里以函数g_\theta(x)表示),进一步将特征表示h_i映射成另外一个空间里的向量z_i

相似性计算函数
表示向量L2正则后的点积或者表示向量间的Cosine相似性
S(z_i,z_j)=z_i^Tz_j/(||z_i||_2||z_j||_2)
InfoNCE损失
L_i=-log(exp(S(z_i, z_j^+)/ \tau))/ \sum_{j=0}^Kexp(S(z_i,z_j)/ \tau)
其中{z_i,z_i^+}代表两个正例相应的表示向量。从这InforNCE可以看出,函数的分子部分鼓励正例相似度越高越好,也就是在表示空间内距离越近越好;而分母部分,则鼓励任意负例之间的向量相似度越低越好,也就是距离越远越好。
SimCLR小结
SimCLR有两个最大的贡献,一个是证明了复合图像增强很重要;另外一个是Projector结构很有必要。(具体原因阐述可见张老师博客)。
\color{red}{此处省略对比学习底层逻辑分析。但是这块真的很精彩,有兴趣的同学一定要看下}

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)。下分枝的模型结合与上分支保持一致,但是模型参数更新不再使用损失函数的反向传播来进行梯度更新,而是采用移动平均机制来更新
\xi=m\xi+(1-m)\nu
其中,\nu是上分枝对应的模型参数,\xi是下分枝对应的模型参数,m是权重调节系数(一般m会取较大数值,eg:0.9甚至0.99)。
此外Moco v2维护了一个较大的负例队列,当对比学习需要在正例和负例之间进行对比计算是,就是这个负例队列里去K个。

基于对比聚类的方法

SwAV 对比聚类:负例隐身

来自知乎-张俊林老师-SwAV模型
SwAV的模型结构,其中的图像增强、Encoder以及Projector结构,与SimCLR基本保持一致,而且也是上下分枝对称结构。对于Batch内某张图像x来说,假设其经过图像增强后,在Aug1和Aug2里对应增强后的图像分别是x_ix_j,数据对x_ix_j互为正例。增强视图x_i走上分枝,经过g_\theta(f_\theta(x_i))投影到单位超球面中某个点z_i,增强视图x_j走下分枝,经过g_\theta(f_\theta(x_j))投影到单位超球面中某个点z_j。之后SwAV对Aug1和Aug2种的表示向量,根据Sinkhorn-Knopp算法,在线对Batch内数据进行聚类。假设走下分枝的x_j聚到了q_j类,则SwAV则要求表示学习模型预测x_i分类成q_j类。
损失函数
损失函数采用z_i和Prototype中每个类中心向量的交叉熵:
Laug1(z_i,q_j)=-\sum_k{q_j^k · log(p_i^k)}
其中p_i^k=exp(z_ic_k/ \tau)/\sum_{k^n}exp(z_ic_{k^n}/\tau)c_k为第k个聚类的类中心向量,\tau为温度超参数。

基于不对称网络结构的方法

BYOL 非对称结构

上文有述,在常见的基于负例的对比学习方法中,负例有着举足轻重的作用,它起到了将投影到超球体平面的各个实例对应的表示向量相互推开,使得图像对应的表示向量在超球体表面分布均匀的作用,以此来避免表示学习方法模型坍塌问题。
那么,问题来了:如果我们只使用正例,不使用负例来训练对比学习模型,这种思路是可行的吗?乍一看,这几乎是不可能的:假设只有正例,模型推动正例在表示空间内相互靠近。如果只有这一优化目标,很明显,理论上,模型会很快收敛到常数解,也就是所有数据会被映射到表示空间里同一个点上。就是说,很容易出现模型坍塌的结局
但是,BYOL模型就是这么做的,关键是,它还做成功了,更关键的是,不仅做成功了,它还是目前效果最好的对比学习模型之一。那么,BYOL是怎么做到的呢?

来自知乎-张俊林老师-BYOL模型
BYOL模型与Moco V2基本是一致的,但是区别在于,在上线分支中,在Projector之后,新增了一个非线性变换模型Predictor。Predictor与Projector类型([FC->BN->ReLU->FC]构成的MLP映射网络),产生表示向量v_i,并对v_i做L2正则化。此外,BYOL不需要分离,所以并不需要为辅Moco v2中的负例队列了。
损失函数

L_{aug1}=||v_i-z_j||_2
经过改写,L_{aug1}也是Cosine相似性的一个变体,它的最小值对应两个表示向量的Cosine最大值,也即优化目标是在单位超球面上,正例之间的距离越近越好。
论文中指出BYOL之所以它没有坍塌到常数解,是由于online和Target两者结构的不对称造成的。

基于冗余消除损失函数的方法

Barlow Twins 冗余消除损失:越简单越快乐

来自知乎-张俊林-Barlow Twins
Barlow Twins和BYOL一样也只使用了正例,其模型结构与SimCLR保持一致。其特点是在激情增强图像经过g_\theta(f_\theta(x))投影之后,在Batch维度分别做了类似BN的正则,再顺着Batch为,对aug1和agu2两个正例表示矩阵做矩阵乘法,求出两者的互相关性矩阵(cross-correlatin matrix),其损失函数定义在这个互相关性矩阵C
L_{bt}=\sum_i(1-C_{ii})^2+ \lambda \sum_i\sum_{j\neq i}C_{ij}^2
损失函数L_{bt}第一个子项成为“不变项”,第二个子项称为“冗余消除项”。可以看出,它的优化目标是希望互相关性矩阵C的对角线元素为1,非对角线元素为0,也就是希望互相关性矩阵是个单位矩阵I。“不变项”,起到了把正例在表示空间相互拉近的作用,而“冗余消除项”,其实是希望Aug1和Aug2矩阵里的特征表示向量中,向量每个元素相互之间增强独立性,也就是尽可能消除表示向量里各个bit位之间的冗余信息表达,这个子项起到了类似负例的作用,避免模型坍塌。
从Barlow Twins我们可以看出,如果能够合理设置损失函数,那么光靠损失函数,也可以避免模型坍塌现象。
上一篇 下一篇

猜你喜欢

热点阅读