1. 注意力机制的前世今生:从RNN到Bahdanau突破
在自然语言处理领域,序列转换任务(如机器翻译)一直面临着核心挑战:如何让模型动态关注输入序列中最相关的部分?传统RNN编码器-解码器架构采用固定长度的上下文向量,就像要求翻译人员仅凭最后一句记忆完成整段翻译,这显然不合理。2014年Bahdanau等人发表的论文《Neural Machine Translation by Jointly Learning to Align and Translate》彻底改变了这一局面。
我第一次实现Bahdanau注意力时,最震撼的是它模拟了人类翻译的认知过程——阅读源语句时,我们会自然地在不同位置停留聚焦。比如翻译"我爱人工智能"到法语,生成"je"时关注"我",生成"aime"时关注"爱",这种动态对齐正是注意力机制的核心思想。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Bahdanau注意力机制原理解析
2.1 核心数学形式化表达
Bahdanau注意力的核心公式看似简单却蕴含深意:
$$
\mathbf{c}{t'} = \sum^T \alpha(\mathbf{s}_{t' - 1}, \mathbf{h}_t) \mathbf{h}_t
$$
这里:
- $\mathbf{s}_{t'-1}$是解码器上一时间步的隐状态(查询向量)
- $\mathbf{h}_t$是编码器各时间步的隐状态(同时作为键和值)
- $\alpha$是注意力权重计算函数
关键理解:与传统Seq2Seq不同,上下文向量$\mathbf{c}_{t'}$现在是动态生成的,而非固定不变的最终编码状态。
2.2 加性注意力评分函数详解
Bahdanau采用加性注意力(additive attention)计算权重:
python复制class AdditiveAttention(nn.Module):
def __init__(self, query_size, key_size, num_hiddens, dropout):
super().__init__()
self.W_q = nn.Linear(query_size, num_hiddens, bias=False)
self.W_k = nn.Linear(key_size, num_hiddens, bias=False)
self.w_v = nn.Linear(num_hiddens, 1)
self.dropout = nn.Dropout(dropout)
def forward(self, queries, keys, values, valid_lens):
#
