25_Vision Transformer原理详解

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.mzph.cn/news/872147.shtml

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

相关文章

怎样去除视频上的水印和文字,视频水印文本移除教程

在观看和分享视频时,我们经常会遇到带有水印或额外文字的情况。这些标记有时是为了版权保护,有时则是平台的标识,但在某些情况下,它们可能会干扰视频的观赏体验。本文将向你介绍常见的视频水印类型以及如何使用简鹿水印助手去除这…

浅谈安数云智能安全运营管理平台:DCS-SOAR

SOAR(security orchestration,automation and response),由Gartner于2015年提出,最初的含义是安全运营、分析与报告。2017年,Gartner又重新定义了SOAR的能力,包括安全编排、安全自动化和安全响应…

Purple Pi OH在Android11下测试WiFi和LAN的TCP和UDP传输速率

本文适用于在Purple Pi OH在Andriod11下如何测试WiFi和LAN的TCP和UDP传输速率。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开发者的…

AI安全系列——[第五空间 2022]AI(持续更新)

最近很长时间没有更新,其实一直在学习AI安全,我原以为学完深度学习之后再学AI安全会更加简单些,但是事实证明理论转实践还是挺困难的,但是请你一定要坚持下去,因为“不是所有的坚持都有结果,但总有一些坚持…

QT简介、安装与运行

QT5.9.0 安装 下载地址:https://download.qt.io/archive/qt/ 安装过程,直接点击下一步,设置勾选如下: 下载VS编译插件地址如下(已安装vs): https://download.qt.io/archive/vsaddin/2.3.2/

【ARMv8/v9 异常模型入门及渐进 9.1 - FIQ 和 IRQ 打开和关闭】

请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 FIQ/IRQ Enable and Disable汇编指令详解功能解释使用场景和注意事项 FIQ/IRQ Enable and Disable 在ARMv8/v9架构中,可以使用下面汇编指令来打开FIQ和 IRQ,代码如下: asm volatile ("msr da…

敏捷营销在AI智能名片微信小程序中的应用探索

摘要:在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。AI智能名片微信小程序作为一种创新的营销工具,以其便捷性、智能化和高效性,正逐步成为企业连接客户、推广品牌的新宠。然而,如何在快速变化的市场环境中&a…

docker 安装 onlyoffice

1.文档地址 Installing ONLYOFFICE Docs for Docker on a local server - ONLYOFFICE 2.安装onlyoffice docker run -i -t -d -p 9000:8000 --restartalways -e JWT_ENABLEDfalse onlyoffice/documentserver 如果发现镜像无法下载,可以尝试更换镜像源 {"registry-mir…

flutter实现语言的国际化

目录 前言 一、GetX实现国际化(推荐) 1.安装Getx 2.创建国际化的文件 3.使用国际化字符串 4.配置GetMaterialApp 5.更改语言 6.系统语言 ​编辑 7.原生工程配置 1.iOS工程配 1.打开iOS工程,在Project的info里面添加语言 2.创建String File文件 2.andr…

Milvus 核心设计(5)--- scalar indexwork mechanism

目录 背景 Scalar index 简介 属性过滤 扫描数据段 相似性搜索 返回结果 举例说明 1. 属性过滤 2. 扫描数据段 3. 相似性搜索 实际应用中的考虑 Scalar Index 方式 Auto indexing Inverted indexing 背景 继续Milvus的很细设计,前面主要阐述了Milvu…

从零开始搭建vue框架

流程图 开始 | |-- 2013 年底,尤雨溪开始开发 Vue 框架,最初命名为 Seed,后更名为 Vue | |-- 2013 年 12 月,Vue 0.6.0 版本 | |-- 2014 年 1 月 24 日,Vue 0.8.0 版本发布 | |-- 2014 年 2 月 25 日,…

2024年初级注册安全工程师职业资格考试首次开考!

​2024年初级注册安全工程师考试首次开考(注:该考试由各省人事考试局组织考试)。目前未取得中级注册安全工程师证书的各位同学,可以关注该考试,毕竟初级考证相对较容易,先去考一个。 目前初安开考地区汇总…

高德地图+Vue3基础地图从0到1实现

前言 本文主要讲解如何利用高德地图api与vue3实现对世界地图的可视化显示。 实现效果 流程总结 流程1:Vue3搭建 搭建没什么说的,可以用cli、webpack、vite等构建工具进行初步搭建 注:必须要带eslint.js 流程2:高德地图密钥下…

请你谈谈:AnnotatedBeanDefinitionReader 显式地注册一个Bean到Spring容器,以及注册并解析配置类

为了深入探讨Spring框架中的beanDefinition对象,我们不可避免地要提及BeanFactoryPostProcessor这一核心类,它作为Spring的bean工厂后置处理器发挥着关键作用。接下来,我们将详细讨论BeanFactoryPostProcessor的执行时机,这是一个…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】!

项目场景: 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时,会发现这个文件下载的默认保存位置和我们预想的不太一样,容易找不到,而且没有提示,那么我们就需要把文件打开自己保存并且有提示保存到哪个…

网络安全保险产业发展洞察报告(2024)

数字经济高速增长,黑客攻击、数据泄露等网络安全风险可能直接导致企业遭受巨额的财务损失。网络安全保险作为风险转移和风险管理的有效工具,正逐渐成为数字安全框架中不可或缺的一环。 《网络安全保险产业发展洞察报告(2024)》梳…

百度“文心•跨模态大模型”又有新动态,支持内容分析时输出自定义标签库

大模型真正的价值在于应用。 一、基本概念 AI大模型具有强大的表征学习能力,能够在海量数据中提取有用的特征,为各种复杂任务提供解决方案。例如GPT-4o、BERT等模型的出现,不仅展示了大规模参数和复杂计算结构的优势,还在自然语…

STM32第二十课:FreeRTOS任务管理和信号量

目录 一、任务管理方式二、任务堆栈溢出检测三、二值信号量(任务同步)四、计数信号量五、互斥信号量六、队列 一、任务管理方式 1.任务创建成功后会添加到就绪链表中,开启调度器,此时任务调度器会去就绪链表中找优先级最高的任务执…

二叉树 —— OJ题目详解

1.二叉树的前序遍历 二叉树的前序遍历比较简单,但是在力扣上写这个接口需要注意几个点: int* preorderTraversal(struct TreeNode* root, int* returnSize) {} preorderTraversal 的返回值是动态开辟的数组,里面存放的是前序遍历的顺序int*…

【Linux取经之路】Linux常见指令

目录 基本指令 常见指令 1)ls —— 对于目录,列出该目录下的所有子目录和文件;对于文件,将列出文件名及其他信息 2)pwd —— 显示当前所在的目录 ​编辑 3)cd —— 切换到指定路径下 4)t…