大佬看问题的角度真的不一样,简单的方法,但为什么这么干的背后思考有理有据,实施细节的设计也是充满灵性。
自监督的方式,催生了NLP领域很多漂亮的工作。将文本中一部分词mask掉,来自监督预测这部分词,构建encode-decode模式,这样就可以得到比较鲁邦的encode模型,用在其他一些任务上作为预训练模型。
大佬的思考是,图像上的自监督应该怎么开展?
图像与NLP的差别:NLP的文字是高级信息,因为被人类提炼过,每个字都有自己的角色,信息密度高;图像更多是冗余信息,周边像素点可能差不多的,信息密度低。
建模差异:NLP用序列类模型,mask很容易实施;图像用CNN,接受规范的网格数据,怎么做到有效的mask掉?ViT把图像序列化了,用ViT。
进一步,前述图像中信息冗余多,只是mask掉一小部分数据,很容易通过周边信息推理出来,比较浅层的语义学习就行;但优秀的encode必须能提取到高层语义,比如物体、属性等,这就需要逼模型往高层走,所以施加大比例的mask(75%),让模型无法基于浅层信息就搞定。
具体的,将图像patch后,随机mask掉一定比例,并将这些mask的patch拿走不进入encode训练;encode后把mask的patch再按原来位置加回来,进decode试图重建出原图。
因为这是自监督的预训练网络,主要为下游任务提供基础;下游任务不会发生输入中有mask的patch,所以encode训练时也不能有。
在decode时,可直接预测patch内每个像素点值,或者PCA预测整个patch的频域信息(按特征值累计大小,只取低频);或者,预测patch内相似度的均值方差+每个点相对变量,这样可以提高patch内点的对比度,这个效果最好。
还讨论了linear probing和所有层fine-tune两种模式,如果有些语义是非线性的,那在微调时只调linear部分就会调整不了非线性信息。“Partial Fine-tuning”,部分层+线性层调,发现多调部分层就可以达到全调的精度。