【学习笔记】Transformer

学习的博客(在此致谢):
初识CV - Transformer模型详解(图解最完整版)

1 整体结构

![[Pasted image 20250528161501.png]]

Transformer由Encoder和Decoder组成,分别包含6个block。

Transformer的工作流程大体如下:

  1. 获取每个单词的embedding vector X X X X X X由词嵌入(word embedding)和位置编码(Positional Encoding)得到。
  2. 将得到的单词 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输出的矩阵维度与输入完全一致。
  3. 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)?

  1. 加法不增加维度,后面的模型结构无需改动。
  2. PE被视为微调词语的表示,可以看作是在词向量的基础上“注入一点位置感知”。比如“I saw a cat.” 中的 “cat” 在句首或句尾含义不同,但你不需要让两个“cat”产生完全不同的表示,只需加一点“位置信息”做微调。
  3. Attention中的缩放点积更适合加法式表示。
  4. 原论文实验验证:加法的效果已经很好,因此选择加法方案。

3 Self-Attention 自注意力机制

![[Pasted image 20250528164507.png]]

上图为论文中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结构

![[Pasted image 20250528172649.png]]

上图为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} XRn×d。定义三个参数矩阵: W Q ∈ R d × d Q W_Q\in\mathbb{R}^{d\times d_Q} WQRd×dQ W K ∈ R d × d K W_K\in\mathbb{R}^{d\times d_K} WKRd×dK W V ∈ R d × d V W_V\in\mathbb{R}^{d\times d_V} WVRd×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} QRn×dQ K ∈ R n × d K K\in\mathbb{R}^{n\times d_K} KRn×dK V ∈ R n × d V V\in\mathbb{R}^{n\times d_V} VRn×dV。通常, d Q , d K , d V d_Q,d_K,d_V dQ,dK,dV是相同的。
在注意力机制中,每个词会

  1. Q Q Q询问别的词的 K K K,来判断该关注谁;
  2. 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(dK QK)V
最后输出的矩阵 Z ∈ R n × d V Z\in\mathbb{R}^{n\times d_V} ZRn×dV

3.3 Multi-head Attention

![[Pasted image 20250528223553.png]]

假设 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)} ZRn×(hdK)
最后再经过一层 R ( h ⋅ d K ) × d \mathbb{R}^{(h\cdot d_K)\times d} R(hdK)×d的线性层,得到最终的输出 Z ∈ R n × d Z\in\mathbb{R}^{n\times d} ZRn×d,和输入 X X X的维度相同。

4 Encoder

![[Pasted image 20250528235507.png]]

上图红色部分是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维度是一样的,所以可以相加)。
AddX+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
![[Pasted image 20250529000354.png]]

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

![[Pasted image 20250529000555.png]]

上图红色部分为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 的信息,即只能使用之前的信息。
![[Pasted image 20250529001717.png]]

第二步:接下来的操作和之前的 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
![[Pasted image 20250529001815.png]]

第三步:在得到 Q K ⊤ QK^\top QK之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
![[Pasted image 20250529001838.png]]

得到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的信息的。
![[Pasted image 20250529002009.png]]

第五步:通过上述步骤就可以得到一个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的信息,如下:
![[Pasted image 20250529002358.png]]

Softmax 根据输出矩阵的每一行预测下一个单词:
![[Pasted image 20250529002410.png]]

这就是Decoder block的定义,与Encoder一样,Decoder是由多个Decoder block组合而成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MMU]IOMMU的主要职能及详细的验证方案

IOMMU的主要职能及详细的验证方案 摘要:IOMMU(Input/Output Memory Management Unit)是一种硬件组件,负责管理I/O设备对内存的直接访问(DMA,Direct Memory Access),其主要作用是提供…

动物类 如何使用Yolov11训练使用牛羊数据集 实现对牛羊进行检测数据集

牛羊检测数据集 3700张 平视视角牛羊检测 带标注 voc yolo 牛羊检测数据集 3700张 牛羊检测平视 带标注 voc yolo 分类名: (图片张数,标注个数) cattle: (1395,4309) sheep: (2393,1 1205) 总数: (3791, 15514) 总类(nc): 2类 以…

搭建frp内网穿透

前言 内网穿透的原理我就不多说了哈,既然会看到我这篇文章,想必都知道内网穿透是做什么的吧 frp分为服务端和客户端,服务端一般是搭在公网服务器中,客户端一般搭在本地或者局域网,需要提前在服务端搭好ftp server&am…

Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面(四):语音识别输入功能

基于前三章的内容,开发AI 对话框语音识别输入功能: Tailwind css实战,基于Kooboo构建AI对话框页面(一)-CSDN博客 Tailwind css实战,基于Kooboo构建AI对话框页面(二):实…

