NLP学习笔记10:Transformer 架构——从编码器、解码器到自注意力

NLP学习笔记10:Transformer 架构------从编码器、解码器到自注意力

作者:Ye Shun

日期:2026-04-18

一、前言

Transformer 是现代自然语言处理最重要的基础架构之一。它由 Google 团队在 2017 年论文《Attention Is All You Need》中提出,并迅速成为 BERT、GPT、T5 等模型的核心基础。

在 Transformer 出现之前,NLP 中处理序列的主流方法主要是 RNN、LSTM 和 GRU。它们能够建模上下文,但存在两个明显问题:

  • 序列需要按时间步顺序处理,难以充分并行
  • 长距离依赖虽然可以建模,但训练上往往不稳定

Transformer 的革命性就在于:它不再依赖循环结构,而是把建模重点放在注意力机制上,让模型可以直接在序列中建立全局依赖关系。

简单来说,Transformer 的核心变化是:

  • 不再"一个词一个词"地读
  • 而是"一次性看整句话"
  • 再通过注意力机制决定该关注哪些位置

这篇笔记将围绕以下几个问题展开:

  1. Transformer 的整体架构长什么样
  2. 编码器和解码器分别在做什么
  3. 自注意力、多头注意力、位置编码在其中扮演什么角色
  4. 为什么 Transformer 比 RNN 更适合现代 NLP
  5. 如何用代码理解一个最小 Transformer 模块

二、Transformer 的整体结构

Transformer 采用经典的编码器-解码器(Encoder-Decoder)结构。

  • 左边是编码器(Encoder)
  • 右边是解码器(Decoder)

编码器负责理解输入序列,解码器负责基于编码结果逐步生成输出序列。

如果以机器翻译为例:

  • 编码器输入中文句子
  • 解码器输出英文句子

1. 编码器做什么

编码器的任务是把原始输入 token 转换为更有上下文信息的表示。它不会直接生成答案,而是先把输入"理解好"。

2. 解码器做什么

解码器的任务是根据:

  • 已经生成的历史输出
  • 编码器提供的输入表示

逐步预测下一个 token。

3. 多层堆叠

Transformer 并不是只有一层编码器和一层解码器,而是由多个相同结构的层堆叠而成。例如原始论文中:

  • 6 层编码器
  • 6 层解码器

这使得模型能够逐层提取更高层次的表示。

三、输入处理:Embedding 与 Positional Encoding

Transformer 虽然强大,但它本身并不能直接处理文本字符串。模型首先需要把 token 转成向量表示。

1. Token Embedding

Embedding 层的作用是把每个 token 映射成一个连续向量。例如:

  • "猫" → 一个 512 维或 768 维向量
  • "苹果" → 另一个向量

这些向量不只是"编号",而是具有语义信息的表示。

2. 为什么还需要位置编码

Transformer 的注意力机制本身不会天然记录顺序。也就是说,如果只看 token embedding,模型并不知道:

  • 哪个词在前
  • 哪个词在后
  • 两个词之间距离有多远

因此,需要显式地加入位置信息,这就是位置编码(Positional Encoding)。

3. 正弦位置编码

原始 Transformer 使用的是确定性的正弦/余弦位置编码:

text 复制代码
PE(pos, 2i)   = sin(pos / 10000^(2i / d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i / d_model))

其中:

  • pos:位置索引
  • i:维度索引
  • d_model:模型维度

4. 位置编码的优点

正弦位置编码有几个很重要的特点:

  • 不需要额外学习参数
  • 可以扩展到训练时未见过的更长序列
  • 某种程度上保留了相对位置信息

现代模型里也常见可学习位置编码,但原始 Transformer 用的是固定位置编码。

四、编码器(Encoder)的核心结构

每个编码器层通常包含两个主要子层:

  1. 多头自注意力(Multi-Head Self-Attention)
  2. 前馈神经网络(Feed-Forward Network, FFN)

每个子层外面通常还会配:

  • 残差连接(Residual Connection)
  • 层归一化(Layer Normalization)

1. 多头自注意力

编码器中的自注意力允许每个 token 都去关注输入序列中的所有 token。

例如在句子:

猫追老鼠

处理"追"时,模型可以同时关注:

  • "猫"
  • "老鼠"

而不是像 RNN 那样只能依赖顺序传递的上下文。

2. 前馈神经网络

自注意力主要负责"信息交互",而前馈网络负责对每个位置的表示做进一步变换和特征提炼。

它通常是一个两层全连接网络:

