25_Vision Transformer原理详解

news2024/9/22 15:35:19

1.1 简介

Vision Transformer (ViT) 是一种将Transformer架构从自然语言处理(NLP)领域扩展到计算机视觉(CV)领域的革命性模型,由Google的研究人员在2020年提出。ViT的核心在于证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效,在处理图像数据时也能取得卓越性能,挑战了卷积神经网络(CNNs)在视觉任务中的主导地位。

ViT的基本思想

传统的CNN通过局部感受野和池化操作逐步提取图像特征,而ViT则采取了一种完全不同的思路。它首先将输入图像划分为多个固定大小的 patches(例如16x16像素),然后对每个patch进行线性映射(Flattening + Linear Projection),将其转换成一个向量。这些向量连同一个特殊的分类token([CLS])一起作为Transformer的输入序列。这样,图像就被转换成了一个序列数据,从而可以直接应用自注意力机制(Self-Attention)进行特征提取。

ViT模型结构

  1. Patch Embedding: 输入图像被分割成多个非重叠的patches,每个patch被展平并经过一个线性层转换成一个固定长度的向量,这个过程称为嵌入。通常还会加入位置编码(Positional Encoding),以保留patch之间的空间信息。

  2. Transformer Encoder: 这是ViT的核心部分,由多层Transformer编码器组成。每层包括一个多头自注意力模块(Multi-Head Self-Attention, MHSA)和一个前馈神经网络(Feed Forward Network, FFN),两侧通常还会有LayerNorm层,并可能伴有残差连接(Residual Connections)。MHSA允许不同patch间的交互,FFN则进一步加工这些特征。

  3. MLP Head: 在Transformer编码器的输出之后,通常会添加一个多层感知机(MLP)用于最终的任务输出,比如在图像分类任务中预测类别。

  4. Classification Token ([CLS]): 在输入序列的开始处添加一个特殊token,Transformer的输出中这个token的表示将用于分类任务,即包含了整个图像的全局特征。

关键创新点

  • 直接应用自注意力机制于视觉任务:打破了CNN在视觉领域的垄断,展示了自注意力机制在图像处理中的潜力。
  • 灵活的序列化处理图像:通过将图像视为一系列向量的序列,使得模型能够更好地理解全局上下文。
  • 简化模型结构:相比复杂的CNN架构,ViT的结构更为简洁,易于理解和调整。

训练与优化

ViT的成功依赖于大规模数据集(如ImageNet)的预训练以及特定的训练策略,包括大数据量、长时间训练以及数据增强技术(如裁剪、翻转等)。为了防止过拟合,还采用了正则化技术,如Dropout或Stochastic Depth。

总结

Vision Transformer展示了Transformer架构在计算机视觉领域的强大潜力,推动了后续一系列视觉Transformer模型的发展,如DeiT(Data-efficient Image Transformers)、Swin Transformer等,这些模型在效率和准确性上进行了进一步的优化。ViT的成功标志着深度学习架构在视觉任务处理上的一次重要革新,为未来的研究开辟了新的方向。

1.2 模型结构

Vision Transformer (ViT) 的工作流程可以分为几个关键步骤,从原始图像输入到最终的分类或预测输出。以下是其详细的工作流程:

1. 图像分割成Patch(Patchification)

  • 输入图像:首先,模型接收一张图像作为输入。
  • 分割:将图像划分为多个大小一致的矩形区域,这些区域被称为“patches”。标准做法是使用16×1616×16像素的大小,但这个尺寸可以根据需求调整。例如,对于一个224×224224×224像素的图像,分割后会得到14×14=19614×14=196个这样的patches。

2. Patch嵌入(Patch Embedding)

  • 展平和线性映射:每个patch被展平成一个向量,然后通过一个全连接层(也称为嵌入层)转换为一个更高维度的向量(比如𝐷=768D=768维),这一步是为了将像素信息转化为特征表示。
  • 位置编码(Positional Encoding):为了保持序列中patch的位置信息,每个嵌入向量还会加上一个位置编码,这可以是绝对位置编码或者学习得到的编码。

3. 添加分类Token

  • 在所有patch的嵌入序列之前,会添加一个特殊的分类Token(例如一个学习到的向量),这个Token的作用是在Transformer的输出中代表整个图像的全局信息,对于分类任务至关重要。

