Transformer+vit原理分析
目录
一、Transformer的核心思想
1. 自注意力机制(Self-Attention)
2. 多头注意力(Multi-Head Attention)
二、Transformer的架构
1. 整体结构
2. 编码器层(Encoder Layer)
3. 解码器层(Decoder Layer)
三、关键技术与细节
1. 位置编码(Positional Encoding)
2. 掩码机制(Masking)
3. 前馈神经网络(FFN)
四、训练与优化
1. 损失函数
2. 优化技巧
五、Transformer的应用与变体
1. 经典应用
2. 变体模型
六、Transformer的优势与局限
1. 优势
2. 局限
七、vision transformer
1.Vision Transformer的核心思想
2.ViT架构的关键组件
(1) 图像分块与嵌入(Patch Embedding)
(2) 位置编码(Positional Encoding)
(3) Transformer Encoder
(4) 分类头(Classification Head)
3. 数据处理与训练流程
4. MindSpore实现特点
5. ViT与传统CNN的对比
6.关键代码片段(简化版)
Transformer 模型是2017年由Google提出的一种革命性的深度学习架构(但不是一种AI框架,区别于Tensorflow,可以理解为一种算法),主要用于序列到序列(Seq2Seq)任务(如机器翻译、文本生成等)。它的核心创新在于完全摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),转而依赖自注意力机制(Self-Attention)捕捉序列中元素之间的全局依赖关系。Transformer通过自注意力机制彻底改变了序列建模方式,成为现代NLP的基石。其设计启发了BERT、GPT等划时代模型,并扩展到了计算机视觉、语音处理等领域。
一、Transformer的核心思想
1. 自注意力机制(Self-Attention)
- 目标:为序列中的每个位置(如单词)分配不同的权重,表示该位置对其他位置的依赖程度。
- 输入:三个向量(Query, Key, Value),均来自同一输入序列的线性变换。
- 计算步骤:
1. 相似度计算:通过Query和Key的点积计算每对位置之间的相关性。
2. 缩放(Scaling):除以根号下维度(
),防止点积值过大导致梯度消失。
3. Softmax归一化:得到权重矩阵(注意力分数)。
4. 加权求和:用权重矩阵对Value向量加权求和,得到最终输出。
公式:

2. 多头注意力(Multi-Head Attention)
- 动机:单次注意力可能只关注局部信息,多头机制允许模型同时关注不同子空间的信息。
- 实现:将Q、K、V分别拆分到多个头(如8个头),每个头独立计算注意力,最后拼接结果并通过线性层融合。
二、Transformer的架构

1. 整体结构
- 编码器(Encoder):由N个相同层堆叠而成(原论文N=6)。
解码器(Decoder):同样由N个层堆叠,每个层比编码器多一个交叉注意力(Cross-Attention)模块。
2. 编码器层(Encoder Layer)
每层包含两个子模块:
1. 多头自注意力(Multi-Head Self-Attention):处理输入序列的内部依赖。
2. 前馈神经网络(Feed-Forward Network, FFN):两层全连接层(中间用ReLU激活)。
残差连接(Residual Connection)和层归一化(Layer Normalization)应用于每个子模块后。
3. 解码器层(Decoder Layer)
每层包含三个子模块:
1. 掩码多头自注意力(Masked Multi-Head Self-Attention):防止解码时看到未来信息。
2. 交叉注意力(Cross-Attention):将解码器的Query与编码器的Key、Value交互。
3. 前馈神经网络(FFN)。
- 同样使用残差连接和层归一化。
三、关键技术与细节

1. 位置编码(Positional Encoding)
- 问题:Transformer没有RNN/CNN的顺序处理能力,需显式注入位置信息。
- 方法:使用正弦和余弦函数生成位置编码,与输入向量相加。

