盘点表示学习(Representation Learning)发展中的逻辑

10 篇文章 1 订阅
9 篇文章 10 订阅

对比学习(Contrastive Learning) 是判别式自监督学习的一种,不依赖标注数据,要从无标注图像中自己学习知识。通过自动构造相似实例和不相似实例,要求习得一个表示学习模型,通过这个模型,使得相似的实例在投影空间中比较接近,而不相似的实例在投影空间中距离比较远。而如何构造相似实例,以及不相似实例,如何构造能够遵循上述指导原则的表示学习模型结构,以及如何防止模型坍塌(Model Collapse),这几个点是其中的关键。目前 对比学习(Contrastive Learning) 的经典模型有Moco系列、SimCLR系列、BYOL、SwAV、DeepCluster系列、Barlow Twins等。
在这里插入图片描述

从防止模型坍塌的不同方法角度,我们可大致把现有方法划分为:

  • 基于负例的对比学习方法
  • 基于对比聚类的方法
  • 基于非对称网络结构的方法
  • 基于冗余消除损失函数的方法

其实我觉得防止模型坍塌还有种是通过有监督Loss约束,但这样就不是纯粹的对比学习,将成为半监督学习的方法,可以参考MeanTeacher、SE-SSD等文章如何防止模型坍塌(Model Collapse)

基于负例的对比学习:

【以SimCLR为例】

对比学习是自监督学习,我们没有标注数据,所以需要如下图所示,自己构造相似数据(正例)以及不相似数据(负例)在这里插入图片描述
对于某张图片,我们从可能的增强操作集合 T T T中,随机抽取两种: t 1 ∼ T t_1 \sim T t1T t 2 ∼ T t_2 \sim T t2T ,分别作用在原始图像上,形成两张经过增强的新图像 < x 1 , x 2 > <x_1,x_2> <x1,x2>,两者互为正例。训练时,Batch内任意其它图像,都可做为 x 1 x_1 x1 x 2 x_2 x2的负例。

有了正例和负例,接下来需要做的是:构造一个表示学习系统,通过它将训练数据投影到某个表示空间内,并采取一定的方法,使得正例距离能够比较近,负例距离比较远。
在这里插入图片描述
A u g 1 Aug1 Aug1首先经过特征编码器Encoder(2D卷积) f θ f_\theta fθ 转换成对应的特征表示 h i h_i hi ,然后经过非线性变换结构Projector(两层MLP) g θ g_\theta gθ,进一步将特征表示 h i h_i hi 映射成另外一个空间里的向量 z i z_i zi。同样地, A u g 2 Aug2 Aug2 经过同样Encoder和Projector映射成 z j z_j zj

在表示空间 Z Z Z 内,我们希望正例距离较近,负例距离较远。如果希望达成这一点,一般通过定义合适的损失函数来实现。在介绍损失函数前,我们首先需要一个度量函数,以判断两个向量在投影空间里的距离远近,一般采用对表示向量 L 2 L_2 L2 正则后的点积 或者表示向量间的 Cosine相似性 S ( z i , z j ) = z i T z j ] ] z i ] ] 2 ] ] z j ] ] 2 S(z_i,z_j) = \frac{z_i^Tz_j}{]]z_i]]_2]]z_j]]_2} S(zi,zj)=]]zi]]2]]zj]]2ziTzj 来作为距离度量标准。
SimCLR的损失函数采用InfoNCE Loss L i = − l o g ( e x p ( S ( z i , z i + ) τ ) ∑ ( j = 0 ) K e x p ( S ( z i , z j ) τ ) ) L_i=-log(\frac{exp(\frac{S(z_i,z_i^+)}{\tau})}{\sum_{(j=0)}^K exp(\frac{S(z_i,z_j)}{\tau})}) Li=log((j=0)Kexp(τS(zi,zj))exp(τS(zi,zi+)))
其中, < z i , z i + > <z_i,z_i^+> <zi,zi+>代表两个正例相应的表示向量;负例个数K是一个超参,K数值可以根据需要调整大小;温度超参 τ \tau τ一般设置0.1或者0.2,它将模型训练聚焦到有难度的负例,并对它们做相应的惩罚,难度越大,也即是与 x i x_i xi 距离越近,则分配到的惩罚越多。 τ \tau τ越小,模型学到的一致性信息就越少,多样性信息就越多,我们需要在一致性和多样性之间寻求一种平衡
在这里插入图片描述

