知行编程网知行编程网  2022-08-06 15:00 知行编程网 隐藏边栏 |   抢沙发  100 
文章评分 0 次,平均分 0.0

从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》

Barlow Twins: Self-Supervised Learning via Redundancy Reduction
https://arxiv.org/abs/2103.03230
藉此机会,我也自己梳理一下SSL在这不到两年的时间里的个人认为比较重要的认知变化的节点:从SimCLR为起点,以这篇BarLow Twins为暂时的终点。个人感觉,从这个历史线上去看SSL的发展非常有趣,整个圈子对于SSL的认知在不断打脸的过程中不断深入。
从 SimCLR 到 BarLow Twins ,一文了解自监督学习不断打脸的认知发展史
1. 首先是2020年初的SimCLR, 这个文章的核心贡献有二:一是提供了使用google的丰富的计算资源和工程力,使用高达4096的mini-batch size,把SSL的效果推到了supervised方法差不多的效果(预训练模型做下游任务);二是细致的整理了一些对SSL效果提升很有用的 tricks: 如更长的训练,多层MLP的projector以及更强的data augmentations。这些有用的trick在后来的SSL的论文中一直被沿用,是SSL发展的基石,而第一个点,则是指出了大力出奇迹,为未来的论文指出了改进的路,或者树立了一个进击的靶子。
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是作者的一个特别的设计。)
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 在方法上都是很不错的,试验也做得很可信充分,可是对于方法的解释其实做的还不够,可能是要寻求一个扎实的解释也确实很难。可以参见从动力学角度看优化算法(六):为什么SimSiam不退化?- 科学空间|Scientific Spaces(https://spaces.ac.cn/archives/7980),也是很有意思的解释。此时已经进入到了摆脱了负样本了,但是在不使用负样本的情况,要想成功训练好一个SSL model,需要引入新的trick: 即predictor+stop-gradient。难免有点像无用功,但是技术其实是在螺旋进步的。
5. 最后,终于到了这次的主角:Barlow Twins。在不考虑数据增强这种大家都有的trick的基础上, Barlow Twins 既没有使用负样本,也没有动量更新的网络,也没有predictor和stop gradient操作。Twins 所做的是换了一种视角去学习表示,从embeddig本身出发,而不是从样本出发。优化目标是使得不同视角下的特征的相关矩阵接近恒等矩阵,即让不同的维度的特征尽量表示不同的信息,从而提升特征的表征能力。这种做法,感觉和以前传统降维(如PCA)的方法是有共通之处的。
从 SimCLR 到 BarLow Twins ,一文了解自监督学习不断打脸的认知发展史
Barlow Twins 模型整体图
设模型为其模型参数记为 
其中
那么Twins 方法和以上的基于正负样本对的所有方法的区别,不严格(抛去特征normalize,BN等操作来说)的来说,可以用一句话,或者说两个式子来概括。
过去的方法大多基于InfoNCE loss 或者类似的对比损失函数,其目的是为了是的样本相关阵接近恒等矩阵,即
而Twins的目的是为了让特征相关阵接近恒等,即:
对于对比损失类方法,比如SimCLR或MoCo需要很大的Batchsize或者用queue的方式去模拟很大的batchsize, 而Twins需要极大的特征维度(8192)。这种特性和以上两个公式是完全对应且对称的。一个需要大  ,一个需要大  。
从 SimCLR 到 BarLow Twins ,一文了解自监督学习不断打脸的认知发展史
Barlow Twins 的核心在于提出了图中新的损失函数
另外,另一个有意思的点是Loss里面的超参数,在论文里,超参数  是通过搜索得到的,然后发现在等于0.0002=1/5000是效果不错。其实,这里的loss略微改写,是可以省却这个不必要的超参数的。损失函数的第二项里的求和换成平均即可。首先,里面的求和换成平均等价于原来公式中  ,虽然数字和搜出来并非完全相等,但是,这种超参数,从经验来说,在数量级上可以是完全一致了。可以合理的想像猜测在搜索这个超参数时,作者本人也是从数量级跨度去搜的。效果上, 和 应当不会有差。那么,一个有意思的问题,为什么是平均呢?我认为是平衡“正负样本”(对于Twins其实没有这个概念了,为了方便,类别来说,指的其实是对角线和非对角线)的梯度,InfoNCE其实是通过softmax形式来隐式的获得了梯度之间的平衡,而这里是直接累加,对应的梯度回传也是直接累加,如果不用平均,或者说没有极小且合适的  。“负样本对”梯度将会占据主导,结果就是,我们的相关矩阵的非对角线大多已经接近0,loss第二项确实优化得很好,但是第一项没有长进。也就是说对角线元素距离“梦想中的1”会比较远。如我以上的臆测分析是对的,那么用平均去换掉求和,省掉一个较为难调的超参数,会让Twins方法更简洁合理。
总结:从历史线上来看,从需要大量的负样本的SimCLR和MoCo,到通过特殊技术(stop-grad+predictor)实践说明了负样本的不必要性的BYOL和SimSiam,最终到了Twins, Twins切换了一直以来从对比学习去看待SSL的训练,而是从特征本身出发。删繁就简,可以认为相比于最简单的裸InfoNCE,仅仅是换了一个loss function。另外,大的维度相比于增加batchsize的代价要小得多,只是encoder最后几层比较大,需要大一点的显存,而不是成倍的显存。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享