深度学习中的 Seq2Seq 模型与注意力机制
一、Seq2Seq 模型
定义:
Seq2Seq(Sequence-to-Sequence)是一种端到端的编码器-解码器架构,专为处理变长输入/输出序列的任务设计(如机器翻译、文本摘要)。其核心思想是将输入序列编码为固定维度的上下文向量(Context Vector),再通过解码器生成目标序列。
输入:可变长度序列(如 X 1 ,X 2 ,…,X n )
输出:可变长度序列(如 Y 1 ,Y 2 ,…,Y n )
核心机制:
-
Encoder:将输入序列编码为固定长度向量(即 Encoder state)
-
Decoder:将该向量解码为目标序列
Seq2Seq 模型示意图
Cell 可以用 RNN,GRU,LSTM 等结果。相当于将 RNN 模型中s0s_0s0变为Encoder
条件语言模型理解
1、编解码器作用
- 编码器的作用:将不定长输入序列 x1,…,xTx_{1},\ldots,x_{T}x1,…,xT 编码为固定长度的状态向量 CCC 。
- 解码器的作用:输出 yty_{t}yt 的条件概率基于以下两个因素:
- 先前生成的输出序列 y1,…,yt−1y_{1},\ldots,y_{t-1}y1,…,yt−1
- 编码器输出的状态向量 CCC
- 目标函数:
argmaxP(y1,…,yT′∣x1,…,xT)\operatorname{argmax} P\left(y_{1},\ldots,y_{T^{\prime}}\mid x_{1},\ldots,x_{T}\right)argmaxP(y1,…,yT′∣x1,…,xT)
即在给定输入序列的条件下,最大化输出序列的概率。
2、根据最大似然估计,最大化输出序列的概率
- 概率分解:
P(y1,…,yT′∣x1,…,xT)=∏t′=1T′P(yt′∣y1,…,yt′−1,C)P\left(y_{1},\ldots,y_{T^{\prime}}\mid x_{1},\ldots,x_{T}\right) = \prod_{t^{\prime}=1}^{T^{\prime}} P\left(y_{t^{\prime}} \mid y_{1},\ldots,y_{t^{\prime}-1}, C \right)P(y1,…,yT′∣x1,…,xT)=t′=1∏T′P(yt′∣y1,…,yt′−1,C) - 核心问题:直接计算概率连乘 P(y1∣C)×P(y2∣y1,C)×P(y3∣y2,y1,C)×⋯P(y^1 \mid C) \times P(y^2 \mid y^1, C) \times P(y^3 \mid y^2, y^1, C) \times \cdotsP(y1∣C)×P(y2∣y1,C)×P(y3∣y2,y1,C)×⋯ 会导致结果趋近于零(数值下溢),不利于计算存储。
3、解决方案:对数概率转化
-
对概率公式取对数:
logP(y1,…,yT′∣x1,…,xT)=∑t′=1T′logP(yt′∣y1,…,yt′−1,C)\log P\left(y_{1},\ldots,y_{T^{\prime}}\mid x_{1},\ldots,x_{T}\right) = \sum_{t^{\prime}=1}^{T^{\prime}} \log P\left(y_{t^{\prime}} \mid y_{1},\ldots,y_{t^{\prime}-1}, C \right)logP(y1,…,yT′∣x1,…,xT)=t′=1∑T′logP(yt′∣y1,…,yt′−1,C) -
转化意义:
- 概率连乘 → 对数概率求和
logP(y1∣C)+logP(y2∣y1,C)+logP(y3∣y2,y1,C)+⋯\log P(y^1 \mid C) + \log P(y^2 \mid y^1, C) + \log P(y^3 \mid y^2, y^1, C) + \cdotslogP(y1∣C)+logP(y2∣y1,C)+logP(y3∣y2,y1,C)+⋯ - 优化目标等价于:
通过 Softmax 输出概率最大化,最小化输出序列的负对数损失(Negative Log-Likelihood Loss)。
机器翻译案例示意图 - 概率连乘 → 对数概率求和
二、注意力机制
长难句问题
当输入序列较长时(如 >30 词),单个上下文向量 C\mathbf{C}C难以有效压缩全部信息,导致解码质量显著下降(尤其丢失序列开头信息)。对于更长的句子,Seq2Seq 就显得力不从心了。下图是通常 BLEU 的分数随这句子的长度变化,可以看到句子非常长的时候,分数就很低。