4. Transformer Encoder 层处理

  • 多头自注意力(Multi-Head Self-Attention, MHSA):每个Encoder层的核心是MHSA模块,它允许模型并行地考虑不同patch之间的相互依赖关系。MHSA通过将输入分成多个“头”并计算不同头间的注意力权重来实现这一点。
  • 层归一化(Layer Normalization, LN):在MHSA前后使用LN来稳定学习过程,提高训练稳定性。
  • 残差连接(Residual Connection):MHSA的输出与输入相加,通过残差连接保留原始信息,有助于解决深度网络中的梯度消失问题。
  • 前馈神经网络(Feed Forward Network, FFN):每个Encoder层还包括一个FFN,通常由两个线性层和一个激活函数(如ReLU)组成,用于进一步的特征变换和非线性处理。
  • Dropout:为了正则化,可能在某些部分应用Dropout以减少过拟合的风险。

5. 输出和分类

  • 分类Token:经过多层Transformer Encoder处理后,最开始添加的分类Token的特征向量被提取出来,该向量包含了关于整个图像的综合信息。
  • 分类头:这个向量接着通过一个分类头,通常是一个简单的全连接层(MLP),用于将特征映射到特定的类别数上,产生最终的分类预测。

6. 训练与优化

  • 损失函数:模型的输出会与真实标签对比,通常使用交叉熵损失函数来计算预测误差。
  • 反向传播与更新:通过反向传播算法计算损失函数关于模型参数的梯度,并使用优化器(如Adam)来更新这些参数,以最小化损失。

总结

ViT的工作流程从图像的分割开始,经过嵌入、位置编码、Transformer编码器层的处理,最终通过分类头输出类别预测。其核心在于利用Transformer的自注意力机制来高效地捕获全局的视觉特征,这一机制使其在图像识别和分类任务中表现出色,尤其是在大数据集上。

首先我们输入一张图片,然后分成一张一张的patches,然后将每个patch输入至embedding层,也就是Linear Projection of Flattened Patches。然后我们就会得到一个个的向量,称为token。紧接着我们会在所有生成的token前加上一个新的,专门用于我们分类的class token,(这里增加一个class token是参考的bert网络),这些patch维度都是相同的。

为了标记位置信息,又加了Positional Encoding,即向量前面的0123456789。然后输入至编码器。编码器的详细结构如右图所示,重复堆叠L次。

然后因为我们要做分类,所以只提取针对我们class token所对应的输出,再通过MLPhead得到最终分类的结果。

1.3 Embedding层

在Vision Transformer (ViT) 中,Embedding层扮演着将图像数据转换为适合Transformer处理的序列化表示的关键角色。这一过程主要涉及以下几个关键步骤:

1. 图像分割(Patch Extraction)

首先,原始图像被分割成多个相同大小的小块,称为patches。每个patch代表了图像的一个局部区域。常见的做法是使用16×16像素的大小,但这个尺寸可以根据具体任务和模型需求调整。例如,对于一个224×224像素的图像,分割后可能会得到14×14=196个这样的patches。

2. Patch Flatten and Linear Projection

  • 展平(Flatten):每一个patch被展平成一维向量,即将其16×16×C(其中C为通道数,例如3对于RGB图像)的形状转换为一个长度为16×16×C的一维数组。
  • 线性映射(Linear Projection):展平后的patch向量通过一个全连接层(也称作线性层)进行映射,目的是将patch的维度变换到一个预定的维度,通常记为D(如D=768)。这一步骤确保了所有patch转换为具有相同维度的向量,为Transformer的输入做好准备。

3. 位置编码(Positional Encoding)

  • 为了保持图像的空间结构信息,每个经过线性映射的patch向量还会加上一个位置编码。位置编码可以是固定的(如正弦/余弦函数),也可以是学习得到的,它的目的是为序列中的每个位置提供唯一的标识。这样,Transformer模型就能区分不同位置的patch,即使它们的视觉内容相似。

4. 分类Token的添加

  • 在所有的patch嵌入前面,通常会添加一个特殊的分类Token(如CLS),该Token的目的是在模型处理过程中聚合所有patch的信息,用于最终的分类任务。这个Token也会经过相同的线性映射处理,以保持维度一致性。

5. 输出形式

经过上述步骤,所有patch的嵌入向量(包括分类Token的嵌入向量)被组织成一个序列,形成Transformer模型的输入。这个序列的形状将是(N+1)×D,其中𝑁N是patch的数量,D是嵌入维度,加1是因为额外的分类Token。

总结

Embedding层在ViT中起着桥梁作用,它将图像从像素空间转换到特征空间,使得Transformer能够以序列化的方式理解和处理图像信息。通过展平、线性映射、位置编码以及分类Token的加入,ViT能够捕捉到图像的局部特征、保持空间信息,并为后续的自注意力机制提供合适的输入形式。

