Transformer架构详解:从Encoder到Decoder的完整旅程

引言:从Self-Attention到完整架构

在上一篇文章中,我们深入剖析了Self-Attention机制的核心原理。然而,Transformer的魅力远不止于此——其Encoder-Decoder架构通过巧妙的模块化设计,实现了从机器翻译到文本生成的广泛能力。本文将以“架构拆解+数学推导+代码实现”的方式,完整揭示Transformer的工作机制。

一、Transformer整体架构全景图

Transformer由N个相同的Encoder层和Decoder层堆叠而成(通常N=6)。其核心流程如下:

输入序列 → Encoder → 上下文表示 → Decoder → 输出序列  

二、Encoder层深度解析

每个Encoder层包含两个核心子层:

2.1 多头自注意力(Multi-Head Attention)

\text{MultiHead}(Q,K,V) = \text{Concat}(head_1,...,head_h)W^O  

其中每个头独立计算Self-Attention:

head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)  

作用:从不同子空间捕捉特征,提升模型表达能力。

2.2 前馈神经网络(FFN)

\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2  

设计特点:

  • 使用ReLU激活函数
  • 中间层维度通常为4×d_model(如d_model=512时,中间层为2048)

2.3 残差连接与层归一化
每个子层输出计算为:

x_{out} = \text{LayerNorm}(x + \text{Sublayer}(x))  

数学意义:防止梯度消失,加速模型收敛。

三、Decoder层核心技术揭秘

Decoder在Encoder基础上新增两个关键机制:

3.1 掩码自注意力(Masked Self-Attention)
通过下三角矩阵掩码,确保当前位置只能关注之前的位置:

# 生成掩码矩阵
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()
scores.masked_fill_(mask, -1e9)  

作用:防止解码时“偷看”未来信息,保证自回归特性。

3.2 Encoder-Decoder注意力
Query来自Decoder上一层的输出,Key/Value来自Encoder最终输出:

\text{Attention}(Q_{dec}, K_{enc}, V_{enc})  

物理意义:建立输入序列与输出序列的语义对齐。

四、核心组件实现详解

4.1 位置前馈网络(Position-wise FFN)代码实现

class FeedForward(nn.Module):def __init__(self, d_model, d_ff=2048):super().__init__()self.linear1 = nn.Linear(d_model, d_ff)self.linear2 = nn.Linear(d_ff, d_model)def forward(self, x):return self.linear2(F.relu(self.linear1(x)))# 输入维度示例:x.shape = [batch, seq_len, 512]

4.2 层归一化(LayerNorm)的位置
实验表明,Transformer使用Post-LN结构(先残差连接后归一化):

class Sublayer(nn.Module):def __init__(self, d_model, dropout=0.1):super().__init__()self.norm = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer):return x + self.dropout(sublayer(self.norm(x)))

五、训练与推理关键技术

5.1 动态掩码技术
在训练时随机屏蔽不同位置的token,提升鲁棒性:

def create_mask(seq, pad_idx):mask = (seq != pad_idx).unsqueeze(1)  # padding掩码seq_mask = (1 - torch.triu(torch.ones(seq_len, seq_len))).bool()  # 序列掩码return mask & seq_mask

5.2 标签平滑(Label Smoothing)
缓解过拟合,计算公式:

q_i = \begin{cases} 
1-\epsilon+\epsilon/K & \text{if } i=y \\
\epsilon/K & \text{otherwise}
\end{cases}  

其中ε=0.1,K为类别数。

六、完整模型实现与效果验证
使用PyTorch搭建完整Transformer:

class Transformer(nn.Module):def __init__(self, src_vocab, tgt_vocab, N=6, d_model=512):super().__init__()self.encoder = Encoder(N, d_model)self.decoder = Decoder(N, d_model)self.src_embed = nn.Embedding(src_vocab, d_model)self.tgt_embed = nn.Embedding(tgt_vocab, d_model)def forward(self, src, tgt):memory = self.encoder(self.src_embed(src))output = self.decoder(self.tgt_embed(tgt), memory)return output# 示例:英中翻译任务
model = Transformer(src_vocab=10000, tgt_vocab=8000)

