该领域论文主要来自三大组:
Facebook AI Research (FAIR) :MoCo v1&v2, SwAV,Simsiam,Twins
Google Research, Brain Team:SimCLR v1 & v2
DeepMind Research:BYOL
(1)谷歌组 SimCLR v1 & v2
SimCLR是self-supervised learning与contrastive learning中重要的一个相当重要的里程碑,其最大的特点在于研究各种数据增强 (data augmentation) 作为SSL的归纳偏置 (inductive bias),并利用不同data间彼此的互斥强化学习目标,避免contrastive learning的output collapse。
整体运作概念分为三个阶段:
先sample一些图片(batch of image)
对batch里的image做两种不同的data augmentation
希望同一张影像、不同augmentation的结果相近,并互斥其他结果。
如果要将SimCLR的架构划分阶段,大致可以分成两个阶段,首先是大个embedding网络执行特征抽取得到y,接下来使用一个小的网络投影到某个固定为度的空间得到z。
对于同一个x,用data augmentation得到不同的v,通过网络抽取、投影得到固定维度的特征,计算z的contrastive loss,直接用gradient decent同时训练两个阶段的网络。
SimCLR直接比MoCo高出了7个点,并直逼监督模型的结果。
(2) FAIR组 MoCo v1&v2, SwAV,Simsiam
MoCo (momentum contrast) 的想法是维持两个encoder,一个使用gradient decent训练,另一个的参数则是跟著第一个encode的参数,但是使用momentum更新,保持一个相似但不同的状态。而这个momentum encoder的输出会被一个queue储存起来,取代原本的memory bank。相比原本的memory bank作法,MoCo的储存的representation比较新,保持一致性的同时也藉由momentum encoder确保了足够的对比性。
MoCo v2 只是将SimCLR的两个组件 (stronger data augmentation与投影网络 )加入MoCo的架构。相对于SimCLR,多了momentum encoder与memory bank,且不需要特别大的batch。
具体的,如下图,图中的顶行和底行表示相同的网络(由θ参数化),MoCo将单个网络拆分为θ参数化的在线网络(顶行)和ξ参数化的动量网络(下排)。在线网络采用随机梯度下降法进行更新,动量网络则基于在线网络权值的指数移动平均值进行更新。动量网络允许MoCo有效地利用过去预测的记忆库作为对比损失的反面例子。这个内存库使批处理的规模小得多。在我们的狗图像插图中,正面的例子是相同图像的狗的作物。反面例子是在过去的小批量中使用的完全不同的图像,它们的投影存储在内存库中。
SimSiam简单用一句话描述就是没有momentum encoder的BYOL。BYOL拿掉了MoCo的memory bank,SimSiam进一步地拿掉了momentum encoder。方法简单,实务上同样能避免collapsing output的发生。
SimSiam的架构与BYOL一样是三个阶段的架构,先过主网络embedding,再过小网络projection,最后过小网络prediction。与BYOL不同之处在于SimSiam并没有两组网络参数,同一个网络对于不同的view交互地用latent projection互为彼此的prediction target。在更新参数时,都只计算prediction那条路线的gradient,也自然没有什么momentum encoder。
这里在BYOL的基础上去除了momentum更新的target encoder, 直接让target encoder = online encoder。指出了predictor+stop-gradinent 是训练出强大SSL encoder的一个充分条件。
再次的阶段小结:在这个阶段,认识进展到了可以没有负样本的阶段,但是不使用负样本,模型就会有陷入平凡解的风险。为此,BYOL设计了predictor 模块,并为之配套了stop-gradient技巧;SimSiam通过大量的试验和控制变量,进一步做减法,去除了momentum update。让模型进一步变得简单。再次总结,就是predictor模块,避免了直接拉近正样本对,对于梯度的直接回传,让模型陷入平凡解。
DeepMind BYOL
BYOL建立在MoCo动量网络概念的基础上,添加了一个MLP来从 z 预测 p ,而不是使用对比损失,BYOL使用归一化预测 p 和目标z’之间的L2 loss。继续使用我们的dog image示例,BYOL尝试将dog图像的两个裁剪转换为相同的表示向量(使 p 和 z’相等)。因为这个损失函数不需要负示例,所以在BYOL中没有内存库的用处。
在BYOL中的两个MLP仅第一个线性层之后使用批处理标准化。
文章的核心点就是要破除“负样本迷信”,BYOL认为不使用负样本,照样可以训练出效果拔群的SSL model。但是如果直接抛弃负样本,只拉近正样本对的话,model 会容易陷入平凡解:对于任意样本,输出同样的embedding。为了在没有负样本的帮助下,解决这个问题。BYOL 在Projector之上,增加了一个新的模块,取名Predictor。整体可以理解为在MoCo的基础上,但是不再直接拉近正样本对(即同一个样本,不同增强后的输出)的距离,而是通过Predictor去学习online encoder 到 target encoder (即moco里的momentum encoder)的映射。另外,对target network梯度不会传递,即Stop-Gradient。
阶段小结 Simclr+MOCO
抛开细节,SimCLR和MoCo的核心点,都是认为negatives(负样本)非常重要,一定要有足够多的负样本,只不过实现方式略有不同。SimCLR 拿着TPU,直接把batch size搞到4096,一力降十会;恺明则是巧妙设计Momentum机制,避开了硬件工程的限制,做出了可以飞入寻常百姓家的MoCo。再次重申,这时候的认识,还是停留在需要大量的负样本,来提升SSL model的效果这个历史局限里。
再次的阶段小结 BYOL+SimSiam
在这个阶段,认识进展到了可以没有负样本的阶段,但是不使用负样本,模型就会有陷入平凡解的风险。为此,BYOL设计了predictor 模块,并为之配套了stop-gradient技巧;SimSiam通过大量的试验和控制变量,进一步做减法,去除了momentum update。让模型进一步变得简单。 再次总结,就是predictor模块,避免了直接拉近正样本对,对于梯度的直接回传,让模型陷入平凡解。BYOL 和 SimSiam 在方法上都是很不错的,试验也做得很可信充分,可是对于方法的解释并没有那么深刻置信,可能要寻求一个扎实的解释也确实很难。可以参见从动力学角度看优化算法(六):为什么SimSiam不退化? - 科学空间|Scientific Spaces,也是另一个角度的解释,颇为有趣合理。此时已经进入到了摆脱了负样本了,但是在不使用负样本的情况,要想成功训练好一个SSL model,需要引入新的trick: 即predictor+stop-gradient。这样子来看,难免有点像左手换右手的无用功,但是整体的技术认识是进步了很多的。
参考文献:https://zhuanlan.zhihu.com/p/342244090