论文理解【LLM-CV】—— 【MAE】Masked Autoencoders Are Scalable Vision Learners

  • 文章链接:Masked Autoencoders Are Scalable Vision Learners
  • 代码:GitHub - facebookresearch/mae
  • 发表:CVPR 2022
  • 领域:LLM CV
  • 一句话总结:本文提出的 MAE 是一种将 Transformer 模型用作 CV backbone 的方法,核心在于其使用了类似 Bert 模型的训练机制。具体而言,MAE 首先对图像 patch 块进行高比例的随机 mask,再用一个非对称的 Encoder-Decoder 架构进行自监督训练来重建图像,训练结束后的 Encoder 提取到高质量的图像特征,可通过微调适用于下游任务。相比 ViT,MAE 的自监督预训练过程无需图像标签,训练效率更高,在加速训练的同时提高了准确性,并且表现出有潜力的 Scaling 能力
    1. ViT = NLP 序列模型(Transformer Encoder) + CV 训练范式(有监督预训练+微调)
    2. MAE = NLP 序列模型(Transformer Encoder-Decoder) + NLP 训练范式(MLM自监督预训练+微调)

  • 摘要: 本文证明了掩码自编码器(MAE)是一种可扩展的 CV 自监督学习器。我们的MAE方法很简单:先随机 mask 掉输入图像的部分 patch 块,再重建缺失的像素。MAE 包含两个核心设计:首先,我们开发了一个非对称的 Encoder-Decoder 架构,其中 Encoder 只作用于没有被 mask 的可见 patch 子集,轻量级 Decoder 则从 latent representation 和 mask tokens 重构原始图像。其次,我们发现掩盖高比例的输入图像,例如75%,可以构造一个普适而有意义的自监督任务。耦合这两种设计使我们能够快速有效地训练大规模模型并提高准确性。我们的可扩展方法能够学到泛化能力很强的高容量模型…

1. 方法

  • 作者注意到 NLP 领域中,以 BERT 为代表的 MLM 自监督训练范式取得了很大的成功,为了把 MLM 训练扩展到 CV 领域中,作者先分析了 CV 和 NLP 任务的差异

    1. 架构差异:CV 领域长期以来被 CNN 架构所主导,由于 CNN 使用卷积核汇聚局部特征,将 Mask 遮盖集成到 CNN 中是困难的。不过这个困难已经被近期提出的 ViT 模型通过 patch 形式的 tokenize 方法解决了
    2. 信息密度差异:语言信号是高度语义化的,信息密度高,而图像信号具有很高的空间冗余性。和 ViT 的 patch 图块相比,自然语言中单个 token 的语义性更强,信息量更高。因此应该遮盖更大比例的 patch 图块,使模型不能仅依靠低级统计信息完成重建任务,从而迫使模型学会对图像的整体理解
      在这里插入图片描述
    3. 解码器扮演角色的差异:NLP 中解码器只用来还原一个词表中的 token 索引,抽象程度高数据复杂度低,因此用 MLP 解码器就足够了;CV 任务中解码器需要重建一个图块 patch,抽象程度低数据复杂度高,为此需要更复杂的解码器结构
  • 针对以上差异,作者设计的 MAE 模型结构如下所示
    在这里插入图片描述
    如图所示,MAE 模型使用非对称的 encoder-decoder 架构,它输入被 mask 遮盖的图像,由较大规模的 Transformer Encoder 将所有无遮盖的 patch token 投影到 embedding 空间中,然后按顺序插入统一的 learnable mask token embedding加上位置编码,最后使用一个轻量的 Transformer Decoder 将 embedding 序列重建为图像。具体而言

    1. Masking:使用和 ViT 相同的方法将输入图像切分成不重叠的 patch 块,然后从中均匀随机采样高比例(如 75 % 75\% 75%)的子集 mask 掉,一方面消除冗余信息以提高 MLM 任务的难度;另一方面为 Encoder 提供稀疏的输入以降低计算成本
    2. MAE Encoder:直接使用一个 ViT 模型作为 Encoder,它通过线性投影来嵌入 patch 块,添加位置编码后通过一系列的Transformer block 进行处理。Encoder 仅应用于可见的,未被 mask 的 patch,其比例很低,因此计算成本并不高
    3. MAE Decoder:Decoder 的输入是完整的 patch embedding 序列,其中所有 masked token 共享一个可学习 embedding 向量。因此,需要按 masked patch 的原始拉平顺序 masked embedding 的多个副本插入到 Encoder 输出中组成完整序列,添加完整的位置编码后输入 Transformer Decoder 进行图像重建(预测对应 patch 的图像像素点值)

      注意此 Decoder 不同于常说的 Transformer Decoder,它还是用的双向注意力,本质是 BERT 类的模型

    4. Reconstruction target: MAE 通过预测每个 masked patch 的像素值来重建图像。Decoder 的最后一层是一个线性投影层,其输出尺寸和一个 patch 的像素数量相同,因此输出向量可以被 reshape 重建成 patch 图像。损失设计为重建图像和原始图像的像素值 mse 误差,类似 BERT,仅在 masked patch 位置计算损失。作者还研究了一个变体,其重建目标是每个 masked patch 的归一化像素值,实验表明这个重建目标提高了表示质量
  • MAE pipeline 的一个简单实现如下

    1. 将原始图像切分为不重叠的 patch 图块
    2. 使用带有位置嵌入的线性层将每个 patch 转换为 token embedding,拉平得到标准顺序序列
    3. 随机打乱 token embedding 序列(shuffling),并根据 masked 比例删除列表的最后一部分,将保留的前驱部分输入 Encoder
    4. 获取 Encoder 输出,在其后拼接 masked embedding 序列以恢复序列长度,重新顺序为标准顺序(unshuffling),使所有自监督标签和序列中的 embedding 对齐
    5. 向完整序列添加位置编码后输入 Decoder 进行重建,计算并优化损失
  • 值得注意的是,在 MAE 之前,已经有一些探索如何把 Transformer 模型用于 CV 任务的工作尝试了 MLM 式的自监督训练方法(比如 ViT 就做过),但是效果不好没有流行起来。主要原因有以下几点

    1. 没有注意到图像信息密度低的归纳偏置,mask 比例不够
    2. 没有直接重建原始图像 pixel ,而是重建一些低维表示(比如马赛克或者 mean color)
    3. 没有设置独立的 Decoder 模型,而是直接在 Encoder 输出上进行重建。但是 Encoder 的编码结果应该是一个更全局、高维的表示,直接在其基础上重建 pixel 会让 Encoder 后几层太关注局部细节,导致提取特征的抽象程度不足