2. 掩码机制(Masking)
- 解码器自注意力掩码:掩盖未来位置,确保预测第t步时只能看到前t-1步的信息。
- 填充掩码(Padding Mask):忽略无效的填充位置(如补齐序列的0)。
3. 前馈神经网络(FFN)
- 结构:两层全连接,中间维度扩大(如输入维度512 → 中间2048 → 输出512)。
公式:![]()
四、训练与优化
1. 损失函数
- 交叉熵损失(Cross-Entropy Loss),用于分类任务(如预测下一个词)。
2. 优化技巧
- 学习率预热(Learning Rate Warmup):逐步增加学习率,避免初始阶段不稳定。
- 标签平滑(Label Smoothing):防止模型对标签过于自信,提升泛化能力。
五、Transformer的应用与变体
1. 经典应用
- 机器翻译(原始论文任务)。
- BERT:仅用编码器,通过掩码语言模型预训练。
- GPT系列:仅用解码器,自回归生成文本。
2. 变体模型
- Vision Transformer(ViT):将图像分块后输入Transformer。
- Longformer:改进注意力机制,处理长序列。
- T5:统一的文本到文本框架。
六、Transformer的优势与局限
1. 优势
- 并行计算效率高(相比RNN)。
- 长距离依赖捕捉能力强。
- 灵活适应多种任务(如文本、图像、语音)。
2. 局限
- 计算复杂度与序列长度平方成正比(O(n²))。
- 对位置编码的依赖较强,可能影响泛化。
七、vision transformer

1.Vision Transformer的核心思想

ViT将图像处理任务转化为类似自然语言处理(NLP)的序列建模问题,通过Transformer Encoder结构替代传统的卷积神经网络(CNN)。核心思想如下:
- 图像分块(Patch Embedding):将输入图像分割为固定大小的图像块(如16x16像素),每个块被展平为一个向量,作为Transformer的输入序列。
- 位置编码(Positional Encoding):由于Transformer本身不具备空间位置感知能力,需为每个图像块添加位置编码,以保留图像的空间信息。
- 类标记(Class Token):在输入序列前添加一个可学习的类标记(Class Token),用于最终分类任务。
2.ViT架构的关键组件

(1) 图像分块与嵌入(Patch Embedding)
- 输入图像(如224x224)被划分为多个固定大小的块(如16x16),每个块展平为向量(如16x16x3=768维)。
- 通过线性投影(`nn.Dense`)将每个块映射到嵌入空间,生成Patch Embeddings。
- 示例操作:
# MindSpore中的分块与嵌入实现
self.patch_embedding = nn.Conv2d(in_channels, embed_dim, kernel_size=patch_size, stride=patch_size, has_bias=True)
(2) 位置编码(Positional Encoding)
- 为每个图像块添加位置编码,编码方式可以是可学习的参数(`nn.Embedding`)或预定义的固定编码。
- 位置编码与Patch Embeddings相加,形成最终的输入序列。
(3) Transformer Encoder
- 由多个Multi-Head Self-Attention层和Feed-Forward Network(FFN)堆叠而成。
- Self-Attention:通过计算序列内各元素间的相关性,捕捉全局依赖关系。
- Layer Normalization(LN -- 层标准化)和残差连接:确保训练稳定性和梯度流动。
- MindSpore中可以使用`nn.TransformerEncoderLayer`实现单层Transformer。
(4) 分类头(Classification Head)
- 取类标记对应的输出向量,通过多层感知机(MLP)进行分类。
self.classifier = nn.Dense(embed_dim, num_classes)
3. 数据处理与训练流程
- 图像预处理:标准化(如ImageNet均值/方差)、调整大小、分块。
- 数据增强:随机裁剪、翻转、颜色扰动等(使用MindSpore的`transforms`模块)。
- 训练优化:使用交叉熵损失函数、AdamW优化器,支持分布式训练和混合精度加速。
4. MindSpore实现特点
- 动态图模式(PyNative):灵活调试模型结构。
- 混合精度训练:通过`model.train`的`amp_level`参数加速训练。
- 分布式训练支持:结合`set_auto_parallel_context`实现多卡并行。
5. ViT与传统CNN的对比

6.关键代码片段(简化版)
VisionTransformer模块的实现

