=======================最新更新(2020/12/16)=================
今天突然想到,可以把AdCo的负样本直接看成是负类别,负样本就是负类别的线性分类器参数。详见下面的第5节。
=============================更新========================
再说几句我想到的。如果我们把负样本看作和一般network weights一样的自由变量,那么由K个D维样本组成的负样本可以看成是一层的 的MLP神经网络层;而Adversarial Contrast 对这层MLP优化是通过对抗性的maximize contrastive loss来实现的。
从这个意义上来说,BYOL里也多了一个做predictor的MLP层,而不同的地方则是BYOL更新这层是非对抗性的。虽然BYOL的predictor里的参数不是负样本,但某种意义上可以看作是某种包含典型样本对应特征的codebook,这个codebook的组合形成了对另一个分支输出特征的预测。为了达到精确预测的目的,势必要求这个codebook要比较diverse,不能出现collapse的现象。而BN则能够保证codebook要拟合的对象不会collapse。
所以不论 AdCo还是BYOL,从概念上来说,都是要引入额外的一层MLP,来做对比学习。
==================以下是原来的回答=============================
最近我们也做了一些和contrastive learning相关的工作,在此过程中比较详细的研究了一下BYOL,发现有人做了非常详细的分析。下面我会先简单总结一下,之后讨论下在对比学习中我们究竟应不应该要负样本(剧透一下我的观点,从实践和理论上,负样本在对比学习中都不用刻意去避免)?最后文末留一个彩蛋。
目录
2. 这个BN必须是global BN,在所有的GPU之间做同步,这就会导致训练的速度会非常慢,这个也和实验里report的所消耗的GPU时间是一致的;
3、尝试了其他的normalization,包括非global的BN, 以及WN和LN,得到的结果都不理想,训练过程也不稳定。
这个blog的作者做了非常详细的分析和实验,我看了后觉得至少实验证据上来看,BN的作用是比较重要的。
至于,它的作用是不是如所宣称的是提供负样本,那就仁者见仁智者见智了。
接下来我想谈谈到底在对比学习中要不要negative 样本。
首先,从比较纯粹的实用主义角度来说,MoCo V2甚至SimCLR这类基于负样本的对比学习方法,自监督训练的时间都是相比BYOL较少的。这点不难理解,MoCo V2和SimCLR 不需要基于Global BN,所以计算消耗最大的feedforward部分相对就快很多;
相比而言,MoCo V2每个minibatch可以更小。这个也容易理解: BYOL 如果的确是把BN得到的mean样本作为负例,太小的minibatch上做的和负例的对比显然是不太稳定和可靠的。
另一方面,MoCo V2唯一不太elegant的地方是要不断得维护一个队列。不过,这点从计算量而言并没有增加太多,所以也是可以接受的。
而且,用一组负样本做对比学习,从性能的角度来说,可能更稳定,毕竟多个负样本的对比可以提供更多的备份。而且类似softmax的contrastive loss从运算量来说相比网络feedforward也是 可以忽略不计的。
所以,我的结论是负样本在对比学习里不见得是一个minus,关键是怎么用怎么来找。
BYOL中除了sync BN外,为了用一个分支得到的特征去预测另外一个分支输出的特征,还需要训练一个基于MLP的预测器(predictor)。虽然BYOL的predictor里的参数不是负样本,但某种意义上可以看作是某种包含典型样本对应特征的codebook,这个codebook的组合形成了对另一个分支输出特征的预测。为了达到精确预测的目的,势必要求这个codebook要比较diverse,能比较好得覆盖另外一个分支输出的特征,不能出现collapse的现象。
从模型参数的角度来说,这个额外的 Predictor Layer 正相对于一般对比学习里用到的负样本,只不过前者是直接通过反向传播训练得到的,而后者在MoCo和SimCLR里是通过收集过去或者当前的minibatch中的特征得到的。
那么,一个自然的问题就是,负样本能够也能像Predictor layer一样通过训练出来吗?如果可以,就意味着对比学习中的负样本也可以看作是模型的一部分,并且可以通过训练的方法得到,这就给出了一种更加elegant的方法来构造负样本。
遗憾的是,直接去最小化contrastive loss并不能用来训练负样本,因为这样得到的是远离所有query样本的平凡负例。这里需要我们换个思路。
这里,介绍一个我们最近的一个工作 AdCo (Adversarial Contrast),我们发现
1、完全可以把负样本作为类似network weights的自由参数来训练,而不是像MoCo V2那样不断用新样本特征去更新;好处是因为所有的负样本都是同时每次update,负样本在训练里的价值会更高。作为对比,MoCo V2每次只能更新当前负样本队列里的很小的一部分;
2、当然,update负样本就不能去minimize对应的contrastive loss,而要maximize它,使得得到的负样本更加地困难,而对训练representation network更有价值,这就得到了一个对抗性的对比学习,对抗的双方是负样本和特征网络;
3、通过对update负样本的梯度进行分析,我们发现这种方法具有非常明显的物理意义。负样本每次更新的方向都是指向当前正样本的一个以某个负样本所归属的正样本的后验概率为权重,对正样本做加权平均得到的梯度方向;
4、实验发现,在同样的训练时间、minibatch大小下,AdCo的精度都会更高,这个来自对负样本更有效的更新迭代。
在提交的附件中,我们进一步比较了AdCo是否可以通过训练更少的负样本来得到同样好的无监督预训练模型。答案是肯定的。
如下面的结果所展示的,只用原先1/4和1/8的样本,在ImageNet 上的top-1 accuracy几乎没有任何损失。这进一步说明了,通过直接用对抗的方式训练负样本,把负样本看成是模型可训练参数的一部分,完全可以得到非常好的训练效果,而且相对于其他的模型,所用的 GPU训练时间也更少。
从另外一个角度来说,我们也可以把每个负样本看作是一个与query的正样本对立的负类别。这样,每个负样本就对应一个负类别的线性分类器的参数。这个时候,AdCo训练的就是负类别分类器的参数,这样也就能更好的理解为什么对比学习中的负类别可以当作是自由变量来直接更新和优化。
这就给我们进一步打开对比学习的工作原理提供了一个新的思路。我们需要的不是负的样本,而是可以和每个正的query进行对抗的负类别。正样本通过与负类别的对抗,可以更好的进行自监督训练。
有兴趣的同学可以参考我们在arxiv上的论文
欢迎大家关注我的知乎账号
和专栏
感觉之前BN那块砖可能抛得有点歪,更新一下,再强调一下EMA
====
最近BYOL挂出来了,我就发表一下浅见,抛砖引玉.悄悄地放了点私货在结尾.
首先回顾一下最近用的比较多的contrastive loss,具体形式如下:
假定给了 是一对positive pair,e.g. 同一张图片的两个crop或者是一对声音视频,同时你还有很多个负样本 ,e.g., 其他图片的crop或者不align的声音视频.给定x后,contrastive loss就是从所有那些试图欺骗我们的负样本中选出唯一正确的那个y,这个问题通常就表达成如上的一个softmax-CE loss.这里 代表你提取的经过了L-2 normliazation的特征,注意这两个特征可以是不同的网络提取的.这个loss可以进一步分解成两个部分(参考我们组tongzhou wang的ICML论文,论文里面公式推导很多,我取重点如下):
这个意思就是说,我可以把contrastive loss分解成两个部分,第一部分叫做alignment,就是希望positive pair的feature接近,第二部分叫做uniformity,就是希望所有点的feature尽量均匀的分部在unit sphere上面,都挺好理解的吧?这两部分理论上是都需要的,假如只有alignment,没有uniformity,那就很容易都坍缩到0,就是退化解。
说了这么多,跟BYOL有什么关系呢.BYOL就是去掉uniformity,只保留了alignment.这听起来似乎不太科学,理论上不work啊.我个人理解其实BYOL在悄悄地做dispersion,默默地在分开不同样本的特征.从文章里面可以读出两点:
(1) 对比表格5a的第三条和最后一条可以看出来EMA很重要.这点猜测,EMA可能在帮助悄悄scatter feature,初始化的随机性本身就把feature scatter开来了,它更新慢或许能保持这种分散开的特性,使得online network的不同图片在regress的时候target是不同的,进而帮助阻止模型塌陷.
(2) 对比表格5b的第一条和倒数第二条,可以看出来多的这个predictor非常重要,虽然它只是1或2层全连接.我觉得它给了online network很好的灵活性,就是online network的feature出来后不用完完全全去match那个EMA模型,只需要再经过一个predictor去match就好了.然后这个predictor的weight是不会update到EMA的,相当于一个允许online和EMA feature不同的缓冲地带.不过我第一次读到时候怀疑是个bug,不知道到底怎么回事.
文中里面我没直接读到,但是我猜测的点(可能会错):
(3) 我猜测一部分是因为骨干网络有BN,所以在一个大batch里面,BN会把不同点的特征scatter开来,就等于默默地在做dispersion.看BYOL的图3可以发现Batch Size还是有影响的,batch size越大scatter得越开,效果越好,反之越差(当然似乎比SimCLR好一点).BN应该是对online network以及EMA都有影响的.
(4) 最后这个regress的feature是L2-normalized的,可能这一步可以防止MSE把feature的scale都拉倒接近0.L2-normalized后这个MSE loss其实就变成把特征的方向对上,而scale就不在乎了.
综上所诉,我的观点还是把BOYL看成contrastive learning,只是uniformity是静悄悄地搞的(包括前天FAIR的一篇应该算是分类版本的contrastive learning).其实我个人还是喜欢contrastive learning这个框架的,能把非监督学习和监督学习(参考supervised contrastive learning)都统一到同一个loss下面(感觉谁可以再来搞一个semi-supervised的版本了就形成一条完整的链了).如果只单纯照着BYOL的思路的话感觉还不明白怎么把unsupervised和supervised统一在一起.另外关于下一步研究方向的猜测:
(1)盲猜以后的研究可以考虑怎么显式地scatter能比BN更好,比如特别设计一种normalization,然后或许就连EMA模型也可以拿掉了.
(2)如果对比它的表18,可以看出来显示的uniformity term还是有用的,可以从72.5提高到72.7,所以还是调得更好的SimCLR是SoTA哇。以后可以考虑怎么使得这个uniformity term更有效.
好了,夹带私货环节,咳咳,之前对contrastive learning做了一点分析,放了一篇arXiv出来: what makes for good views for contrastive learning?如果有喜欢对contrastive learning进行分析理解的童鞋,可以看看.最近也在更新一版估计过段时间放个干净点的v2.此外,release了一个contrastive learning method的打包package放在这里github,欢迎试用以及贡献.过段时间就把supervised contrastive learning放进去,ResNet-50有79%吧,似乎比cross-entropy是要好一些些的.