2. 实验

2.1 主实验

  • 作者在 IN1k 数据集上比较了 ViT-L/16 有监督从头训练和 MAE finetune 的结果,可以看到 MAE finetune 超越了有监督训练的效果
    在这里插入图片描述

    这里特别注意,ViT 原始论文的实现正则化强度太低了,ViT-L/16 这个规模的模型很容易过拟合,因此在 IN1k 这个规模较小的数据集上只达成了 76.5 的性能,且不太稳定。MAE 作者调整了实现细节后性能提升到 82.5,但是仍不如 MAE finetune 的 84.9

    和其他经典方法的对比体现了 MAE 的有效性
    在这里插入图片描述

  • 作者在 COCO 数据集的目标检测任务和 ADE20k 数据集上的分割任务验证了 MAE 的迁移性能,同样是最好的
    在这里插入图片描述

2.2 消融实验

  • 作者考察了 masking ratio 的影响。作者评估了两种微调方法,一是全参数微调fine-tuning,二是只微调Encoder最后的线性层linear probing,注意到最佳 masking ratio 是相当高的,达到 75% 左右
    在这里插入图片描述
    注意到全量 fine-tuning 比较稳健,而 linear probing 关于 mask ratio 更敏感。作者进一步考察了介于二者之间的部分微调方案
    在这里插入图片描述
    可见微调一半的 Transformer Block 基本就足够了
  • 作者进一步对解码器的结构进行对比,其中 ft 表示全量微调,lin 表示只调线性层
    在这里插入图片描述
    • (C) 说明在 Encoder 中不加入 Mask token 的话性能更好,而且计算量更少
    • (d) 对比数据增强方法,发现简单随机裁剪就足够好了
    • (e) 对比 mask 策略,发现均匀随机 mask 效果最好
      在这里插入图片描述

3 总结 & 感受

  • MAE 进一步发展了 ViT 将 NLP 方法和训练范式运用到 CV 任务上的思路,通过以下三个创新在 Image 1K 上取得了很好的结果
    1. 由于图像的信息密度较低,CV 任务上应该使用更高的 mask ratio
    2. 使用 Transformer decoder 重建图像
    3. 加上了 ViT 之后的各种 trick,使训练更鲁棒
  • 这篇文章的思路不难,但是故事讲得足够好,从将 NLP 范式直接用到 CV 任务的问题存在的问题开始讲,这个写法是可以帮助读者理解的。另外实验做得很详细,具有很好的借鉴意义
  • 参考:如何看待何恺明最新一作论文Masked Autoencoders? - 李rumor的回答 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555542.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

制作一个流水灯,控制发光二极管由上至下再由下至上反复循环点亮显示,每次点亮一个发光二级管(Proteus 与Keil uVision联合仿真)

一、代码编写 (1)编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。 #define uchar unsigned char // 定义uchar为unsigned char类型uchar tab[] {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0x7f, 0x…

一个不错的 SQL 编码风格的指南

前言 SQL语句的编写对于我们后端开发者而言是一个必备的技巧,在日常工作中,SQL语言编写的质量不仅仅会影响到团队的合作效率与项目的可维护性,还直接关系到数据库的性能优化与数据安全。今天大姚给大家分享一个不错的 SQL 编码风格的指南&am…

【Qt】控件概述(4)—— 输出类控件

