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

第6讲、全面拆解Encoder、Decoder内部模块

全面拆解 Transformer 架构:Encoder、Decoder 内部模块解析(附流程图小测验)

关键词:Transformer、Encoder、Decoder、Self-Attention、Masked Attention、位置编码、残差连接、多头注意力机制

Transformer 自 2017 年诞生以来,已经成为深度学习中最具影响力的模型架构之一。无论是 GPT、BERT,还是今天的大模型 GPT-4、Claude、Gemini,它们的底层都离不开 Transformer 的基本框架。

今天我们就来全面拆解 Transformer 的 Encoder 与 Decoder 内部模块结构,并附上一个动手小测验:画出 Transformer 的完整流程图,帮助大家真正掌握这个强大的架构。


一、Transformer 总览

Transformer 的核心是:自注意力机制(Self-Attention)+ 前馈神经网络(Feed Forward Network),通过堆叠多层 Encoder 和 Decoder 实现序列建模。

整个模型可以分为两个部分:

  • Encoder:理解输入序列
  • Decoder:逐步生成输出序列

每个部分都由多个重复的模块(Layer)组成,每个 Layer 内部结构非常规范。


二、Encoder 模块拆解

一个 Encoder Layer 通常包括以下结构:

输入 Embedding → 位置编码 → 多头自注意力(Multi-Head Self-Attention)→ 残差连接 + LayerNorm → 前馈全连接层(FFN)→ 残差连接 + LayerNorm

1. 输入 Embedding + 位置编码

  • 词嵌入:将离散词 token 转化为连续向量
  • 位置编码(Positional Encoding):添加序列中 token 的位置信息,常用 sin/cos 形式

2. 多头自注意力(Multi-Head Self-Attention)

  • 每个位置都对所有位置的 token 做注意力计算
  • 多头机制可以并行学习不同语义空间的信息

3. 残差连接 + LayerNorm

  • 避免深层网络梯度消失
  • 加快收敛速度,提高训练稳定性

4. 前馈神经网络(FFN)

  • 两层全连接层,中间使用激活函数 ReLU 或 GELU
  • 提高模型非线性表达能力

三、Decoder 模块拆解

Decoder Layer 在结构上和 Encoder 类似,但多了一个关键模块:Encoder-Decoder Attention,同时引入了Mask 机制来保证自回归生成。

输入 Embedding → 位置编码 → Masked Multi-Head Self-Attention → 残差连接 + LayerNorm
→ Encoder-Decoder Attention → 残差连接 + LayerNorm
→ FFN → 残差连接 + LayerNorm

1. Masked Multi-Head Self-Attention

  • 为了防止"看见未来",只允许当前 token 看到它左边的 token(即因果 Mask)

2. Encoder-Decoder Attention

  • 允许 Decoder 访问 Encoder 的输出表示,用于对输入序列进行上下文感知
  • 本质也是注意力机制,只不过 Query 来自 Decoder,Key 和 Value 来自 Encoder 输出

四、整体结构图

建议自己画一遍 Transformer 的流程图,从输入 token 到输出结果,包括 Encoder 和 Decoder 各层之间的连接方式。

小提示可以参考以下流程(动手练习!):

[Input Embedding + Pos Encoding] → [N个Encoder Layer 堆叠] → Encoder输出
↓
[Shifted Output Embedding + Pos Encoding] → [N个Decoder Layer 堆叠(含 Mask + Encoder-Decoder Attention)]
↓
[线性层 + Softmax] → 最终预测输出

小测验:请尝试画出这个结构图,并标注出每个模块的主要作用。


五、总结:你需要掌握的关键点

模块作用说明
Self-Attention获取上下文依赖
Multi-Head Mechanism学习多种注意力表示
Positional Encoding注入位置信息
FFN增强模型表达能力
Residual + LayerNorm稳定训练、加快收敛
Masking(Decoder)保证生成的因果性
Encoder-Decoder Attention对输入序列做条件建模

六、后续推荐阅读

  • 《Attention is All You Need》原论文
  • BERT、GPT、T5 架构演化对比
  • Transformer 变体(如:Linformer、Performer、Longformer)

希望这篇文章能帮助你真正"看懂" Transformer 的结构与逻辑。建议动手画一画,理解每一个模块的输入输出关系,构建自己的知识图谱。

