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

张开发
2026/4/19 3:16:21 15 分钟阅读

分享文章

NLP学习笔记10:Transformer 架构——从编码器、解码器到自注意力
NLP学习笔记10Transformer 架构——从编码器、解码器到自注意力作者Ye Shun日期2026-04-18一、前言Transformer 是现代自然语言处理最重要的基础架构之一。它由 Google 团队在 2017 年论文《Attention Is All You Need》中提出并迅速成为 BERT、GPT、T5 等模型的核心基础。在 Transformer 出现之前NLP 中处理序列的主流方法主要是 RNN、LSTM 和 GRU。它们能够建模上下文但存在两个明显问题序列需要按时间步顺序处理难以充分并行长距离依赖虽然可以建模但训练上往往不稳定Transformer 的革命性就在于它不再依赖循环结构而是把建模重点放在注意力机制上让模型可以直接在序列中建立全局依赖关系。简单来说Transformer 的核心变化是不再“一个词一个词”地读而是“一次性看整句话”再通过注意力机制决定该关注哪些位置这篇笔记将围绕以下几个问题展开Transformer 的整体架构长什么样编码器和解码器分别在做什么自注意力、多头注意力、位置编码在其中扮演什么角色为什么 Transformer 比 RNN 更适合现代 NLP如何用代码理解一个最小 Transformer 模块二、Transformer 的整体结构Transformer 采用经典的编码器-解码器Encoder-Decoder结构。左边是编码器Encoder右边是解码器Decoder编码器负责理解输入序列解码器负责基于编码结果逐步生成输出序列。如果以机器翻译为例编码器输入中文句子解码器输出英文句子1. 编码器做什么编码器的任务是把原始输入 token 转换为更有上下文信息的表示。它不会直接生成答案而是先把输入“理解好”。2. 解码器做什么解码器的任务是根据已经生成的历史输出编码器提供的输入表示逐步预测下一个 token。3. 多层堆叠Transformer 并不是只有一层编码器和一层解码器而是由多个相同结构的层堆叠而成。例如原始论文中6 层编码器6 层解码器这使得模型能够逐层提取更高层次的表示。三、输入处理Embedding 与 Positional EncodingTransformer 虽然强大但它本身并不能直接处理文本字符串。模型首先需要把 token 转成向量表示。1. Token EmbeddingEmbedding 层的作用是把每个 token 映射成一个连续向量。例如“猫” → 一个 512 维或 768 维向量“苹果” → 另一个向量这些向量不只是“编号”而是具有语义信息的表示。2. 为什么还需要位置编码Transformer 的注意力机制本身不会天然记录顺序。也就是说如果只看 token embedding模型并不知道哪个词在前哪个词在后两个词之间距离有多远因此需要显式地加入位置信息这就是位置编码Positional Encoding。3. 正弦位置编码原始 Transformer 使用的是确定性的正弦/余弦位置编码PE(pos, 2i) sin(pos / 10000^(2i / d_model)) PE(pos, 2i1) cos(pos / 10000^(2i / d_model))其中pos位置索引i维度索引d_model模型维度4. 位置编码的优点正弦位置编码有几个很重要的特点不需要额外学习参数可以扩展到训练时未见过的更长序列某种程度上保留了相对位置信息现代模型里也常见可学习位置编码但原始 Transformer 用的是固定位置编码。四、编码器Encoder的核心结构每个编码器层通常包含两个主要子层多头自注意力Multi-Head Self-Attention前馈神经网络Feed-Forward Network, FFN每个子层外面通常还会配残差连接Residual Connection层归一化Layer Normalization1. 多头自注意力编码器中的自注意力允许每个 token 都去关注输入序列中的所有 token。例如在句子猫追老鼠处理“追”时模型可以同时关注“猫”“老鼠”而不是像 RNN 那样只能依赖顺序传递的上下文。2. 前馈神经网络自注意力主要负责“信息交互”而前馈网络负责对每个位置的表示做进一步变换和特征提炼。它通常是一个两层全连接网络FFN(x) max(0, xW1 b1)W2 b2在现代实现中也常见 GELU 等激活函数不一定只用 ReLU。3. 残差连接与层归一化这两个组件非常关键残差连接帮助缓解深层训练中的梯度问题层归一化帮助稳定训练和数值分布简化理解就是自注意力或 FFN 先处理输入再和原输入相加最后做归一化五、解码器Decoder的核心结构解码器比编码器稍复杂因为它除了要看自己之前生成的内容还要参考编码器输出。一个典型解码器层包含三个子层掩码多头自注意力Masked Multi-Head Self-Attention编码器-解码器交叉注意力Cross-Attention前馈神经网络FFN1. 掩码自注意力解码器在训练和生成时不能偷看未来位置。例如生成我爱__模型只能利用“我”“爱”来预测下一个词不能提前看到答案。因此解码器的自注意力要加上 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_len5000):super().__init__()positiontorch.arange(max_len).unsqueeze(1)div_termtorch.exp(torch.arange(0,d_model,2)*(-math.log(10000.0)/d_model))petorch.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. 自注意力的二次复杂度标准自注意力需要计算序列中任意两个位置之间的关系因此随着序列长度增加开销会迅速上升。这就是为什么长文本场景中研究者提出了LongformerPerformerSparse AttentionFlashAttention 等优化思路2. 对数据和算力要求高Transformer 的强大很大程度上依赖大规模数据和强算力支持。小数据场景下它不一定总是优于更轻量的模型。十一、实践练习建议练习1实现缩放点积注意力importmathimporttorchimporttorch.nn.functionalasFdefscaled_dot_product_attention(Q,K,V,maskNone):d_kQ.size(-1)scorestorch.matmul(Q,K.transpose(-2,-1))/math.sqrt(d_k)ifmaskisnotNone:scoresscores.masked_fill(mask0,-1e9)weightsF.softmax(scores,dim-1)returntorch.matmul(weights,V)这个练习适合帮助理解 Transformer 最核心的计算单元。练习2实现位置编码可以尝试画出不同位置的编码曲线比较不同位置之间的相似度观察正弦和余弦在不同维度的模式练习3拼一个最小 Transformer 编码器层把以下模块串起来Multi-Head AttentionAdd NormFeed-ForwardAdd Norm这是理解完整 Transformer 编码器的最好方式之一。十二、常见问题Q1为什么 Transformer 比 RNN 更适合长文本因为 RNN 需要逐步传递信息而 Transformer 可以通过注意力直接让任意两个位置建立联系不需要经过很多时间步。Q2为什么位置编码常用正弦函数因为它不依赖训练参数具备规律性的周期结构也能较自然地表达相对位置信息并扩展到更长序列。Q3Transformer 的主要瓶颈在哪里标准自注意力在长序列上的时间和内存开销通常是O(n^2)这是它最典型的计算瓶颈。十三、总结Transformer 架构通过自注意力机制重构了序列建模方式是现代 NLP 和大语言模型的核心基础。它最重要的几个组成部分包括EmbeddingPositional EncodingMulti-Head Self-AttentionFeed-Forward NetworkResidual ConnectionLayer NormalizationEncoder / Decoder 结构它之所以强大核心在于能并行处理序列能直接建模全局依赖易于扩展和迁移理解 Transformer是理解 BERT、GPT、T5、LLaMA 等模型的关键一步。把这一层理解清楚后面再学大模型原理时会顺很多。如果继续写下一篇我比较建议接着写NLP学习笔记11位置编码Positional Encoding详解NLP学习笔记11BERT 与 GPT 的结构差异NLP学习笔记11Seq2Seq、Encoder-Only、Decoder-Only 模型对比这样整个系列就能从注意力机制自然过渡到更完整的大模型结构理解。

更多文章