输出类控件 1. QLineEdit——单行输入框2. QTextEdit——多行输入框3. QComboBox——下拉框4. QSpinBox——微调框5. QDateEdit && QTimeEdit && QDateTimeEdit6 QDial——旋钮7. QSlider——滑动条 1. QLineEdit——单行输入框 QLineEdit是一个单行的输入框&…

定时器实验(Proteus 与Keil uVision联合仿真)

一、 (1)设置TMOD寄存器 T0工作在方式1,应使TMOD寄存器的M1、M001;应设置C/T*0,为定时器模式;对T0的运行控制仅由TR0来控制,应使相应的GATE位为0。定时器T1不使用,各相关位均设为…

执行路径带空格的服务漏洞

原理 当系统管理员配置Windows服务时,必须指定要执行的命令,或者运行可执行文件的路径。 当Windows服务运行时,会发生以下两种情况之一。 1、如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行 …

Listen1 0.8.2| 免费无广告,整合多平台音乐,界面简洁,操作便捷。

Listen 1 是一款开源且免费的跨平台音乐播放器,它能够整合多个主流音乐平台的资源,让你在一个应用中就能听到来自不同平台的歌曲。无论你是网易云音乐、QQ音乐还是虾米音乐的用户,你都可以通过 Listen 1 来享受无缝的音乐体验。它支持网易云音…

【每天学个新注解】Day 16 Lombok注解简解(十五)—@FieldNameConstants

FieldNameConstants 根据属性名生成常量类的常量。 1、如何使用 加在需要根据属性名生成常量的属性上。 2、代码示例 例: FieldNameConstants public class Test {private String iAmAField;private int andSoAmI;FieldNameConstants.Exclude private int asA…

【机器学习(十一)】糖尿病数据集分类预测案例分析—XGBoost分类算法—Sentosa_DSML社区版

文章目录 一、XGBoost算法二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二)数据预处理(三)模型训练与评估(四)模型可视化 三、总结 一、XGBoost算法 关于集成学习中的XGBoost算法原理,已经进行了介绍与总结,相关内容可参考【…

openEuler 24.03 (LTS) 部署 K8s(v1.31.1) 高可用集群(Kubespray Ansible 方式)

写在前面 实验需要一个 CNI 为 flannel 的 K8s 集群之前有一个 calico 的版本有些旧了,所以国庆部署了一个v1.31.1 版本 3 * master 5 * work时间关系直接用的工具 kubespray博文内容为部署过程以及一些躺坑分享需要科学上网理解不足小伙伴帮忙指正 😃,生活加油 99…

第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例

JPA教程 - JPA查询OrderBy两个属性示例 以下代码显示如何按两个属性排序,一个升序,另一个降序。 List l em.createQuery("SELECT e FROM Professor e " "JOIN e.department d ORDER BY d.name, e.name DESC").getResultList();例子…

数据结构实验二 顺序表的应用

数据结构实验二 顺序表的应用 一、实验目的 1、掌握建立顺序表的基本方法。 2、掌握顺序表的插入、删除算法的思想和实现,并能灵活运用 二、实验内容 用顺序表实现病历信息的管理与查询功能。具体要求如下: 1.利用教材中定义顺序表类型存储病人病历信息(病历号…

什么是高斯积分,以及如何求它的值(error function)

文章目录 什么是高斯积分高斯积分与误差函数的关系求值证明过程技巧1 两个相互独立的积分的乘积转为双重积分技巧2 富比尼定理技巧3 坐标系转换总结 什么是高斯积分 高斯积分的公式如下: 高斯积分与误差函数的关系 参考wiki,误差函数的定义如下&…

SQL自用小结

推荐一下这个知识点总结 《数据库系统概论》第五版 学习笔记总目录 1. SQL概述 SQL(Structured Query Language,结构化查询语言)是一种用于定义、查询、更新和控制关系数据库的标准化语言。 它包含了数据定义语言(DDL&#xff0…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流,不做任何商业用途,该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了,老生常谈,网上有大量的介绍,想看看这三层都起到什么职责?那就直接上图吧 2.我举一个栗子 我有…

“迷雾深渊”炮击图设计

python尝试C题目,ai查错审码还写“代码解读”和学习总结。 (笔记模板由python脚本于2024年09月29日 10:51:58创建,本篇笔记适合喜欢python,鼓捣算法的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/…

【EXCEL数据处理】保姆级教程 000016案例 vlookup函数。

【EXCEL数据处理】000016案例 vlookup函数。 前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】保姆级教…

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

每日一题|134. 加油站|循环数组单次遍历

本题题目比较绕,理解了之后发现就是给一个一维数组表示余量,找出能够首尾相连且后构成每个位置处的累积和都是正数的索引。 首先,根据cost和gas相减,确定每个位置出发去下一个位置所剩余的gas。 这里可以直接统计全部的余量和&…

IO零拷贝技术

01背景介绍 相信不少的网友,在很多的博客文章里面,已经见到过零拷贝这个词,会不禁的发出一些疑问,什么是零拷贝? 从字面上我们很容易理解出,零拷贝包含两个意思: 拷贝:就是指数据从…