当前位置: 首页 > news >正文

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 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通过引入三个门(输入门、遗忘门和输出门&#xff09…...

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)一种常见的贪心算法 总结 前言 提示:这里…...

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…...

算法总结-哈希表

文章目录 1.赎金信1.答案2.思路 2.字母异位词分组1.答案2.思路 3.两数之和1.答案2.思路 4.快乐数1.答案2.思路 5.最长连续序列1.答案2.思路 1.赎金信 1.答案 package com.sunxiansheng.arithmetic.day14;/*** Description: 383. 赎金信** Author sun* Create 2025/1/22 11:10…...

向下调整算法(详解)c++

算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 大家可能会有点疑惑,这个是大根堆,22是怎么跑到…...

蓝桥杯之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…...

使用Python爬虫获取1688商品拍立淘API接口(item_search_img)的实战指南

在电商领域,通过图片搜索商品(拍立淘)已经成为一种重要的商品检索方式。1688平台的item_search_img接口允许用户通过上传图片来搜索相似商品,这为商品信息采集和市场分析提供了极大的便利。本文将详细介绍如何使用Python爬虫技术调…...

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档?文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获&#xff0…...

使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?

使用Navicat Premium管理数据库时,最糟心的事情莫过于事务默认自动提交,也就是你写完语句运行时,它自动执行commit提交至数据库,此时你就无法进行回滚操作。 建议您尝试取消勾选“选项”中的“自动开始事务”,点击“工…...

【单细胞-第三节 多样本数据分析】

文件在单细胞\5_GC_py\1_single_cell\1.GSE183904.Rmd GSE183904 数据原文 1.获取临床信息 筛选样本可以参考临床信息 rm(list ls()) library(tinyarray) a geo_download("GSE183904")$pd head(a) table(a$Characteristics_ch1) #统计各样本有多少2.批量读取 学…...

(java) IO流

学习IO流之前,我们需要先认识file对象,帮助我们更好的使用IO流 1.1 file 作用:关联硬盘上的文件 写法: File(String path); (推荐)File(String parent, String child); //由父级路径,再子级路径拼接而成File(File p…...

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表,不需进入命令行模式。示例如下: sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…...