链接:https://www.zhihu.com/question/453203448
编辑:深度学习与计算机视觉
声明:仅做学术分享,侵删
作者:小小将
https://www.zhihu.com/question/453203448/answer/1826367462
认真的读了一下论文,还是对He表示大大的钦佩,非常细致的工作。
首先MoCo v3不应该是这篇论文的重点,这篇论文的重点应该是将目前无监督学习最常用的对比学习应用在ViT上。MoCo v3相比v2去掉了memory queue,转而像SimCLR那样采用large batch来取得稍好一点的结果,从结构上encoder 借鉴BYOL那样增加了一个prediction head,在ResNet上效果有稍许提升:
重头戏主要在MoCo v3在ViT上的实验,这里简单总结如下:
(1)从实验结果来看,基于MoCo v3训练的ViT-BN-L/7模型在ImageNet linear probing protocol上取得了新的SOTA,超过Top-1 acc达到81.0%,超过79.8% with SimCLR v2 (SK-ResNet152-3×), and 79.6% with BYOL (ResNet200-2×)。这证明了ViT在无监督训练上的优势。
(2)发现了ViT在无监督训练过程中的instability,这个训练不稳定并不会导致灾难性的性能骤降,而只是稍许的性能下降,这就比较难以察觉。batch size和lr会明显影响ViT训练的稳定性,比如batch size为6144时,从训练过程中的acc曲线可以看到会出现比较明显的“dips”,这就好像网络又重开始训练一样。虽然训练不稳定,但最终的效果为69.7,相比batch size为2048的72.6只掉了不到3个点。当lr过大时也会导致instability。
论文中进一步分析这个"dips"出现的原因,发现其实是训练过程中的梯度会出现陡峰造成的,而且发现first layer先出现,然后延迟一些iterations后last layer也出现梯度骤增。所以这种训练不稳定性是由于first layer造成的可能性比较大。
论文中提出的一种解决方案是,ViT采用a fixed random patch projection layer,这相当于这patch embedding是固定的,而不是训练得到的(其实对projection layer做gradient clip也是可以,但是最终发现需要设定一个极小的阈值,这就等价于freeze它了)。这个简单的trick可以解决部分这种训练的instability:
但这并没有本质解决这个问题,因为当lr过大时这种现象还是会出现的。
(3)尽管更大的ViT模型可以取得更好的效果,但是还是可以发现模型越来越大时会出现saturation的趋势,当然最简单的解决方案是喂给更多的数据。还有可能是基于instance discrimination的pretext task过于简单,还需要设计更好的pretext task。
(4)position embedding的影响:去除PE,在无监督训练过程去除PE,效果也下降了1个多点。在有监督训练中,去除PE的影响会更大一些,ViT论文中是报道掉了3个点以上。去除PE还能学习的这么好,说明ViT的学习能力很强,在没有位置信息的情况下就可以学习的很好;从另外一个角度来看,也说明ViT并没有充分利用好PE而取得更好的效果,具体是哪个原因还需要进一步的研究。最近的CPVT和CvT也提出引入卷积来去除PE。
最后摘抄论文中的两段脚注(透过现象看本质):
self-attention vs convolution
transformer vs resnet
作者:TniL
https://www.zhihu.com/question/453203448/answer/1822153464
大致读了一下论文,个人比较感兴趣的地方是把patch projection固定为随机初始值可以缓解ViT训练不稳定问题。这让我想到了https://arxiv.org/pdf/2011.08704这篇工作,核心思想是将输出端的参数(class vectors)固定,虽然他们的出发点是不是训练稳定性问题,但是实验确实发现固定类表示时能支持更高的学习率:
注意到表7中0.1的初始学习率会导致两个数据集的非固定类表示直接NaN
当然He组的这篇是在输入端固定参数,形式上还是有很大不同。我大胆猜想(可能沦为民科地)有两个角度可以解释这个问题:
1、两个相邻层的参数难以避免地会产生共演化的问题,结果就是两辆自行车即将相撞时产生“你向左我往右”的尴尬境地,这种现象副作用体现在梯度上,接近输入端的参数受到影响会被反向传播放大,结果是越低层梯度震荡越大。
2、固定输入层参数是一种很强的正则化手段,实质上大大缩小了假设空间,避开了输入端演化可能导致的不好的区域。
总之这个现象值得思考,上述纯属猜想,仅供参考。——更:谢谢评论区
@棒棒糖的补充,看了一下,NIPS2019的LCA(链接)也提到了类似的问题,即第一层和最后一层神经网络的LCA一直为正(hurt learning),但是固定第一层参数会导致其他层的参数学得不那么好,总体表现不变,和He组的这篇结论还是有所不同。不过结论挺有意思,贴一下:
作者:黄挂
https://www.zhihu.com/question/453203448/answer/1840244013
文章最值得一提的就是fix random patch这个骚操作了。想从另一个角度说下看法,这个看似诡异反直觉的idea,其实文章有很严谨的推理过程。我看完这个idea的第一感觉就是自己就算想出来也会立刻被自己毙掉不会去试,为什么作者会试并且work了呢,我想这里就体现出和顶级研究者的认知差距了吧。
我们捋一下作者是如何提出这个观点的,试图学习一下人家是怎么思考问题的:
先debug模型:因为是自监督训练 ViT,没法直接看效果不好debug。所以想到了用kNN classifier Curve 的方法来极高效的看中间效果。发现训练中间确实会有偶尔 acc 猛掉的情况。
如何观测:自然想到是不是中间iter模型参数炸了,那我们看看训练中间的gradient怎么样,于是把训练中网络各个层的gradient 可视化,发现确实会偶然炸毛一下。而且发现第一层炸毛之后几十个iter后最后一层会炸毛。
提出假设:那么自然的因果假设就是,最后一层的炸毛是由第一层参数炸毛引起的,因此第一层参数可能是导致训练不稳定的原因。
设计实验:既然第一层是“罪魁祸首”,那就试试把他冻结住会怎么样了。于是就有了这篇文章。
这个过程就很自然丝滑,让人感慨深度学习真就不是炼丹,是很有逻辑的。
作者:江山如画
https://www.zhihu.com/question/453203448/answer/1821807893
恺明的这篇文章之前很多方法也在谈transformer在自监督预训练上的作用,可能是我看的少,之前的方法和主流的MoCo,SimCLR,BYOL等框架没有契合在一起。这个应该算是第一个讲主流的自监督框架和transformer融合在一起的结果。
从恺明最近的文章可以看到,他的研究偏向于一些通用细节的设计,比如之前在RegNet提出的100epoch的给出初步趋势的事在这里就得到了应用。moco中动量更新的方法也是自监督中比较好用的武器。这篇文章中给出锁定proj头以及lr大小和稳定性的关系在后续实验中都可以做参考去使用。
所谓磨刀不误砍柴工,以后恺明团队的文章应该在实验设计上会相对比较固定,在大多数trick都充分验证之后,新文章的实验会越来越简单。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