/16代表分割的每张图片大小是16x16的。叠加位置编码时是对应元素直接相加的。

那么不加位置编码会出现什么情况呢?论文也做了实验。

不加位置编码的话准确率是61.3,加了位置编码变为了64.2。其他的位置编码效果差别都不大。

下图为,训练得到的位置编码,它的每个位置上与其他位置上的一个余弦相似度。

这里的patches大小是32x32的 ,224/32=7,所以是7x7大小。

1.4 Encoder层

在Vision Transformer (ViT) 中,Encoder层是模型的核心部分,负责对经过Embedding层处理过的序列化图像特征进行深层次的处理和特征提取。Encoder层由多个相同的Transformer Encoder Block堆叠而成,每个Block包含以下几个关键组件:

1. Layer Normalization (LN)层归一化

  • 在许多实现中,每个Encoder Block的开始会应用Layer Normalization (LN),而不是原始Transformer架构中的Post-Norm(即在自注意力和前馈网络之后)。LN通过对每个特征维度进行标准化处理,帮助稳定训练过程,加速收敛,并且在视觉任务中通常优于Batch Normalization (BN)。

2. Multi-Head Self-Attention (MHSA)

  • Query, Key, Value计算:MHSA是Transformer的核心,它通过计算输入序列中不同位置(或patch)之间的关系来捕获全局依赖性。每个位置的输入被线性映射为Query、Key和Value矩阵,分别用于衡量位置间的关系、查找相关性和聚合信息。
  • 多头注意力:MHSA将Query、Key、Value分成多个头(Head),每个头独立计算注意力,这样可以让模型在不同的表示子空间中并行地学习不同类型的依赖关系,之后再将结果合并。这样做增加了模型的表达能力,使其能更好地处理复杂的数据结构。
  • 注意力分数与加权求和:基于Query和Key的点积计算注意力分数,通过softmax函数归一化后,用以加权求和Value,从而获得每个位置的上下文依赖表示。

3. Add & Normalize with Residual Connection

  • 自注意力模块的输出会与输入(即LN的输出)相加,形成残差连接(Residual Connection),这有助于梯度流动并防止信息丢失。之后,再次应用Layer Normalization以稳定特征表示。

4. Feed-Forward Network (FFN)

  • 每个Encoder Block还包括一个两层的全连接网络,即FFN。它通常包含两个线性层,中间夹着一个非线性激活函数(如ReLU或GELU),用于对注意力模块输出的特征进行进一步的非线性变换和特征提炼。
  • 第一层线性变换通常会增加特征维度,第二层则将特征维度转换回原始维度,保持输入输出维度一致以便于残差连接。

5. Dropout

  • 在某些情况下,为了增强模型的泛化能力,会在自注意力输出或FFN输出上应用Dropout,随机丢弃一部分神经元的输出,以减少过拟合的风险。

6. 重复堆叠

  • 上述过程(LN → MHSA → Add & Normalize → FFN → Add & Normalize)在一个Encoder Block内完成,整个Encoder层由这样的Block重复堆叠𝐿L次(𝐿L是超参数),每增加一层,模型的表达能力都会增强,能够学习更复杂的特征交互。

综上所述,ViT的Encoder层通过多头自注意力机制捕捉全局依赖,结合前馈网络进行特征变换,通过残差连接和Layer Normalization保证信息流通和训练稳定性,最终输出经过深层次特征提取的序列化特征表示,为图像分类或其他下游任务提供强大的特征支持。

1.5 MLPHead层

在Vision Transformer (ViT) 模型中,MLP Head(也称为分类头或预测头)是模型的最后一部分,其主要任务是将Transformer Encoder输出的特征向量转换为最终的分类预测或回归输出。具体工作流程如下:

1. 提取分类Token

  • 经过一系列Transformer Encoder层处理后,序列中的第一个Token(通常是初始化时添加的分类Token,如𝐶𝐿𝑆CLS)被认为汇总了整个输入图像的全局信息。因此,在进入MLP Head之前,模型会从Encoder的输出序列中提取这个分类Token的特征表示。

2. 全连接层(FC Layer)

  • 提取出的分类Token特征向量会通过一个或多个全连接(Fully Connected,FC)层。第一个FC层通常用于将Transformer的高维特征空间映射到一个中间维度,这有助于模型进行更灵活的特征变换和非线性处理。随后,第二个FC层(如果有)将中间维度的特征映射到最终的输出维度,如对于图像分类任务,就是映射到类别数。