七、总结与延展思考

Transformer通过以下设计革新了序列建模:

  1. 并行计算:彻底摆脱RNN的时序依赖
  2. 层次化注意力:从局部到全局的特征抽象
  3. 统一架构:同一模型处理不同模态任务

思考题

  • 为什么Decoder需要两个不同的注意力层?
  • 如何理解“多头”注意力中的“头”维度分配?

下期预告:《Vision Transformer实战:如何将Transformer应用于图像分类》

参考资料

  1. Vaswani A, et al. Attention Is All You Need. NeurIPS 2017
  2. Transformer代码库

(注:文中部分示意图需配合代码运行生成,完整实现代码可在CSDN资源下载专区获取)

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

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

相关文章

Docker学习--容器生命周期管理相关命令--docker create 命令

docker create 命令作用: 会根据指定的镜像和参数创建一个容器实例,但容器只会在创建时进行初始化,并不会执行任何进程。 语法: docker create[参数] IMAGE(要执行的镜像) [COMMAND](在容器内部…

【C++11】异步编程

异步编程的概念 什么是异步? 异步编程是一种编程范式,允许程序在等待某些操作时继续执行其它任务,而不是阻塞或等待这些操作完成。 异步编程vs同步编程? 在传统的同步编程中,代码按顺序同步执行,每个操作需…

FastAPI与ASGI深度整合实战指南

一、ASGI技术体系解析 1. ASGI协议栈全景图 #mermaid-svg-a5XPEshAsf64SBkw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-a5XPEshAsf64SBkw .error-icon{fill:#552222;}#mermaid-svg-a5XPEshAsf64SBkw .error-te…

数组与特殊压缩矩阵

一、数组的基本特性 定义: int arr[3][3]; // 3x3二维数组 存储方式: 行优先存储(C语言默认):元素按行连续存储。 列优先存储:需手动实现(如科学计算中的Fortran风格)。 访问元素…

Word 插入无页眉页码的空白页(即插入奇数页)

遇到问题 例如,我的第5章的页码是58,偶数页,我想改成奇数页59,需要在57页和58页之间插入奇数页。 解决办法 单击上一页(57页),打开“视图-大纲”,找到要插入奇数页的位置&#x…

OpenCV 从入门到精通(day_05)

1. 模板匹配 1.1 什么是模板匹配 模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动比较,通过某种比较方法来判断是否匹配成功。 1.2 匹配方法 rescv2.matchTemplate(image, …

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解前言YOLOV3的模型结构YOLOV3模型的基本执行流程YOLOV3模型的网络参数 YOLOV3的核心思想前向传播阶段反向传播阶段 总结 前言 YOLOV3是由华盛顿…

LN2220 2A 高效率升压 DC/DC 电压调整器

1、产品概述 LN2220 是一款微小型、高效率、升压型 DC/DC 调整器。 电路由电流模 PWM 控制环路,误差放大器,斜波补偿电路, 比较器和功率开关等模块组成。该芯片可在较宽负载范围内 高效稳定的工作,内置一个 4A 的功率开关和…

【大模型基础_毛玉仁】6.3 知识检索

目录 6.3 知识检索6.3.1 知识库构建1)数据采集及预处理2)知识库增强 6.3.2 查询增强1)查询语义增强2)查询内容增强 6.3.3 检索器1)判别式检索器2)生成式检索器 6.3.4 检索效率增强1)相似度索引算…

静态方法和实例方法