这会引发一个问题:为什么这种投影操作,要做两次非线性变换,而不是直接在Encoder后,只经过一次变换即可呢?
实验证明,加上这个Projector对于提升模型效果改进很明显,这从经验角度说明两次投影变换是必须的。个人猜测,在接近任务的高层网络,也就是Projector,会编码更多跟对比学习任务相关的信息,低层就是Encoder,会编码更多跟任务无关的通用细节信息。对于下游任务,这种对比学习训练任务相关的高层特征,可能会带来负面影响。如果映射网络只包含Encoder的话,那么特征表示里会有很多预训练任务相关特征,会影响下游任务效果;而加上Projector,等于增加了网络层深,这些任务相关特征就聚集在Projector,此时Encoder则不再包含预训练任务相关特征,只包含更通用的细节特征,这样训练好的Encoder作为下游任务的预训练模型效果会更好。

Contribution:

  • 证明了复合图像增强很重要
  • 在Moco的Encoder结构后添加这个Projector结构并实验证明很有效

在此之后的对比学习模型,基本都采取了Encoder+Projector的两次映射结构,以及复合图像增强方法。

Batch之外【以MocoV2为例】

很多实验证明了:在基于负例的对比学习中,负例数量越多,对比学习模型效果越好,其实本质上,是因为越多负例,会包含更多的Hard负例,而这些Hard负例对于模型贡献较大,而easy负例,其实没多少贡献。因此一个自然的想法诞生了:不再局限于Batch内寻找负例

Moco V2是在整个训练集合内选择负例的典型方法,其实这个做法主要是Moco 提出的,Moco V2是吸收了SimCLR的Projector结构,以及更具难度的图像增强方法之后,针对Moco 的改进版本。
在这里插入图片描述
Contribution:

  • 不再局限于Batch内寻找负例
  • 下分支采用动量更新(Momentum Update)机制,而非SimCLR中的参数共享

下分枝的 动量更新(Momentum Update) 模型结构有两个作用:一个是将第二组图像增强视图 A u g 2 Aug2 Aug2 里的图像,映射到对应的表示空间编码 z j z_j zj ,为第一组图像增强视图 A u g 1 Aug1 Aug1 提供正例;第二个作用是更新负例队列里数据的图像表示编码:一般会将最新Batch里Aug2对应的特征表示编码放入队列,而最老的那个Batch对应的图像编码出队,这样就可以不断更新负例队列内负例编码内容。

新问题来了:为什么负例队列里的图像编码,不用上分枝对应的最新的模型参数 θ \theta θ ,而是采用缓慢移动的 ξ \xi ξ 来更新呢?
下分枝的正例和负例参数缓慢而稳定的变动,才能提供较好的模型效果。这可能是因为缓慢更新的模型参数 ξ \xi ξ ,给队列中来自不同Batch内的实例表征编码相对稳定而统一的改变,增加了表示空间的一致性。
在这里插入图片描述

基于对比聚类的对比学习:负例隐身术【以SwAV为例】

SwAV的模型结构如下图,其中的图像增强、Encoder以及Projector结构,与SimCLR基本保持一致。SwAV对 A u g 1 Aug1 Aug1 A u g 2 Aug2 Aug2 中的表示向量,根据Sinkhorn-Knopp算法[Reference:Sinkhorn算法],在线对Batch内数据进行聚类。假设走下分枝的 x j x_j xj 聚类到了 q j q_j qj 类,则SwAV要求表示学习模型根据 x i x_i xi 预测 x j x_j xj 所在的类,也就是说,要将 z i z_i zi 分到第 q j q_j qj类,具体损失函数采用 z i z_i zi P r o t o t y p e Prototype Prototype 中每个类中心向量的交叉熵: L a v g ( z i , q j ) = − ∑ k q j k ⋅ l o g ( p i k ) L_{avg}(z_i,q_j)=-\sum_kq_j^k \cdot log(p_i^k) Lavg(zi,qj)=kqjklog(pik)其中, p i k = e x p ( z i c k τ ) ∑ k ′ ′ e x p ( z i c k ′ ′ τ ) p_i^k=\frac{exp(\frac{z_ic_k}{\tau})}{\sum_{k''}exp(\frac{z_ic_{k''}}{\tau})} pik=kexp(τzick)exp(τzick) c k c_k ck 为第k个聚类的类中心向量, τ \tau τ为温度超参数。

