有小黑子说我家ViT在小数据集上不work,我真的忍不了了!

文摘   2025-01-25 11:21   安徽  

点击下方卡片,关注“AI前沿速递”公众号

各种重磅干货,第一时间送达


转载自知乎:cloud erow   链接:https://zhuanlan.zhihu.com/p/18137386714

江湖传言,ViT需要大量数据才能超过CNN。总所周知,ViT的attention机制难收敛难训练。所以如果没有足够的训练数据,那么ViT就不能得到一个很好的解似乎就是一个合理的推论。但是事实真的如此么?

口说无凭,首先调查一下ViT在cifar10上的有监督训练能达到多少。按关键词检索,很容易发现一些文献:其中,红框的论文提到使用ViT-Tiny重头开始训练可以达到93.58的准确率。注意,这个tiny只有9层,一共2.8M参数。这个成绩,就问CNN怕不怕?

为了一探究竟是怎么回事,我使用timm的训练脚本分别训练了vit-tiny (12层)和convnext-atto。结果如下

病因

虽然ViT更好,但是结果并不令人满意。这个结果也很正常,timm默认脚本是针对imagenet优化的。去github上拔代码,默认的参数也很可能是针对imagenet的。那么在处理cifar10数据的时候自然效果很差。而一些所谓cifar10的vit训练脚本,其实是在imagenet pretrain, cifar10 finetune的脚本,而不是真正的训练cifar10脚本。

解决办法

data augmentation的scale ratio默认是(0.08, 1)。如果随机裁剪到0.08的区域,还能看见东西么?图像的归一化的均值和方差也需要用cifar10的,而不是imagenet的。数据增强对cifar10来说,过于强了,需要使用drop path等正则化手段避免过拟合。其实只要修改数据增强,就可以轻松达到92,再优化一下参数就能达到93。下面是我跑的ablation有趣的是,将q通过MLA降维到32以后,性能依然很不错。这说明即使是vit tiny,也还有冗余结构。

更快的ViT

我尝试使用class attention。来进一步减少ViT的推理速度。depth 为self-attention的层数,CLS depth为class attention的层数。结果如下

使用class attention可以兼顾性能与速度。(理论上是要调一个速度比12层self-attention快,性能要好的模型。太麻烦了,就算了)

More

ViT其实最缺的不是数据,而是训练。在cifar10上做预训练,再finetune可以取得更好的结果。其实早在21点文章就发现了这点,不用大数据预训练,用小数据预训练一样可行。


欢迎投稿

想要让高质量的内容更快地触达读者,降低他们寻找优质信息的成本吗?关键在于那些你尚未结识的人。他们可能掌握着你渴望了解的知识。【AI前沿速递】愿意成为这样的一座桥梁,连接不同领域、不同背景的学者,让他们的学术灵感相互碰撞,激发出无限可能。

【AI前沿速递】欢迎各高校实验室和个人在我们的平台上分享各类精彩内容,无论是最新的论文解读,还是对学术热点的深入分析,或是科研心得和竞赛经验的分享,我们的目标只有一个:让知识自由流动。

📝 投稿指南

  • 确保文章为个人原创,未在任何公开渠道发布。若文章已在其他平台发表或即将发表,请明确说明。

  • 建议使用Markdown格式撰写稿件,并以附件形式发送清晰、无版权争议的配图。

  • 【AI前沿速递】尊重作者的署名权,并为每篇被采纳的原创首发稿件提供具有市场竞争力的稿酬。稿酬将根据文章的阅读量和质量进行阶梯式结算。

📬 投稿方式

  • 您可以通过添加我们的小助理微信(aiqysd)进行快速投稿。请在添加时备注“投稿-姓名-学校-研究方向”


    长按添加AI前沿速递小助理


AI前沿速递
持续分享最新AI前沿论文成果
 最新文章