【学习笔记】Transformer
学习的博客(在此致谢):
初识CV - Transformer模型详解(图解最完整版)
1 整体结构
Transformer由Encoder和Decoder组成,分别包含6个block。
Transformer的工作流程大体如下:
- 获取每个单词的embedding vector X X X, X X X由词嵌入(word embedding)和位置编码(Positional Encoding)得到。
- 将得到的单词 X X X传入Encoder中,经过6个Encoder block后可以得到句子所有单词的编码信息矩阵 C C C。单词向量矩阵可以用 X n × d X_{n\times d} Xn×d表示,其中 n n n为单词数, d d d为向量维度(论文中为512)。每个Encoder block输出的矩阵维度与输入完全一致。
- 将 C C C传递到Decoder中,Decoder会根据翻译过的单词 1 , ⋯ , i 1,\cdots,i 1,⋯,i翻译单词 i + 1 i+1 i+1。翻译 i + 1 i+1 i+1时需要用mask盖住 i + 2 , ⋯ , n i+2,\cdots,n i+2,⋯,n。
2 Transformer的输入
X X X由词嵌入(word embedding)和位置编码(Positional Encoding)得到。
2.1 词嵌入
输入的是一句话,比如:“我 爱 自然语言处理”,每个词会被映射成一个向量,叫词嵌入(word embedding)。
“我” → [0.2, 0.5, ..., -0.1] (一个 d_model 维的向量)
“爱” → [...]
“自然语言处理” → [...]
2.2 位置编码
Transformer除了词嵌入,还需要位置编码(Positional Encoding, PE) 来表示单词在句子中出现的位置。由于Transformer不采用RNN结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于NLP来说非常重要。 所以Transformer中使用位置编码来保存单词在序列中的相对/绝对位置。
Transformer中计算PE的公式如下:
PE ( pos , 2 i ) = sin ( pos / 10000 2 i / d ) \text{PE}_{(\text{pos},2i)}=\sin(\text{pos}/10000^{2i/d}) PE(pos,2i)=sin(pos/100002i/d)
PE ( pos , 2 i + 1 ) = cos ( pos / 10000 2 i / d ) \text{PE}_{(\text{pos},2i+1)}=\cos(\text{pos}/10000^{2i/d}) PE(pos,2i+1)=cos(pos/100002i/d)
其中, pos \text{pos} pos表示单词在句子中的位置, d d d表示PE的维度(与词嵌入的维度相同)。
对于每个位置 pos \text{pos} pos,我们计算 d d d维向量(其中一半维度是 sin \sin sin,另一半是 cos \cos cos)。所以每个位置的PE也是长度为 d d d的向量。
2.3 Transformer的输入
有了词嵌入 input_embedding \text{input\_embedding} input_embedding和位置编码 positional_encoding \text{positional\_encoding} positional_encoding(即 PE \text{PE} PE),我们有
X = input_embedding + positional_encoding X=\text{input\_embedding}+\text{positional\_encoding} X=input_embedding+positional_encoding
为什么是相加而不是连接(concat)?
- 加法不增加维度,后面的模型结构无需改动。
- PE被视为微调词语的表示,可以看作是在词向量的基础上“注入一点位置感知”。比如“I saw a cat.” 中的 “cat” 在句首或句尾含义不同,但你不需要让两个“cat”产生完全不同的表示,只需加一点“位置信息”做微调。
- Attention中的缩放点积更适合加法式表示。
- 原论文实验验证:加法的效果已经很好,因此选择加法方案。
3 Self-Attention 自注意力机制
上图为论文中Transformer的内部结构图,左侧为Encoder block,右侧为Decoder block。红色圈中的部分为Multi-Head Attention,由多个Self-Attention组成。
还可以发现,Encoder block包含一个Multi-Head Attention,而Decoder block包含两个,其中一个用到了mask。
还可以发现,Multi-Head Attention上方还包括一个Add & Norm层,Add表示残差链接(Redidual Connection),用于防止网络退化;Norm表示Layer Normalization,用于对每一层的激活值进行归一化。
3.1 Self-Attention结构
上图为Self-Attention结构,计算时需要用到矩阵Q(Query, 查询), K(Key, 键值), V(Value, 值)。Self-Attention接收的是输入(第2章中的矩阵 X X X) 或者上一个Encoder block的输出。
而Q,K,V正是通过Self-Attention的输入进行线性变换得到的。
3.2 Q, K, V
已知 X ∈ R n × d X\in\mathbb{R}^{n\times d} X∈Rn×d。定义三个参数矩阵: W Q ∈ R d × d Q W_Q\in\mathbb{R}^{d\times d_Q} WQ∈Rd×dQ, W K ∈ R d × d K W_K\in\mathbb{R}^{d\times d_K} WK∈Rd×dK, W V ∈ R d × d V W_V\in\mathbb{R}^{d\times d_V} WV∈Rd×dV。对于每个输入 X X X:
Q = X W Q , K = X W K , V = X W V Q=XW_Q,\ K=XW_K,\ V=XW_V Q=XWQ, K=XWK, V=XWV
得到的矩阵: Q ∈ R n × d Q Q\in\mathbb{R}^{n\times d_Q} Q∈Rn×dQ, K ∈ R n × d K K\in\mathbb{R}^{n\times d_K} K∈Rn×dK, V ∈ R n × d V V\in\mathbb{R}^{n\times d_V} V∈Rn×dV。通常, d Q , d K , d V d_Q,d_K,d_V dQ,dK,dV是相同的。
在注意力机制中,每个词会
- 用 Q Q Q询问别的词的 K K K,来判断该关注谁;
- 用 V V V提供实际信息,如果我关注你,要拿到你的什么内容。
注意力公式如下:
Attention ( Q , K , V ) = softmax ( Q K ⊤ d K ) V \text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^\top}{\sqrt{d_K}})V Attention(Q,K,V)=softmax(dKQK⊤)V
最后输出的矩阵 Z ∈ R n × d V Z\in\mathbb{R}^{n\times d_V} Z∈Rn×dV。
3.3 Multi-head Attention
假设 X X X经过QKV计算后得到 Z Z Z。上图可以看出Multi-head Attention包含多个Self-Attention层。首先将输入 X X X分别传递到 h h h个不同的Self-Attention中,计算得到 h h h个输出矩阵 Z = [ Z 1 , ⋯ , Z h ] Z=[Z_1,\cdots,Z_h] Z=[Z1,⋯,Zh]。Multi-head Attention将其连接(concat)起来,得到 Z ′ ∈ R n × ( h ⋅ d K ) Z'\in\mathbb{R}^{n\times (h\cdot d_K)} Z′∈Rn×(h⋅dK)。
最后再经过一层 R ( h ⋅ d K ) × d \mathbb{R}^{(h\cdot d_K)\times d} R(h⋅dK)×d的线性层,得到最终的输出 Z ∈ R n × d Z\in\mathbb{R}^{n\times d} Z∈Rn×d,和输入 X X X的维度相同。
4 Encoder
上图红色部分是Transformer的Encoder block结构,可以看到是由Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm组成的。刚刚已经了解了Multi-Head Attention的计算过程,现在了解一下Add & Norm和Feed Forward部分。
4.1 Add & Norm
Add & Norm层由Add和Norm两部分组成,其计算公式如下:
LayerNorm ( X + MultiHeadAttention ( X ) ) \text{LayerNorm}(X+\text{MultiHeadAttention}(X)) LayerNorm(X+MultiHeadAttention(X))
LayerNorm ( X + FeedForward ( X ) ) \text{LayerNorm}(X+\text{FeedForward}(X)) LayerNorm(X+FeedForward(X))
其中 X X X表示Multi-Head Attention或者Feed Forward的输入,MultiHeadAttention(X)和 FeedForward(X) 表示输出(输出与输入X维度是一样的,所以可以相加)。
Add指X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
Norm指Layer Normalization,通常用于RNN结构,Layer Normalization会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
4.2 Feed Forward
Feed Forward层比较简单,是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数:
max ( 0 , X W 1 + b 1 ) W 2 + b 2 \max(0,XW_1+b_1)W_2+b_2 max(0,XW1+b1)W2+b2
X是输入,Feed Forward最终得到的输出矩阵的维度与X一致。
最后, X X X经过一连串Encoder得到编码信息矩阵 C C C。
5 Decoder
上图红色部分为Transformer的Decoder block结构,与Encoder block相似,但是存在一些区别:
- 包含两个Multi-Head Attention层。
- 第一个Multi-Head Attention层采用了Masked操作。
- 第二个Multi-Head Attention层的K, V矩阵使用Encoder的编码信息矩阵 C C C进行计算,而Q使用上一个Decoder block的输出计算。
- 最后有一个Softmax层计算下一个翻译单词的概率。
5.1 Masked Multi-Head Attention (1st)
Decoder block 的第一个Multi-Head Attention采用了Masked操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第i+1个单词。通过Masked操作可以防止第i个单词知道i+1个单词之后的信息。
下面的描述中使用了类似Teacher Forcing的概念。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入"Begin"预测出第一个单词为 “I”,然后根据输入"Begin I"预测下一个单词 “have”。
**第一步:**是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “(begin) I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。
第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵 X X X计算得到 Q , K , V Q,K,V Q,K,V矩阵。然后计算 Q Q Q和 K ⊤ K^\top K⊤的乘积 Q K ⊤ QK^\top QK⊤。
第三步:在得到 Q K ⊤ QK^\top QK⊤之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
得到Mask Q K ⊤ QK^\top QK⊤之后在Mask Q K ⊤ QK^\top QK⊤上进行Softmax,每一行的和都是1,但是单词0在单词1,2,3,4上的attention score都为0。
第四步:使用Mask Q K ⊤ QK^\top QK⊤与矩阵 V V V相乘得到 Z Z Z,则单词1的输出向量 Z 1 Z_1 Z1是只包含单词1的信息的。
第五步:通过上述步骤就可以得到一个Masked Self-Attention的输出矩阵 Z i Z_i Zi,然后和Encoder类似,通过Multi-Head Attention拼接多个输出 Z i Z_i Zi,然后计算得到第一个Multi-Head Attention的输出 Z Z Z, Z Z Z与输入 X X X的维度相同。
5.2 Multi-Head Attention (2nd)
Decoder block 第二个 Multi-Head Attention 变化不大, 主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个Decoder block的输出计算的,而是使用Encoder 的编码信息矩阵C计算的。
根据Encoder的输出 C C C计算得到 K , V K, V K,V,根据上一个Decoder block的输出 Z Z Z计算 Q Q Q (如果是第一个Decoder block则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。
这样做的好处是在Decoder的时候,每一位单词都可以利用到Encoder所有单词的信息 (这些信息无需Mask)。
5.3 Softmax预测输出单词
Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z Z Z,因为 Mask 的存在,使得单词0的输出 Z 0 Z_0 Z0 只包含单词0的信息,如下:
Softmax 根据输出矩阵的每一行预测下一个单词:
这就是Decoder block的定义,与Encoder一样,Decoder是由多个Decoder block组合而成。
相关文章:

【学习笔记】Transformer
学习的博客(在此致谢): 初识CV - Transformer模型详解(图解最完整版) 1 整体结构 Transformer由Encoder和Decoder组成,分别包含6个block。 Transformer的工作流程大体如下: 获取每个单词的em…...

欢乐熊大话蓝牙知识12:用 BLE 打造家庭 IoT 网络的三种方式
🏠 用 BLE 打造家庭 IoT 网络的三种方式 不止是“蓝牙耳机”,BLE 还能把你家“点亮成精”! 👋 前言:BLE 不只是蓝牙耳机的“代名词” 蓝牙?很多人一听就联想到“耳机连接失败请重试”。但你知道吗?现在 BLE(Bluetooth Low Energy)在智能家居中已经偷偷搞起了大事情。…...

02.上帝之心算法用GPU计算提速50倍
本文介绍了上帝之心的算法及其Python实现,使用Python语言的性能分析工具测算性能瓶颈,将算法最耗时的部分重构至CUDA C语言在纯GPU上运行,利用GPU核心更多并行更快的优势显著提高算法运算速度,实现了结果不变的情况下将耗时缩短五…...

MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能
前言: 在当今竞争激烈的制造业环境中,企业面临着提高生产效率、降低成本、提升产品质量以及快速响应市场变化等多重挑战。MES管理系统作为连接企业上层计划管理系统与底层工业控制之间的桥梁,扮演着至关重要的角色。它能够实时收集、分析和处…...

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++
https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 ta…...

VectorStore 组件深入学习与检索方法
考虑到目前市面上的向量数据库众多,每个数据库的操作方式也无统一标准,但是仍然存在着一些公共特征,LangChain 基于这些通用的特征封装了 VectorStore 基类,在这个基类下,可以将方法划分成 6 种: 相似性搜…...

HackMyVM-First
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 06:13 EDT Nmap scan report for 192.168.43.1 Host is up (0.0080s latency). MAC Address: C6:45:66:05:91:88 (Unknown) …...
30V/150A MOSFET 150N03在无人机驱动动力系统中的性能边界与热设计挑战
产品技术概述 150N03 是一款基于沟槽式工艺(Trench Technology)的N沟道功率MOSFET,其核心价值在于: 电压/电流规格:VDSS30V, ID150A (Tc25℃) 工艺特征:高密度元胞设计实现超低导通电阻 双面散热架构:顶部裸露铜架底…...
数据共享交换平台之数据资源目录
依据信息资源体系规范,构建多维度、多层级的资源目录体系,完整的展示和管理资源目录。资源目录提供以下功能: 多层级资源目录展示,能够将资源目录按照技术维度和管理维度进行分类管理,并能够将资源目录按照数据湖、基础…...

跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用
JxBrowser 是 TeamDev 开发的跨平台库,用于在 Java 应用程序中集成 Chromium 浏览器。它支持 HTML5、CSS3、JavaScript 等,具备硬件加速渲染、双向 Java 与 JavaScript 连接、丰富的事件监听等功能,能处理网页保存、打印等操作,助…...

WEBSTORM前端 —— 第3章:移动 Web —— 第3节:移动适配
目录 一、移动Web基础 1.谷歌模拟器 2.屏幕分辨率 3.视口 4.二倍图 二、适配方案 三、rem 适配方案 四、less 1.less – 简介 2.less – 注释 3.less – 运算 4.less – 嵌套 5.less – 变量 6.less – 导入 7.less – 导出 8.less – 禁止导出 五…...
38.springboot使用rabbitmq
pom依赖 <!--amqp依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 配置文件添加 spring:application:name: message…...

弱光环境下如何手持相机拍摄静物:摄影曝光之等效曝光认知
写在前面 博文内容为一次博物馆静物拍摄笔记的简单总结内容涉及:弱光环境拍摄静物如何选择,以及等效曝光的认知理解不足小伙伴帮忙指正 😃,生活加油 我看远山,远山悲悯 持续分享技术干货,感兴趣小伙伴可以关注下 _ 采…...
Selenium Manager中文文档
1. 什么是 Selenium Manager(测试版) Selenium Manager 是 Selenium 官方提供的命令行工具(用 Rust 实现),用于自动管理浏览器及其驱动(chromedriver、geckodriver、msedgedriver 等)。从 Sele…...
WEB安全--SQL注入--MSSQL注入
一、SQLsever知识点了解 1.1、系统变量 版本号:version 用户名:USER、SYSTEM_USER 库名:DB_NAME() SELECT name FROM master..sysdatabases 表名:SELECT name FROM sysobjects WHERE xtypeU 字段名:SELECT name …...

【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
- 第 102 篇 - Date: 2025 - 05 - 31 Author: 郑龙浩/仟墨 文章目录 HTML 基础学习一 了解HTML二 HTML的结构三 HTML标签1 标题2 文本段落3 换行4 加粗、斜体、下划线5 插入图片6 添加链接7 容器8 列表9 表格10 class类 HTML 基础学习 一 了解HTML 一个网页分为为三部分&…...
SAP Business ByDesign:无锡哲讯科技赋能中大型企业云端数字化转型
云端ERP时代,中大型企业的智能化引擎 在数字经济高速发展的今天,中大型企业面临着全球化竞争、供应链复杂化、数据安全等多重挑战。传统的本地化ERP系统已无法满足企业快速响应市场变化的需求,而SAP Business ByDesign(ByD&…...
华为OD机考2025B卷 - 无向图染色(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 给一个无向图染色,可以填红黑两种颜色,必须保证相邻两个节点不能同时为红色,输出有多少种不同的染色方案? 输入描述 第一行输入M(图中节点数) N(边数) 后续N行格式为:V1 V2表示…...
计算机网络学习20250528
地址解析协议ARP 实现IP地址和Mac地址的转换 ARP工作原理: 每台主机或路由器都有一个ARP表,表项:<IP地址,Mac地址,TTL>(TTL一般为20分钟) 主机产生ARP查询分组,包含源目的IP地…...

Next.js路由导航完全指南
在前端框架(如 React、Vue 等)或移动端开发中,路由系统是实现页面 / 界面导航的核心机制。Next.js 采用 文件系统路由(File System Routing),即根据项目目录结构自动生成路由。 Next.js 目前有两套路由解决…...

五、web安全--XSS漏洞(1)--XSS漏洞利用全过程
本文章仅供学习交流,如作他用所承受的法律责任一概与作者无关1、XSS漏洞利用全过程 1.1 寻找注入点:攻击者首先需要找到目标网站中可能存在XSS漏洞的注入点。这些注入点通常出现在用户输入能够直接输出到页面,且没有经过适当过滤或编码的地方…...

【C++高级主题】命令空间(六):重载与命名空间
目录 一、候选函数与命名空间:重载的 “搜索范围” 1.1 重载集的构成规则 1.2 命名空间对候选函数的隔离 二、重载与using声明:精准引入单个函数 2.1 using声明与重载的结合 2.2 using声明的冲突处理 三、重载与using指示:批量引入命名…...
利用 Python 爬虫获取淘宝商品详情
在电商领域,淘宝作为中国最大的在线零售平台,拥有海量的商品信息。对于开发者、市场分析师以及电商研究者来说,能够从淘宝获取商品详情信息,对于市场分析、价格比较、商品推荐等应用场景具有重要价值。本文将详细介绍如何使用 Pyt…...
动态拼接内容
服务器端模板引擎(Server-Side Template Engine) 的特性,比如 JSP(Java Server Pages)、ASP.NET、PHP 等技术中常用的 <% %> 语法。 它的核心作用是: 动态拼接内容:在 HTML 中嵌入编程语…...

Tomcat运行比较卡顿进行参数调优
在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加参数 1. 初步调整参数(缓解问题) set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代,减少对象过早晋升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…...
java直接获取MyBatis将要执行的动态sql命令(不是拦截器方式)
目录 前言 一. 准备数据 1. 传输过来的json条件数据 2. mybatis 配置的动态sql 3. 想要的最终会执行的sql并返回给页面展示 二. 实现方式 三. 最终代码 前言 1.在平常开发过程中,MyBatis使用时非常多的,一般情况下我们只需要在控制台看看MyBatis输出的日志,要不就是实…...

C++四种类型转换方式
const_cast,去掉(指针或引用)常量属性的一个类型转换,但需要保持转换前后类型一致static_cast,提供编译器认为安全的类型转换(最常使用)reinterpret_cast,类似于c语言风格的强制类型转换,不保证安全;dynamic_cast,主要用于继承结构中…...

Canvas: trying to draw too large(256032000bytes) bitmap.
1、错误展示 测试了一下一张图片的显示,发现二个手机上测试的结果不一样,配制好一些的手机,直接就通过,但是屏小一些的测试手机上,直接报下面的错误。 这个意思是图片太大了,直接就崩了。 2、代码编写 lo…...
【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
卷积神经网络与LLaMA分类模型 一、卷积操作基础 卷积是深度学习中用于提取局部特征的核心操作,特别适用于图像识别任务。 自定义二维卷积函数示例 以下函数实现了一个简化版的二维卷积: def convolve2D(image, kernel, padding0, strides1):kernel …...
matlab全息技术中的菲涅尔仿真成像
matlab全息技术中的菲涅尔仿真成像程序。 傅里叶法(重建距离得大)/Fresnel.m , 545 傅里叶法(重建距离得大)/FresnelB.m , 548 傅里叶法(重建距离得大)/Fresnel_solution.m , 1643 傅里叶法(重…...