3. 激活函数

  • 在FC层之间,通常会插入激活函数(如ReLU或GELU),以引入非线性,使得模型能够学习和表达更复杂的决策边界。

4. 归一化和Dropout(可选)

  • 在某些实现中,MLP Head之前或之后可能会应用Layer Normalization或Batch Normalization,以进一步稳定训练过程。同时,为了提高模型的泛化能力,可能会在FC层之后应用Dropout,随机丢弃一部分神经元的输出,减少模型对训练数据的过拟合。

5. 输出层

  • 最终的FC层输出通常对应于模型的预测概率分布。对于分类任务,这通常通过Softmax函数来实现,将输出转换为各分类的概率分布。对于回归任务,则可能直接输出预测值或使用其他适合的激活函数(如线性激活)。

6. 损失计算与优化

  • MLP Head的输出会与真实的标签进行比较,计算损失(如交叉熵损失用于分类任务)。这个损失值用于指导反向传播,优化模型参数,以减小预测与实际之间的差距。

综上所述,MLP Head在ViT模型中起到了从高层次特征到具体任务输出的桥梁作用,通过一系列精心设计的线性变换和非线性操作,将Transformer编码得到的特征转化为任务所需的输出形式,是模型进行分类或回归预测的关键组件。

1.6 不同的模型参数

1.7 混合模型

R50指的是ResNet50,和VIT混合。

1.10 模型效果

/16代表分割的每张图片大小是16x16的。

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

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

相关文章

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及,智能合约作为其核心应用之一,在金融科技(FinTech)领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例,以及面临的技术挑战和发展趋势,旨在帮助读…

redis笔记2

redis是用c语言写的,放不频繁更新的数据(用户数据。课程数据) Redis 中,"穿透"通常指的是缓存穿透(Cache Penetration)问题,这是指一种恶意或非法请求直接绕过缓存层,直接访问数据库或…

HouseCrafter:平面草稿至3D室内场景的革新之旅

在室内设计、房地产展示和影视布景设计等领域,将平面草稿图快速转换为立体的3D场景一直是一个迫切的需求。HouseCrafter,一个创新的AI室内设计方案,正致力于解决这一挑战。本文将探索HouseCrafter如何将这一过程自动化并提升至新的高度。 一、定位:AI室内设计的革新者 Ho…

通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制

前言 前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。 TLV数据之协议解析 紧着…

爬虫学习 | 01 Web Scraper的使用

目录 背景介绍: 第一部分:Web Scraper简介 1.什么是Web Scraper: Web Scraper🛒 主要用途: 2.为什么选择Web Scraper: 第二部分:安装Web Scraper ​​​​​1.打开google浏览器&#xf…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…

redis讲解与介绍

Redis介绍: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列&#x…

linux adb命令

⏩ 大家好哇!我是小光,正在努力寻找自己的职业方向。 ⏩ 在调试设备时,经常会用到adb命令,本文对linux adb命令做一个知识分享。 ⏩ 感谢你的阅读,不对的地方欢迎指正。 1.adb命令 即 Android Debug Bridge 是一种允许…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注:机翻,未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时,…

数据库:编程(打开、操作(增、删、改、查)、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增,删,改,查) 》关闭数据库 3.1 打开数据库: sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

docker持久化

上周学习了docker的dockerfile,这周会往下学习一下docker的持久化;提到持久化,首先会涉及到一个UnionFS的概念; 1、什么是UnionFS? docker创建镜像的时候,会将各种依赖包括操作系统OS、工具包、依赖库等都放在文件系…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) 这三个基本要求,最多只能同时满足…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件传参 (以下为错误示例) 3.事件传参与数据同步 4.条件渲染 …

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量: QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说:现在有个word文档,里面有个表格太长(如下图所示),希望这一个设置成横的,其余页还是保持竖的! 二、解决方案 1、将鼠标放置在该页的最前面闪烁,然后选择“页面”》“↘…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失,我们有时候会使用到外接硬盘或移动硬盘。一般来说,这些硬盘都是即插即用的,可能部分要安装插件。不过,在一些特殊情况下,也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…

PyTorch张量创建和随机数生成器算法

文章目录 1、基本创建方式1.1、根据已有数据创建张量1.2、根据已有数据创建张量1.3、根据已有数据创建张量 2、创建线性和随机张量2.1、创建线性空间的张量2.2、创建随机张量2.3、什么是随机数种子2.4、initial_seed()和manual_seed() 3、创建01张量3.1、全0张量3.2、全1张量3.…