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

news2025/4/12 9:08:16

引言:从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.coloradmin.cn/o/2328295.html

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

相关文章

蓝桥杯2024省赛PythonB组——日期问题

题目链接: https://www.lanqiao.cn/problems/103/learning/?page1&first_category_id1&name%E6%97%A5%E6%9C%9F%E9%97%AE%E9%A2%98 题目内容: 解题思路 import os import sys# 请在此输入您的代码 from datetime import datetime date_str input().str…

带头结点 的单链表插入方法(头插法与尾插法)

带头结点的单链表插入方法(头插法与尾插法) 在单链表的操作中,插入是最常见的操作之一,本文介绍 带头结点的单链表 如何实现 后插法 和 前插法(包括 插入法 和 后插数据交换法),并提供完整的 C …

Opencv之dilib库:表情识别

一、简介 在计算机视觉领域,表情识别是一个既有趣又具有挑战性的任务。它在人机交互、情感分析、安防监控等众多领域都有着广泛的应用前景。本文将详细介绍如何使用 Python 中的 OpenCV 库和 Dlib 库来实现一个简单的实时表情识别系统。 二、实现原理 表情识别系统…

基于web的生产过程执行管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展,推动了很多行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、畅通、高效的线上管理系统。当前的生产过程执行管理存在管理效率…

C++:继承+菱形虚拟继承的一箭双雕

目录 一、继承概念与定义 1.1、什么是继承? 1.2、继承定义 二、继承关系与访问限定符 2.1、继承方式 三、基类与派生类对象的赋值转换 3.1、向上转型 3.2、对象切片 四、继承中的作用域 4.1、隐藏 五、派生类中的成员函数 5.1、构造与析构 六、继承与友…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份(浮动静态路由)配置验证 缺省路由配置验证 总结 华为HCIA 基础实验-静态路由 & eNSP静态路由 基础…

CFResNet鸟类识别:原网络基础上改进算法

​本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊​ 先放一张ResNet50模型的鸟类识别结果图 一 ResNetSE-NetBN import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcP…

Ubuntu 20.04 出现问号图标且无法联网 修复

在 Ubuntu 中遇到网络连接问题(如出现问号图标且无法联网),可以通过以下命令尝试重启网络服务: 1. 推荐先修改DNS 编辑 -> 虚拟机网络编辑器-> VMnet8 ->NAT 设置 -> DNS 设置 -> 设置DNS 服务器 DNS填什么 取决…

基于Contiue来阅读open-r1中的GRPO训练代码

原创 快乐王子HP 快乐王子AI说 2025年04月03日 23:54 广东 前面安装了vscode[1]同时也安装了Coninue的相关插件[2],现在想用它们来阅读一下open-r1项目的代码[3]。 首先,从启动训练开始(以GRPO为例子) 第一步,使用TRL的vLLM后端…

51c嵌入式~单片机~合集7~※

我自己的原文哦~ https://blog.51cto.com/whaosoft/13692314 一、芯片工作的心脏--晶振 在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法 …

英菲克(INPHIC)A9无线蓝牙鼠标 链接电脑的方式

英菲克(INPHIC)A9鼠标链接至电脑时,要长按住“模式切换MODE”按钮5秒左右的时间,此时模式指示灯变成蓝色,并且闪烁。 这时使用电脑的蓝牙设置中,“添加设备”,会出现BT4.0 Mouse提示&#xff0…

lua表table和JSON字符串互转

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 与 string 转换 local function value2string(value, isA…

【每日一个知识点】分布式数据湖与实时计算

在现代数据架构中,分布式数据湖(Distributed Data Lake) 结合 实时计算(Real-time Computing) 已成为大数据处理的核心模式。数据湖用于存储海量的结构化和非结构化数据,而实时计算则确保数据能够被迅速处理…

c语言数据结构--------拓扑排序和逆拓扑排序(Kahn算法和DFS算法实现)

#include <stdio.h> #include <string.h> #include <stdbool.h> #include <stdlib.h>//使用卡恩算法(Kahn)和深度优先算法(DFS)实现//拓扑排序和逆拓扑排序//拓扑排序和逆拓扑排序顶点顺序相反//图&#xff0c;邻接矩阵存储 #define MaxVertexNum 100 …

谷粒微服务高级篇学习笔记整理---nginx搭建正反向代理

正向与反向代理 **正向代理:**客户端向代理服务器发请求并指定目标服务器,代理向目标转交请求并将获得的内容转给客户端。 反向代理:用户直接访问反向代理服务器就可以获得目标服务器的资源。反向代理服务器统一了访问入口。 给首页配置反向代理 修改windows的hosts文件配…

2.pycharm保姆级安装教程

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

【SQL】取消sql某一列的唯一值key值的方法

在插入数据到sql时&#xff0c;遇到了这个问题&#xff1a; Duplicate entry ‘XXX’ for key 起因是&#xff1a; 我之前设计表的时候&#xff0c;手动给product_title 这个列加了一个key&#xff0c; key 是这个字段的唯一键约束&#xff0c;就不能重复在这一列存入重复的数…

数据库--SQL

SQL&#xff1a;Structured Query Language&#xff0c;结构化查询语言 SQL是用于管理关系型数据库并对其中的数据进行一系列操作&#xff08;包括数据插入、查询、修改删除&#xff09;的一种语言 分类&#xff1a;数据定义语言DDL、数据操纵语言DML、数据控制语言DCL、事务处…

SQL语句(一)—— DDL

目录 一、SQL 基础知识 &#xff08;一&#xff09;SQL 通用语法 &#xff08;二&#xff09;SQL 分类 二、DDL —— 数据库操作 1、查询所有数据库 2、查询当前数据库 3、创建数据库 4、删除数据库 5、切换数据库 三、DDL —— 表操作 &#xff08;一&#xff09;查…

Husky目标跟踪

1.0设备清单 幻影峡谷、适配器 摄像头及数据线、显卡欺骗器 外接屏幕、键盘鼠标 Husky底盘、便携显示屏、键盘鼠标 移动电源 1.1连线 插排——移动电源幻影峡谷——适配器——插排摄像头——幻影峡谷&#xff08;摄像头固定在机械臂前方的底盘上&#xff09;键盘鼠标显示器…