注意力机制定义
建立 Encoder 的隐层状态输出到 Decoder 对于输出 y 所需要的上下文信息
其目的是增加编码器信息输入到解码器中相同时刻的联系

公式
关键设定:
- Encoder 时刻记为 ttt(输入序列时间步)
- Decoder 时刻记为 t′t't′(输出序列时间步)
1. 上下文向量 ct′c_{t'}ct′ 的计算
ct′=∑t=1Tαt′thtc_{t'} = \sum_{t=1}^{T} \alpha_{t'}^t h_tct′=t=1∑Tαt′tht
- 参数说明:
- αt′t\alpha_{t'}^tαt′t:权重系数(通过训练学习得到)
- hth_tht:Encoder 第 ttt 时刻的隐层状态输出
- 工作示例(上图蓝色Decoder cell 示意图):
α41h1+α42h2+α43h3+α44h4=c4\alpha_4^1 h_1 + \alpha_4^2 h_2 + \alpha_4^3 h_3 + \alpha_4^4 h_4 = c_4α41h1+α42h2+α43h3+α44h4=c4
2. 权重系数 αt′t\alpha_{t'}^tαt′t 的生成
- Softmax 归一化:
αt′t=exp(et′t)∑k=1Texp(et′k),t=1,2,…,T\alpha_{t'}^t = \frac{\exp(e_{t'}^t)}{\sum_{k=1}^{T} \exp(e_{t'}^k)}, \quad t=1,2,\ldots,Tαt′t=∑k=1Texp(et′k)exp(et′t),t=1,2,…,T - 能量得分 et′te_{t'}^tet′t 的计算:
et′t=g(st′−1,ht)=v⊤tanh(Wsst′−1+Whht)e_{t'}^t = g(s_{t'-1}, h_t) = v^{\top} \tanh \left( W_s s_{t'-1} + W_h h_t \right)et′t=g(st′−1,ht)=v⊤tanh(Wsst′−1+Whht)- 输入来源:
- st′−1s_{t'-1}st′−1:Decoder 在 t′−1t'-1t′−1时刻的隐层状态
- hth_tht:Encoder 在 ttt 时刻的隐层状态
- 可学习参数:
- vvv:权重向量
- Ws,WhW_s, W_hWs,Wh:权重矩阵
- 输入来源:
注意力机制的意义与影响
- 解决长序列遗忘:
解码器直接访问所有编码器状态,避免信息压缩损失。 - 可解释性:
注意力权重 αtj\alpha_{tj}αtj 可视化输入-输出词对齐(如翻译中源词与目标词关联)。 - 性能提升:
在机器翻译等任务上,BLEU 值提升 >30%(对比无注意力模型)。
扩展:从基础注意力到 Transformer
基础注意力仍依赖 RNN 的序列计算。Transformer 模型进一步革新:
- 用 Self-Attention 替代 RNN,并行捕获全局依赖
- 多头注意力(Multi-Head)增强不同表示子空间的聚焦能力
- 成为 BERT、GPT 等预训练模型的基石
三、总结
Seq2Seq 框架通过条件语言建模解决序列生成问题,而注意力机制通过动态上下文计算突破长序列建模瓶颈,为后续 Transformer 革命奠定基础。其核心价值在于:让模型学会在生成过程中自主关注最相关的信息源,显著提升语义理解与生成的准确性。