MAE

 开篇定性如上图

标题:Masked Autoencoder Are Scalable Vision Learners 带掩码的自编码器是一个可拓展的(scalable)视觉学习器

沐神说加入做的模型比较大就用scalable,算法比较快的话就用efficient

Masked就是要做完形填空的意思。

auto在机器学习中一般理解为自己而不是自动,其实我一直都觉得是自己的意思(尤其是自回归模型,不是自动回归,是用自己回归,即输入样本和预测标签来自同一个东西)但不确定。这里加一个auto就是强调输入样本和预测标签都来自图片,在视觉领域中很少有这种情况,一般分类的结果是文本。

题目用XX是XX,这种是一个非常强有力的句式,相当于结论浓缩成一句话直接当标题。

摘要:随即盖住一些图像块,再重构这些像素。这里有两个核心设计,一个是非对称的encoder-decoder架构,这里要先说明一下,虽然题目中讲只有encoder,但是严格来讲任何一个模型都会有decoder,就像在BERT(BERT我没学,但是应该和ViT里那个结构差不多)中,虽然不是transformer那种完整的解码器,但它的解码器就是最后的那个全连接层。这里的非对称是说编码器和解码器看到的东西是不一样的,编码器只看见可见的那些块。第二点就是说,如果mask掉很多的块,例如一张图片中75%的东西都盖住,就能够强行让模型学习到一些有用的东西。因为如果你只盖住一两个块,只用简单的插值也能插出来一点东西。

 

 架构图:首先将输入切块然后拉直,将没有被盖住的部分进行编码,然后在编码结果里把盖住的那些块插回去(这里插的只有位置编码),用解码器复原。这里编码器比解码器大一点,因为主要的计算量来自于编码。我们都知道transformer模型的计算量都特别大,这里只需要看1/4的图片就够了也是一个很大的亮点,算是一种加速方式。这个模型预训练好正式投入具体任务的时候,只需要编码器,把解码器丢掉就可以了。

 

 这里展示了只用1/4图片来还原原始图片的效果,可以看出来还原出来的东西还是比较模糊的。这里有一个严重的问题,就是这个用模型还原出来的模糊的图片,可能对于模型理解这张图,或进一步做分类任务可能就够了。如果把这种方式移到气象海洋领域中应用,还需要再思考具体操作方法。但是仅从图片的角度讲,还是比较令人震惊的,输入的1/4图片人眼看都很难看出来,它还原出来的结果还是比较一致的。

 

讨论和结论:简单且易拓展的算法是整个深度学习的核心,这里的简单和易拓展都是基于一小群人的,其实对于普通人来说已经足够复杂了。

我们要注意到图片和语言的区别,对于语言来讲一个词是一个语义的单元,它里面包含的语义信息较多,图片中的一个patch虽然包含较多的语义信息,但一个patch中并不是一个语义的单元,换句话说一个patch中没有一个完整的图片对象,大部分情况下只是一个对象的某个分片。但即便如此效果也不错。

 

导言:自监督学习的transformer在NLP领域已经搞的不错了,但是在视觉方面是稍稍落后的,主要原因如下:1. 之前主要用卷积,但是mask机制没法很好的在卷积上用,模型在卷积的时候很难分辨mask的边界,不像transformer一样,mask掉的东西是完完整整被特殊对待的。2. 信息密度不同。NLP中一个词是一个语义的实体,所以完形填空也不是一件非常简单的事。但图片中冗余信息还是比较多的,一般来说一个patch盖住仍然可以通过邻居来判断猜测,作者提出的办法就是多mask掉一些东西提高难度,而且这样做使得模型被迫去学全局信息而非局部信息。3. 自编码器的解码器,NLP中需要还原的是一个词,一个词在语义层面比较高的,按我的理解就是说比较高层的特征。但是CV中要还原的毕竟是具体的像素点,像素还是比较低层次的语义表达(高层次的可以认为是分类结果,例如一只猫)。所以BERT的解码器用一个简单的全连接层就够了,这就像是你在做图片分类目标检测的时候输出层(解码器)就是MLP就够了,但是复杂一点的分割任务,需要给一个像素级别的输出,通常就是用一个转置的神经网络来做一个比较大的解码器。

基于上述分析提出了MAE,1. 随即遮住大量的patch进行重构。 2. 因为大量的信息都被遮住了,所以使用非对称结构(编码器只看见可见块,解码器看见所有块),这样可以极大的减少编码器的计算开销。

