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

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 使用的是确定性的正弦/余弦位置编码:

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. 前馈神经网络

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

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

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. 缩放点积注意力

其公式是:

Attention(Q, K, V) = softmax(QK^T / √d_k) V

含义如下:

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

2. 多头注意力

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

例如某些头可能更关注:

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

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

八、位置编码(Positional Encoding)

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

1. 为什么位置编码重要

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

  • “猫追老鼠”
  • “老鼠追猫”

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

2. 正弦位置编码的直觉

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

这类设计的好处是:

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

3. 位置编码示例

importmathimporttorchimporttorch.nnasnnclassPositionalEncoding(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. 与传统架构的对比

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

2. 实际应用上的优势

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

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

十、Transformer 的局限

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

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

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

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

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

2. 对数据和算力要求高

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

十一、实践练习建议

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

importmathimporttorchimporttorch.nn.functionalasFdefscaled_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)ifmaskisnotNone:scores=scores.masked_fill(mask==0,-1e9)weights=F.softmax(scores,dim=-1)returntorch.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 模型对比

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

http://www.jsqmd.com/news/663875/

相关文章:

  • 别再手动调参了!用OpenBayes一键部署Depth-Anything-3,5分钟搞定你的3D视觉项目
  • AI智能体开发核心概念全解析
  • AGI研发已无“安全窗口期”:从GPT-5延迟到中国“伏羲计划”提速,90天内5国密集调整国家级AGI战略(附原始政策文本对照表)
  • 从零到精通:使用stress-ng对Linux系统进行全方位压力测试
  • 从按下电源到看到Logo:一文拆解Android手机开机背后的BootLoader与Linux内核启动全流程
  • 揭秘AI编程时代代码资源失控真相:如何用动态血缘追踪+智能配额引擎实现零泄漏管理?
  • 秒杀系统整体架构怎么设计?一次讲清限流、削峰、库存、幂等与高并发链路
  • 星空图床系统1.1.0源码 在线图床 图床外链
  • UnrealPakViewer完全指南:3步掌握UE4 Pak文件分析的终极技巧
  • 2026年靠谱的庭院景观灯/新中式景观灯厂家对比推荐 - 品牌宣传支持者
  • 超越官方SDK:用Python直接读取Myo蓝牙数据,实现双臂环同步采集
  • Unity 2019+打包APK卡在Building Gradle?试试这招替换阿里云镜像,5分钟搞定
  • Python3 字符串
  • 【限时开源】我们刚发布的DepGuard v2.0:首个支持TypeScript/Python/Rust三语种的AI生成代码依赖审计工具(仅开放前500个企业License)
  • 提示工程(Prompt Engineering)完整指南:从原子结构到工业级实践——AI智能体开发实战
  • 新版精美UI界面FileCodeBox快递柜源码 附带搭建教程
  • 嵌入式系统调试接口安全防护与最佳实践
  • c++怎么快速生成一个包含随机数据的1GB大型测试文件【实战】
  • 智能代码生成与代码自愈结合(工业级自修复系统设计白皮书)
  • OpenMemories-Tweak:索尼相机隐藏功能深度解锁终极指南
  • 黎阳之光:全域实景立体管控,重构智慧电厂与变电站数字孪生新范式
  • Intel Realsense D435图像采集实战:用C接口和OpenCV imshow的正确姿势(解决颜色反色问题)
  • 鸿蒙游戏,会不会重演微信小游戏的爆发?
  • 你还在用Copilot式单点辅助?SITS2026已实现“全栈感知生成”:从Service Mesh配置→CRD定义→Argo CD Manifest全自动推演(附生成可信度量化评估矩阵V1.3)
  • Windows风扇智能控制终极指南:5分钟打造个性化散热方案
  • jEasyUI 合并单元格详解
  • 别再乱点‘是’了!Windows UAC这10个组策略设置,你真的都懂吗?
  • 从Copilot到CodeWhisperer再到自研模型:头部科技公司代码成本对比图谱(含TCO测算表·限内部流出版)
  • 向量引擎中转站上线后,我那份API密钥终于不用像爱情一样患得患失
  • 因果推断利器:一文读懂合成控制法的原理、实现与应用