
传统的自然语言处理任务,如文本分类、序列标注,通常是在做“选择题”或“填空题”。它们的核心是理解与判断,目标是给输入文本打上一个或多个固定的标签。
然而,现实世界中的许多智能应用,则要求模型化身“创作者”,能够动态生成全新的、连贯的文本序列。这不仅是技术的演进,更是从“理解”到“创造”的一次跨越。典型的例子包括:
仔细观察,这些生成任务有两个鲜明的共同点:
面对这种“可变长度序列”到“可变长度序列”的映射挑战,传统的模型架构显得有些力不从心。为此,研究者们提出了一个强大而优雅的解决方案——Seq2Seq(Sequence to Sequence,序列到序列)模型。
Seq2Seq 模型的架构优雅而直观,它由两大核心组件构成:编码器与解码器,共同协作完成“理解”与“创造”的使命。
这种“编码-解码” 的模式,巧妙地解决了输入与输出序列长度可变、结构自由的难题。上下文向量成为了连接两个序列的“语义桥梁”,使得从一种语言到另一种语言、从长文到摘要、从问题到答案的智能生成成为可能。💡
编码器通常由 RNN、LSTM 或 GRU 等序列模型构成,其任务是将输入语句的语义信息提取并压缩成一个上下文向量。
可以将其理解为一次有记忆的逐词阅读:
在模型处理输入序列时,循环神经网络会依次接收每个token的输入,并在每个时间步步更新隐藏状态。每个隐藏状态都携带了截止到当前位置为止的信息。随着序列推进,信息不断累积,最终会在最后一个时间步形成一个包含整句信息的隐藏状态。
最后的隐藏状态就会作为上下文向量(context vector),传递给解码器,用于指导后续的序列生成。

解码器是模型的“创作者”。它同样基于RNN架构,其任务是基于编码器传来的上下文向量,逐步“写出”目标序列。
它的工作是一个典型的自回归生成过程:
<sos>作为首个输入。
<eos>时,整个过程停止。在生成开始时,循环神经网络以上下文向量作为初始隐藏状态,并接收一个特殊的起始标记 <sos>(start of sentence)作为第一个时间步的输入,用于预测第一个 token。
随后,在每一个时间步,模型都会根据前一时刻的隐藏状态和上一步生成的 token,预测当前的输出。这种“将前一步的输出作为下一步输入”的方式被称为自回归生成(Autoregressive Generation),它确保了生成结果的连贯性。
训练的第一步是为目标语句明确起点和终点。我们会在每个目标句(如英文句子)的开头添加一个特殊的 <sos>(序列起始) 标记,在句末添加 <eos>(序列结束) 标记。
例如:
I like you.
<sos> I like you . <eos>
这两个标记是模型学会生成流程的“信号灯”:<sos>告诉解码器“从这里开始写”,<eos>则指示“在这里结束”。🚦
训练时,数据会依次通过模型的两大部分:
<sos>作为第一个输入,开始预测序列。这里存在一个关键区别:训练策略(Teacher Forcing)与推理策略(自回归)不同。
训练时,解码器的生成是逐步进行的,因此每一步(每个时间步)我们都能计算一个损失值,衡量模型对当前词的预测精度。而整个句子的总损失,就是所有这些时间步的损失值之和。
通俗理解:这好比老师批改一篇由模型“逐词写就”的作文。老师不会只给最终分数,而是对每一个用词的对错都进行打分,最后将所有词的扣分(损失)累加起来,得到这篇“作文”的总扣分。模型的目标,就是在整个训练集上,最小化这个“总扣分”,从而学会用更准确的词汇,写出更流畅的句子。
通过这种“逐步计算,累加求和” 的损失计算方式,模型得以从每个词的细粒度反馈中学习,最终优化其从理解到生成的整体能力。
计算出总损失后,模型的“学习”才真正开始。我们需要告诉模型如何调整内部参数,才能在下次写得更好。这就是反向传播和优化的环节。
在PyTorch等现代深度学习框架中,这一切变得异常简洁。只需一行代码:
loss.backward() # 魔法开始的地方当执行这行代码时,框架会自动沿着时间维度展开计算图,从最终的损失值开始,逆向计算模型每一个参数(从解码器的输出层,一路回溯到编码器的词嵌入层)的梯度。这些梯度精确地指明了“每个参数应该向哪个方向、调整多少,才能降低损失”。
训练完成后,Seq2Seq模型便进入了它的“实战阶段”——推理。这一过程旨在利用已学习到的知识,为全新的输入序列动态生成相应的目标序列。推理的核心流程清晰而严谨,通常包含以下关键环节:
推理阶段编码器的处理流程与训练时完全一致:
此阶段编码器的工作是确定性的,仅执行一次,为后续的生成奠定基础。
推理的核心与魅力在于解码器的生成过程。它采用自回归生成方式,如同一位逐字创作的作家:
<sos> 作为第一个“起笔”信号。
<eos> ,或达到预设的最大生成长度,标志着句子创作完成。
在自回归的每一步,解码器输出的是一个覆盖整个词表的概率分布。如何从这个分布中选出一个具体的词,直接决定了生成结果的质量和风格。常见的选择策略主要有两种:
策略 | 机制 | 优点 | 缺点 |
|---|---|---|---|
🔍 贪心解码 | 每一步都无条件选择当前概率最高的词。 | 简单高效,计算速度快。 | 容易陷入局部最优,生成结果可能生硬、缺乏多样性,且一旦选错难以回头。 |
📡 束搜索 | 每一步保留得分最高的k个候选序列(k为束宽),在扩展中持续评估,最后选择总体得分最高的完整序列。 | 全局视野更优,生成质量通常更高、更流畅。 | 计算和内存开销较大,且k值越大,代价越高。 |
在实际应用中,贪心解码常用于对速度要求极高的场景或作为基线方法;而束搜索因其更好的生成质量,成为机器翻译等任务中的主流选择。此外,还有采样(如Top-k、Top-p采样)等策略,常用于追求多样性和创造性的对话、故事生成等任务。
至此,一个完整的Seq2Seq模型完成了从理解输入到创造性输出的全过程。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。