jasperzhong / read-papers-and-code

My paper/code reading notes in Chinese
45 stars 3 forks source link

ICML '20 | A Simple Framework for Contrastive Learning of Visual Representations #83

Closed jasperzhong closed 4 years ago

jasperzhong commented 4 years ago

https://arxiv.org/abs/2002.05709

jasperzhong commented 4 years ago

这篇文章让我想起了当年 1h训练imagenet #4 ,同样都给了非常有用的训练技巧,基本是经验结论,每一个claim都有一个实验支撑,看完觉得很过瘾

总的来看,监督学习的很多经验,在对比学习里面并不适用

SimCLR

本文首先是提出了一个简单的对比学习方法SimCLR Screenshot-20200803150332-428x288

输入一张图片x,做两个data argumentation得到x1 x2,然后经过一个encoder(CNN backbone)变成$h$ feature/representation,再经过一个head(2层的MLP)变成$z$,最后计算loss

注意:最后是使用h作为最后的feature,而不是z. 预训练完后,丢弃head,保留encoder(后面有解释)

loss如何计算?参考下面的公式 image

假如输入有N张图片,经过增强后产生了2N张图片,N对pair是positive examples,而某个图片与其他剩下2(N-1)张图片都是negetive examples.

具体算法如下,非常清楚 image

Some tricks

这篇文章实验量非常大。。。就算有8台p3.16xlarge估计也要搞三个月……仔细一看用的是TPUv3,再见

TLDL.

  1. 必须使用large batch:后面解释了,large batch其实是增加了反例的数量(其实包括 MoCo #82 和 memory bank #86 都是在解决反例数量不足的问题,看来现在都是想多了,直接增大batch size就行了)另外需要加上large batch所必须的一些技巧:linear LR scaling(后面有跟sqrt root scaling对比), warmup, LARS #9 (都是某位ucb phd研究烂了的)
  2. training longer:这个是早期large batch解决generalization gap的一个技巧,不过后来有了linear scaling rule #4 基本就不用了,不需要longer的训练。但是对于对比学习,似乎需要更多的epochs
  3. data argumentation的组合使用很重要:这点其实可能是涨分最多的trick。。。发现crop + color distortion 比较好,最后benchmark中还加了gaussian blur.

另外还有一个坑: global BN:跨机跨卡BN,这个比较操蛋,local BN容易泄露信息,我还不清楚哪些框架支持这个(好像mxnet可以?),不过我估计# #82 的shuffle BN应该也可以

差不多就是这些tricks,文章其他部分就是做ablation study

Large batch & Training Lnger

batch size看上去最高到了8192,其实也不算多大,如果单卡256的话,也才32张卡而已,4台p3.16xlarge而已 image

large batch应该是这个方法能够work的关键,如果batch size只有256,最后linear evaluation的结果只有57.5%,这是远低于MoCo #82 的60.6%的;但当batch size翻倍到512,就超过了60%;当batch size达到8192的时候,逼近65%了。这涨分有点厉害。

但还不够。作者发现其实100个epochs(resnet50的supervised的标准一般是120epochs)还收敛的不够,继续训练到1000个epochs,居然可以涨到接近70%。而且训练越久,batch size之间的差异也开始缩小。

这个发现非常有意思。因为他们已经使用了linear LR scaling, warmup甚至LARS这样的技巧,对于supervise learning来讲,是不需要训练更久的(他们也在B3确认了这点,supervised训练更久没用)。这说明对比学习的收敛速度是远慢于监督学习的。 很期待有人来填坑,如何加速收敛(

作者还对比了linear LR scaling与root squre LR scaling(B2),结果看上去在训练不充分的情况下,后者表现更好些。 image 这二者之争确实挺久了…我以为 #4 已经终结了这个问题。但是没想到去年的 #3 又用了root squre LR scaling.... emmmmm 我也迷惑了

Data Argumentation

这张图不错,显示crop + color distortion是很好的组合 image

奇怪的是为什么这两个组合能涨点这么多?作者推测是因为单独使用crop的话,很容易导致color distribution是一样的。如下图。 image

另外他们还说明,对比学习需要更强的data argumentation相比于监督学习,如下图,color distortion越厉害,对于SimCLR涨点越多,而对于监督学习反而更差。。。 image

Architecture

Encoder

这里发现的结论是:模型越大,无监督对比学习涨分越多。如图 image

Head

他们使用了non-linear的head,也做了实验证明确实更好...如图 image

但是他们发现,使用head之前的h作为feature,要比head的输出z,更好(好10%)。这点就是为什么他们最后选择h作为feature的原因。他们的解释是non-linear projection是按照对data变换无关来训练的(大概是因为做了data argumentation?),所以non-linear projection可能会去除一些有用的信息,比如颜色或者方位。 然后他们做了一个实验,用h或者g(h)来预测使用了何种transformation image

最终对比

这组对比是Linear evaluation,resnet50能到69.3%,还是远低于supervised的76+% image

这组是semi-supervised,用部分标签来finetune,1%的标签能到75.5%,比较接近了 image

这组是在下游任务上做transfer learning,看上去光linear evaluation就能打平supervised了 Screenshot-20200803161600-2464x534


期待SimCLRv2 #92 是否解决了上面几个坑

  1. longer training time
  2. 能否进一步涨点
  3. global BN是否给换掉了
jasperzhong commented 4 years ago

我刚注意到 semi-supervised的结果是远差于linear evaluation的。。。Resnet50在1%标签上semi-supervised只有49%的top1....而直接linear evaluation都有69%了....

有趣....

jasperzhong commented 4 years ago

SimCLR learns representations by maximizing agreement between differently augmented views of the same data example via a contrasive loss in the latent space.