import mindspore.nn as nnclass VisionTransformer(nn.Cell):def __init__(self, image_size=224, patch_size=16, num_classes=1000, embed_dim=768, depth=12):super().__init__()
num_patches = (image_size // patch_size) ** 2
self.patch_embedding = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size, has_bias=True)
self.cls_token = Parameter(initializer('normal', (1, 1, embed_dim)))
self.pos_embed = Parameter(initializer('normal', (1, num_patches + 1, embed_dim)))
self.transformer = nn.TransformerEncoder(depth, embed_dim, num_heads=12)
self.classifier = nn.Dense(embed_dim, num_classes)def construct(self, x):
x = self.patch_embedding(x) # 分块嵌入
x = x.flatten(2).transpose(0, 2, 1)
cls_token = self.cls_token.tile((x.shape[0], 1, 1))
x = ops.concat((cls_token, x), axis=1) # 添加类标记
x += self.pos_embed # 位置编码
x = self.transformer(x) # Transformer编码
x = x[:, 0] # 提取类标记输出
x = self.classifier(x)return x
参考文档:Vision Transformer图像分类 — MindSpore master 文档
相关文章:
Transformer+vit原理分析
目录 一、Transformer的核心思想 1. 自注意力机制(Self-Attention) 2. 多头注意力(Multi-Head Attention) 二、Transformer的架构 1. 整体结构 2. 编码器层(Encoder Layer) 3. 解码器层(Decoder…...
「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)
深度学习(DL)是现代人工智能(AI)的核心之一,但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用,深度学习经历了几乎一个世纪的不断探索与发展。今天,我们一起回顾深度学习的历史…...
【漫话机器学习系列】069.哈达马乘积(Hadamard Product)
哈达马乘积(Hadamard Product) 哈达马乘积(Hadamard Product)是两个矩阵之间的一种元素级操作,也称为逐元素乘积(Element-wise Product)。它以矩阵的对应元素相乘为规则,生成一个新…...
2025一区新风口:小波变换+KAN!速占!
今天给大家分享一个能让审稿人眼前一亮,好发一区的idea:小波变换KAN! 一方面:KAN刚中稿ICLR25,正是风口上,与小波变换的结合还处于起步阶段,正是红利期,创新空间广阔。 另一方面&a…...
相同的树及延伸题型(C语言详解版)
从LeetCode 100和101看二叉树的比较与对称性判断 今天要讲的是leetcode100.相同的树,并且本文章还会讲到延伸题型leetcode101.对称二叉树。本文章编写用的是C语言,大家主要是学习思路,学习过后可以自己点击链接测试,并且做一些对…...
【Redis】 String 类型的介绍和常用命令
1. 介绍 Redis 中的 key 都是字符串类型Redis 中存储字符串是完全按照二进制流的形式保存的,所以 Redis 是不处理字符集编码的问题,客户端传入的命令中使用的是什么编码就采用什么编码,使得 Redis 能够处理各种类型的数据,包括文…...
LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...
Docker/K8S
文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…...
32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 继续stdio测试的分析,上篇讲到标准IO端口初始化,单从测试内容来说其实很简单,没啥可分析的,但这几篇…...
git push到远程仓库时无法推送大文件
一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…...
Vue.js路由管理与自定义指令深度剖析
Vue.js 是一个强大的前端框架,提供了丰富的功能来帮助开发者构建复杂的单页应用(SPA)。本文将详细介绍 Vue.js 中的自定义指令和路由管理及导航守卫。通过这些功能,你可以更好地控制视图行为和应用导航,从而提升用户体验和开发效率。 1 自定义指令详解 1.1 什么是自定义…...
NVIDIA GPU介绍:概念、序列、核心、A100、H100
概述 入职一家大模型领域创业公司,恶补相关知识。 概念 一些概念: HPC:High Performance Computing,高性能计算SoC:System on Chip,单片系统FLOPS:Floating Point Operations Per Second&am…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
什么是长短期记忆网络?
一、概念 长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门(输入门、遗忘门和输出门)…...
git中有关old mode 100644、new mode 10075的问题解决小结
在 Git 版本控制系统中,文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时,这通常表示文件的权限发生了变化。本文将详细解析这种情况,并提供解决方法和注意事项。 问题背景 在 Git 中,文…...
Jenkins上生成的allure report打不开怎么处理
目录 问题背景: 原因: 解决方案: Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx: 通过合理调整CSP配置&a…...
JSR303校验教学
1、什么是JSR303校验 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。…...
使用DeepSeek技巧:提升内容创作效率与质量
一、引言 在当今快节奏的数字时代,内容创作的需求不断增加,无论是企业营销、个人博客还是学术研究,高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手,凭借其强大的语言生成能力,为创作者…...
【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的贪心算法2.贪心算法3.详细的贪心代码1)一种常见的贪心算法 总结 前言 提示:这里…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
