引言:从"逐词替换"到"理解再表达"
1954年,IBM和乔治城大学联合做了一个实验:用IBM 701计算机把60个俄语句子翻译成英语。这个实验被称为乔治城-IBM实验,它标志着机器翻译的诞生。但当时的翻译方式极其朴素------本质上是一个双语词典加上一些简单的语序调整规则。系统"知道"俄语的"машина"对应英语的"machine",但不知道"машина"在不同语境下可能指"汽车""机器"或"机构"。
此后的几十年里,机器翻译的主流方法是统计机器翻译(SMT)。它用大规模双语语料来估计翻译概率,比词典方法进步了很多,但仍然是"碎片化"的------它把句子切分成短语,逐个翻译,然后再拼装。翻译的质量取决于短语切分的好坏和短语表的覆盖度,而不是对句子整体含义的理解。
2014年,两个独立的研究团队------Google的Sutskever等人和蒙特利尔大学的Cho等人------同时提出了一个全新的架构:序列到序列(Seq2Seq)模型。这个架构的核心思想是:用一个神经网络把源语言句子编码成一个向量,再用另一个神经网络从这个向量解码出目标语言句子。
这个想法在当时是激进的。它不再依赖短语表、对齐模型或语言规则。它试图让神经网络自己学会"理解"源语言句子,然后用目标语言"表达"出来。翻译不再是逐词替换,而是"理解再表达"。
Seq2Seq的提出,不仅改变了机器翻译,也改变了整个自然语言处理领域。它证明了神经网络可以处理变长序列之间的映射,这个能力后来被用于文本摘要、对话生成、语音识别、代码生成等无数任务。今天的大语言模型,本质上仍然是Seq2Seq架构的放大版。
一、Seq2Seq的基本架构:编码器-解码器
1.1 编码器:把句子压缩成一个向量
Seq2Seq的第一个组件是编码器(Encoder)。它的任务是读取源语言句子,把它压缩成一个固定维度的向量表示。
最常用的编码器是循环神经网络(RNN)及其变体LSTM、GRU。RNN按时间步逐个读取输入词,每一步更新自己的隐藏状态。读完整个句子后,最终的隐藏状态就被当作整个句子的表示。
用公式表示,对于一个输入序列 x1,x2,...,xT,编码器逐步计算:
ht=f(ht−1,xt)
其中 ht 是第t步的隐藏状态,f 是RNN单元。最终的隐藏状态 hT 就是整个句子的编码。
这个设计有一个优雅之处:它天然处理变长输入。无论句子是5个词还是50个词,编码器都能把它压缩成一个固定维度的向量。但这个优雅也埋下了一个隐患:所有信息都被压进一个向量里。句子越长,信息损失越严重。
1.2 解码器:从向量中"读出"目标句子
解码器(Decoder)是另一个RNN。它从编码器输出的向量开始,逐步生成目标语言句子。
解码器的每一步接收两个输入:前一步生成的词,以及前一步的隐藏状态。它输出当前步的隐藏状态,并通过一个softmax层预测下一个词。
在训练时,解码器使用"教师强制"(Teacher Forcing):每一步的输入是真实的目标词,而不是模型自己上一步生成的词。这让训练更稳定、收敛更快。在推理时,模型只能使用自己生成的词,这会导致"曝光偏差"------训练时见到的输入分布和推理时不同。
解码器的生成过程是自回归的:每一步的输出依赖于之前所有步的输出。这意味着生成一个长度为L的句子需要L步,无法并行化。这是Seq2Seq在推理时慢的根本原因。
1.3 一个具体的例子
假设我们要把英语"Hello world"翻译成法语"Bonjour le monde"。
编码器读取"Hello"→隐藏状态h1→读取"world"→隐藏状态h2。h2是整个输入句子的编码。
解码器从h2开始。第一步,输入一个特殊的起始token,输出"Bonjour"。第二步,输入"Bonjour",输出"le"。第三步,输入"le",输出"monde"。第四步,输出结束token。
这个过程中,编码器把所有输入信息压缩到h2中,解码器从h2中提取信息来生成翻译。如果输入句子很长,h2的容量可能不够,导致翻译不完整或错误。
1.4 训练目标:最大似然估计
Seq2Seq的训练目标是最大化目标句子的条件概率。对于每个训练样本(源句子x,目标句子y),损失函数是:
L=−∑t=1Tlogp(yt∣y<t,x)
这个损失函数鼓励模型在给定源句子和之前生成的目标词的情况下,最大化下一个正确目标词的概率。
注意,这个目标函数和人类翻译的目标有微妙的差异。人类翻译追求的是"整体质量"------流畅、准确、符合目标语言习惯。最大似然估计追求的是"每个词都预测对"。这两个目标在大多数时候一致,但不完全一致。一个在词级别上预测准确的翻译,整体上可能不流畅。这就是为什么后来的研究引入了BLEU、ROUGE等序列级评估指标,以及强化学习等序列级训练方法。
二、注意力机制:Seq2Seq的第一次革命
2.1 固定长度瓶颈
Seq2Seq的原始架构有一个根本性的瓶颈:编码器必须把整个源句子压缩成一个固定维度的向量。
这个瓶颈在短句子上不明显。当句子长度在10-20个词时,一个256维或512维的向量可以容纳足够的信息。但当句子长度增加到50个词以上时,信息损失变得严重。实验表明,原始Seq2Seq在长句子上的翻译质量急剧下降。
更糟糕的是,解码器在生成每个词时,只能看到同一个固定向量。它无法"回顾"源句子的特定部分。当翻译一个长句子时,解码器在生成第30个词时,应该关注源句子的哪一部分?固定向量无法告诉它。
2.2 注意力机制的核心思想
注意力机制(Attention)的提出,直接针对这个瓶颈。它的核心思想是:解码器在每一步生成时,不应该只看一个固定向量,而应该能够"查看"编码器的所有隐藏状态,并根据当前需要选择性地关注某些部分。
具体来说,解码器在每一步t计算一个注意力权重分布。这个分布表示"在生成当前词时,源句子的每个位置有多重要"。然后,用这些权重对编码器的所有隐藏状态做加权平均,得到一个"上下文向量"。这个上下文向量和当前解码器状态一起,用于预测下一个词。
2.3 注意力解决了什么问题
注意力机制解决了两个问题。
第一,信息瓶颈。解码器不再依赖一个固定向量来获取所有源语言信息。它可以直接"查看"编码器的所有状态,每个状态都保留了源句子某个位置的局部信息。这意味着长句子的信息不会在编码阶段被过度压缩。
第二,对齐问题。注意力权重天然地提供了源语言和目标语言之间的对齐信息。当解码器生成"Bonjour"时,注意力可能集中在"Hello"上;当生成"monde"时,注意力可能集中在"world"上。这种对齐是模型自动学到的,不需要外部的对齐标注。
从可视化的角度看,注意力权重形成一个矩阵,横轴是源语言位置,纵轴是目标语言位置。对于语序相似的语言对(如英语-法语),这个矩阵接近对角线。对于语序差异大的语言对(如英语-日语),这个矩阵会呈现更复杂的模式。
2.4 注意力机制的变体
注意力机制有很多变体。按计算方式分,有加性注意力 (Bahdanau注意力)和乘性注意力(Luong注意力)。加性注意力用一个小型前馈网络计算分数,乘性注意力用点积计算。乘性注意力计算更快,但加性注意力在维度不匹配时更灵活。
按关注范围分,有全局注意力 和局部注意力。全局注意力关注所有源位置,计算开销大。局部注意力只关注一个窗口内的源位置,计算更快但可能错过远距离依赖。
按是否使用历史信息分,有单调注意力 和非单调注意力。单调注意力假设对齐是单调的(源位置和目标位置同步前进),适合语音识别等任务。非单调注意力允许任意对齐,适合翻译等任务。
三、从RNN到Transformer:Seq2Seq的第二次革命
3.1 RNN的固有局限
注意力机制缓解了Seq2Seq的信息瓶颈,但编码器和解码器的RNN结构本身仍有问题。
序列处理的串行性是最根本的限制。RNN必须按时间步逐个处理输入,第t步的计算依赖于第t-1步。这意味着无法并行化。在GPU上训练时,RNN的利用率很低------大部分计算单元在等待前一步完成。
长距离依赖的衰减是另一个问题。虽然LSTM和GRU通过门控机制缓解了梯度消失,但对于非常长的序列,早期信息仍然可能丢失。
固定维度的隐藏状态限制了模型的表达能力。无论句子多长,RNN的隐藏状态维度是固定的。这个维度必须在"足够大以容纳信息"和"足够小以保持计算效率"之间权衡。
3.2 Transformer的颠覆性设计
2017年,Vaswani等人发表了《Attention Is All You Need》,提出了Transformer架构。它的核心思想是:完全抛弃RNN,只用注意力机制来建模序列。
Transformer的关键创新是自注意力(Self-Attention)。在自注意力中,序列中的每个位置都可以直接关注其他所有位置。计算方式是:每个位置生成Query、Key、Value三个向量,用Query和所有Key的点积计算注意力权重,然后用这些权重对Value加权求和。
自注意力的计算可以完全并行化。所有位置的Query、Key、Value可以同时计算,注意力矩阵可以一次性算出。这大大提升了训练效率。
但自注意力也有代价。它的计算复杂度是 O(n2)O(n2),其中n是序列长度。对于长序列,这个复杂度变得不可接受。这就是为什么后来的研究提出了各种稀疏注意力、线性注意力等变体。
3.3 Transformer版的Seq2Seq
Transformer最初就是为机器翻译设计的。它的架构是标准的编码器-解码器:
编码器由多层自注意力和前馈网络组成。每一层中,自注意力让每个位置关注所有位置,前馈网络对每个位置独立做非线性变换。残差连接和层归一化保证训练稳定。
解码器同样由多层组成,但多了一个交叉注意力层。交叉注意力让解码器的每个位置关注编码器的所有位置。这就是Seq2Seq中注意力机制的Transformer版本------Query来自解码器,Key和Value来自编码器。
Transformer版的Seq2Seq在翻译质量上显著超越了基于RNN的版本。在WMT 2014英德翻译任务上,Transformer的BLEU分数比最好的RNN模型高了2个点以上。更重要的是,训练时间大幅缩短------Transformer可以在8个GPU上训练12小时达到RNN模型训练数天的效果。
3.4 位置编码:Transformer的"时间感"
自注意力本身是位置无关的。无论序列顺序如何,自注意力的输出都是一样的。但语言是有顺序的------"猫追狗"和"狗追猫"意思完全不同。
Transformer通过位置编码来解决这个问题。位置编码是一个与位置相关的向量,被加到每个位置的输入嵌入上。原始Transformer使用正弦和余弦函数生成位置编码:
PE(pos,2i)=sin(pos/100002i/d)
PE(pos,2i+1)=cos(pos/100002i/d)
这种编码方式的优点是:对于任意固定偏移k,PE(pos+k)可以表示为PE(pos)的线性函数。这让模型能够学习相对位置关系。
后来的研究提出了可学习的位置编码、相对位置编码、旋转位置编码(RoPE)等变体。RoPE在LLaMA、Qwen等大模型中被广泛使用,它通过旋转矩阵来编码相对位置,在长序列上表现更好。
四、Seq2Seq的训练与推理
4.1 教师强制与曝光偏差
Seq2Seq的训练使用教师强制:解码器每一步的输入是真实的目标词,而不是模型自己生成的词。
教师强制的优点是训练稳定、收敛快。但它造成了一个问题:曝光偏差。在训练时,解码器总是看到正确的历史;在推理时,它看到的是自己生成的历史。如果模型在推理时生成了一个错误的词,后续的生成会基于这个错误累积,导致越来越偏离。
这个问题在长序列生成中尤为严重。一个在训练时"从未见过自己犯错"的模型,在推理时一旦犯错就可能崩溃。
缓解曝光偏差的方法包括:计划采样 (Scheduled Sampling),在训练过程中逐渐从教师强制过渡到模型自生成;最小风险训练 ,直接优化序列级评估指标而不是词级似然;强化学习,用BLEU等指标作为奖励来训练模型。
4.2 束搜索:推理时的解码策略
推理时,最简单的解码策略是贪心搜索:每一步选择概率最高的词。但贪心搜索是短视的------它可能因为选择了一个局部最优的词而错过全局最优的序列。
束搜索(Beam Search)是更常用的策略。它维护k个候选序列(k是束宽),每一步扩展所有候选,保留概率最高的k个。这比贪心搜索更可能找到高概率序列,但计算开销是k倍。
束搜索的束宽是一个权衡。束宽越大,找到的序列概率越高,但计算越慢。在实践中,束宽通常设为5-10。束宽太大时,收益递减,而且可能产生"安全但平庸"的翻译------因为高概率序列往往是常见表达,缺乏多样性。
4.3 评估指标:BLEU的功与过
机器翻译的自动评估主要使用BLEU(Bilingual Evaluation Understudy)。它计算模型输出和参考翻译之间的n-gram重叠率,并加上长度惩罚。
BLEU的优点是简单、快速、可复现。它和人类判断有一定的相关性,在系统比较中表现不错。但BLEU也有明显的局限。
它只考虑精确匹配,不考虑语义相似性。"猫在沙发上"和"沙发上有只猫"在BLEU看来可能重叠度不高,但语义完全相同。它偏向短句子------短句子的n-gram更容易匹配。它对词序不敏感------只要n-gram匹配,词序错误也可能得高分。
后来的评估指标如METEOR、ROUGE、BERTScore、COMET试图解决这些问题。BERTScore用预训练模型的嵌入来计算语义相似度,COMET用神经网络直接预测人类判断。这些指标和人类判断的相关性更高,但计算成本也更大。
五、Seq2Seq的广泛应用
5.1 机器翻译
机器翻译是Seq2Seq的"母任务"。从2016年Google翻译切换到神经机器翻译(GNMT)开始,Seq2Seq逐渐成为机器翻译的主流。
今天的机器翻译系统几乎全部基于Transformer。在资源丰富的语言对上(如英语-法语、英语-德语),神经机器翻译的质量已经接近人类专业翻译。在资源稀缺的语言对上,研究重点转向了低资源翻译、零样本翻译和跨语言迁移。
一个重要的趋势是多语言翻译。一个模型同时支持多种语言对,通过共享参数来利用不同语言之间的共性。Google的 multilingual BERT 和 Meta 的 NLLB(No Language Left Behind)是这方面的代表。NLLB支持200种语言的翻译,其中最稀缺的语言只有几千句训练数据。
5.2 文本摘要
文本摘要的任务是把长文本压缩成短摘要。Seq2Seq的编码器读取原文,解码器生成摘要。
摘要分为抽取式 和生成式。抽取式从原文中选出最重要的句子拼成摘要,生成式用自己的话重新表达。Seq2Seq天然适合生成式摘要。
生成式摘要的挑战包括:事实一致性 (生成的摘要不能和原文矛盾)、信息覆盖 (摘要不能遗漏关键信息)、流畅性(摘要要像人写的)。Pointer-Generator Networks 通过指针机制让模型能够直接复制原文中的词,缓解了未登录词问题。BERTSUM等预训练模型显著提升了摘要质量。
5.3 对话生成
Seq2Seq也可以用于对话生成:编码器读取对话历史,解码器生成回复。
对话生成的挑战和翻译不同。翻译的输入输出是强对齐的------源句子的每个部分在目标句子中都有对应。对话的输入输出是弱对齐的------用户的上一句话和系统回复之间没有严格的一一对应关系。对话还涉及常识推理、情感理解、个性化等复杂因素。
早期的Seq2Seq对话模型倾向于生成"安全但无聊"的回复,比如"我不知道""好的"。这是因为最大似然估计倾向于选择高概率的通用回复。后来的研究引入了强化学习、对抗训练、条件生成等方法来提升回复的多样性和信息量。
5.4 语音识别
语音识别的任务是把语音信号转成文本。Seq2Seq的编码器读取语音特征序列,解码器生成字符或词序列。
语音识别的一个特殊挑战是输入和输出的长度差异很大。一段10秒的语音可能对应几十个字符,也可能对应几百个字符。注意力机制在这里特别重要------它让解码器能够对齐语音帧和输出字符。
Listen, Attend and Spell(LAS)是最早的端到端语音识别模型之一。它用金字塔结构的编码器来逐步降采样语音特征,然后用注意力解码器生成字符。后来的研究用Transformer替换了RNN,在LibriSpeech等基准上取得了显著进展。
5.5 代码生成
代码生成的任务是从自然语言描述生成代码,或者从一种编程语言翻译成另一种。
代码和自然语言有相似之处(都有语法和语义),也有不同之处(代码有严格的语法规则、有编译器和解释器可以验证正确性)。Seq2Seq模型可以学习代码的语法模式,但生成的代码可能无法编译或运行。
Codex、StarCoder、CodeLlama等模型在代码生成上取得了显著进展。它们的训练数据包含大量开源代码,模型学会了代码的语法和常见模式。代码生成的一个独特优势是:可以用单元测试来自动验证生成代码的正确性,这为强化学习提供了可靠的奖励信号。
六、Seq2Seq的局限与未来
6.1 暴露偏差与错误累积
暴露偏差是Seq2Seq的固有缺陷。训练时模型看到的是真实历史,推理时看到的是自己生成的历史。这种不一致导致错误累积。
解决这个问题的根本方法是让训练和推理一致。计划采样在训练中逐渐引入模型自生成的词,但调度策略难以设计。对抗训练让判别器区分真实序列和生成序列,但训练不稳定。强化学习直接优化序列级指标,但奖励稀疏、方差大。
6.2 长序列的挑战
Transformer的 O(n2) 复杂度限制了它处理长序列的能力。对于翻译,长文档的翻译需要处理数千个词。对于摘要,输入可能是一篇完整的论文。对于对话,历史可能跨越几十轮。
解决长序列问题的方法包括:稀疏注意力 (每个位置只关注部分位置)、线性注意力 (用核函数近似softmax)、分块处理 (把长序列切成块,块内用全注意力,块间用压缩表示)、检索增强(从外部记忆中检索相关信息,而不是把所有信息都存在注意力中)。
6.3 从Seq2Seq到通用序列建模
Seq2Seq最初是为翻译设计的,但它的核心思想------编码-解码-注意力------已经被推广到几乎所有序列到序列的任务。
更重要的是,Seq2Seq的思想被大语言模型继承和发展。GPT系列是纯解码器架构,通过自回归生成来处理所有任务。T5把所有任务统一成"文本到文本"的格式,用同一个Seq2Seq模型处理翻译、摘要、问答、分类。这些模型证明了:序列到序列的框架足够通用,可以容纳几乎所有NLP任务。
从RNN到Transformer,从单任务到多任务,从监督学习到预训练+微调,Seq2Seq的演进史就是NLP的演进史。今天的大语言模型,本质上仍然是在做Seq2Seq------给定一个输入序列,生成一个输出序列。只是输入的"序列"从源语言句子变成了任意提示,输出的"序列"从翻译变成了任意文本。
结语:翻译之外的意义
Seq2Seq对机器翻译的贡献是直接的:它把翻译质量从"能用"提升到了"好用"。但它的意义远不止翻译。
它证明了神经网络可以处理变长序列之间的映射。这个能力后来被用于文本摘要、对话生成、语音识别、代码生成、图像描述、视频理解。它引入了注意力机制,这个机制后来成为Transformer的核心,而Transformer又成为大语言模型的基础。
从更抽象的层面看,Seq2Seq代表了一种思维方式:把复杂任务分解为"理解"和"表达"两个阶段。编码器理解输入,解码器表达输出,注意力在两者之间建立桥梁。这个分解不仅适用于翻译,也适用于任何需要"输入→转换→输出"的任务。
当你在今天使用ChatGPT、Claude或任何大语言模型时,你看到的输出是解码器生成的。当你给模型一个提示时,你实际上是在给它一个"源序列"。模型在做的,本质上仍然是Seq2Seq:理解你的输入,生成合适的输出。
三十年前,机器翻译还在逐词替换。今天,它已经能理解语境、处理歧义、保持风格。这个进步的背后,是Seq2Seq和它引发的注意力革命。站在大语言模型的时代回望,Seq2Seq是那个关键的转折点------它让机器从"处理词"走向了"理解序列"。