735 字
4 分钟
RNN-Seq2Seq序列到序列模型
2026-06-26
无标签

动机#

前面三种RNN模式要求输入和输出序列等长,但机器翻译这类任务中输入输出长度往往不同,需要一种更灵活的架构。

序列到序列架构:编码器-解码器#

Seq2Seq由两个RNN组成:

编码器(Encoder)/读取器(Reader):

  • 读取输入序列 x(1),,x(nx)x^{(1)}, \ldots, x^{(n_x)}
  • 将整个输入序列压缩成一个上下文向量 CC
  • 通常取最后一个隐藏状态或者其简单的函数:C=h(nx)C = h^{(n_x)}

解码器(Decoder)/写入器(Writer):

  • 以上下文向量 CC 为条件
  • 逐步生成输出序列 y(1),,y(ny)y^{(1)}, \ldots, y^{(n_y)}
  • 每一步的输入是上一步的输出(或训练时用Teacher Forcing)

训练目标: 最大化条件对数似然

logP(y(1),,y(ny)x(1),,x(nx))\log P(y^{(1)}, \ldots, y^{(n_y)} \mid x^{(1)}, \ldots, x^{(n_x)})

alt text

Seq2Seq的瓶颈问题#

基础Seq2Seq有一个明显缺陷:整个输入序列被压缩成固定长度的向量 CC,当输入序列很长时,CC 很难保留所有关键信息,导致翻译质量下降。

注意力机制(Attention)#

注意力机制正是为了解决上述瓶颈而提出的。核心思想是:

解码器在生成每个输出词时,不再只依赖固定的 CC,而是动态地关注编码器不同时刻的隐藏状态

假设encoder的隐藏状态为 h(1),,h(nx)h^{(1)}, \ldots, h^{(n_x)},decoder在生成第 tt 个输出时,会计算一个上下文向量 CtC_t,它是编码器隐藏状态的加权和:

  1. 解码器在每一步计算当前状态与编码器各时刻隐藏状态的相关性权重

    αt,i=exp(et,i)jexp(et,j)\alpha_{t,i} = \frac{\exp(e_{t,i})}{\sum_j \exp(e_{t,j})}
    • 其中 et,i=score(h(i),s(t))e_{t,i}=score(h^{(i)}, s^{(t)}) 衡量解码器第 tt 步与编码器第 ii 步的匹配程度。
    • score函数可以是点积、可学习的前馈网络(MLP)等。
  2. 然后用这些权重对编码器隐藏状态做加权求和,得到当前步专属的上下文向量:

    Ct=iαt,ih(i)C_t = \sum_i \alpha_{t,i} h^{(i)}
  3. 最后,解码器在生成输出时使用 CtC_t 而不是固定的 CC

这样解码器每一步都能有选择地聚焦在输入序列的不同部分,类似人类翻译时会反复回看原文的不同片段。

对比总结#

基础Seq2Seq加入注意力机制
上下文向量固定的 CC,只来自最后隐藏状态动态的 CtC_t,每步重新计算
长序列表现较差,信息易丢失较好,可以直接访问任意位置
计算复杂度较高(需计算所有位置的权重)
可解释性好(注意力权重可可视化)
  1. 从“压缩”到“访问”
    • Seq2Seq:压缩encoder的所有 h(i)h^{(i)} 到一个固定向量 CC
    • Attention:随时访问encoder的所有隐藏状态 h(i)h^{(i)},动态计算 CtC_t
  2. 从“固定上下文”到“动态上下文”
    • CCtC → C_t
  3. 从“链式依赖”到“直接连接”
    • RNN路径 → Attention跳跃连接
RNN-Seq2Seq序列到序列模型
https://biscuit0613.github.io/posts/ml/rnn-seq2seq/
作者
Biscuit
发布于
2026-06-26
许可协议
CC BY-NC-SA 4.0
RNN-GRU门控循环单元和LSTM长短期记忆网络
RNN-概念,三种典型设计模式以及有向图模型解释