基于注意力机制的神经网络机器翻译模型:注意力机制原理与编码器-解码器架构的构建过程
题目描述
在传统的序列到序列(Seq2Seq)模型中,编码器会将一个变长的输入序列(如一句话)压缩成一个固定长度的上下文向量,解码器再根据这个向量生成目标序列。这种架构在处理长序列时,会面临信息瓶颈问题,即编码器的最终隐藏状态可能难以完整保存长输入序列的所有信息,导致翻译质量下降。
基于注意力机制的神经网络翻译模型,通过在解码的每一步,动态地为解码器提供输入序列不同部分的信息,有效地解决了这个问题。本次讲解将深入剖析注意力机制的工作原理,并详细阐述其如何集成到编码器-解码器架构中,从而构建一个强大的神经机器翻译模型。
解题过程(模型构建原理)
我们将整个构建过程分解为几个核心步骤,从基础架构到注意力机制的集成。
第一步:理解基础的编码器-解码器架构
这是注意力模型的基石。
-
编码器:
- 目标:将源语言句子(如英语“I love machine learning.”)转换成一个包含其语义信息的表示序列。
- 常见实现:使用循环神经网络,如长短时记忆网络(LSTM)或门控循环单元(GRU)。
- 处理过程:
- 输入句子被表示为一个词嵌入序列:
[x1, x2, ..., xT],其中T是源句长度。 - 编码器RNN逐个时间步处理这些向量。在每个时间步
t,RNN接受当前输入xt和上一个隐藏状态h_{t-1},输出一个新的隐藏状态ht。 - 处理完所有输入后,我们得到一系列的隐藏状态:
[h1, h2, ..., hT]。每个ht都包含了到句子第t个词为止的上下文信息。
- 输入句子被表示为一个词嵌入序列:
- 传统做法:在基础Seq2Seq中,通常只取最后一个隐藏状态
hT作为整个句子的“上下文向量”传递给解码器。这就是信息瓶颈所在。
-
解码器:
- 目标:基于编码器的输出,逐个生成目标语言(如中文“我 爱 机器学习 。”)。
- 常见实现:同样使用RNN(LSTM/GRU)。
- 处理过程:
- 初始时刻
t=1,解码器的初始隐藏状态s0通常被设置为编码器的最终隐藏状态hT。 - 在每个解码时间步
i,解码器接受上一个时间步的生成词y_{i-1}(在训练时,也常使用真实的目标词作为输入,即“teacher forcing”)、上一个隐藏状态s_{i-1},并生成当前隐藏状态s_i。 - 然后,
s_i被送入一个全连接层(通常接一个softmax函数),预测当前最可能的目标词y_i的概率分布。
- 初始时刻
核心问题:在传统的模型中,解码器在每一步i都只能看到同一个、固定长度的上下文向量hT。这要求hT必须“记住”输入序列的所有细节,对于长句子来说非常困难。
第二步:引入注意力机制的核心思想
注意力机制的核心思想是:解码器在生成每一个目标词时,不应该“平等”地看待所有源语言信息,而应该“有选择地聚焦”于输入序列中与之最相关的部分。
- 动态上下文:不再将编码器的最终状态
hT作为唯一的上下文。相反,为解码器的每一个时间步i,都计算一个独立的、动态的上下文向量c_i。 - 计算相关性:这个
c_i是编码器所有隐藏状态[h1, h2, ..., hT]的加权和。权重a_{i,t}代表了“在生成第i个目标词时,输入序列第t个词(的编码ht)的重要程度”。 - 计算流程:
- 对齐分数:首先,计算解码器当前隐藏状态
s_i与编码器每一个隐藏状态ht之间的“对齐分数”e_{i,t}。这个分数衡量了它们之间的相关程度。- 常见计算方法有:
- 点积注意力:
e_{i,t} = s_i^T * ht(计算简单,要求s_i和ht维度相同)。 - 加性注意力:
e_{i,t} = v_a^T * tanh(W_a * [s_i; ht])(更灵活,v_a和W_a是可学习参数)。
- 点积注意力:
- 常见计算方法有:
- 注意力权重:然后,对所有时间步
t的e_{i,t}应用softmax函数,得到注意力权重分布a_{i,t}。这确保了所有权重之和为1,且每个权重都介于0和1之间。a_{i,t} = softmax(e_{i,t}) = exp(e_{i,t}) / Σ_{k=1 to T}(exp(e_{i,k}))
- 上下文向量:最后,用这些权重对编码器隐藏状态进行加权求和,得到当前解码步的上下文向量
c_i。c_i = Σ_{t=1 to T}(a_{i,t} * ht)
- 可视化理解:如果解码器在生成中文“爱”,它计算出的
a_i可能会在源句“love”对应的ht上有一个很高的权重,从而c_i会富含“love”这个词的语义信息。
- 对齐分数:首先,计算解码器当前隐藏状态
第三步:构建完整的注意力编码器-解码器模型
将注意力机制集成到基础架构中。
-
编码器保持不变:仍然是一个双向RNN(通常使用),分别从左到右和从右到左处理句子,并将两个方向的最终隐藏状态拼接起来,得到更丰富的表示
ht = [\overrightarrow{h_t}; \overleftarrow{h_t}]。最终输出编码器隐藏状态序列H = [h1, h2, ..., hT]。 -
解码器的修改:
- 在解码的每个时间步
i,先计算注意力:- 使用解码器上一步的隐藏状态
s_{i-1}和编码器所有状态H,计算当前步的注意力权重a_i和上下文向量c_i(如上一步所述)。
- 使用解码器上一步的隐藏状态
- 更新解码器状态:
- 解码器的输入通常是一个“增强”的表示。具体做法是,将上一步生成的词的嵌入
emb(y_{i-1})与刚计算出的上下文向量c_i拼接在一起,作为解码器RNN在当前步的输入。 - 解码器RNN接收这个拼接向量
[emb(y_{i-1}); c_i]和上一个隐藏状态s_{i-1},生成当前隐藏状态s_i。
- 解码器的输入通常是一个“增强”的表示。具体做法是,将上一步生成的词的嵌入
- 生成预测:
- 将当前解码器隐藏状态
s_i和上下文向量c_i再次拼接,送入一个全连接层,再经过softmax,得到目标词汇表上的概率分布P(y_i)。 P(y_i) = softmax(W_o * [s_i; c_i] + b_o)- 选择概率最大的词作为当前步的输出
y_i,并作为下一步的输入。
- 将当前解码器隐藏状态
- 在解码的每个时间步
第四步:模型训练与推理
-
训练:
- 使用最大似然估计。对于一个(源句,目标句)对,模型预测目标句每个词的概率分布。
- 损失函数是负对数似然(交叉熵损失),即最小化模型预测分布与真实目标词(one-hot向量)之间的差异。公式为:
Loss = - Σ_{i=1}^{T_y} log(P(y_i* | y_1*, ..., y_{i-1}*, x)),其中y_i*是真实目标词,x是源句。 - 通过反向传播和梯度下降(如Adam优化器)来更新模型的所有参数,包括词嵌入矩阵、RNN权重、注意力参数
v_a, W_a、输出层权重等。
-
推理:
- 推理时,没有真实目标句作为输入。
- 解码器从特殊的
<start>开始标记开始。 - 在每个时间步,使用模型预测的概率分布
P(y_i),选择概率最高的词(贪婪搜索)或通过束搜索保留多个高概率候选序列。 - 将上一步预测的词作为下一步的输入,重复此过程,直到生成
<end>结束标记或达到最大长度。
总结
基于注意力机制的神经机器翻译模型,通过为解码器的每一步生成一个动态的、聚焦于输入序列特定部分的上下文向量,有效缓解了长序列的信息遗忘问题。它的核心贡献在于:
- 对齐可视化:注意力权重可以被解释为源语言和目标语言词汇之间的软对齐,这与语言学中的对齐概念一致。
- 性能提升:显著提升了长句和复杂句的翻译质量,成为了现代神经机器翻译的基石。
- 广泛应用:其思想(查询
Query=解码器状态,键Key=编码器状态,值Value=编码器状态)被推广到Transformer等更强大的架构中,成为深度学习的核心组件之一。