MAE可以只是用Image-1K的数据(100万张图片)进行训练,使得模型能够达到ViT中使用一百倍大小的数据才能达到的效果。

迁移学习上的效果也极好,物体检测、语义分割、实例分割

这篇文章的导言不仅讲了做了什么,怎么做的,更重要的是引出了问题,然后回答了问题,讲清楚了为什么这么做,李沐比较赞成这种写法。也就是说它的导言不仅仅是摘要的延申和扩展。

 

方法:随机采样的意义是降低图片的冗余度

编码器就是ViT,没有变,分块,加位置信息,当然mask掉的部分就不输入网络了

解码器看到的是所有块,已知块已经被编码器编码过了,未知块用一个可以学习的向量来表示,所有未知块都共享同一个表示方式。解码器也是另外一个transformer,需要加位置信息。这里李沐说有一个不明确的就是编码器过来的东西要不要重新编码,毕竟已经编码过了。但是我的疑惑是,不管哪个块,在编码器输入前不是都有位置信息吗?这里为什么又说需要加一次位置信息

解码器只在预训练使用,后面再用到别的任务中是不需要解码器的。他这里使用的解码器结构比较小,其计算开销仅为编码器的1/10

重构原始像素:如果patch是16*16,那么解码器线性层就是256,结果reshape即可。

 

实验:在ImageNet-1k上先做无标号的预训练,再进行有标号的训练

在操作层面,一种是可以做end-to-end微调,也就是整个模型参数都可以在第二次训练时做变动

第二种是linear-probing,即只允许训练最后的线性层

之前在ViT上说必须要非常非常大的模型才能有效果,现在这里提出其实只要加上比较强的正则化,小一点的数据集如Image-1k也可以

下面是一些表,作者做了各种实验,大体上来说,只要采用全模型微调的那一种方案,模型就不用很复杂。

有一个有意思的点就是在编码器那里只输入已知块不仅计算量小很多,而且更精准,也就是说本文提出的非对称结构帮助很大

微调这件事通常来说调的层数越少越快越不精准,调的层数越多越慢越准确,但是边际效应明显,层数增加到一个点后,再多的层就没啥效果了。

 

 

这里有一个非常重要的事,以MAE这篇文章为例,讲一讲如何基于MAE找下一步论文的创新点:

这篇论文其实是ViT的改进,也就是说在ViT上打补丁。ViT那篇文章尝试了自监督,但是不如BERT效果那么好,MAE主要是基于这个点进行改进

第一点就是遮住更多的块,第二点是用transformer而非一个简单的先行输出层进行解码。

第一个想法其实是有一点问题的,这个方式可以看作是一个很强的数据增强,而数据增强的目的是让模型不那么过拟合,作者也的确展示了这样的结果,它展示模型在1600轮的时候仍然在提升。但是反过来讲,其实是训练很慢,1600轮了还没收敛。那么我们在做的时候,其实就可以想,能不能尝试别的数据增强方法,减少训练开销。

这里再次提到,这个东西好用可能是整个架构好用,自注意力块和MLP层都是可以替换的,甚至可以试试CNN行不行

第三点就是BERT里有两个损失函数,这里只有一个,我们是不是可以再加一个,比如最近比较火的contrastive learning

李沐只是在这里举了三个例子,他说每一个细节都可以有想法,当然想法还是要经过验证,看看哪一个效果好,很多时候也是第一个想法不对,在实验过程中又有新的想法。每一个想法对最后的结果都会有一点贡献,我们可以杂揉出一篇文章,比如MAE这两个点,其实是比较远的,但是我们不能揉太多东西,看起来就会比较脏乱。MAE这篇文章在导言里还是讲了一个比较顺畅的故事把两个点串起来了,不那么有违和感。我们也需要讲故事串创新点,有的时候为了故事完整性,还需要放弃一些比较远的补丁,这个比较考验写作方法。

当然在补丁文章上继续打补丁是比较难的,因为可能很多东西原作者都已经试过了。所以一般像ViT这种脑洞比较大的创新性比较大的工作一出来,就会有大量研究跟进。当然反过来,我们也可以尝试做一些大脑洞的工作,但是人工智能的工作还是要先掂量一下自己,很多东西是比较烧钱的。

 

posted @   诸葛村夫CC  阅读(235)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-04-13 Java基础
2022-04-13 Java入门
点击右上角即可分享
微信分享提示