因为是对称结构,SwAV要求模型根据 x j x_j xj 预测 x i x_i xi 所在的类,也就是说要将 z j z_j zj 分到第 q i q_i qi 类。所以,SwAV的总体损失函数是两个分支损失之和: L S w A V = L a v g 1 ( z i , q j ) + L a v g 2 ( z j , q i ) L_{SwAV}=L_{avg1}(z_i,q_j)+L_{avg2}(z_j,q_i) LSwAV=Lavg1(zi,qj)+Lavg2(zj,qi)
在这里插入图片描述
SwAV也会面临模型坍塌的问题,具体表现形式为:Batch内所有实例都聚类到同一个类里。所以为了防止模型坍塌,SwAV对聚类增加了约束条件,要求Batch内实例比较均匀地聚类到不同的类别中。分母中的投影点 z j z_j zj 所不属于的那些类中心,则充当了负例,它要求投影点 z i z_i zi 在超球面上,和其它聚类中心越远越好,也是防止模型坍塌的关键。

我们也可以换个角度,从聚类的角度来看SimCLR中的正例和负例,我们可以把SimCLR看成是:每两个正例组成了一个聚类中心。如果从这个角度看,其实SimCLR这种正负例方法,是种极端情况下的聚类模型。我们在上文说过,SimCLR这种模式,当温度超参设的比较小的时候,容易出现误判的负例,而聚类模型无疑在容忍负例误判方面,天然有很好的包容力,这也许是聚类方法效果好的原因之一。

从概念上,可以简单将DeepCluser-V2理解为和SwAV整体结构类似的工作,只不过SwAV对每个Batch数据在线聚类,而DeepCluster-V2是每个Epoch做一次更大规模的聚类。目前来看,SwAV和DeepCluster-V2是效果最好的对比学习模型之一。

基于非对称网络结构的对比学习:模型不坍塌之谜【以BYOL和SimSiam为例】

假如只有正例,理论上模型会推动正例在表示空间内相互靠近,模型会很快收敛到常数解,出现模型坍塌的结局。而BYOL却能够只使用正例来训练对比学习模型,而不出现模型崩塌的局面,这是为什么呢?
在这里插入图片描述
BYOL的模型结构如上图所示。对于Batch内任意图像,类似SimCRL采取随机图像增强,产生两组增强图像视图 A u g 1 Aug1 Aug1 A u g 2 Aug2 Aug2 ,彼此互为正例,分别走上下两个模型分枝,上分枝被称为Online,下分枝被称为Target。Online分枝的Encoder和Projector和其它对比学习模型是一样的,但是,在Projector之后,新增了一个非线性变换模块Predictor,Predictor的结构和Projector类似(两层MLP),产生表示向量 v i v_i vi 并对 v i v_i vi L 2 L2 L2 正则化,将向量映射到单位超球面上。Target分枝结构类似Moco V2对应下分枝的动量更新结构,即由自有参数的Encoder和Projector构成,且模型参数不参与梯度更新,采用Online分枝对应结构参数的Moving Average动量更新方式。以此方式,产生增强图像 A u g 2 Aug2 Aug2 的向量 z j z_j zj ,同样地,会对 z j z_j zj L 2 L2 L2 正则化操作,将表示向量映射到单位超球面上。但是,因为BYOL不用负例,所以并不需要维护Moco V2中的负例队列,下分枝只是对 A u g 2 Aug2 Aug2 中的正例进行投影。

