文 | 王珣
从Kaiming的MoCo和Hinton组Chen Ting的SimCLR开始,自监督学习(SSL)成了计算机视觉的热潮显学。凡是大佬大组(Kaiming, VGG,MMLAB等),近两年都是搞了几个自监督方法的。从一开始的新奇兴奋地看着Arxiv上新发布的SSL方法(像MoCo, SwAV, BYOL, SimSiam等这些方法着实有趣),但是有一些相关的文章多少有些泛滥了,让人有些眼花缭乱。最近FAIR的一个工作,着实让我眼前一亮,觉得好有意思,颇为叹服。关键的是这个方法特别简单,应当可以称之为最简单的SSL。
论文题目:
Barlow Twins: Self-Supervised Learning via Redundancy Reduction
论文链接:
https://arxiv.org/abs/2103.03230.pdf
Arxiv访问慢的小伙伴也可以在 【夕小瑶的卖萌屋】订阅号后台回复关键词 【0324】 下载论文PDF~
藉此机会,我也自己梳理一下SSL在这不到两年的时间里的个人认为比较重要的认知变化的节点:从SimCLR,MoCo为起点,以这篇BarLow Twins为暂时的终点。从这个历史线上去看SSL的发展非常有趣:计算机视觉圈子对于SSL的认知在不断打脸的过程中不断深入。
1.首先是2020年初的SimCLR
这个文章的核心贡献有二:一是提供了使用google的丰富的计算资源和强大的工程能力,使用高达4096的mini-batch size,把SSL的效果推到了supervised方法差不多的效果(预训练模型做下游任务);二是细致地整理了一些对SSL效果提升很有用的tricks: 如更长的训练,多层MLP的projector以及更强的data augmentations。这些有用的trick在后来的SSL的论文中一直被沿用,是SSL发展的基石,而第一个点,则是指出了大batch-size出奇迹,为未来的论文指出了改进的路,或者树立了一个进击的靶子。
2.MoCo 共有两版本
原始版本是2019年末放出来的。在SimCLR出现后之后,又吸收SimCLR的几个SSL小技巧,改进出了V2版,但是整体方法的核心是没有变化的,V2仅仅是一个2页试验报告。相比于SimCLR大力出奇迹,恺明设计了一个巧妙的momentum encoder 和 dynamic queue 去获得大量的负样本。这里的momentum encoder 采用了动量更新机制,除了文章本身的分析,另一层的理解是:其实momentum encoder相当于是teacher, 而dynamic里是来自不同mini-batch的样本,所以teacher需要在时间维度上对于同一个样本的输出具有一致性,否则,要学习的encoder 也就是student,会没有一个稳定的学习目标,难以收敛;当然另一方面,teacher 也不能一直不变,如果teacher一直不变,student就是在向一个随机的teacher学习。综上,动量更新机制是一个相当好理解的选择。
阶段小结
抛开细节,SimCLR和MoCo的核心点,都是认为negatives(负样本) 非常重要,一定要有足够多的负样本,只不过实现方式略有不同。SimCLR 拿着TPU,直接把batch size搞到4096,一力降十会;恺明则是巧妙设计Momentum机制,避开了硬件工程的限制,做出了可以飞入寻常百姓家的MoCo。再次重申,这时候的认识,还是停留在需要大量的负样本,来提升SSL model的效果这个历史局限里。
3.BYOL 是Deep Mind 在2020年发布的工作
文章的核心点就是要破除负样本迷信 ,BYOL认为不使用负样本,照样可以训练出效果拔群的SSL model。但是如果直接抛弃负样本,只拉近正样本对的话,model 会容易陷入平凡解:对于任意样本,输出同样的embedding。为了在没有负样本的帮助下,解决这个问题。BYOL 在Projector之上,增加了一个新的模块,取名Predictor。整体可以理解为在MoCo的基础上,但是不再直接拉近正样本对(即同一个样本,不同增强后的输出)的距离,而是通过Predictor去学习online encoder 到 target encoder (即moco里的momentum encoder)的映射。另外,对target network梯度不会传递,即Stop-Gradient。(注:在MoCo中,momentum encoder也是没有梯度回传的,不过MoCo这么没有给momentum encoder回传梯度是因为queue里面的负样本来自过去的mini-batch,其计算图已经丢失,没有办法回传梯度,而如果只回传正样本对的梯度,会很不合理。而BYOL是只考虑正样本对,如果梯度对于online encoder 和 target encoder都回传,不存在这个不合理的点,因此,Stop-Gradient是BYOL的一个特别的设计。)
4.SimSiam 是在BYOL的再次做减法
这里在BYOL的基础上去除了momentum更新的target encoder, 直接让target encoder = online encoder。指出了predictor+stop-gradinent 是训练出强大SSL encoder的一个充分条件。
再次的阶段小结
在这个阶段,认识进展到了可以没有负样本的阶段,但是不使用负样本,模型就会有陷入平凡解的风险。为此,BYOL设计了predictor 模块,并为之配套了stop-gradient技巧;SimSiam通过大量的试验和控制变量,进一步做减法,去除了momentum update。让模型进一步变得简单。再次总结,就是predictor模块,避免了直接拉近正样本对,对于梯度的直接回传,让模型陷入平凡解。BYOL 和 SimSiam 在方法上都是很不错的,试验也做得很可信充分,可是对于方法的解释并没有那么深刻置信,可能要寻求一个扎实的解释也确实很难。可以参见(https://spaces.ac.cn/archives/7980),也是另一个角度的解释,颇为有趣合理。此时已经进入到了摆脱了负样本了,但是在不使用负样本的情况,要想成功训练好一个SSL model,需要引入新的trick: 即predictor+stop-gradient。这样子来看,难免有点像左手换右手的无用功,但是整体的技术认识是进步了很多的。
5.最后,终于到了这次的主角:Barlow Twins
在不考虑数据增强这种大家都有的trick的基础上, Barlow Twins 既没有使用负样本,没有动量更新,也没有predictor和stop gradient的奇妙操作。Twins 所做的是换了一种视角去学习表示,从embeddig本身出发,而不是从样本出发。优化目标是使得不同视角下的特征的相关矩阵接近恒等矩阵,即让不同的维度的特征尽量表示不同的信息,从而提升特征的表征能力。这种做法,和以前传统降维(如PCA)的方法是有共通之处的,甚至优化的目标可以说非常一致。
▲Barlow Twins 模型整体图
设 模型为 ,其模型参数记为 。
对于 不同的视角 下的输入 ,分别输出的特征 , 其中 。
那么Twins 方法和以上的基于正负样本对的所有方法的区别,不严格(抛去特征normalize,BN等操作来说)的来说,可以用一句话,或者说两个式子来概括。
过去的方法大多基于InfoNCE loss 或者类似的对比损失函数,其目的是为了是的样本相关阵接近恒等矩阵,即
而Twins的目的是为了让特征相关阵接近恒等,即:
对于对比损失类方法,比如SimCLR或MoCo需要很大的Batchsize或者用queue的方式去模拟很大的batchsize, 而Twins需要极大的特征维度(8192)。这种特性和以上两个公式是完全对应且对称的。一个需要大 ,一个需要大 。
▲Barlow Twins 的核心在于提出了图中新的损失函数
总结
从历史线上来看,从SimCLR和MoCo说一定要有大量的负样本,到BYOL和SimSiam通过神奇操作(stop-grad+predictor)验证了负样本并非不可或缺,最终到了Twins切换了一直以来从对比学习去训练SSL的视角,转向从特征本身出发,推开了另一扇大门。对比而言,相比于最简单的裸InfoNCE,Twins仅仅是换了一个loss function (+大维度的特征)。不过,大的维度相比于增加batchsize的代价要小得多,就是多占一点的显存。