text 复制代码
FFN(x) = max(0, xW1 + b1)W2 + b2

在现代实现中,也常见 GELU 等激活函数,不一定只用 ReLU。

3. 残差连接与层归一化

这两个组件非常关键:

  • 残差连接帮助缓解深层训练中的梯度问题
  • 层归一化帮助稳定训练和数值分布

简化理解就是:

  • 自注意力或 FFN 先处理输入
  • 再和原输入相加
  • 最后做归一化

五、解码器(Decoder)的核心结构

解码器比编码器稍复杂,因为它除了要看自己之前生成的内容,还要参考编码器输出。

一个典型解码器层包含三个子层:

  1. 掩码多头自注意力(Masked Multi-Head Self-Attention)
  2. 编码器-解码器交叉注意力(Cross-Attention)
  3. 前馈神经网络(FFN)

1. 掩码自注意力

解码器在训练和生成时,不能偷看未来位置。

例如生成:

我爱__

模型只能利用"我""爱"来预测下一个词,不能提前看到答案。

因此,解码器的自注意力要加上 mask,把未来位置遮住。这就是 masked self-attention。

2. 编码器-解码器交叉注意力

这一层让解码器能够参考输入序列。

以翻译为例:

  • 解码器正在生成英文
  • 它会通过 cross-attention 查看编码器里中文句子的表示
  • 决定当前输出时应该重点参考输入的哪一部分

这一步是编码器和解码器之间真正建立联系的关键。

3. 前馈网络

和编码器一样,解码器最后也会经过前馈网络继续提炼表示。

六、Transformer 的核心思想

虽然 Transformer 看起来有很多模块,但它的思想可以浓缩成几条最关键的原则。

1. 完全依赖注意力机制

Transformer 最大的特点是:

不使用循环,也不依赖卷积,而是完全依赖注意力机制建模序列依赖关系。

这使它和 RNN 路线产生了根本区别。

2. 全局依赖直接建模

在 Transformer 中,任意两个 token 都可以通过一次注意力计算直接建立联系。

这意味着:

  • 长距离依赖不需要跨很多步传递
  • 句子中远距离词语也能直接交互

3. 并行处理能力强

RNN 必须按顺序逐步处理序列,而 Transformer 在训练时可以同时处理整段序列,因此更适合 GPU 并行。

不过这里要注意一个容易混淆的点:

  • Transformer 更容易并行
  • 但标准自注意力在序列长度上通常是 O(n^2) 复杂度

所以它训练快,不等于它在长序列上一定"更省算力"。

七、自注意力与多头注意力

Transformer 的核心计算单元是注意力机制,尤其是缩放点积注意力。

1. 缩放点积注意力

其公式是:

text 复制代码
Attention(Q, K, V) = softmax(QK^T / √d_k) V

含义如下:

  • Q:当前要查询什么
  • K:用于匹配的键
  • V:真正承载信息的值
  • √d_k:缩放因子,防止点积过大

2. 多头注意力

单头注意力只能从一个子空间理解关系,而多头注意力会并行做多次注意力,让不同头学习不同类型的模式。

例如某些头可能更关注:

  • 语法依赖
  • 局部邻近词
  • 长距离指代
  • 语义主题关系

这使得 Transformer 具有很强的表达能力。

八、位置编码(Positional Encoding)

由于 Transformer 没有循环结构,所以位置信息必须显式加入。

1. 为什么位置编码重要

如果没有位置编码,那么句子:

  • "猫追老鼠"
  • "老鼠追猫"

在模型看来,可能只是一组相同 token 的集合,而顺序信息会丢失。

2. 正弦位置编码的直觉

不同位置的编码使用不同频率的正弦和余弦函数组合,这样每个位置都能获得唯一而连续的表示。

这类设计的好处是:

  • 可以表示顺序
  • 可以在不同位置之间形成规律性的几何关系

3. 位置编码示例

python 复制代码
import math
import torch
import torch.nn as nn


class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_len=5000):
        super().__init__()
        position = torch.arange(max_len).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))

        pe = torch.zeros(max_len, d_model)
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        self.register_buffer("pe", pe.unsqueeze(0))

九、Transformer 的优势

Transformer 之所以成为现代 NLP 的主流,不是因为它只在某一个任务上表现好,而是因为它在多个维度都展现出明显优势。

1. 与传统架构的对比

特性 Transformer RNN/LSTM CNN
并行性 中等
长距离依赖 直接建模 逐步传递 感受野有限
训练速度 中等
内存消耗 较高 中等 较低