对于BYOL来说,它的优化目标要求Online部分的正例,在表示空间中向Target侧对应的正例靠近,也即拉近两组图像增强正例之间的距离,对应Loss 函数为: L a v g 1 = ∣ ∣ v i ‾ − z j ‾ ∣ ∣ 2 2 = 2 − 2 ⋅ < v i , z j > ∣ ∣ v i ∣ ∣ 2 ⋅ ∣ ∣ z j ∣ ∣ 2 L_{avg1}=||\overline{v_i}-\overline{z_j}||_2^2=2-2\cdot\frac{<v_i,z_j>}{||v_i||_2\cdot||z_j||_2} Lavg1=vizj22=22vi2zj2<vi,zj> where v i ‾ = v i ∣ ∣ v i ∣ ∣ 2 \overline{v_i}=\frac{v_i}{||v_i||_2} vi=vi2vi and z j ‾ = z j ∣ ∣ z j ∣ ∣ 2 \overline{z_j}=\frac{z_j}{||z_j||_2} zj=zj2zj
可见虽然看似用的 L 2 L2 L2 Loss,但实际上跟Cosine相似性 是一致的,只是一个变体。

由于online和Target分枝是不对称的,所以BYOL会交换两批增强图像,要求 A u g 2 Aug2 Aug2 的图像也走一遍Online网络,并向 A u g 1 Aug1 Aug1 图像对应的Target分枝表示向量靠近。也就是说,BYOL的Total Loss为: L b y o l = L a v g 1 + L a v g 2 L_{byol}=L_{avg1}+L_{avg2} Lbyol=Lavg1+Lavg2

那么关键问题来了,BYOL只是用了正例,为什么没有发生模型坍塌呢?
在理论层面,目前仍然是未解之谜。在实验层面,论文中指明如果将Predictor去掉会导致模型坍塌。另外,如果让Target结构参数和Online部分共享保持一致,不再使用动量更新(Momentum Update),只要把Predictor部分的学习率调大,那么BYOL同样也不会坍塌,这也是SimSiam的做法。
这里可以参考文章:防止坍塌不需要EMA与BN

SimSiam进一步对BYOL进行了简化,我们可以大致将SimSiam看作是:把BYOL的动量更新机制移除,下分枝的Encoder及Projector和上分枝对应构件参数共享版本的BYOL
在这里插入图片描述
关于SimSiam的介绍可以看看作者在Valse Webinar的报告视频【VALSE论文速览-02期】探索简单孪生网络表征学习

下面两个图证实了stop_gradient算子以及predictor模块 才是SimSiam不坍塌的关键:

1.对模型做经验实验,分别用没有predictor模块的,和有predictor模块但固定随机初始化参数的,和原有进行对比。结果发现,仅仅只是少了个 MLP 预测头,结果就天差地别,根本就不能收敛。


2.同样的模型,如果不加stop_gradient算子结果也是根本不收敛
在这里插入图片描述
下图总结了SimSiam与SimCLR、SwAV、BYOL、MoCo的直观区别:
在这里插入图片描述

基于冗余消除损失函数的对比学习:越简单越快乐【以Barlow Twins为例】

Barlow Twins也只使用正例,在图像增强、Encoder以及Projector这几处,和SimCLR模型基本保持一致。我们上面说过,BYOL是靠上下分枝的结构不对称,来阻止模型坍塌的。然而,Barlow Twins采取了上下分枝对称结构,且两者参数共享。它既没有使用负例,也没有使用不对称结构,主要替换了一个新的冗余消除损失函数来防止模型坍塌。

A u g 1 Aug1 Aug1 A u g 2 Aug2 Aug2 里的正例分别做BN正则,之后在Batch内,对 A u g 1 Aug1 Aug1 A u g 2 Aug2 Aug2 两个正例表示矩阵做矩阵乘法,求出两者的互相关性矩阵(cross-correlation matrix),其损失函数定义在这个互相关矩阵 C \mathcal C C 上: L b t = ∑ i ( 1 − C i i ) 2 + λ ∑ i ∑ ( j ≠ i ) C i j 2 L_{bt}=\sum_i (1-\mathcal C_{ii})^2+\lambda\sum_i\sum_{(j \neq i)}\mathcal C_{ij}^2 Lbt=i(1Cii)2+λi(j=i)Cij2

下面是冗余消除损失函数原论文中的具体信息:
在这里插入图片描述
在这里插入图片描述

到此,对于表示学习(Representation Learning) 的发展逻辑盘点就暂时结束,但可以看出这里面还有个坑没有填好就是关于问题:BYOL、SimSiam只是用了正例,为什么没有发生模型坍塌呢? 对于这个问题目前学术界也没有给出理论上的解答,读者们可以思考思考这个问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoaringPigeon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值