ollama list模型列表获取 接口代码

ollama list模型列表获取 接口代码 curl http://localhost:11434/v1/modelscoding package hcx.ollama;/*** ClassName DockerOllamaList* Description TODO* Author dell* Date 2025/5/26 11:31* Version 1.0**/import java.io.BufferedReader; import java.io.InputStreamR…

ISOLAR软件生成报错处理(五)

错误1 An error has occurred. See error log for more details. java.lang.NullPointerException 这东西不用管&#xff0c;不影响生成 错误2 Description Resource Path Location Type Target ARObject: <xxxx> CompuMethod used for floating-point data conversi…

前端开发定时,ES学习,java集合

1.前端vue3加入定时任务&#xff1a; import { onMounted, ref,onUnmounted } from vue;//初始化&#xff0c;结束调用部分引用let timer: any;//定时器onMounted(async () > {timer setInterval(() > {open()//需要定时的任务}, 60000)//一分钟调用一次}); onUnmounte…

Photoshop2025(PS2025)软件及安装教程

在数字图像编辑领域&#xff0c;Adobe Photoshop 一直是无可争议的王者。如今&#xff0c;Photoshop 2025 重磅登场&#xff0c;再次为我们带来了惊喜与变革&#xff0c;进一步巩固了它在行业中的领先地位。 Photoshop 2025 在人工智能方面的升级令人瞩目。其全新的 “Magic Se…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

高等数学基础(向量矩阵及其创建和特殊的矩阵)

向量 向量是机器学习最底层的组成部分, 也是基础数据的表示形式, 线性代数通过将研究对象拓展到向量, 对多维数据进行统一研究, 而进化出的方法方便我们可以研究和解决真实世界中的问题 标量 标量也称为"无向量", 使用一个单独的数表示数值大小, 可以有正负之分, …

IBM DB2数据库管理工具IBM Data Studio

一、介绍 IBM Data Studio 是 IBM 提供的一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于支持数据管理、开发、优化和管理数据库应用程序&#xff0c;特别是在 IBM Db2 和其他数据库平台上。它提供了许多功能&#xff0c;以帮助开发人员和数据库管理员提高生产力…

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…

MediaMtx开源项目学习

这个博客主要记录MediaMtx开源项目学习记录,主要包括下载、推流(摄像头,MP4)、MediaMtx如何使用api去添加推流,最后自定义播放器,播放推流后的视频流,自定义Video播放器博客地址 1 下载 MediaMTX MediaMTX 提供了预编译的二进制文件,您可以从其 GitHub 页面下载: Gi…

【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、监听编辑器事件1、常用编辑器事件2、示例监听播放模…

Spring Boot+Activiti7入坑指南初阶版

介绍  Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spri…

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理

​一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架&#xff0c;用于构建和编排 AI 代理 二、什么是 VoltAgent&#xff1f; AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 &#xff08;&am…

《仿盒马》app开发技术分享-- 订单详情页(端云一体)

开发准备 在之前的章节中我们实现了订单的提交&#xff0c;以及提交之后跳转到确认订单页面&#xff0c;在确认订单页面我们添加了一个入口&#xff0c;这个入口是查询订单&#xff0c;当我们点击入口时&#xff0c;我们需要跳转到一个新的界面&#xff0c;这个界面通过接收上…

传统项目管理总拖延?Scrum敏捷全流程拆解

在互联网高速发展的时代&#xff0c;企业竞争的核心要素正逐渐向 "速度" 倾斜。市场环境瞬息万变&#xff0c;用户需求呈现出多元化、动态化的显著特征&#xff0c;而传统管理模式固有的滞后性与僵化性&#xff0c;已难以匹配快速迭代的市场需求。在此背景下&#xf…

GelSight Mini触觉传感器:7μm精度+3D 映射,赋能具身智能精密操作

GelSight Mini 高分辨率视触觉传感器采用先进的光学成像与触觉感知技术&#xff0c;赋予机器人接近人类的触觉能力。该设备可捕捉物体表面微观细节&#xff0c;并生成高精度的2D/3D数字映射&#xff0c;帮助机器人识别形状、纹理及接触力&#xff0c;从而执行更复杂、精准的操作…

【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG 帧同步信号 FSG

对应于原文 Multichannel Buffered Serial Port (McBSP)的 2.5.3 Data Clock Generation。 CLKG Figure 2-4. Sample Rate Generator Block Diagram CLKG 是采样率发生器输出的数据位时钟&#xff08;Data Bit Clock&#xff09;&#xff0c;它被用来控制&#xff1a; 数据发…