ViT学习笔记(一) 基本的原理和框架结构
原论文地址:https://arxiv.org/pdf/2010.11929
首先大致通读一下原论文,这是很有必要的,但不必完全读懂,因为会有高手给我们解读,比如:
【Transformer系列】深入浅出理解ViT(Vision Transformer)模型-CSDN博客
解决图像分类任务的利器——Vision Transformer
以下是综合各种知识来源,我的笔记:
基本原理:
Vision Transformer (ViT) 是一种基于Transformer架构的图像分类模型,它通过将图像分割成小块(patches)并将其转换为序列,相当于二维的图像数据转换为类似文本中单词序列的一维数据形式,以便输入到 Transformer Encoder 中进行处理然后输出,从而实现图像分类任务。
以下是ViT模型的详细工作原理:
1. 图像分块(Patch Partition)
• 原始图像:假设输入的图像大小为 H x W x C,其中 H 和 W 是图像的高度和宽度,C 是通道数(通常为3,即RGB)。
• 分块:图像被划分为固定大小的 P x P 的图像块。假设每个图像块的大小为 P x P,那么图像将被划分为 (H/P) x (W/P) 个图像块。
2. 图像块线性嵌入(Patch Embedding)
• 展平图像块:每个图像块被展平为一维向量。假设每个图像块的大小为 P x P x C,那么展平后的每个图像块将是一个长度为 P^2C 的向量。
• 线性映射层:展平后的图像块向量通过一个线性映射层(全连接层),将其映射到一个指定的embedding维度 D。这个线性映射层的作用是将每个图像块的原始维度 P^2C 转换为一个较低维度的向量,通常称为embedding向量。
3. 添加位置编码(Position Embedding)
• 位置编码:为了给图像块添加位置信息,模型会为每个embedding向量加上一个可学习的位置编码(position embedding)。位置编码的形式可以是可学习的向量,通常与embedding向量具有相同的维度 D。
• 拼接序列:所有图像块的embedding向量加上位置编码后,形成一个序列,这个序列将作为Transformer编码器的输入。
4. 类别标记(Class Token)
• 类别标记:为了进行图像分类,ViT模型在输入序列的最前面添加一个特殊的类别标记(class token)。这个类别标记是一个可学习的向量,与embedding向量具有相同的维度 D,并且在训练过程中会与图像的类别信息相关联。
5. Transformer编码器
• Transformer编码器:输入序列(包括类别标记和图像块embedding向量)被送入Transformer编码器。Transformer编码器由多个相同的层组成,每个层包括多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network),并且在每个子层后都应用层归一化(Layer Normalization)和残差连接(Residual Connection)。
• 自注意力机制:在自注意力机制中,每个输入向量(包括类别标记和图像块embedding向量)都会与其他所有输入向量进行交互,捕捉全局上下文信息。
• 前馈神经网络:每个位置的向量通过一个两层的前馈神经网络进行非线性变换。
6. 分类
• 类别输出:在经过Transformer编码器处理后,类别标记(class token)对应的输出向量被提取出来。这个向量包含了整个图像的全局信息。
• 分类器:类别标记的输出向量通过一个线性层和一个softmax层进行分类,得到图像属于各个类别的概率分布。
7. 训练与推理
• 训练:在训练过程中,模型通过最小化交叉熵损失函数来优化参数,目标是使模型能够准确地预测图像的类别。
• 推理:在推理过程中,输入图像经过上述步骤后,模型输出预测的类别概率,最终选择概率最高的类别作为预测结果。
总结来说,ViT模型通过将图像划分为小块并转换为序列,利用Transformer编码器处理这些序列,最终实现图像分类任务。其核心在于利用Transformer的全局自注意力机制来捕捉图像的全局上下文信息。
概念解析:
全局自注意力机制
Transformer 的全局自注意力机制是一种在 Transformer 架构中使用的重要机制。它允许模型在处理序列数据时,对整个输入序列中的所有位置进行关注,从而能够捕捉到不同位置之间的长距离依赖关系。
全局自注意力机制通过计算每个位置与其他所有位置之间的注意力权重,来确定每个位置在当前任务中的重要程度。然后,根据这些注意力权重对输入序列中的所有位置进行加权求和,得到每个位置的新表示。这种机制使得 Transformer 能够有效地处理长序列数据,并且在自然语言处理等领域取得了非常出色的效果。例如,在机器翻译、文本生成、问答系统等任务中,全局自注意力机制可以帮助模型更好地理解输入文本的语义和结构,从而生成更准确和流畅的输出。
Transformer编码器中的前馈神经网络
在Transformer编码器中,前馈神经网络(Feed-Forward Neural Network, FFN)是一个关键组件,它在每个Transformer层中都存在,并且在多头自注意力机制(Multi-Head Self-Attention)之后应用。前馈神经网络的主要作用是对输入数据进行非线性变换,从而增强模型的表达能力。以下是前馈神经网络的详细介绍:
1. 结构
前馈神经网络通常由两个线性变换层和一个非线性激活函数组成。具体结构如下:
-
第一层线性变换:输入向量
x
首先通过一个线性变换层,将其映射到一个中间维度d_ff
(通常比输入维度d_model
大)。这个线性变换可以表示为:
[
x’ = W_1 x + b_1
]
其中,W_1
是权重矩阵,b_1
是偏置向量。这一步与CNN常见的中间隐藏层的作用异曲同工。-
为什么中间维度 d_ff通常比输入维度 d_model 大?
增加模型的表达能力
当中间维度比输入维度大时,网络能够学习到更复杂的特征表示。例如,在自然语言处理中,如果输入是一个单词的低维向量表示(),通过将其映射到一个更高维的空间(),模型就有更多的 “自由度” 来捕捉单词之间潜在的语义关系和语法结构。就好像在一个更大的 “画布” 上描绘更细致的内容,能够挖掘出输入数据中隐藏的、低维空间难以表示的信息。
避免信息瓶颈
如果中间维度小于输入维度,可能会导致信息瓶颈。假设输入数据包含丰富多样的信息,而中间层维度过小,在信息传递过程中,很多有用的信息可能会丢失。以图像识别为例,输入是一张包含大量细节(如纹理、形状、颜色等)的图像,其维度代表了这些信息。如果中间层维度过小,在映射过程中,图像的某些重要特征可能无法被有效传递和处理,就像把一幅大画通过一个过小的通道,部分画面会被遮挡或丢失。
有利于梯度传播
较大的中间维度可以使梯度在反向传播过程中有更广阔的 “空间” 来流动。在神经网络的训练中,梯度用于更新网络的参数。如果中间层维度过小,梯度可能会很快消失或变得不稳定。而足够大的可以为梯度提供一个相对稳定的传播环境,使得网络能够更有效地学习。例如,在深度神经网络中,中间层的梯度就像是在一个复杂的管道系统中流动的水流,足够大的管道可以让水流(梯度)更顺畅地传播,避免堵塞(梯度消失)或泛滥(梯度爆炸)的情况。
-
-
非线性激活函数:在第一层线性变换之后,通常会应用一个非线性激活函数,如ReLU(Rectified Linear Unit):
[
x’’ = \text{ReLU}(x’) = \max(0, x’)
] -
第二层线性变换:经过非线性激活函数处理后的向量
x''
再通过一个线性变换层,将其映射回原始维度d_model
:
[
y = W_2 x’’ + b_2
]
其中,W_2
是权重矩阵,b_2
是偏置向量。
2. 作用
前馈神经网络的主要作用包括:
- 非线性变换:通过非线性激活函数(如ReLU),前馈神经网络能够捕捉输入数据中的复杂模式和非线性关系。
- 特征提取:前馈神经网络在每个Transformer层中对输入数据进行进一步的特征提取,增强模型的表达能力。
- 信息整合:前馈神经网络通过两个线性变换层和非线性激活函数,将输入数据映射到不同的空间,并在这些空间中进行信息整合。
3. 残差连接与层归一化
在Transformer编码器中,前馈神经网络通常与残差连接(Residual Connection)和层归一化(Layer Normalization)结合使用,以提高模型的训练稳定性和性能。具体步骤如下:
-
残差连接:在前馈神经网络的输出
y
与输入x
之间添加残差连接,即:
[
y_{\text{residual}} = x + y
]
残差连接有助于缓解梯度消失问题,并允许模型更容易地学习恒等映射。 -
层归一化:在残差连接之后,应用层归一化,对每个样本的特征进行归一化处理,以稳定训练过程:
[
y_{\text{normalized}} = \text{LayerNorm}(y_{\text{residual}})
] -
残差连接与层归一化的概念复习:残差连接是一种在神经网络中常用的结构,它将输入直接与经过若干层处理后的输出相加,使得网络可以更容易地学习输入和输出之间的残差,有助于解决深度网络中的梯度消失和梯度爆炸问题,提高模型的训练效果和性能。层归一化是对一层中的神经元的激活值进行归一化处理。它可以使得数据的分布更加稳定,加速模型的训练过程,提高模型的泛化能力。比如在自然语言处理任务中,层归一化可以对词向量或者中间层的输出进行归一化,使得模型对不同的输入数据具有更好的适应性。
4. 实现细节
在实际实现中,前馈神经网络的中间维度 d_ff
通常是输入维度 d_model
的4倍,即 d_ff = 4 * d_model
。这种设计选择是为了在保持模型复杂度的同时,提供足够的非线性变换能力。
5. 总结
前馈神经网络在Transformer编码器中扮演着重要角色,通过非线性变换和特征提取,增强了模型的表达能力。结合残差连接和层归一化,前馈神经网络能够有效地处理输入数据,并在Transformer层中进行信息整合,从而提升模型的性能。
相关文章:
ViT学习笔记(一) 基本的原理和框架结构
原论文地址:https://arxiv.org/pdf/2010.11929 首先大致通读一下原论文,这是很有必要的,但不必完全读懂,因为会有高手给我们解读,比如: 【Transformer系列】深入浅出理解ViT(Vision Transformer)模型-CSD…...

