我们可以把 Seq2Seq(Sequence-to-Sequence,序列到序列) 想象成一种任务架构(业务流程),而 RNN(Recurrent Neural Network,循环神经网络) 则是驱动这个架构的基础引擎(具体算法组件)。
下面为你拆解它们各自是什么,以及它们是如何结合在一起工作的。
一、 什么是 RNN(循环神经网络)?
普通的神经网络(如全连接网络 CNN、DNN)在处理数据时,假设每个输入之间是相互独立的(比如识别一张猫的图片,不需要知道上一张图片是什么)。
但人类的语言、音频或时间序列是有上下文顺序的。“我 喜欢 苹果”和“苹果 喜欢 我”含义完全不同。
RNN 的核心思想:拥有“短期记忆”(Hidden State / 隐藏状态)。
- 它在处理当前词(第 步)时,不仅看当前词的内容,还会把上一时刻保留的记忆一起输入进来:
- 局限性:标准 RNN 处理长序列时容易发生“遗忘”(梯度消失),因此实际应用中通常会用其改进版本 LSTM(长短期记忆网络) 或 GRU。
二、 什么是 Seq2Seq 架构?
Seq2Seq 是一种专门用于处理**“输入是一个序列,输出也是一个序列,且两者长度不固定”**的任务框架。
常见场景:
- 机器翻译:英文(5个词) 中文(3个词)
- 文本摘要:长文章 短摘要
- 对话系统:提问句子 回答句子
Seq2Seq 采用经典的 Encoder-Decoder(编码器-解码器) 结构:
- Encoder(编码器):负责将变长的输入序列“读懂”,并压缩成一个包含全局语义的向量(称为 Context Vector / 语义向量)。
- Decoder(解码器):负责拿到这个语义向量,一步步生成目标序列。
三、 RNN 是如何在 Seq2Seq 中工作的?
在 Transformer 诞生之前,最经典的 Seq2Seq 结构就是由两个 RNN(通常是 LSTM/GRU)拼接而成的:
【输入序列】: "I" -> "love" -> "cat"
↓ ↓ ↓
【Encoder RNN】: [RNN] -> [RNN] -> [RNN]
↓
[ Context Vector (语义向量) ]
↓
【Decoder RNN】: [RNN] -> [RNN] -> [RNN] -> [RNN]
↓ ↓ ↓ ↓
【输出序列】: "我" "爱" "猫" <EOS> (结束符)
具体工作流程:
-
编码阶段(Encoder 端):
- 输入一句话,例如
"I love cat"。 - Encoder RNN 逐词读取:
- 读取
"I",生成隐藏状态 ; - 读取
"love",结合 生成 ; - 读取
"cat",结合 生成最后的隐藏状态 。
- 读取
- 这个最终的 (包含了整句话的信息)就被作为 Context Vector(上下文向量 )。
- 输入一句话,例如
-
解码阶段(Decoder 端):
- Decoder RNN 获取到上下文向量 (通常将其作为 Decoder 的初始状态或每一步的输入)。
- 给出起始标记
<SOS>(Start of Sentence),Decoder 生成第一个词"我"。 - 下一步,把
"我"作为输入,继续生成下一个词"爱"。 - 如此循环,直到 Decoder 生成结束标记
<EOS>(End of Sentence),翻译完成。
四、 基于 RNN 的 Seq2Seq 的瓶颈与演进
虽然基于 RNN 的 Seq2Seq 开创了端到端序列建模的时代,但它有两个致命弱点:
-
信息瓶颈(Information Bottleneck):
- 不管输入句子有多长(10个词还是100个词),Encoder 最终都要把它强行压缩成一个固定长度的向量。长文本的信息极易丢失。
- 解决办法:引入 Attention(注意力机制),让 Decoder 在生成每个词时,可以直接回顾 Encoder 每一步的记忆,而不仅依赖最后一个向量。
-
无法并行计算(训练慢):
- RNN 必须等 步计算完才能算第 步,无法利用现代 GPU 的并行能力进行大规模加速。
- 最终演进:2017 年 Google 提出了 Transformer,彻底抛弃了 RNN,完全依靠自注意力机制(Self-Attention)处理序列,成为了如今主流大模型(如 GPT、BERT、LLaMA 等)的基石。
总结
- RNN 是一种按时间/序列顺序一步步处理数据、具备记忆能力的神经网络类型。
- Seq2Seq 是一种“输入序列 输出序列”的网络设计范式(Encoder-Decoder)。
- Seq2Seq 中的 RNN 指的是利用 RNN 的记忆特性,一个作为编码器提取输入特征,另一个作为解码器生成输出结果。