第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,防止信息泄露。---**自注意力公式**:
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 机制的推导练习
""")---