fedora下Jetbrains系列IDE窗口中文乱码解决方法
可以看到窗口右部分的中文内容为小方块。 进入 Settings - Appearance & Behavior - Appearance - Use custom font : Note Sans Mono CJK SC ,设置后如下图:...
nginx根据报文里字段转发至不同地址
nginx接收到post请求.请求报文里是一个json字符串,字符串里有个字段id。 根据id不同,转发到不同地址。 如果idaaa,转发到www.aaa.com.test 如果idbbb,转发到www.bbb.com.test 如何配置,请提供一个nginx.conf 要在 Nginx 中根据 POST 请求的 JSON 负载中的…...
使用 html/css 实现 educoder 顶部导航栏的步骤和方法
要使用HTML和CSS实现一个类似于Educoder网站的顶部导航栏,我们可以设计一个响应式、简洁且功能齐全的导航栏。Educoder的顶部导航栏通常包括网站的logo、主要导航项(如首页、课程、讨论等)、以及用户操作按钮(如登录、注册等&…...
EasyExcel导出列表
通过easyexcel导出列表数据 根据列表内容自适应宽高。 文件名冲突,修改文件名递增设置。 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version&…...

【unity小技巧】分享vscode如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...

【JavaScript】Object.keys() 和 Object.values() 的使用示例和相关的简单应用
值是数字的情况: let n 124; Object.keys(n) // [] Object.values(n) // []值是字符串的情况: let s "abc"; Object.keys(s) // [0, 1, 2] Object.values(s) // [a, b, c]值是数组的情况:(常用) let ar…...

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...

基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯
基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯 1. 实验要求2. 功能分析3. 模块设计4. 波形图5.代码编写6. 代码仿真7. 添加约束文件并分析综合 上期内容,我们学习了按键控制蜂鸣器,这一期我们开始学习呼吸灯 1. 实验要求 控制领航者核心板上的led&#x…...

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题
探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...

OpenCV-平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
解决跨域问题方案
跨域问题在前后端分离架构下尤为常见,是每个 Web 开发者都会遇到的核心问题。本文将通过原理解析、场景剖析、解决方案详解以及最佳实践等多个维度,帮助开发者全面理解并有效应对跨域问题。 目录 **一、跨域的本质****1. 同源策略****2. 同源策略的限制范…...

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)
计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化)1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化&#…...

