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

news2024/10/5 19:47:51
  • 文章链接: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.coloradmin.cn/o/2190431.html

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

相关文章

新闻推荐系统:Spring Boot的可扩展性

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

csp-j模拟五补题报告

前言 今天第二题文件名把 r 写成 t 了 又跌出前10名了 白丢了好多分 &#xff08;“关于二进制中一的个数的研究与规律”这篇文章正在写&#xff09; 第一题 牛奶(milk) 我的代码&#xff08;AC&#xff09; #include<bits/stdc.h> #define ll long long #define fi …

Acwing 线性DP

状态转移方程呈现出一种线性的递推形式的DP&#xff0c;我们将其称为线性DP。 Acwing 898.数字三角形 实现思路&#xff1a; 对这个三角形的数字进行编号&#xff0c;状态表示依然可以用二维表示&#xff0c;即f(i,j),i表示横坐标&#xff08;横线&#xff09;&#xff0c;j表…

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏&#xff0c;代码参考了github上的项目Mario-Level-1&#xff0c;使用pygame来实现&#xff0c;从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

Windows应急响应-Auto病毒

文章目录 应急背景分析样本开启监控感染病毒查看监控分析病毒行为1.autorun.inf分析2.异常连接3.进程排查4.启动项排查 查杀1.先删掉autorun.inf文件2.使用xuetr杀掉进程3.启动项删除重启排查入侵排查正常流程 应急背景 运维人员准备通过windows共享文档方式为公司员工下发软件…

【Java】Java面试题笔试

[赠送]面试视频指导简历面试题 Java面试笔试题题库华为 java笔试面试题2014.files 就业相关java 面试题 面试题库 视频笔记 java笔试题大集合及答案 java面试书籍源码 java算法大全源码包8张图解 java.docx25个经典的Spring面试问答.docx 25个经典的Spring面试问答.docx 100家大…

知识图谱入门——10:使用 spaCy 进行命名实体识别(NER)的进阶应用:基于词袋的实体识别与知识抽取

在构建知识图谱的过程中&#xff0c;如何准确地识别和提取实体是关键。spaCy 提供了强大的命名实体识别&#xff08;NER&#xff09;功能&#xff0c;我们可以结合自定义规则和工具来实现更精准的实体抽取。本文将详细探讨如何在 spaCy 中实现自定义实体抽取&#xff0c;包括使…

OpenAI 推出 Canvas 工具,助力用户与 ChatGPT 协作写作和编程

OpenAI 近日推出了一款名为 Canvas 的新工具&#xff0c;旨在帮助用户更高效地与 ChatGPT 协作进行写作与编程。 Canvas 允许用户在一个独立窗口中与 ChatGPT 实时协作修改内容。无论是改进文本、调整语言风格、审查代码&#xff0c;还是在不同编程语言间转换&#xff0c;Canv…

Js逆向分析+Python爬虫结合

JS逆向分析Python爬虫结合 特别声明&#x1f4e2;&#xff1a;本教程只用于教学&#xff0c;大家在使用爬虫过程中需要遵守相关法律法规&#xff0c;否则后果自负&#xff01;&#xff01;&#xff01; 完整代码地址Github&#xff1a;https://github.com/ziyifast/ziyifast-co…

自闭症干预寄宿学校:为孩子搭建沟通与社交的桥梁

在探索自闭症儿童教育的广阔天地里&#xff0c;一所优秀的寄宿学校不仅是知识的殿堂&#xff0c;更是孩子们学习沟通与社交技能的桥梁。位于广州的星贝育园自闭症儿童寄宿制学校&#xff0c;正是这样一所专注于为自闭症儿童提供全面、个性化教育服务的机构&#xff0c;它以其独…

Linux-du命令使用方法

Linux-du&#xff08;disk useage&#xff09;命令 du 命令用于查看文件和目录占用的磁盘空间。 du [选项] [文件或目录]-h (human-readable)&#xff1a; 将输出格式转为人类可读的形式&#xff0c;使用 KB、MB 等单位。 du -h /path/to/directory1.5M /path/to/directory…

Pikachu-SSRF(curl / file_get_content)

SSRF SSRF是Server-side Request Forge的缩写&#xff0c;中文翻译为服务端请求伪造。产生的原因是由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。常见的一个场景就是&#xff0c;通过用户输入的URL来获取图片。这个功能如果被恶意使用&am…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务&#xff1a; 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…

力扣189.轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES&#xff1b;展示所有的数据库CREATE DATABASE 数据库名称; 创…

10以内数的分解

// 10以内数的分解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> using namespace std; int main(int argc, char* argv[]){for (int i 2; i < 10; i){for (int j 1; j < i; j){printf("%d%d%d ",j…

CSS样式基础样式选择器(案例+代码实现+效果图)

目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例&#xff1a;使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例&#xff1a;使用类选择器为div添加背景色 1.代码 2.效果 3)id…

深度探索Kali Linux的精髓与实践应用

Kali Linux简介 Kali Linux作为全球网络安全领域的首选操作系统之一&#xff0c;其强大的功能性及广泛的适用范围令人瞩目。除了上述基础介绍外&#xff0c;让我们深入探究Kali Linux的几个关键特性及其在实际操作中的具体应用案例。 Kali工具集成&#xff1a;全面的安全工具…

加湿器模块(5V STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.尺寸介绍 三、程序设计 main.c文件 jsq.h文件 jsq.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 加湿器模块通常是指在智能家居设备中负责增加室内空气湿度的部分&#xff0c;这种模块设计旨在改善干燥环…

osg 矩阵相关

下面结果是一样的 osg::Matrix mtrixx;mtrixx.makeRotate(90 / 180.f * osg::PI, osg::Vec3(1, 0, 0));osg::Matrix mtrixx12 osg::Matrix::rotate(90 / 180.f * osg::PI, 1, 0, 0); 备注&#xff1a; rotate或makerotate第一个参数是弧度&#xff0c;可以用 弧度值osg::in…