你是否已经掌握 Transformer 的全部细节了?不妨挑战一下自己,不看图,能不能完整说出 Encoder 和 Decoder 每一层的结构?


需要我生成一张配套的 Transformer 流程图吗?


七、核心公式与直观解释

1. 自注意力机制(Self-Attention)

  • 公式

  • 直观理解:每个 token 通过 Query 与所有 token 的 Key 计算相关性分数,Softmax 后加权 Value,动态聚合全局信息。

2. 前馈神经网络(FFN)

  • 结构:两层全连接,常用激活函数 ReLU/GELU
  • 作用:提升模型的非线性表达能力

3. Mask 机制

  • Decoder Masked Attention:用上三角 Mask 保证自回归生成,防止信息泄露

4. Encoder-Decoder Attention

  • 作用:让 Decoder 能"读"到 Encoder 的输出,做条件生成
  • 本质:Query 来自 Decoder,Key/Value 来自 Encoder

八、配套流程图与交互式可视化代码(Streamlit Demo)

1. 结构流程图建议

建议动手画一遍 Transformer 的流程图,帮助理解各模块的输入输出关系。参考流程如下:

[Input Embedding + Pos Encoding] → [N个Encoder Layer 堆叠] → Encoder输出
↓
[Shifted Output Embedding + Pos Encoding] → [N个Decoder Layer 堆叠(含 Mask + Encoder-Decoder Attention)]
↓
[线性层 + Softmax] → 最终预测输出

你可以用 draw.io、ProcessOn、Visio 等工具绘制,也可以参考下方 Streamlit Demo 的可视化。

2. Streamlit 交互式可视化 Demo 代码

将以下代码保存为 streamlit_transformer_demo.py,在命令行运行 streamlit run streamlit_transformer_demo.py 即可体验:

import streamlit as st
import numpy as np
import matplotlib.pyplot as pltst.set_page_config(page_title="Transformer Encoder/Decoder 可视化拆解", layout="wide")st.title("Transformer Encoder/Decoder 结构交互式拆解")
st.markdown("""
> 结合自注意力、前馈网络、Mask 机制等核心模块,交互式理解 Transformer 架构。
""")tab1, tab2, tab3 = st.tabs(["结构流程图", "模块细节", "自注意力演示"])with tab1:st.header("Transformer 总体结构流程图")st.markdown("""- **左侧:Encoder 堆叠层**,每层包含多头自注意力、前馈网络、残差连接和 LayerNorm。- **右侧:Decoder 堆叠层**,每层包含 Masked Multi-Head Self-Attention、Encoder-Decoder Attention、前馈网络等。- **输入/输出**:输入序列 Embedding + 位置编码,输出经过线性层和 Softmax 得到预测。""")fig, ax = plt.subplots(figsize=(7, 7))ax.axis('off')# Encoder部分ax.text(0.5, 0.95, "Input Embedding\n+ Pos Encoding", ha='center', va='center', bbox=dict(boxstyle="round", fc="lightblue"))ax.arrow(0.5, 0.92, 0, -0.08, head_width=0.02, head_length=0.02, fc='k', ec='k')ax.text(0.5, 0.82, "N x Encoder Layer", ha='center', va='center', bbox=dict(boxstyle="round", fc="lightgreen"))ax.arrow(0.5, 0.79, 0, -0.08, head_width=0.02, head_length=0.02, fc='k', ec='k')ax.text(0.5, 0.69, "Encoder Output", ha='center', va='center', bbox=dict(boxstyle="round", fc="wheat"))# Decoder部分ax.text(0.8, 0.82, "Shifted Output Embedding\n+ Pos Encoding", ha='center', va='center', bbox=dict(boxstyle="round", fc="lightblue"))ax.arrow(0.8, 0.79, 0, -0.08, head_width=0.02, head_length=0.02, fc='k', ec='k')ax.text(0.8, 0.69, "N x Decoder Layer\n(Masked + Enc-Dec Attn)", ha='center', va='center', bbox=dict(boxstyle="round", fc="lightcoral"))ax.arrow(0.8, 0.66, 0, -0.08, head_width=0.02, head_length=0.02, fc='k', ec='k')ax.text(0.8, 0.56, "Linear + Softmax", ha='center', va='center', bbox=dict(boxstyle="round", fc="plum"))ax.arrow(0.8, 0.53, 0, -0.08, head_width=0.02, head_length=0.02, fc='k', ec='k')ax.text(0.8, 0.43, "Output", ha='center', va='center', bbox=dict(boxstyle="round", fc="lightyellow"))# Encoder Output 到 Decoder Layer 的横向箭头ax.arrow(0.55, 0.69, 0.18, 0, head_width=0.02, head_length=0.02, fc='k', ec='k', length_includes_head=True)ax.text(0.67, 0.71, "Context", ha='center', va='bottom', fontsize=10, color='gray')st.pyplot(fig)with tab2:st.header("模块细节与原理")st.markdown("""### Encoder Layer- **多头自注意力(Multi-Head Self-Attention)**:每个 token 能关注全局,捕捉长距离依赖。- **残差连接 + LayerNorm**:防止梯度消失,加快收敛。- **前馈神经网络(FFN)**:提升非线性表达能力。### Decoder Layer- **Masked Multi-Head Self-Attention**:保证生成时不"偷看"未来 token。- **Encoder-Decoder Attention**:让 Decoder 能访问 Encoder 输出,实现条件生成。- **残差连接 + LayerNorm、FFN**:同 Encoder。### 位置编码(Positional Encoding)- 注入序列顺序信息,常用 sin/cos 公式。### Mask 机制- Decoder 中用上三角 Mask,防止信息泄露。---**自注意力公式**:
![](https://i-blog.csdnimg.cn/img_convert/ec53b1b37ab5d4293d8f8d25230dcff7.png)with tab3:st.header("自注意力分数计算演示")st.markdown("""下面你可以输入一组简单的 token 向量,体验自注意力分数的计算过程。""")st.markdown("**假设有3个token,每个维度为2**")tokens = st.text_area("输入token向量(每行一个token,用逗号分隔)", "1,0\n0,1\n1,1")try:X = np.array([list(map(float, line.split(','))) for line in tokens.strip().split('\n')])d_k = X.shape[1]Q = XK = XV = Xattn_scores = Q @ K.T / np.sqrt(d_k)attn_weights = np.exp(attn_scores) / np.exp(attn_scores).sum(axis=1, keepdims=True)output = attn_weights @ Vst.write("**Attention 分数矩阵**")st.dataframe(attn_scores)st.write("**Softmax 后的权重**")st.dataframe(attn_weights)st.write("**输出向量(加权和)**")st.dataframe(output)except Exception as e:st.error(f"输入格式有误: {e}")st.sidebar.title("学习建议")
st.sidebar.markdown("""
- 建议动手画一画结构图,加深理解
- 推荐阅读原论文和 BERT/GPT 相关资料
- 多做自注意力、Mask 机制的推导练习
""")---![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76416e86d5804140b3c9af088ac365ba.png)

相关文章:

  • stm32 WDG看门狗
  • 【人工智能】全面掌控:使用Python进行深度学习模型监控与调优
  • 深入浅出:Spring Boot 中 RestTemplate 的完整使用指南
  • 虚拟内存笔记(三)虚拟内存替换策略与机制
  • 小智AI机器人 - 代码框架梳理2
  • 论文解读:MP-SfM: Monocular Surface Priors for Robust Structure-from-Motion
  • C语言速成之08循环语句全解析:从基础用法到高效实践
  • HTTP3详解
  • C++类和对象--初阶
  • C++ string初始化、string赋值操作、string拼接操作
  • 嵌入式硬件篇---超声波|PID
  • 三维空间中的组织行为映射:MATLAB 数据插值可视化技术
  • 实战项目6(09)
  • 企业内训|智能调控系统算法与优化——某汽车厂商
  • JVM内存结构有哪些?HashMap和HashTable的区别?
  • NX989NY104美光科技芯片NY109NY113
  • mem0跟Memgraph交互
  • 当 Manus AI 遇上 OpenAI Operator,谁能更胜一筹?
  • 大模型应用中常说的Rerank是什么技术?
  • 大模型核心基础简介
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 超新星|18岁冲击中超金靴,王钰栋的未来无限可能
  • 福州千余公共道路泊车位装“智能地锁”续:运营公司被责令改正并罚款
  • 吉林:消纳绿电,“氢”装上阵
  • 体坛联播|巴萨4比3打服皇马,利物浦2比2战平阿森纳
  • 人民时评:莫让“假俗乱”讲解侵蚀“文博热”