2. 实际应用上的优势

Transformer 的工程优势也非常明显:

  • 在大多数 NLP 任务上效果优异
  • 容易通过增加层数、宽度和数据规模扩展
  • 适合预训练 + 微调范式
  • 容易迁移到文本、图像、语音、多模态等任务

十、Transformer 的局限

Transformer 虽然强大,但也不是没有代价。

1. 自注意力的二次复杂度

标准自注意力需要计算序列中任意两个位置之间的关系,因此随着序列长度增加,开销会迅速上升。

这就是为什么长文本场景中,研究者提出了:

  • Longformer
  • Performer
  • Sparse Attention
  • FlashAttention 等优化思路

2. 对数据和算力要求高

Transformer 的强大,很大程度上依赖大规模数据和强算力支持。小数据场景下,它不一定总是优于更轻量的模型。

十一、实践练习建议

练习1:实现缩放点积注意力

python 复制代码
import math
import torch
import torch.nn.functional as F


def scaled_dot_product_attention(Q, K, V, mask=None):
    d_k = Q.size(-1)
    scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)
    weights = F.softmax(scores, dim=-1)
    return torch.matmul(weights, V)

这个练习适合帮助理解 Transformer 最核心的计算单元。

练习2:实现位置编码

可以尝试:

  • 画出不同位置的编码曲线
  • 比较不同位置之间的相似度
  • 观察正弦和余弦在不同维度的模式

练习3:拼一个最小 Transformer 编码器层

把以下模块串起来:

  • Multi-Head Attention
  • Add & Norm
  • Feed-Forward
  • Add & Norm

这是理解完整 Transformer 编码器的最好方式之一。

十二、常见问题

Q1:为什么 Transformer 比 RNN 更适合长文本?

因为 RNN 需要逐步传递信息,而 Transformer 可以通过注意力直接让任意两个位置建立联系,不需要经过很多时间步。

Q2:为什么位置编码常用正弦函数?

因为它不依赖训练参数,具备规律性的周期结构,也能较自然地表达相对位置信息,并扩展到更长序列。

Q3:Transformer 的主要瓶颈在哪里?

标准自注意力在长序列上的时间和内存开销通常是 O(n^2),这是它最典型的计算瓶颈。

十三、总结

Transformer 架构通过自注意力机制重构了序列建模方式,是现代 NLP 和大语言模型的核心基础。

它最重要的几个组成部分包括:

  • Embedding
  • Positional Encoding
  • Multi-Head Self-Attention
  • Feed-Forward Network
  • Residual Connection
  • Layer Normalization
  • Encoder / Decoder 结构

它之所以强大,核心在于:

  • 能并行处理序列
  • 能直接建模全局依赖
  • 易于扩展和迁移

理解 Transformer,是理解 BERT、GPT、T5、LLaMA 等模型的关键一步。把这一层理解清楚,后面再学大模型原理时会顺很多。

如果继续写下一篇,我比较建议接着写:

  • NLP学习笔记11:位置编码(Positional Encoding)详解
  • NLP学习笔记11:BERT 与 GPT 的结构差异
  • NLP学习笔记11:Seq2Seq、Encoder-Only、Decoder-Only 模型对比

这样整个系列就能从注意力机制自然过渡到更完整的大模型结构理解。

相关推荐
像一只黄油飞2 小时前
第二章-04-数据类型
笔记·python·学习·零基础
elseif1232 小时前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲
23471021272 小时前
4.17 学习笔记
开发语言·软件测试·笔记·python·学习
智者知已应修善业2 小时前
【51单片机按键控制流水灯+数码管显示按键次数】2023-6-15
c++·经验分享·笔记·算法·51单片机
开放知识图谱2 小时前
论文浅尝 | 图形约束推理:基于大型语言模型在知识图谱上的可信推理(ICML2025)
人工智能·语言模型·自然语言处理·知识图谱
red_redemption2 小时前
自由学习记录(167)
学习·pawn是客体·pcontroller是主体·world是概念体
扣脑壳的FPGAer2 小时前
数字信号处理学习笔记--Chapter 1.4.1 时域采样定理基本概念
笔记·学习·信号处理
矢志航天的阿洪2 小时前
面目标 SAR 回波整体处理过程(教学技术文档)面目标 SAR 回波整体处理过程(教学技术文档)
学习
运维技术小记2 小时前
这个 MIT 学生用 AI 学习法两天搞定一门课的方法,颠覆认知!
人工智能·学习