软件工程复习记录
基本概念 软件工程三要素:方法、工具、过程 软件开发方法:软件开发所遵循的办法和步骤,以保证所得到的运行系统和支持的文档满足质量要求。 软件开发过程管理 软件生命周期:可行性研究、需求分析、概要设计、详细设计、编码、测…...

俩Nim游戏
1.给定n堆石子,每堆石子有xi快,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略ÿ…...

基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 超级电容特性 4.2 电池特性 5.完整工程文件 1.课题概述 基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真。分析不同车速对应的电池,超级电容充放电变化情况。 2.系统仿…...

数据结构——图(遍历,最小生成树,最短路径)
目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…...
002-NoSQL介绍
目录 一、NoSQL 简介 二、NoSQL 特性 三、NoSQL 的工作原理 四、NoSQL 有哪些类型 五、NoSQL数据库与关系型数据库的区别 六、常见的非关系型数据库NOSQL分类 一、NoSQL 简介 NoSQL,全称为Not Only SQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是…...
qt-everywher交叉编译e-src-5.15.2
简化配置的方式: 你完全可以通过直接配置 安装目录、编译链 和 目标架构 来完成交叉编译,而不需要修改 mkspecs 配置。以下是如何通过简化配置来进行交叉编译 Qt 的步骤。 准备交叉编译工具链 首先,确保你已经安装了交叉编译工具链ÿ…...

4.STM32通信接口之SPI通信(含源码)---硬件SPI与W25Q64存储模块通信实战《精讲》
开胃简介 根据上一节对STM32的SPI介绍!本节将进行硬件SPI的实现,片选用软件实现!跟着Whappy走起!W25Q64的驱动层,我们不需要更改,仅仅需要更改一下SPI的协议,即:由软件实现改成硬件…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...

Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...