* 本文的示意图使用了 AI 辅助创作。
RNN
背景引入
在前文 MLP 与 BP 算法的数学基础 中,我们从数学上推导了普通前馈神经网络的误差反向传播算法,并最终编码实现了一个能够训练并完成分类任务的 MLP。
MLP(Multi-Layer
Perceptron)是最经典、最基础的一种前馈神经网络,它只接受固定维度的张量
- 输入维度固定,意味着无法处理可变长序列;
- 固定维度与无记忆性的假设,使得模型更难捕捉到序列元素间的依赖关系。
一个简单的改进就是 RNN(Recurrent Neural Network,循环神经网络)。RNN 是一种基本的序列模型,下面介绍 RNN,并做简要的数学推导。
参考文献:
- Y. Bengio, P. Simard and P. Frasconi, "Learning long-term dependencies with gradient descent is difficult," in IEEE Transactions on Neural Networks, vol. 5, no. 2, pp. 157-166, March 1994, doi: 10.1109/72.279181.
基本结构
RNN 的核心公式是如下的递归表达式,
如果没有偏置项,
只能够做到线性变换,而不能做到仿射变换。
我们认为,
这里要注意的关键点是
从权重规模看,RNN 的权重规模是固定的,不随输入序列长度
若输入维度为
不严谨地,我们可以把 RNN 视为在时间维度上权重共享且具有隐状态的一种 MLP 改进。换言之,RNN 是在时间维度上对同一个 MLP 进行递归展开的结构。
RNN 的最终输出是可以灵活选取的,不存在统一的「硬规定」。可以只使用最后一个隐状态
或对其做进一步的变换 ,常见场景有情感分析、垃圾邮件识别与时间序列预测任务;也可以使用隐状态序列 ,常见场景有序列标注(譬如词性标注)、语音识别与早期机器翻译的 Decoder。 但通常而言,RNN 是无法直接做到将可变长序列作为输出的,因此后来提出了基于 RNN 的 Encoder–Decoder,该架构实现使神经网络真正地做到序列至序列的映射。
计算
时,需要我们特别提供 ,最常见的做法是取 为零值。也可以将 设计为一个可学习的参数,这样可以为 RNN 提供一个默认的初始上下文信息。
BPTT 算法
在前文中我们推导了 MLP 的 BP 算法(Backpropagation Algorithm,反向传播算法)中梯度的形式。RNN 考虑了时间维度,我们称适用这类模型的最优化算法为 BPTT 算法(Backpropagation Through Time Algorithm,沿时间的反向传播算法)。下面我们推导 RNN 的 BPTT 算法中梯度的形式。
这里花了很大的篇幅推导 BPTT 中梯度的形式,这是有必要的,因为知晓了梯度后我们就可以很容易地使用梯度下降法等最优化算法训练模型了。
为方便表示,记
则根据
通常假设
其中第
这里要明确根据式子
直接影响路径:
直接影响当前时刻的损失 ,进而影响总损失 ;间接影响路径(通过递归关系):
作为下一时刻的输入,间接影响后续时刻的所有损失 ,进而影响总损失 。这类影响路径是 RNN 所特有的,是时间依赖的体现。然而,我们不能直接计算出
,因为若将所有 直接展开到 ,我们将得到一个指数爆炸的间接路径数量;故我们应考虑藉由递归式 ,通过中间变量 表示 对总损失 造成的所有间接影响。
因此,我们根据链式法则,有
计算出
我们再分别导出回归任务场景均方误差与分类任务场景交叉熵损失下局部误差项的具体表达式,记真实值为
对于均方误差损失函数
由 Softmax 与交叉熵复合函数的导数性质,不难知道
局限
RNN 的循环结构使得模型具备了跨时间维度共享状态的能力。我们可以列举出 RNN 的若干优点:
- 能够轻松地处理可变长序列输入;
- 参数量与序列长度无关;
- 具备一定程度的「记忆」能力,因为任何时刻的隐状态在理论上都蕴含了过去时间步的历史信息;
- ……
虽然 RNN 的参数量不随序列长度改变,但从其原理不难看到前向计算量与训练开销仍会随序列长度线性增长。
RNN 的设计的确十分优雅,然而从上述推导中,我们能够发现 RNN 依然存在着若干缺陷:
- 没有解决长期依赖(Long-term Dependency)的问题,因为 RNN 内部存在梯度爆炸 / 梯度消失的现象,这使得早期信息难以长期保留;
- 无法直接访问全部的历史信息:当前时间步
只利用了上一时间步输出的隐状态 ,尽管 理论上蕴含了过去的历史信息,但终归是将所有历史信息全部压缩编码到 这一个量中了,而无法直接利用过去完整的历史信息 。注意力(Attention)机制解决了这个问题,使得模型在任意时间步都能够完整访问并利用过去某一时间步的信息; - 串行计算:在计算隐状态时,RNN 只能按时间步顺序串行化计算,因为
依赖于 。Transformer 彻底解决了这个问题,实现了隐状态的并行计算(但推理时输出 token 仍按时间步顺序进行)。
这里从数学上简要说明 RNN 为什么存在梯度爆炸 /
梯度消失的风险。我们讨论早期隐状态
Hochreiter 与 Schmidhuber 在 1997
年指出,保持时间依赖性的必要条件是长期保持梯度。然而,
Hochreiter 与 Schmidhuber 提出 LSTM 的动机,正是为了解决 RNN 的结构性问题所带来的梯度爆炸 / 梯度消失。LSTM 的核心创新点是通过添加精妙的输入门、遗忘门与输出门机制,使得隐状态链路径上的梯度不再是多个矩阵连乘,而只需要连乘多个遗忘门的值——而遗忘门是可学习的,这使得梯度消失的问题得到了很大的缓解。
下面我们跳过 LSTM、GRU 等若干 RNN 的改良,让我们直接关注划时代的注意力机制。
参考文献:
- S. Hochreiter and J. Schmidhuber, "Long Short-Term Memory," in Neural Computation, vol. 9, no. 8, pp. 1735-1780, 15 Nov. 1997, doi: 10.1162/neco.1997.9.8.1735.
Attention
经典 Encoder–Decoder 的瓶颈
Transformer 最早是被应用在机器翻译领域的,我们可以列出在机器翻译领域神经网络模型发展史的一些关键时间点:
- 1982 ~ 1990:早期 RNN
- 1997:首次提出 LSTM
- 2014:基于 RNN 的 Seq2Seq 模型(经典 Encoder-Decoder)与注意力机制分别被首次提出,随后注意力机制被应用在了 Seq2Seq 上
- 2017:Google Brain 团队在《Attention Is All You Need》中首次提出 Transformer,彻底抛弃 RNN
GPT 的全称是 Generative Pre-trained Transformer,可见 GPT 就是典型的基于 Transformer 的 LLM。而 AI 热潮的起点,我们能很明显地感受到是在 2022 年 11 月前后 GPT-3.5 的突然爆红。其实,在 2017 年首次提出 Transformer 后,次年 GPT-1 就发布了。
这里我们简要介绍基于 RNN 的经典 Encoder–Decoder 架构。Transformer 可认为是在经典 Encoder–Decoder 上彻底抛弃 RNN、全面拥抱 attention 的改进款,因此尽管经典 Encoder–Decoder 放在今天看早已过时,但了解经典 Encoder–Decoder 对我们稍后研究 Transformer 依然是大有裨益的。
Seq2Seq 是最具代表性的经典 Encoder–Decoder 模型,其出现标志着我们首次拥有了能够将序列映射至序列的神经网络模型。我们以 Seq2Seq 为例,借以阐述 Encoder–Decoder 的主体结构。
通过上文我们可以知道,RNN 擅长将可变长序列作为输入,却不能容易地直接输出可变长序列。在时间序列预测或情感分析的场景下这是没有问题的,但在机器翻译领域却不可接受——毕竟,我们也不希望输入一长串句子,最终只得到固定数量 token 的翻译。为了解决这个问题,2014 年 Seq2Seq 应运而生。在这以前,在机器翻译领域占统治性地位的是 SMT 技术(Statistical Machine Translation,统计机器翻译)。
Seq2Seq 最核心的组成部分是 Encoder 与 Decoder,以一种简单的 Seq2Seq 实现为例,在推理阶段:
- Encoder 是一个普通的 RNN,负责将序列映射到一个语义向量(Context
Vector)中,记为
。在 encoder 中有隐状态 ,其中 是输入 token 经 embedding 后得到的向量。语义向量 取自 RNN 的最后一个隐状态 ,而 RNN 的结构则决定了 是一个固定维度的向量。我们认为,该向量压缩编码了原输入的语义信息。 - Decoder 则是一个自回归(Autoregressive)的
RNN,在输出时通过额外的线性层与 Softmax 函数归一化得到预测 token
的概率分布。为与 encoder 的记号相区分,记 decoder 在第
时间步的隐状态为 。Decoder 的工作流程:- 将语义向量
作为初始隐状态 ,将特殊的起始标志 token 作为首个 token,此为初始化状态; - 在 RNN 的第
时间步,将 输出的 token 进行 embedding 得到向量 ,然后令 作为第 时间步的输入,结合第 时间步 decoder 的隐状态 ,得到输出 ; - 计算输出概率
,采样(比如 Top-K、argmax)得到输出 token; - 重复上述过程,直到输出终止标志 token
。
- 将语义向量
Seq2Seq 还有其他几种常见实现,改动点集中在 decoder 上,主要差异在于
RNN 的内部工作方式。例如,有的实现中会让语义向量
在训练阶段会考虑 Teacher Forcing 技巧,让 Decoder 的神经元在训练阶段不再全盘使用上一步的输出,而是有比例地选取正确的序列作为输入。这是因为早期节点的偏差会不断在 RNN 内不断传递,Teacher Forcing 能够缓解这个问题。
总而言之,Seq2Seq 首次使神经网络真正具备了
然而,Seq2Seq 也有着不少缺点,其中最显著的问题是无论输入序列有多长,信息都会被压缩至一个固定维度的语义向量中,这就像试图用一页纸概况整本书的内容,导致早期 Seq2Seq 的长句翻译质量相较于短句翻译明显下滑,表现出明显的长期依赖问题。跨注意力(Cross-Attention)的诞生就是为了解决这一难题,使 Seq2Seq 不再依赖固定维度的单一语义向量,允许 Decoder 能够使用所有过去的隐状态信息。
除此之外,Seq2Seq 还有一些其他局限,包括:
- 以 RNN 作为基础组件,计算串行,效率低下;
- 仍未解决长期依赖问题;
- Teacher Forcing 导致训练与推断不一致,存在暴露偏差(Exposure Bias);
- ……
为解决 encoder 需要将所有输入信息压缩为一个固定长度的语义向量所造成的信息瓶颈问题,在 cross-attention 被提出后,有研究者将 cross-attention 与 Seq2Seq 相结合,这使得 decoder 在生成每一个目标词时都能够直接访问并利用编码器生成的全部隐状态信息,从而显著提升了对长序列的建模能力与文本翻译的质量。
我们将在下文介绍 Seq2Seq 是如何与 attention 相结合的。直到这一步,我们仍未彻底抛弃 RNN。
参考文献:
- Sutskever, Ilya, Oriol Vinyals and Quoc V. Le. “Sequence to Sequence Learning with Neural Networks.” ArXiv abs/1409.3215 (2014): n. pag.
Seq2Seq + Bahdanau Attention
在早期的 Seq2Seq 模型中,如上文所述,decoder 只使用一个由 encoder
在最后时间步输出的语义向量
其中
我们说这体现了模型能够「有选择性」地「关注」更重要的历史信息 / encoder,是因为本质上
是 encoder 的历史隐状态的加权和。
最早应用在 Seq2Seq 上的 attention 是 Bahdanau Attention,由 Bahdanau、Cho 与 Bengio 在 2014 年提出。这里仅对 Bahdanau Attention 作简要介绍,在后文再着重分析 attention 的统一形式。
现在有两个问题,一是模型如何计算注意力权重,二是模型如何使用
首先讨论如何计算注意力权重。记
记
最后,对各匹配分数进行 Softmax 归一化
可见,匹配分数
在计算过程中会同时使用到 encoder 与 decoder 的隐状态。换言之,尽管 是 encoder 的隐状态的线性组合加权,但其加权权重却同时使用了 decoder 的信息。这很好理解,当我们在翻译一个句子时,不仅要考虑输入的源文本,也要考虑已经翻译出的部分结果。
接着讨论如何使用
参考文献:
- Bahdanau, Dzmitry, Kyunghyun Cho and Yoshua Bengio. “Neural Machine Translation by Jointly Learning to Align and Translate.” CoRR abs/1409.0473 (2014): n. pag.
Attention 的一般数学形式
现在我们来把 Bahdanau Attention 的狭隘视角推广到更一般、更抽象的 attention 视角。
在更一般的 attention 视角下不存在 RNN 中时间步的概念,取而代之的是 token 序列的位置索引。
RNN 的时间步可以被视为某种 token 的位置索引,只不过计算时必须按 token 顺序(时序)递归进行;就 attention 本身而言,是完全可以同时并行计算任意位置 token 间的相关性的,因为他关注的只是 token 间的关系。因此,Bahdanau Attention 也可以被纳入到该体系下。
因此这里事先约定记号的写法:对于第
在 Bahdanau Attention 中,公式
的本质是对历史信息作加权和。Bahdanau Attention 所选取的被加权向量是 RNN 的隐状态,在更一般 attention 形式中,被加权的向量称为 value,将多个 value 向量按行排布为矩阵即为所谓的 value 矩阵,记为 。在 Bahdanau Attention 中,被归一化的权重系数是
,该系数衡量了当前位置的输入信息( ,encoder 的隐状态)与当前解码状态( ,decoder 的隐状态)间的相关程度。在更一般的 attention 形式中,「当前解码状态 」意味着查询者,即 query;「当前位置的输入信息 」意味着被查询的内容,即 key。类似地,query 矩阵记为 ,key 矩阵记为 ,对应的行分量分别表示对应 token 的 query 与 key 。回到 Bahdanau Attention 的框架中也不难理解,在 Bahdanau Attention 的设计中,我们希望模型能够根据「当前解码状态,
,query」查询「当前位置的输入信息, ,key」得到权重系数,然后根据权重系数对「(历史编码)信息, ,value」进行加权求和,从而给予一些对当前解码十分重要的信息更多关注,并在一定程度上看轻对当前解码不重要的信息。我们希望通过
计算以得到一个具体的数值,该数值应能够从数值上体现出第 个 token 作为 query 与第 个 token 作为 key 时的相关程度,就像 Bahdanau Attention 计算匹配分数那样。我们把该矩阵称为 score 或 attention score,记作 ,有 不难看出,在 Bahdanau Attention 中, 。下面是一些经典的 score 设计:
- Additive Attention (Bahdanau Attention):
- Dot-Product Attention (Luong Attention,内积相似度):
- Bilinear Attention:
,其中 是可学习的参数 - Scaled Dot-Product Attention:
( 为 key 的维度)
- Additive Attention (Bahdanau Attention):
可以简化地认为 attention 的本质是根据 query 与 key 间的匹配关系为一组 value 向量计算权重系数,随后使用这些权重系数为 value 向量进行加权求和,从而得到一个能够突出(对当前 query 位置而言重要的)相关信息的新表示向量。
而至于如何利用 attention、如何利用新表示向量,这就是上层的模型需要考虑的事了。
现在,我们可以给出 attention 的标准抽象形式了:
也可以显式地写为加权和的形式,这样更符合前文的推导流程,也更能体现「注意力的本质是对
value 加权求和」:
注:
表示对每一个固定的 query 在所有 key 上进行归一化。更具体地,若令 ,则 ,其中 分别表示输入序列长度与 key 序列长度。
特别地,在划时代论文《Attention Is All You Need》中,所选取的 score
是 Scaled Dot-Product Attention,因此在这篇文献中,attention
的形式可以被更具体地写作一个在众多文章中频繁出现的式子:
在抽象的 attention 中,
:Query 矩阵,第 行表示位置索引为 的 token 对应的 query 向量 :Key 矩阵,第 行表示位置索引为 的 token 对应的 key 向量 :Value 矩阵,第 行表示位置索引为 的 token 对应的 value 向量 分别为 query 序列、key 序列、value 序列,在不同的 attention 设计中三者有不同的形式,例如在 Self-Attention 中三者均为同一个输入序列 分别为 query 投影矩阵、key 投影矩阵、value 投影矩阵,通常都是可学习的参数矩阵 为 key 向量的维度, 为输入序列的长度, 为 key 序列与 value 序列的长度
上文所列举的 score 都是较为经典的设计,后来涌现出了不少它们的改进版本以及更多全新设计的 score。
值得一提的是,上文提到《Attention Is All You Need》选择了 Scaled
Dot-Product Attention 而非 Dot-Product
Attention,在一点在原文中给出了具体的解释:假设
这意味着 Dot-Product Attention 的方差为
因此,《Attention Is All You Need》考虑标准化后的 Scaled Dot-Product
Attention,即
参考文献:
- Vaswani, Ashish, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin. “Attention is All you Need.” Neural Information Processing Systems (2017).
Attention 的反向传播算法
这里推导单头无 mask 的 Scaled Dot-Product Attention
的梯度,以便从反向传播的角度进一步理解 attention。记损失函数为
接下来对按行进行的 Softmax 求导。对于任意固定的 query 位置
再由
最后,由
由此也能看出一个有趣的事实,在 Scaled Dot-Product Attention 的例子下有
的梯度依赖所有 的信息; 的梯度依赖所有 的信息; 的梯度的任何分量均通过权重 间接依赖全局 query。
这意味着
- 每个 query 与所有 key 交互;
- 每个 key 与所有 query 交互;
- 每个 value 的更新受所有 query 影响。
即,任意两个 token 间都至少存在一条长度为 1 的梯度路径。也就是说,Scaled Dot-Product Attention 在反向传播时建立了 token 间的全连接梯度路径,这是基于 attention 的 Transformer 能在相当程度上解决长期依赖问题的一个重要原因。
基础 Attention 结构范式
上文给出了 attention 的一般数学形式,根据
Cross-Attention
如果 query 序列
无论是哪种结构范式,大多数情况下,key 序列
与 value 序列 都是一致的。从语义上讲,key 序列代表「为 query 提供什么信息」,而 value 序列代表「本身表示什么内容」,二者通常是同一语义,因此便不难理解为何二者通常均对应同一序列了。
在 Seq2Seq 上被应用的 Bahdanau Attention 就是一种典型的
Cross-Attention,回到 Bahdanau Attention 的关键公式
由 Facebook AI 团队在 2020 年发布的 RAG(Retrieval-Augmented Generation)技术中所使用的 attention 也是一种典型的 Cross-Attention。这里不深入分析 RAG 的实现原理,只从直觉上就很容易推断:我们希望利用文本 A 作为依据在知识库中召回(retrieve)相关文本 B,当然是让 A(输入 decoder 后得到的隐状态输出)作为 query,让 B(的文档表示)作为 key 与 value,这是因为 A 是查询者,提供要查询的信息;B 是被查询者,提供被查询的内容。
后来的一些 RAG 改进实现已经不属于 Cross-Attention 体系了。
参考文献:
- Lewis, Patrick, Ethan Perez, Aleksandara Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Kuttler, Mike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel and Douwe Kiela. “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.” ArXiv abs/2005.11401 (2020): n. pag.
Self-Attention
如果 query 序列
若不额外施加约束,则第
除此之外还有许多掩码的实现。更一般地,若对第
以 Scaled Dot-Product Score 为例,有
因果掩码不仅在理论上能避免标签泄露的问题,同时还在工程上带来了一个重要的影响:因果掩码的加入,使得
这真的相当重要!没有因果掩码,注意力将会是双向的,历史位置的表示会随未来 token 的引入而发生变化,因而 KV Cache 将无法支持标准的 incremental decoding。对于长度为
的前缀,若只讨论单层 Self-Attention 的主导项,则每一步都需对整个前缀重新计算一次 attention,单步时间复杂度为 ;而在因果掩码与 KV Cache 同时成立时,利用 incremental decoding,我们仅需对新位置与历史 的交互进行一次计算,单步时间复杂度可降至 。在 Transformer 章节中将详细说明这一点。
从原理上看,Self-Attention 对输入序列的顺序是等变(equivariant)的,这导致若直接交换输入 token 的排列顺序而不额外提供任何位置信息,Self-Attention 本身并不能区分出这种顺序变化。即,模型虽然能够学习到 token 与 token 间的相关性,却无法学习到 token 的顺序关系。毕竟,「我 喜欢 你」和「你 喜欢 我」是完全相反的顺序,若不引入位置编码,模型可能就无法学习到这两个短句在表达含义上的区别。
为解决这个问题,LLM 通常会在 Self-Attention 中引入位置编码(Position Encoding)以将顺序信息编码进输入表示中,从而使得模型能够学习不同 token 间的顺序关系。
一种简单的位置编码实现是将第
位置编码有许多种具体设计,其中最经典的是《Attention Is All You
Need》所使用的 Fixed Sinusoidal Positional Encoding。若记模型表示维度为
Multi-Head Attention
若 attention 的实现只有一组投影矩阵
Cross-Attention 与 Self-Attention 是相对立的,Single-Head Attention 则与 Multi-Head Attention 是相对立的。
由于只有一组投影矩阵,因此 Single-Head Attention 也只会得到一个权重矩阵,这意味着所有 token 间的交互都必须通过同一套相似度度量与同一个表示子空间完成,这样的模型表达能力往往较为局限。Multi-Head Attention 通过并行地计算多头 attention,不同的 head 在不同的线性子空间中有能力学习到不同类型的相关性,包括长程指代、语法依赖与语义相关等若干关系。
假设 Multi-Head Attention 共有
若模型隐状态维度(模型中每个位置 token 对应的向量的维度)为
若序列长度为
Transformer
经典 Transformer 架构
至此,Transformer 所需的关键部件其实已经齐备:attention 的一般形式给出了统一的计算框架,Self-Attention 使序列中任意两个位置能够直接交互,Multi-Head Attention 提升了模型的表示能力,位置编码则为原本对顺序不敏感的 attention 注入了位置信息。本质上,所谓 Transformer 正是将这些部件按 Encoder–Decoder 的方式组织拼接起来,同时彻底抛弃 RNN。
在接下来的两个小节中,我们将介绍《Attention Is All You Need》中所提出的首个 Transformer 模型(典型 Encoder-Decoder 架构),该模型可被视为经典 Seq2Seq 的改进或升级,依然属于 Encoder-Decoder 架构。相较于经典 Seq2Seq,这一模型不再依赖 RNN 逐步传递隐状态,而是以 attention 为核心构造 encoder 与 decoder,从而在获得更强的并行计算能力的同时也拥有更灵活的长程依赖建模能力。因此才有所谓的「Attention is all you need」——我们并不需要 RNN,只需要 attention 便能完成数据建模,而且还能取得更好的效果。这在 2017 年是极具开创性的工作。
如上图所示,该模型的 encoder 与 decoder 都不再含有 RNN,而是由若干个结构相同的层堆叠而成。在原论文中,encoder 与 decoder 各自堆叠了 6 层,分别称为编码器层与解码器层。
Encoder
首先讨论 encoder。Encoder 的输入是完整源序列的 token embedding
矩阵经位置编码后所得到输入表示
- Multi-Head Self-Attention 子层;
- 逐位置独立作用的 FFN(Feed-Forward Network,前馈神经网络)子层。
在原论文的实现中,每一个子层外都包裹着残差连接(Residual
Connection)与层归一化(Layer Normalization)。记第
这里残差连接的目的是保留子层输入的原始信息,同时为梯度提供一条更直接的传播路径,缓解深层堆叠时的优化困难;层归一化的作用则是对每个位置上的表示作归一化处理,使得不同层之间的数值尺度相对稳定,减轻训练过程中参数的数值不稳定现象。二者相互配合,是 Transformer 能够稳定堆叠多层结构的重要原因。
在 encoder 中,由于
若源序列长度为
尽管 encoder 包含 6 层编码器层,但从单层的结构上看,第一层、中间层与最后一层的编码器并无结构上的区别,它们只是参数各自独立并且输入输出所处的抽象层次不同。
经过 6 层编码器层后,最终 encoder 将输出一组上下文表示
这暗示了 decoder 包含 Cross-Attention。实际上,原论文中的 encoder 使用的是纯粹的 Self-Attention,而 decoder 同时使用了 Causal Masked Self-Attention 与 Cross-Attention(Encoder–Decoder Attention);二者均应用了 Multi-Head Attention。
要特别说明的是,训练时与推理时 encoder 均仅并行计算一次,由 decoder 多次进行自回归以生成全部输出。因此若考虑 Encoder-Decoder LLM,则 encoder 只会计算一次输入 prompt 与上下文,不会在随后 decoder 每一次自回归生成 token 输出时都进行重复计算。
但现在许多 LLM 已经没有了 encoder 的设计,只有 decoder 了。后文会展开这一点。
Decoder
接着讨论 decoder。Decoder
的输入在训练与推理时略有不同,为了在训练时达到推理输出的等价效果,需要对目标序列显式右移。所谓右移,设训练时原始的目标序列为
也可以是终止标记 token 。
这种做法本质上就是 Transformer 在训练阶段所采用的 Teacher
Forcing:在预测第
记
- Masked Multi-Head Self-Attention 子层,通过因果掩码确保自回归生成时当前位置只能访问到自身及其之前的位置,避免标签泄漏;
- Multi-Head Cross-Attention 子层,用于注入 encoder 的上下文表示,query 来自 decoder 当前隐状态(即 Masked Multi-Head Self-Attention 子层的输出);
- 逐位置独立作用的 FFN 子层。
若记第
当最后一层解码器层输出
得到预测概率分布后,我们根据预测概率分布通过采样技术得到具体的 token。
许多 LLM 的 API 都支持 Temperature 超参数,实际上该参数只对基座模型计算得到的 logits 进行缩放,与基座模型内部的计算过程无关。记 Temperature 超参数为
,则一种常见的支持 Temperature 参数的采样方式是 通常 Temperature 被设定为非负数(取 0 时特殊考虑贪心策略),该值越大越容易得到小 logits 的 token。例如,当 Temperature 被设定为 0 时,采样时直接选取 logits 最大的 token,即 ,于是模型的输出完全确定唯一、高度一致;反之,若 Temperature 较大,则会得到更多样多元、更不可控甚至上下文不连贯的输出。 根据目前为止的工程经验,对多数实践中的常见推荐
取 内的数,比如 。
若源序列长度为
不过,尽管模型在每个位置都可以给出下一个 token
的概率分布,但我们真正关心的是当前已生成序列(本轮自回归过程的输入)的下一个
token 的概率,即输出序列的最后一个位置所对应的预测分布
自回归过程的概率模型为
如上文所述,decoder 在推理阶段以自回归的方式逐个输出 token,因此若未采取任何优化措施,每个 token 的生成都是十分昂贵的。所幸,KV Cache 可以帮助我们避免大量重复计算,从而极大地降低计算量。
早在 2017 年的《Attention Is All You Need》中在首次提出 Transformer 时就已经蕴含了这一设计,只不过那时该机制还没有被系统化整理,也没有如今这个如雷贯耳的名字。
所谓 KV Cache,其实就是使用缓存存储自回归中先前时间步中已计算的
现在我们分析为什么自回归时可以缓存
- 从
式可以看出,对于 decoder 的第 层,考虑自回归过程的先后两次当前层的输入序列 与 ,不难知道两个序列的前 个元素都是相同的(提示:第一数学归纳法易证); - 因果掩码的加入,使得 attention 是单向的,即
, 与 无关;又由第一点可知,两个输入序列前 个元素也是相同的,故两序列的前 个 attention 的值也是恒定不变的。综上,我们只需要计算 ,然后将 插入到上一轮自回归得到的 attention 序列 ,这一技巧称为 incremental decoding; - 根据
式 、 与 可以知道, 的值仅与 有关,而与 无关,加之两个输入序列的前 个元素是相同的,因此 也是固定的、可复用的,这就是为什么我们可以缓存 而不必缓存 的根本原因。
在明确了为什么 KV Cache 需要且仅需要缓存
以《Attention Is All You Need》中提出的 Transformer
为例,如上文所述,在 Self-Attention 的场景下若输入序列长度为
而若应用 KV Cache,计 decoder 共堆叠
Encoder 与 Decoder 的关系
今天,基于 Transformer 的主流 LLM 移除了 encoder 的设计,几乎都可以认为是 Decoder-only 的架构,比如 GPT、Claude、GLM、DeepSeek 与 Gemini(截止至 2026/3/30,其中 Gemini 在视觉与音频多模态存在 encoder 设计)。
是 encoder 不被需要了吗?至少在纯文本自回归生成的场景下,Decoder-only 往往被认为比 Full Encoder-Decoder 更高效,这或许是今天 Decoder-only 成为生成式 AI 主流设计的一种原因,不过我没有找到能支撑这个观点的权威文献。但不管怎样,文本生成的确是一类典型的长序列建模问题。
源序列与目标不一致时,即类似
的「Seq2Seq」问题,或许依然适合 Full Encoder-Decoder?
2019 年 OpenAI 为发布 GPT-2 撰写的论文《Language
Models are Unsupervised Multitask
Learners》中指出,统一使用自回归语言建模目标
但这并不意味着 encoder 是毫无用处的,
- Google 在 2025 年发布的生成式 LLM T5Gemma 便重新引入了 encoder,一个可能的目的是为了大幅缩减 decoder 的参数量,降低 KV Cache 的空间开销,从而支持侧端 AI 部署;
- 在生成式 AI 以外的场景,甚至出现了像 2024 年 ModernBERT 这样的 Encoder-only 模型——不过它并不是生成式 LLM,其职责是将文本「深度理解」后进行分类,在情感分析、代码检索等任务上有亮眼的能力。
在当下(截止至 2026/3/30),纯文本生成式 AI 普遍已将 encoder 排除在主架构之外,而多模态 AI 则通常具有 encoder,甚至为处理多种类型的输入(如图片、视频、音频、激光信号等)而具有多种 encoder。这有个很形象的直观:Decoder 越来越像「大脑」,而 encoder 越来越像「传感器」。
参考文献:
- Radford, Alec, Jeff Wu, Rewon Child, David Luan, Dario Amodei and Ilya Sutskever. “Language Models are Unsupervised Multitask Learners.” (2019).