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 NormalizationLN -- 层标准化)残差连接:确保训练稳定性和梯度流动。
  • 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 nn

class 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 文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言自定义数据类型详解(二)——结构体类型(下)

书接上回,前面我们已经给大家介绍了如何去声明和创建一个结构体,如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识: 今天的主题是:结构体大小的计算并简单了解一下位段的相关知识。…

【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点

当前的ComfyUI的收录的自定义节点很多,但是有些节点属于新出来,或者他的应用没有那么广泛,Manager管理节点 有可能没有收录到,这时候 如果我们需要安装需要怎么办呢?这就涉及到我们自己安装这些节点了。例如下面的内容…

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用

论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接:https://arxiv.org/pdf/2403.06258 代码链接:https://github.com/NUST-Mac…

[OO ALV] OO ALV 基础显示

程序代码 REPORT z437_test_2025.DATA gt_spfli TYPE STANDARD TABLE OF spfli. " 内表DATA go_alv TYPE REF TO cl_gui_alv_grid. " 创建和管理ALV表格DATA gs_layout TYPE lvc_s_layo. " 存储ALV表格的布局信息*---------------------…

jQuery小游戏(二)

jQuery小游戏(二) 今天是新年的第二天,本人在这里祝大家,新年快乐,万事胜意💕 紧接jQuery小游戏(一)的内容,我们开始继续往下咯😜 游戏中使用到的方法 key…

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令: 文件: touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向(Redirection) 2. 管道(Pipes&a…

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1:计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2:带余除法练习3:整数个位练习4:整数十位练习5:时间转换练习6&#xff…

51单片机开发:定时器中断

目标:利用定时器中断,每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。: 系统中断号如下图所示:定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

【设计测试用例自动化测试性能测试 实战篇】

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 设计测试用例…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一,指针 二,内存地址和指针 1,什么是内存地址 2,指针在不同系统下所占内存 三,指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1, 初始化方式优点及适用场景 4,指针的声明初始化类型…

利用Redis实现数据缓存

目录 1 为啥要缓存捏? 2 基本流程(以查询商铺信息为例) 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除(半自动) 3.3 主动更新(手动) 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性:原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证(1)REDO LOG称为重做日志,用来保证事务的持久性(2)UNDO LOG称为回…

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容: 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置,我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…

SpringBoot 日志与配置文件

SpringBoot 配置文件格式 Properties 格式 Component ConfigurationProperties(prefix "person") //和配置文件person前缀的所有配置进行绑定 Data public class Person {private String name;private Integer age;private Date birthDay;private Boolean like;pr…

oracl:数据查询语言DQL

SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系数据库的标准编程语言。 sql分类: 基本查询语法 数据查询语言(DQL - Data Query Language) 查询的关键词 select where对查询结果进行过滤…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…

神经网络和深度学习

应用 类型 为什么近几年飞速发展 数据增长,算力增长,算法革新 逻辑回归 向量化 浅层神经网络(Shallow neural network) 单条训练数据前向传播计算表达式 batch训练数据前向传播计算表达式 反向传播计算表达式 参数随机初始化 不能全部设为0 原因是同一…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂,论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此,本文通过精简代码(约300行),从代码运行角度讲解扩散模型。 本文包括扩散模型的3项技术复现: 1.DDPM (Denoising…

浅谈网络 | 容器网络之Flannel

目录 云原生网络架构深度解构:Flannel的设计哲学与实现机制Flannel架构解析:三层核心设计原则UDP模式(用户态隧道)VXLAN模式(内核态隧道)Host-GW模式(直连路由) 生产环境架构选型与调…