序列学习与循环神经网络(RNN)
传统的 DNN(多层前馈神经网络)在图像分类、简单语音识别等任务中表现优异,但它们的输入和输出长度都是固定的,因此难以胜任机器翻译、对话建模等输出长度不确定、依赖上下文的任务。
为了建模可变长度的序列并捕捉上下文依赖,研究人员提出了 RNN。其核心思想是:在预测当前时刻的输出时,不仅依赖当前输入,还要结合以往输入中保留下来的信息,从而实现顺序建模。换句话说,RNN 在网络结构中引入了“记忆”,能够在一定程度上捕捉序列之间的依赖关系。
与传统前馈网络不同,RNN 面向的是序列数据。前馈网络通常只接受一个固定长度的向量输入(例如 \(x \in \mathbb{R}^d\)),且各样本被假设为相互独立同分布;而 RNN 的输入则是一个序列:
\( x = (x_1, x_2, \dots, x_T) \)
对应 \(T\) 个时间步。模型在时间维度上展开,通过隐状态在各时刻之间传递信息:
\( h_t = f(W_{xh} x_t + W_{hh} h_{t-1} + b_h), \quad y_t = g(W_{hy} h_t + b_y). \)
其中,\(W_{xh}, W_{hh}, W_{hy}\) 为权重矩阵,\(b_h, b_y\) 为偏置项;\(h_t\) 是时刻 \(t\) 的隐状态,既依赖于当前输入 \(x_t\),也继承了之前的状态 \(h_{t-1}\),相当于网络的记忆。理论上来说,隐状态在形式上能够完整保留此前所有历史输入的信息,虽然这样会产生高昂的计算和存储成本 [1]。在实际中,隐状态的维度有限,它只能以压缩的方式概括过去的信息。
此外,RNN 在长序列建模上存在固有问题。训练依赖时间上的反向传播,梯度需要跨多个时间步逐层传递,在链式相乘的过程中容易出现数值不稳定:如果逐步缩小就导致梯度消失,使模型只能利用最近的上下文;如果逐步放大就导致梯度爆炸,使训练难以收敛。实际中通常会采用梯度截断等方法来缓解爆炸问题,但这进一步限制了模型捕捉长距离依赖的能力。因此,RNN 很难同时保持梯度传播的稳定性和对长距离依赖的建模能力,这是其核心局限。
长短期记忆网络(LSTM)
针对 RNN 在长序列建模中容易出现的梯度消失问题,以及因此导致的长程依赖难以捕捉的局限,研究人员提出了长短期记忆网络(LSTM)。
LSTM 在每个时间步维护一个独立的记忆单元 \(c_t\),并通过门控机制决定信息的保留、更新与输出。
首先,遗忘门和输入门共同决定记忆单元的更新方式:
\( f_t = \sigma(W_f x_t + U_f h_{t-1} + b_f), \quad
i_t = \sigma(W_i x_t + U_i h_{t-1} + b_i), \quad
\tilde{c}_t = \tanh(W_c x_t + U_c h_{t-1} + b_c) \)
其中遗忘门 \(f_t\) 控制上一时刻记忆 \(c_{t-1}\) 的保留程度,输入门 \(i_t\) 决定候选记忆 \(\tilde{c}_t\) 中有多少被写入。
两者结合后得到新的记忆状态:
\( c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t \)
接着,输出门决定记忆单元状态 \(c_t\) 如何作用于当前的隐状态:
\( o_t = \sigma(W_o x_t + U_o h_{t-1} + b_o), \quad
h_t = o_t \odot \tanh(c_t) \)
这样的结构使梯度在反向传播时能够相对稳定地沿着记忆单元状态 \(c_t\) 传递,从而使网络能够在较长时间范围内有效保留和利用历史信息。
序列到序列学习(Seq2Seq)
RNN 和 LSTM 虽然能够处理输入长度不确定的情况,但依然难以应对输入和输出长度不相等的任务,例如机器翻译。为了解决这一问题,Sutskever 等人提出了基于双 LSTM 的编码器–解码器(encoder–decoder)架构 [2]。直观地看,可以把它理解为将一个按输入序列长度展开的 LSTM和一个按输出序列长度展开的 LSTM拼接在一起,中间通过编码器的最终状态传递语义信息。
训练时(如图1所示),编码器依次读入源句子,得到最后的隐状态和记忆单元状态,并将它们作为解码器的初始状态。解码器的输入序列是起始符 <bos> 加上完整的目标翻译语句,而输出序列则是目标翻译语句加结束符 <eos>。
推理时(如图2所示),编码器同样处理源句子并输出最终状态,作为解码器的初始状态。解码器第一步以起始符 <bos> 作为输入,之后每一步把自己上一步生成的词作为下一步输入,直到预测到结束符 <eos> 或达到设定的最大长度。
需要注意的是,解码器在每个时间步输出的并不是一个确定的词,而是整个词表上的概率分布。设词表为 \(V\),在时刻 \(t\) 的预测为
\[
P(y_t \mid y_{<t}, x) = \mathrm{softmax}(W s_t + b), \quad y_t \in V .
\]
训练时,目标是最大化整个翻译序列的似然:
\[
P(y_{1:T} \mid x) = \prod_{t=1}^T P(y_t \mid y_{<t}, x) .
\]
在推理时,模型必须从概率分布中选出具体的词序列。最理想的方法是穷举所有可能的输出并选择概率最大的序列:
\[
\hat{y}_{1:T} = \arg\max_{y_{1:T} \in V^T} P(y_{1:T} \mid x) ,
\]
但由于搜索空间 \(|V|^T\) 随序列长度指数增长,这在实际中不可行。
因此,推理时通常会采用近似搜索策略,常用的方法包括贪心搜索和束搜索。贪心搜索在每一步选择概率最大的词,简单高效,但容易陷入局部最优。束搜索(beam search)则在每一步保留前 \(k\) 条概率最高的候选序列(束宽为 \(k\))。通过调节束宽,可以在效率与结果质量之间取得平衡。
此外,原论文还提到一个现象:在训练时将源序列整体反转,模型的翻译效果会更好。虽然至今仍没有严格的理论证明,但通常认为这一操作缩短了源序列和目标序列之间的依赖路径,使得解码初期就能利用更接近的源信息,从而在一定程度上缓解了长距离梯度传递带来的困难。
注意力机制
在 Seq2Seq 中,编码器和解码器之间是通过 LSTM 的最后一个隐状态来传递原句的上下文信息的。LSTM 在 RNN 的基础上增强了长期记忆能力,确实比普通 RNN 更善于捕捉长距离依赖,但它依然更偏向于最近的输入,对前面较远的内容记忆不足。
这种问题具体表现为:当模型把整句压缩到一个固定长度的向量时,往往更强调输入序列的后半部分,而对前半部分的信息保留不足。这一点也能从我们之前提到的现象看出:在 Seq2Seq 中,如果将输入句子反转,模型的翻译效果会更好,因为这样能够缓解其遗忘句首信息的问题。既然单一的最后隐状态不足以代表整句语义,一个自然的改进思路就是:把编码器在每个时间步的隐状态都保存下来,供解码器在生成时按需使用。为了实现这一点,Bahdanau 等人首次在神经机器翻译中提出并应用了注意力机制 [3]。
Bahdanau 注意力机制的核心思想是:在保留解码器原有结构的基础上,让解码器在每一步生成时,根据需要为不同时间步的隐状态分配权重,并通过加权求和得到一个上下文向量:
\( c_i = \sum_{j=1}^{T_x} \alpha_{ij} h_j \)
其中,\(h_j\) 表示源句子在第 \(j\) 个位置的隐状态,\(\alpha_{ij}\) 表示在生成第 \(i\) 个目标词时分配给该隐状态的注意力权重,用以刻画其对上下文向量的贡献大小。
为了计算这些权重,Bahdanau 等人引入了一个对齐模型:它根据解码器上一步的状态 \(s_{i-1}\) 与源句第 \(j\) 个隐状态 \(h_j\) 来计算得分。在他们的实现中,该函数被设计为一个前馈神经网络,形式为:
\( e_{ij} = v_a^\top \tanh(W_a s_{i-1} + U_a h_j) \)
其中,\(W_a\) 和 \(U_a\) 是可学习的权重矩阵,\(v_a\) 是一个可学习的向量。直观地说,\(s_{i-1}\) 包含了解码器到当前为止已经生成内容的信息,相当于目标端的语境;而 \(h_j\) 表示源句在位置 \(j\) 的语义。对齐模型通过比较二者,输出一个标量得分,表示该位置对生成下一个目标词的重要性。
接着,将所有得分通过 softmax 转换为一个概率分布,得到注意力权重:
\( \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T_x} \exp(e_{ik})} \)
这样,每个 \(\alpha_{ij}\) 都是非负的,并且总和为 1,可以解释为“在生成第 \(i\) 个目标词时,源句第 \(j\) 个位置被关注的程度”。最终的上下文向量由所有隐状态加权求和得到,并与解码器状态一起用于预测,从而使模型能够在全句范围内灵活地获取信息,而不再依赖单一的固定向量。
Bahdanau 等人还在编码器中引入了双向 RNN,使得每个隐状态同时融合前文和后文的信息。做法是并行运行一个从左到右的 RNN 和一个从右到左的 RNN,并将两者的输出拼接,得到该时间步的表示。
该注意力机制的整体结构如图3所示。
在 Bahdanau 的工作之后,Luong 等人对注意力机制进行了进一步的改进和扩展 [4]。他们提出了三种常见的对齐函数形式:dot、general 和 concat,其中 concat 形式实际上对应于 Bahdanau 最初提出的前馈网络打分方式:
\(\text{dot: } e_{tj} = s_t^\top h_j, \quad
\text{general: } e_{tj} = s_t^\top W_a h_j, \quad
\text{concat: } e_{tj} = v_a^\top \tanh(W_a [s_t; h_j])\)
此外,他们还提出了局部注意力,通过限制解码器在每一步参考的源端范围,降低了计算成本。这些改进虽然主要是工程化的探索,但也对后续注意力机制的发展起到了启发作用。
Transformer
Transformer 的提出核心动机在于解决两大问题:其一,传统序列模型(如 RNN、LSTM)在时间维度上逐步展开,难以并行化训练;其二,这类模型在捕捉长距离依赖时路径过长,即便结合注意力机制,RNN 编码器的隐状态仍需顺序生成,难以高效建模全局依赖。当时 Google 的神经机器翻译系统仍主要依赖深层 LSTM,需要在大规模语料上训练,但循环结构既难以充分发挥 GPU 的并行能力,又使推理速度受限。这些瓶颈直接推动了他们在 2017 年提出 Transformer 架构 [5],彻底摒弃循环与卷积结构,而完全基于注意力机制来实现序列建模。
Transformer 仍然采用编码器–解码器的整体框架,但用多头自注意力和逐位置前馈网络取代了递归结构,其结构如图4所示。
回顾前文的 Bahdanau 注意力:在生成目标词时,解码器会将当前状态与源端各个隐状态逐一比较,得到一组相似度分数;再通过 softmax 变成注意力权重;最后用这些权重对源端隐状态加权求和,得到上下文向量。这一过程可概括为“比较—加权—汇总”。
更一般地,这个过程可以形式化为查询–键–值(query–key–value, Q–K–V)框架:查询 \(Q\) 表示信息需求(如解码器状态),键 \(K\) 表示候选项的索引特征(如源句子各词的隐状态,用来和 \(Q\) 对比),值 \(V\) 则承载具体信息(如隐状态本身)。注意力机制通过计算 \(Q\) 与 \(K\) 的匹配度得到权重,再用这些权重对 \(V\) 求加权和:
\[
\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\!\left(\tfrac{QK^\top}{\sqrt{d_k}}\right)V
\]
其中缩放因子 \(\tfrac{1}{\sqrt{d_k}}\) 是 Transformer 相比早期注意力机制的改进,用来避免高维点积过大导致 softmax 饱和。
尽管 Bahdanau 注意力已经让解码器在生成时能够灵活参考源端的不同位置,但它仍然存在一个局限:只有在编码器–解码器交互时才会使用注意力,而在编码器或解码器内部,信息依然是顺序传递的。这意味着同一序列内部的位置关系仍受限于链式传播,长距离依赖难以直接建立。为了解决这一问题,Transformer 将注意力机制推广为自注意力(self-attention)。
在自注意力中,序列的每个位置都会生成自己的查询 \(Q\)、键 \(K\) 和值 \(V\)。这样,一个位置既能作为查询去关注其他位置,也能作为键和值被其他位置关注。所有位置的交互可以同时进行,从而在单层内部就能直接建模全局依赖关系。如果把输入序列的表示堆叠成矩阵 \(X\),那么自注意力就是在 \(Q = X W^{Q}\)、\(K = X W^{K}\)、\(V = X W^{V}\) 的线性变换后,套用前述的注意力公式:
\[
\mathrm{SelfAttention}(X) = \mathrm{softmax}\!\left(\tfrac{QK^\top}{\sqrt{d_k}}\right)V .
\]
这种机制的优势在于:一方面,任意两个位置之间的依赖只需一次计算即可建立,而不再依赖逐层传播;另一方面,所有位置的 \(Q\)、\(K\)、\(V\) 都可以并行计算,显著提升了训练效率。
注意力机制能够在序列各位置之间建立依赖,但如果只在单一的投影空间里做加权平均,表达能力仍然有限。为了让模型能够在不同的子空间中并行地学习多种依赖模式,Transformer 将注意力机制扩展为多组并行的计算,这被称为多头注意力(multi-head attention)。
所谓“头”,就是一组独立的注意力运算:它有自己的一套投影矩阵 \(W_i^Q, W_i^K, W_i^V\),先将输入的 \(Q,K,V\) 映射到较低维度,再在该子空间中计算注意力。这样,不同的组可以从不同角度建模序列中的依赖关系。所有组的结果会在维度上拼接,并通过一个输出映射 \(W^O\) 投影回原始维度:
\[
\text{MultiHead}(Q,K,V) = \mathrm{Concat}(\text{head}_1,\dots,\text{head}_h)W^O,\quad
\text{head}_i = \mathrm{Attention}(QW_i^Q, KW_i^K, VW_i^V).
\]
总的来说,多头注意力通过在多个子空间并行建模依赖关系,大大提升了注意力机制的表达能力。至此,注意力机制已介绍完毕,下面可结合前馈网络与层堆叠来理解整个编码器–解码器的结构。
Transformer 的编码器由 \(N=6\) 个相同的层堆叠而成。每一层包含两个主要部分:首先是多头自注意力,它允许输入序列的所有位置彼此交互;其次是逐位置前馈网络(position-wise feed-forward network),即对每个位置独立施加的非线性变换。通过层层堆叠,编码器将原始输入序列逐渐映射为一组更高层次、更全局化的表示。其单层结构如图5所示,可以看作图4左侧编码器部分的简化版本。
解码器同样由 \(N=6\) 个相同的层堆叠而成,但比编码器多一个子层。在解码器的每一层,首先是带掩蔽的自注意力,用来保证当前位置只能看到先前生成的内容;然后是“编码器–解码器注意力”,让解码器在生成时能够直接查询编码器的输出表示;最后是逐位置前馈网络,对当前层的表示进一步加工。通过这样的结构,解码器能够在生成过程中同时利用目标端已有的上下文和源端的输入信息。其单层结构如图6所示,可以看作图4右侧解码器部分的简化版本。
堆叠后的 Transformer 整体结构如图7所示。
除注意力机制外,Transformer 的每一层还包含逐位置前馈网络(position-wise feed-forward network, FFN)。它由两个全连接层和一个非线性激活函数组成,作用是对每个位置的表示独立地进行非线性变换:
\[
\mathrm{FFN}(x) = \max(0, xW_1+b_1)W_2+b_2 .
\]
由于 FFN 在不同位置之间没有依赖关系,因此能够充分并行计算,同时增强了模型的表示能力。
为了保证训练的稳定性,每个注意力子层和 FFN 子层的外部都使用了残差连接与层归一化(layer normalization)。形式上可以写为
\[
\mathrm{LayerNorm}(x + \mathrm{Sublayer}(x)) ,
\]
其中 \(\mathrm{Sublayer}(x)\) 表示子层的变换函数,可以是多头注意力,也可以是前馈网络。这样设计的好处是:残差连接避免了深层网络中的梯度消失,使模型更易于训练;层归一化则保持了数值稳定性,加速了收敛。
由于 Transformer 完全摒弃了循环与卷积结构,它本身无法感知序列顺序,因此需要显式地注入位置信息。作者提出了位置编码,通过一组不同频率的正弦与余弦函数来表示序列中的位置,并将其加到输入嵌入上:
\[
\mathrm{PE}(pos,2i)=\sin\!\left(\tfrac{pos}{10000^{2i/d_{\text{model}}}}\right), \quad
\mathrm{PE}(pos,2i+1)=\cos\!\left(\tfrac{pos}{10000^{2i/d_{\text{model}}}}\right),
\]
其中 \(pos\) 表示序列中的位置,\(i\) 表示维度索引。偶数维使用正弦函数,奇数维使用余弦函数。这样,在 \(d_{\text{model}}\) 维空间中,位置 \(pos\) 的编码由 \(\tfrac{d_{\text{model}}}{2}\) 对不同频率的 \(\sin/\cos\) 组成。高频维度变化快,有助于区分相邻位置;低频维度变化慢,能提供更大跨度的顺序信息。组合在一起,相当于给每个位置分配了一组独特的“多频率坐标指纹”,在常见的序列长度范围内几乎不会重复。
更重要的是,正弦与余弦函数满足和角公式。例如,在某个频率 \(\lambda\) 下,有:
\[
\begin{bmatrix}
\sin\!\big(\tfrac{pos+\Delta}{\lambda}\big) \\
\cos\!\big(\tfrac{pos+\Delta}{\lambda}\big)
\end{bmatrix}
=
\begin{bmatrix}
\cos(\tfrac{\Delta}{\lambda}) & \sin(\tfrac{\Delta}{\lambda}) \\
-\sin(\tfrac{\Delta}{\lambda}) & \cos(\tfrac{\Delta}{\lambda})
\end{bmatrix}
\cdot
\begin{bmatrix}
\sin(\tfrac{pos}{\lambda}) \\
\cos(\tfrac{pos}{\lambda})
\end{bmatrix}.
\]
这说明位置 \(pos+\Delta\) 的编码可以通过对位置 \(pos\) 的编码施加一个与 \(\Delta\) 有关的旋转矩阵得到。这样,模型就能在没有循环结构的情况下,通过线性变换捕捉相对位置信息。
Transformer 的训练和推理过程在框架上与前文的 Seq2Seq 模型相同:训练时,解码器在每一步都会接收前一时刻的真实目标词作为输入,目标是最大化整个翻译序列的条件概率;推理时,则只能依赖模型自己已经生成的结果,逐步预测下一个词,并结合贪心或束搜索来选择最终的输出序列。不同的是,Transformer 不再依赖循环状态:解码器通过带掩蔽的自注意力利用已生成的上下文,通过编码器–解码器注意力直接访问输入序列的全局表示;同时,位置编码显式注入顺序信息。配合残差连接与层归一化带来的训练稳定性,以及前馈网络提供的非线性变换能力,Transformer 在并行化和长距离依赖建模方面显著优于基于循环的架构。
参考文献
[1] A. Zhang, Z. C. Lipton, M. Li, and A. J. Smola, Dive into Deep Learning. Cambridge, U.K.: Cambridge Univ. Press, 2023. [Online]. Available: https://d2l.ai[2] I. Sutskever, O. Vinyals, and Q. V. Le, “Sequence to sequence learning with neural networks,” in Proc. 28th Int. Conf. Neural Information Processing Systems (NIPS), Montreal, Canada, Dec. 2014, pp. 3104–3112.
[3] D. Bahdanau, K. Cho, and Y. Bengio, “Neural machine translation by jointly learning to align and translate,” in Proc. Int. Conf. Learn. Representations (ICLR), San Diego, CA, USA, May 2015. [Online]. Available: https://arxiv.org/abs/1409.0473
[4] M.-T. Luong, H. Pham, and C. D. Manning, “Effective approaches to attention-based neural machine translation,” in Proc. 2015 Conf. Empirical Methods in Natural Language Processing (EMNLP), Lisbon, Portugal, Sep. 2015, pp. 1412–1421. [Online]. Available: https://aclanthology.org/D15-1166/
[5] A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N. Gomez, Ł. Kaiser, and I. Polosukhin, “Attention is all you need,” in Advances in Neural Information Processing Systems (NeurIPS), vol. 30, Long Beach, CA, USA, Dec. 2017. [Online]. Available: https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
图1 图片作者 Zhang, Aston; Lipton, Zachary C.; Li, Mu; Smola, Alexander J.,来源 d2l-ai/d2l-en,Wikimedia Commons,许可协议 CC BY 4.0。
图2 图片作者 Zhang, Aston; Lipton, Zachary C.; Li, Mu; Smola, Alexander J.,来源 d2l-ai/d2l-en,Wikimedia Commons,许可协议 CC BY 4.0。
图3 基于 Bahdanau et al. (2015, ICLR) 的原图绘制。
图4 图片作者 Google(源自论文 Attention Is All You Need),来源 Wikimedia Commons,许可协议 CC BY-SA 4.0。
图5 图片作者 dvgodoy,来源 dl-visuals,Wikimedia Commons,许可协议 CC BY 4.0。
图6 图片作者 dvgodoy,来源 dl-visuals,Wikimedia Commons,许可协议 CC BY 4.0。
图7 图片作者 dvgodoy,来源 dl-visuals,Wikimedia Commons,许可协议 CC BY 4.0。本图为原图的裁剪版本。