公司动态

深入理解 Transformer:为什么我们需要 Transformer?

📅 2026/8/28 7:13:23
深入理解 Transformer:为什么我们需要 Transformer?
深入理解 Transformer从 Attention 到大语言模型目录前言一、让机器理解一句话并没有想象中那么简单二、最直接的想法按照顺序一个一个处理三、RNN让神经网络拥有“记忆”四、RNN 的问题它必须“一个一个来”五、第二个问题真的能记住很久吗六、这就是所谓的“长距离依赖问题”七、LSTM既然记不住那就给它一个更聪明的记忆系统八、但是LSTM 真的解决了一切问题吗九、Encoder-Decoder我们离 Transformer 已经很近了十、Attention不要把所有信息都记住只需要“关注重要的信息”十一、Attention 真正解决了什么十二、但是 Attention 还不够十三、2017 年Transformer 出现了十四、为什么 Transformer 最终能够改变整个 AI十五、从 Transformer 到今天的大语言模型十六、我们真正需要理解的不是 Transformer 的公式十七、小结Transformer 核心结构图下一篇Transformer 究竟是什么为什么我们需要 Transformer前言这几年Transformer 几乎已经成为人工智能领域绕不开的一个名字。无论是我们熟悉的大语言模型还是文本生成、机器翻译、图像理解、多模态模型背后都能看到 Transformer 的影子。当我们第一次接触 Transformer 时很容易看到这样一堆名词Attention Self-Attention Multi-Head Attention Q、K、V Positional Encoding Encoder Decoder Transformer Block然后打开论文或者各种源码很快会产生一种感觉Transformer 好像就是由一堆复杂的矩阵运算拼起来的。如果只是停留在这个层面我们确实可以把 Transformer 的公式背下来甚至把代码实现出来。但是这样并不能真正理解 Transformer。因为一个更加根本的问题还没有回答为什么我们需要 TransformerTransformer 并不是人工智能领域凭空出现的一个新架构。在 Transformer 出现之前我们已经有了能够处理文本序列的神经网络例如 RNN、LSTM、GRU以及基于 Encoder-Decoder 的机器翻译模型。既然这些模型已经可以处理文本了为什么还需要重新设计一个 Transformer要理解这个问题我们不能直接从 Transformer 开始。我们需要先回到 Transformer 出现之前看看当时的模型究竟遇到了什么问题。一、让机器理解一句话并没有想象中那么简单我们先从一个最简单的问题开始如果让计算机处理一句话它到底应该怎么处理例如我 喜欢 学习 人工智能对于我们人类来说这句话非常简单。我们能够自然地理解“我”是主语“喜欢”表示一种行为“学习”是具体行为“人工智能”是学习的对象。甚至当一句话变得更加复杂时我们仍然可以通过上下文理解其含义。例如小明把书放在桌子上因为他马上要出门。这里的“他”指谁很明显我们知道“他”指“小明”。但是对于计算机来说问题就没有这么简单了。计算机看到的并不是“意义”而是一串离散的符号小明 把 书 放 在 桌子 上 因为 他 马上 要 出门因此对于一个能够处理文本的模型而言真正困难的问题并不是“我能不能看到这些词”而是“我应该如何理解这些词之间的关系”这其实就是整个 NLPNatural Language Processing自然语言处理领域长期以来都在解决的问题。二、最直接的想法按照顺序一个一个处理既然文本本身就是一个序列那么一个非常自然的想法就是按照文本出现的顺序一个一个处理。例如我 → 喜欢 → 学习 → 人工智能处理“我”的时候模型获得一个信息。处理“喜欢”的时候在“我”的基础上继续理解。处理“学习”的时候再结合前面的信息。最后处理“人工智能”。这种思路非常符合我们对“阅读”的直觉读到第一个词 ↓ 记住一些信息 ↓ 继续读第二个词 ↓ 结合之前的信息 ↓ 继续读第三个词 ↓ ……在早期的神经网络模型中RNNRecurrent Neural Network循环神经网络就是按照这样的思想设计出来的。三、RNN让神经网络拥有“记忆”我们先不考虑复杂的数学公式只从直觉上理解 RNN。假设输入是一句话我 喜欢 学习 人工智能RNN 会按照顺序处理这些词。可以简单理解为h₁ ↗ 我 → RNN h₂ ↗ 喜欢 → RNN ────┘ h₃ ↗ 学习 → RNN ─────────────┘ h₄ ↗ 人工智能 → RNN ──────────────────┘这里的h可以理解成模型读到当前位置时对前面信息进行总结后形成的一份“记忆”。例如读到“我” ↓ 得到 h₁ 读到“喜欢” ↓ 结合 h₁ ↓ 得到 h₂ 读到“学习” ↓ 结合 h₂ ↓ 得到 h₃ 读到“人工智能” ↓ 结合 h₃ ↓ 得到 h₄所以 RNN 最大的特点就是当前时刻的计算不仅依赖当前输入还依赖之前保存下来的隐藏状态。我们可以用一个更加简单的结构来表示xₜ hₜ₋₁ ↓ RNN ↓ hₜ其中xₜ当前输入hₜ₋₁之前保存的隐藏状态hₜ处理当前输入之后产生的新隐藏状态。这使得神经网络第一次拥有了某种意义上的“记忆”。四、RNN 的问题它必须“一个一个来”看到这里我们可能会觉得RNN 不是挺好的吗它能够处理序列也能够把之前的信息传递到后面。但问题恰恰就出在这里它必须一个一个处理。假设我们有x₁ → x₂ → x₃ → x₄ → x₅ → x₆ → … → x₁₀₀₀RNN 必须x₁ ↓ x₂ ↓ x₃ ↓ x₄ ↓ …… ↓ x₁₀₀₀前一个时间步的计算没有完成后一个时间步就很难开始。也就是说RNN 的计算天然具有顺序依赖。这一点在处理短文本时可能并不明显。但是当序列变得非常长时这个问题就开始显现。假设我们需要处理一万个 TokenToken 1 Token 2 Token 3 …… Token 10000传统 RNN 的计算必须沿着这条链依次进行。这意味着序列越长计算链越长。而现代深度学习模型最喜欢的是什么并行计算。GPU 擅长同时进行大量相似的数学运算。但是 RNN 却告诉 GPU先算 1 算完以后再算 2 算完以后再算 3 ……这就有点像给一个拥有几千个工人的工厂安排任务却规定所有工人必须排队一个做完之后下一个才能开始。GPU 再强也很难完全发挥自己的优势。所以 RNN 的第一个问题就出现了计算过程存在严重的顺序依赖并行能力有限。五、第二个问题真的能记住很久吗RNN 的另一个问题更加关键。那就是它真的能够记住很久以前的信息吗还是刚才那个例子小明把书放在桌子上因为他马上要出门。我们希望模型能够知道他 → 小明但是假设一句话变得非常长小明…… …… …… …… …… …… …… …… 他马上要出门。此时“他”和“小明”之间可能隔着几十个、几百个甚至更多 Token。RNN 理论上可以通过隐藏状态不断传递信息小明 ↓ h₁ ↓ h₂ ↓ h₃ ↓ h₄ ↓ …… ↓ h₁₀₀ ↓ 他但这里有一个很现实的问题信息在传递的过程中真的能够完整地保留下来吗答案通常是否定的。因为每一次状态更新本质上都在对之前的信息进行压缩。你可以把h理解成一个不断更新的“记忆盒子”。刚开始h₁ “小明”继续处理h₂ “小明 把书……”再继续h₃ “前面大量信息的某种总结”随着序列不断向后推进模型需要把越来越多的信息压缩到一个固定维度的隐藏状态中。这就引出了一个非常直观的问题如果前面有几百个词最后真的能够把所有重要信息都塞进一个状态向量里吗显然很困难。六、这就是所谓的“长距离依赖问题”在 NLP 中有一个非常重要的概念Long-Term Dependency长距离依赖。所谓长距离依赖就是一个 Token 的含义需要依赖距离它很远的另一个 Token。例如我出生在中国…… …… …… …… …… …… …… 所以我会说中文。“中文”和“中国”之间存在语义上的联系。再例如虽然今天下着很大的雨而且路上非常堵 但是我还是按时到达了公司。“但是”后面的内容与前面的“虽然”存在明显的逻辑关系。对人类来说理解这种联系并不困难。但是对于 RNN 来说这意味着前面的信息 ↓ h₁ ↓ h₂ ↓ h₃ ↓ …… ↓ h₅₀ ↓ 当前 Token信息必须穿过一条非常长的路径。路径越长信息在传播过程中丢失的可能性就越大。这就是 RNN 面临的核心问题之一距离较远的两个 Token 之间信息需要经过很多次状态传递才能建立联系。七、LSTM既然记不住那就给它一个更聪明的记忆系统既然普通 RNN 容易忘记前面的信息那么一个非常自然的思路就是能不能设计一个更加聪明的记忆机制于是 LSTMLong Short-Term Memory出现了。LSTM 可以理解成给 RNN 增加了一套更加精细的信息管理机制。它会通过门结构控制什么信息应该留下 什么信息应该删除 什么信息应该输出也就是我们经常听到的Forget GateInput GateOutput Gate如果把普通 RNN 想象成一个人记笔记看到什么 记什么 继续往下看那么 LSTM 更像是一个会整理笔记的人这个信息很重要 ↓ 保留下来 这个信息没用了 ↓ 删除 这个信息暂时没用 ↓ 先放着这确实在很大程度上解决了 RNN 的长期依赖问题。所以在很长一段时间里RNN ↓ LSTM / GRU ↓ Encoder-Decoder成为了处理序列任务的重要技术路线。八、但是LSTM 真的解决了一切问题吗并没有。这里需要特别强调一点LSTM 是对 RNN 的改进但它并没有改变 RNN“按顺序处理”的根本结构。不管是 RNN、LSTM 还是 GRU本质上仍然是Token 1 ↓ Token 2 ↓ Token 3 ↓ Token 4 ↓ ……它们仍然需要依赖前面的隐藏状态。因此计算上的顺序依赖这个问题依然存在。而且当序列越来越长时模型依然需要让信息沿着时间方向不断传递。于是我们又遇到了一个问题有没有一种方法可以让任意两个 Token 直接建立联系而不需要让信息一个一个地传过去这个问题非常关键。因为如果可以做到这一点Token 1 ───────────────→ Token 100 Token 2 ───────────────→ Token 100 Token 3 ───────────────→ Token 100 ……那么我们就不需要让信息Token 1 ↓ Token 2 ↓ Token 3 ↓ …… ↓ Token 100一级一级地传递了。这就是后来 Attention 思想真正重要的地方。九、Encoder-Decoder我们离 Transformer 已经很近了在 Transformer 出现之前还有一个非常重要的架构Encoder-Decoder。其最经典的应用之一就是机器翻译。例如I love artificial intelligence.翻译成我喜欢人工智能。一个很自然的设计是英文 ↓ Encoder ↓ 某种中间表示 ↓ Decoder ↓ 中文Encoder 负责理解输入。Decoder 负责生成输出。这时候我们又遇到了一个问题。假设输入句子非常长Token 1 Token 2 Token 3 …… Token 100如果 Encoder 最后只把整个句子压缩成一个固定长度的向量Token 1 Token 2 …… Token 100 ↓ 一个固定向量 ↓ Decoder那么问题就又出现了这么多信息全部压缩到一个向量里真的够吗答案显然是否定的。于是研究人员开始思考Decoder 在生成每一个词的时候为什么一定要把所有信息都压缩到一个固定向量里既然 Decoder 现在正在生成某个词那么能不能让它直接回头看看输入序列并决定自己应该重点关注哪些词这就是 Attention。十、Attention不要把所有信息都记住只需要“关注重要的信息”Attention 的核心思想其实非常直观。我们可以把它理解成当我处理当前信息时不需要平均地看待所有信息而应该把注意力放在真正重要的地方。例如小明把书放在桌子上因为他马上要出门。当模型看到他它真正关心的可能是小明而不是把 书 放在 桌子 上 因为 马上 要 出门所以模型需要做的其实是“他” ↓ 寻找相关信息 ↓ “小明” ← 重点关注我们甚至可以把它想象成一个“注意力分配器”。对于当前 Token他模型可能给不同 Token 分配不同的权重小明 0.72 把 0.01 书 0.03 放 0.01 桌子 0.02 因为 0.04 马上 0.03 出门 0.14这些数字并不是说“小明”这个词本身有 0.72 的意义。这些权重表达的是当模型理解“他”时应该在多大程度上参考其他 Token。这样一来模型就不需要把所有信息都压缩到一个固定的隐藏状态中。而是能够需要谁的信息就直接去关注谁。这就是 Attention 最核心的思想。十一、Attention 真正解决了什么到这里我们就可以重新回头看 RNN 的问题。RNN 的信息传递方式是Token 1 ↓ Token 2 ↓ Token 3 ↓ …… ↓ Token 100而 Attention 更像是Token 1 ↗ Token 100 ← Token 2 ↖ Token 3 ↖ ……也就是说当前 Token 可以直接关注序列中的其他 Token。这带来了一个非常重要的变化。假设Token 1 ─────────────────── Token 100在 RNN 中Token 1 ↓ Token 2 ↓ …… ↓ Token 100需要经过很多步才能传递信息。而在 Attention 中Token 1 ─────────→ Token 100可以直接建立联系。这就是为什么 Attention 对长距离依赖问题如此重要。十二、但是 Attention 还不够到这里我们似乎已经解决了所有问题。RNN依赖前面的隐藏状态。Attention直接关注其他 Token。看起来已经非常完美。但研究人员又发现了一个新的问题既然我们可以让 Token 之间直接建立联系那么为什么还要按照顺序一个一个处理这其实是一个非常重要的转折。Attention 本身并不要求Token 1 处理完 ↓ Token 2 处理完 ↓ Token 3相反我们可以把整个序列x₁ x₂ x₃ x₄ x₅一起放进模型。然后通过矩阵运算一次性计算所有 Token 之间的关系。于是RNN x₁ → x₂ → x₃ → x₄ → x₅逐渐变成Attention x₁ ─────┐ x₂ ─────┤ x₃ ─────┼→ 同时计算彼此之间的关系 x₄ ─────┤ x₅ ─────┘这意味着序列模型第一次真正有机会充分利用 GPU 的并行计算能力。这就是 Transformer 最重要的出发点之一。十三、2017 年Transformer 出现了2017 年Google Research 团队发表了一篇后来影响整个 AI 行业的论文Attention Is All You Need论文提出了 Transformer。它最核心的一句话其实可以概括成Attention Is All You Need。也就是说我们能否不再依赖 RNN而只使用 Attention 来构建序列模型Transformer 给出的答案是可以。它不再把 RNN 作为核心计算单元而是以 Attention 为核心构建了全新的网络架构。简单来看传统序列模型 RNN ↓ RNN ↓ RNN ↓ RNN Transformer Attention ↓ Attention ↓ Attention ↓ Attention当然真正的 Transformer 并不是简单地把 RNN 删除然后换成几个 Attention 层。它还包含Multi-Head Attention Positional Encoding Feed Forward Network Residual Connection Layer Normalization Encoder Decoder这些模块共同组成了完整的 Transformer 架构。十四、为什么 Transformer 最终能够改变整个 AI现在我们可以重新回答最开始的问题为什么我们需要 Transformer答案并不是一句简单的“因为 Transformer 比 RNN 强。”真正的原因是第一Transformer 摆脱了 RNN 的强顺序依赖RNNx₁ → x₂ → x₃ → x₄ → x₅Transformerx₁ x₂ x₃ x₄ x₅ ↓ Attention ↓ 统一计算关系。这使 Transformer 更容易进行大规模并行计算。第二Transformer 更容易建立长距离依赖RNNToken 1 ↓ Token 2 ↓ …… ↓ Token 100AttentionToken 1 ─────────→ Token 100两个距离非常远的 Token 也可以直接建立联系。第三Transformer 非常适合扩展这是一个非常重要但初学者容易忽略的特点。Transformer 的结构非常规则输入 ↓ Embedding ↓ Transformer Block ↓ Transformer Block ↓ Transformer Block ↓ …… ↓ 输出当我们希望模型变得更强时可以增加参数量 训练数据 计算资源 网络深度 隐藏维度 Attention Head于是模型可以不断扩展。这为后来大语言模型的发展提供了非常重要的基础。十五、从 Transformer 到今天的大语言模型如果我们把整个发展过程串起来就会发现一条非常清晰的路线RNN ↓ 解决序列数据问题 ↓ LSTM / GRU ↓ 缓解长期依赖问题 ↓ Encoder-Decoder ↓ 解决输入到输出的序列任务 ↓ Attention ↓ 让模型能够直接关注重要信息 ↓ Transformer ↓ 摆脱 RNN 的顺序计算 ↓ BERT / GPT / T5 等模型 ↓ 大规模预训练 ↓ Large Language Model ↓ 今天的大语言模型所以当我们今天使用各种大语言模型时真正应该记住的并不是“这个模型有多少亿参数。”而是它为什么能够发展到今天而这条技术路线的一个重要起点就是 Transformer。十六、我们真正需要理解的不是 Transformer 的公式写到这里我们还没有真正开始推导Q K V也没有开始计算Attention(Q, K, V) softmax(QK^T / √d_k) V这是故意的。因为如果现在直接把公式扔出来我们很容易陷入一个误区Q 是什么 K 是什么 V 是什么 为什么要点乘 为什么要除以 √d 为什么要 Softmax最后可能把公式背下来了却不知道为什么要这么设计而这一篇真正想建立的认知只有一个Transformer 的出现本质上是在解决传统序列模型在“信息传递、长距离依赖以及并行计算”方面的问题。我们可以把整个过程浓缩成一句话RNN 让信息沿着序列一步一步传递 Attention 让信息可以直接建立联系 Transformer 让 Attention 成为整个模型的核心这也是理解 Transformer 最重要的第一步。十七、小结在这一篇中我们没有急着进入 Transformer 内部而是先回答了一个更加重要的问题为什么需要 Transformer我们首先看到文本本身就是一种序列数据。为了处理序列我们曾经使用 RNN让模型通过隐藏状态保存之前的信息。但是 RNN 存在两个明显的问题计算存在严重的顺序依赖并行能力有限当两个 Token 距离较远时信息需要经过很多次状态传递长距离依赖较难处理。随后LSTM、GRU 等模型通过更复杂的门控机制改善了记忆能力但它们仍然没有从根本上摆脱 RNN 的顺序计算方式。于是 Attention 出现了。Attention 不再要求信息必须一级一级地传递而是允许当前 Token 直接关注序列中与自己相关的其他 Token。在此基础上Transformer 进一步摆脱了 RNN将 Attention 作为整个模型的核心并利用矩阵运算充分发挥 GPU 的并行计算能力。最终形成了RNN ↓ LSTM / GRU ↓ Attention ↓ Transformer ↓ BERT / GPT ↓ 大语言模型这条技术路线。Transformer 核心结构图在了解了 Transformer 为什么会出现之后让我们先直观地看一下它的整体架构。下图展示了一个简化的 Transformer Encoder-Decoder 结构Decoder (N×)Encoder (N×)输入序列(已编码)Multi-HeadAttentionAdd NormFeed ForwardNetworkAdd NormEncoder 输出目标序列(已编码)Masked Multi-HeadAttentionAdd NormCross Multi-HeadAttentionAdd NormFeed ForwardNetworkAdd NormDecoder 输出LinearLayerSoftmax输出概率分布核心模块说明1. Encoder编码器作用将输入序列如源语言句子转换为一系列富含上下文信息的向量表示。结构由 N 个相同的层堆叠而成图中用 N× 表示每层包含Multi-Head Attention让输入序列中的每个位置都能同时关注序列中所有其他位置捕获丰富的上下文关系。Feed Forward Network对每个位置独立进行非线性变换增强模型的表达能力。Add Norm残差连接Add和层归一化Norm帮助训练更深的网络。2. Decoder解码器作用基于 Encoder 的输出和已生成的部分目标序列预测下一个 Token。结构同样由 N 个相同的层堆叠而成但比 Encoder 多一个 Attention 层Masked Multi-Head Attention防止当前位置关注到未来的 Token确保自回归生成。Cross Multi-Head Attention让 Decoder 关注 Encoder 的输出实现“编码-解码”的信息传递。Feed Forward Network和Add Norm与 Encoder 类似。3. 信息流向输入序列→Encoder→ 得到上下文丰富的表示。目标序列已生成部分→Decoder。Encoder 输出→Decoder 的 Cross Attention→ Decoder 知道该关注输入序列的哪些部分。Decoder 输出→Linear Softmax→ 得到下一个 Token 的概率分布。4. 为什么需要这么多模块Multi-Head Attention从多个角度多个“头”同时计算注意力捕获不同类型的关系。Feed Forward Network为每个位置提供独立的非线性变换增加模型的表达能力。Add Norm残差连接缓解梯度消失层归一化稳定训练过程。Positional Encoding为模型提供序列中 Token 的位置信息图中未单独画出通常加在输入 Embedding 上。这个架构的核心思想是让模型能够并行处理整个序列同时让任意两个位置都能直接建立联系从而解决了 RNN 的顺序依赖和长距离依赖问题。下一篇Transformer 究竟是什么现在我们已经知道Transformer 是为了解决什么问题而出现的。但是新的问题马上又来了Transformer 到底长什么样为什么一张 Transformer 的结构图里会同时出现Encoder Decoder Multi-Head Attention Feed Forward Add Norm Positional Encoding这些模块又分别负责什么尤其是为什么 Attention 明明已经能够建立 Token 之间的联系Transformer 还需要这么多其他模块下一篇我们正式进入 Transformer 内部。我们先不急着推导 Q、K、V而是从整体架构开始把 Transformer 的每一个组成部分逐层拆开先建立一张完整的“地图”。只有先知道每个模块在整个系统中负责什么后面真正开始推导 Self-Attention 时才不会迷失在公式里。