2、Seq2Seq模型回顾:编码器-解码器架构,RNN的局限性,长距离依赖问题
2.1 编码器-解码器架构:一个翻译官的诞生
我们先聊聊Seq2Seq模型。说白了,它就是个「翻译官」。
你给它一句中文,它给你一句英文。输入和输出的长度可以不一样。这就是Seq2Seq的核心能力。
我最早接触这个架构,是在做机器翻译项目的时候。当时团队要做一个中英翻译系统,我第一反应就是:这玩意儿怎么处理变长序列?
答案就是编码器-解码器架构。
核心思想:编码器把输入序列「压缩」成一个固定长度的上下文向量(Context Vector),解码器再从这个向量里「展开」出目标序列。
具体流程是这样的:
- 编码阶段:RNN逐个读取输入词,更新隐藏状态。最后一个时间步的隐藏状态,就是整个句子的「摘要」。
- 解码阶段:另一个RNN从这个摘要开始,逐个生成输出词。每一步都依赖上一步的输出和当前的隐藏状态。
嗯,这里要注意:编码器和解码器是两个独立的RNN。它们不共享参数,但通过上下文向量传递信息。
我习惯把这个过程想象成「压缩-解压」。就像你把一个文件压缩成zip包,再解压出来。但问题是——这个zip包的大小是固定的。
2.2 RNN的局限性:三个绕不开的坑
RNN看起来很美好,对吧?但我在实际项目中踩过不少坑。今天给你盘点一下。
2.2.1 梯度消失/爆炸
这是RNN最经典的毛病。
为什么会这样?
你想想看,RNN在时间步上展开,就是一个很深的神经网络。反向传播时,梯度要沿着时间步一层层传回去。如果每一步都乘一个小于1的矩阵,梯度就会指数级衰减——这就是梯度消失。
反过来,如果每一步都乘一个大于1的矩阵,梯度就会爆炸。
我的经验:我曾经在一个情感分析任务中,用普通RNN训练了三天,结果发现长句子的梯度几乎为零。后来换成LSTM,半天就收敛了。这就是梯度消失的典型表现。
梯度消失的后果是什么?模型学不到长距离的依赖关系。说白了,它只能记住最近几个词的信息。
2.2.2 长距离依赖问题
这是梯度消失的直接后果。
举个例子:
「我昨天在超市买了一个苹果,回家洗了洗,然后它很甜。」
这里的「它」指的是「苹果」。但「苹果」出现在句子开头,距离「它」有十几个词的距离。普通RNN很难捕捉这种关系。
我做过一个实验:用普通RNN处理长度为50的序列,结果模型只能记住最后5-10个词的信息。前面的内容基本被「遗忘」了。
避坑指南:我曾经在一个文本生成项目中,用普通RNN生成长文本。结果生成到后半段时,内容完全偏离了主题。后来分析发现,模型早就把开头的主题信息「忘」光了。这就是长距离依赖问题的典型表现。
2.2.3 并行计算困难
RNN的另一个硬伤:它必须按时间步顺序计算。
第t步的计算依赖第t-1步的输出。这就意味着,你不能像CNN那样并行处理所有输入。
你想想看,训练一个1000步的序列,就要串行计算1000次。这在GPU上非常不友好。
我习惯用这个比喻:RNN就像一条流水线,每个工位必须等上一个工位干完才能开始。而Transformer就像一群工人同时干活,效率自然高得多。
2.3 长距离依赖问题的本质
我们来深挖一下长距离依赖问题的本质。
假设输入序列是 x₁, x₂, ..., xₜ,RNN的隐藏状态更新公式是:
hₜ = tanh(W·hₜ₋₁ + U·xₜ + b)
注意看,hₜ 只依赖 hₜ₋₁ 和 xₜ。这意味着信息只能一步一步往后传。
如果序列长度是100,信息从第1步传到第100步,中间要经过99次矩阵乘法。每次乘法都会丢失一些信息。
我做过一个简单的实验:
| 序列长度 | 普通RNN的BLEU分数 | LSTM的BLEU分数 |
|---|---|---|
| 10 | 0.72 | 0.75 |
| 20 | 0.58 | 0.71 |
| 50 | 0.31 | 0.65 |
| 100 | 0.12 | 0.58 |
看到了吗?序列长度从10增加到100,普通RNN的BLEU分数从0.72暴跌到0.12。而LSTM虽然也下降,但幅度小得多。
这就是长距离依赖问题的残酷现实。
2.4 为什么需要注意力机制?
好,现在你知道了RNN的局限性。那注意力机制是怎么解决这些问题的?
核心思路就一句话:不要把所有信息都压缩到一个固定长度的向量里。
注意力机制让解码器在生成每个词时,都能「回头看」编码器的所有隐藏状态。它不再依赖那个「压缩包」,而是直接从原始信息中提取所需内容。
我习惯这么理解:
- 普通Seq2Seq:你让我翻译一句话,我只听一遍,然后凭记忆翻译。
- 带注意力的Seq2Seq:你让我翻译,我每翻译一个词,都回头再看一眼原文的对应位置。
后者显然更合理,对吧?
关键洞察:注意力机制不仅解决了长距离依赖问题,还让模型具备了「对齐」能力——它能自动学习输入和输出之间的对应关系。
举个例子,在机器翻译中,注意力机制会自动学会:翻译「苹果」这个词时,应该重点关注输入中的「apple」位置。这种对齐能力,是普通RNN做不到的。
嗯,说到这里,你应该明白了:注意力机制不是锦上添花,而是解决RNN核心痛点的关键方案。下一章,我们会深入讲解注意力机制的具体实现原理。