在 Java 中,‌静态方法(static method)‌和‌实例方法(instance method)‌是两种不同类型的方法,它们在调用方式、内存分配和访问权限上有显著区别。以下是详细对比: ‌1. 静态方法(…

Lua环境搭建+Lua基本语法

前期准备: 搜索并下载安装LuaForWindows,例: 安装完成后开启cmd窗口,输入lua 出现版本号证明成功下载安装 使用Sublime Text编辑器编写Lua 使用浏览器或CSDN搜索Sublime Text下载并安装,安装成功后打开编辑器,编辑…

FFmpeg录制屏幕和音频

一、FFmpeg命令行实现录制屏幕和音频 1、Windows 示例 #include <cstdlib> #include <string> #include <iostream>int main() {// FFmpeg 命令行&#xff08;录制屏幕 麦克风音频&#xff09;std::string command "ffmpeg -f gdigrab -framerate 3…

【数据集】多视图文本数据集

多视图文本数据集指的是包含多个不同类型或来源的信息的文本数据集。不同视图可以来源于不同的数据模式&#xff08;如原始文本、元数据、网络结构等&#xff09;&#xff0c;或者不同的文本表示方法&#xff08;如 TF-IDF、词嵌入、主题分布等&#xff09;。这些数据集常用于多…

C++ 继承方式使用场景(极简版)

1. 公有继承&#xff08;public&#xff09; 什么时候用&#xff1f; “是一个”&#xff08;is-a&#xff09;关系&#xff1a;派生类 是 基类的一种。 例&#xff1a;class Dog : public Animal&#xff08;狗是动物&#xff09; 最常见&#xff0c;90%的继承都用它。 2. 保…

Ubuntu 系统 Docker 中搭建 CUDA cuDNN 开发环境

CUDA 是 NVIDIA 推出的并行计算平台和编程模型&#xff0c;利用 GPU 多核心架构加速计算任务&#xff0c;广泛应用于深度学习、科学计算等领域。cuDNN 是基于 CUDA 的深度神经网络加速库&#xff0c;为深度学习框架提供高效卷积、池化等操作的优化实现&#xff0c;提升模型训练…

高密度任务下的挑战与破局:数字样机助力火箭发射提效提质

2025年4月1日12时&#xff0c;在酒泉卫星发射中心&#xff0c;长征二号丁运载火箭顺利升空&#xff0c;成功将一颗卫星互联网技术试验卫星送入预定轨道&#xff0c;发射任务圆满完成。这是长征二号丁火箭的第97次发射&#xff0c;也是长征系列火箭的第567次发射。 执行本次任务…

关于SQL子查询的使用策略

在 SQL 优化中&#xff0c;一般遵循**“非必要不使用子查询”**的原则&#xff0c;因为子查询可能会带来额外的计算开销&#xff0c;影响查询效率。但是&#xff0c;并不是所有子查询都需要避免&#xff0c;有时子查询是最优解&#xff0c;具体要根据实际场景选择合适的优化方式…

JavaEE初阶复习(JVM篇)

JVM Java虚拟机 jdk java开发工具包 jre java运行时环境 jvm java虚拟机(解释执行 java 字节码) java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件>.class文件(字节码文件) 字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为…

2.pycharm保姆级安装教程

一、pycharm安装 1.官网上下载好好软&#xff0c;双击打开 2.下一步 3.修改路径地址 (默认也可以) 4.打勾 5.安装 不用重启电脑 二、添加解释器 1.双击软件&#xff0c;打开 2.projects – new project 3.指定项目名字&#xff0c;项目保存地址&#xff0c;解释器 4.右击 – …

zk基础—4.zk实现分布式功能二

大纲 1.zk实现数据发布订阅 2.zk实现负载均衡 3.zk实现分布式命名服务 4.zk实现分布式协调(Master-Worker协同) 5.zk实现分布式通信 6.zk实现Master选举 7.zk实现分布式锁 8.zk实现分布式队列和分布式屏障 4.zk实现分布式协调(Master-Worker协同) (1)Master-Worker架构…