文章目录
-
- [一、 Bahdanau 注意力 (Additive / Concat Attention)](#一、 Bahdanau 注意力 (Additive / Concat Attention))
-
- [1.1 核心思想](#1.1 核心思想)
- [1.2 计算步骤](#1.2 计算步骤)
- [1.3 特点总结](#1.3 特点总结)
- [二、 Luong 注意力 (General / Multiplicative Attention)](#二、 Luong 注意力 (General / Multiplicative Attention))
-
- [2.1 核心思想](#2.1 核心思想)
- [2.2 计算步骤](#2.2 计算步骤)
- [2.3 特点总结](#2.3 特点总结)
- [三、 对比与选择](#三、 对比与选择)
-
- [3.1 两种注意力对比](#3.1 两种注意力对比)
- [3.2 两种注意力的优缺点](#3.2 两种注意力的优缺点)
- [3.3 如何选择?](#3.3 如何选择?)
注意力机制(Attention Mechanism) 是自然语言处理(NLP)和深度学习中的核心技术之一,尤其在序列到序列(Seq2Seq)任务(如机器翻译、文本摘要等)中表现突出。Bahdanau注意力(又称"加性注意力")和Luong注意力(又称"乘性注意力")是两种经典的注意力模型,它们在计算方式和应用场景上有所不同。
一、 Bahdanau 注意力 (Additive / Concat Attention)
Bahdanau注意力是最早被提出的注意力机制之一,由Dzmitry Bahdanau等人在2014年的论文《Neural Machine Translation by Jointly Learning to Align and Translate》中提出。
1.1 核心思想
它通过一个可学习的神经网络 来计算查询和键之间的"兼容性分数"。这个网络将查询和键拼接起来,然后通过一个带有tanh
激活函数的前馈网络进行处理。因此,它也被称为加性注意力 或拼接注意力。
1.2 计算步骤
假设我们有:
- 输入序列 : X = ( x 1 , x 2 , . . . , x T ) X = (x_1, x_2, ..., x_T) X=(x1,x2,...,xT)
- 编码器隐藏状态 : H = ( h 1 , h 2 , . . . , h T ) H = (h_1, h_2, ..., h_T) H=(h1,h2,...,hT), 其中 h i h_i hi 是输入第 i i i 个词后的隐藏状态。
- 解码器在时间步 t t t 的隐藏状态 : s t s_t st
Bahdanau注意力的计算流程如下:
步骤一:计算注意力分数
对于解码器的每一个状态 s t s_t st,我们需要计算它与编码器每一个隐藏状态 h i h_i hi 的相关性分数 e t i e_{ti} eti。这个分数衡量了输入序列中第 i i i 个词对生成输出序列第 t t t 个词有多重要。
公式 :
e t i = score ( s t − 1 , h i ) = v a T tanh ( W a s t − 1 + U a h i ) e_{ti} = \text{score}(s_{t-1}, h_i) = v_a^T \tanh(W_a s_{t-1} + U_a h_i) eti=score(st−1,hi)=vaTtanh(Wast−1+Uahi)
- s t − 1 s_{t-1} st−1: 解码器在前一个 时间步的隐藏状态(作为Query)。
- h i h_i hi: 编码器在第 i i i 个时间步的隐藏状态(作为Key 和Value)。
- W a , U a W_a, U_a Wa,Ua: 可学习的权重矩阵。
- v a v_a va: 可学习的权重向量。
- tanh \tanh tanh: 激活函数。
- 解释 :这个公式将 s t − 1 s_{t-1} st−1 和 h i h_i hi 线性变换后拼接,再通过
tanh
函数,最后与向量 v a v_a va 做点积,得到一个标量分数 e t i e_{ti} eti。
步骤二:分数归一化(计算注意力权重)
将所有分数通过Softmax
函数进行归一化,得到注意力权重 α t i \alpha_{ti} αti。这些权重之和为1,表示每个输入词被关注的"概率"。
公式 :
α t i = exp ( e t i ) ∑ j = 1 T exp ( e t j ) \alpha_{ti} = \frac{\exp(e_{ti})}{\sum_{j=1}^{T} \exp(e_{tj})} αti=∑j=1Texp(etj)exp(eti)
步骤三:计算上下文向量
使用注意力权重对编码器的隐藏状态进行加权求和,得到当前时间步的上下文向量 c t c_t ct。
公式 :
c t = ∑ i = 1 T α t i h i c_t = \sum_{i=1}^{T} \alpha_{ti} h_i ct=i=1∑Tαtihi
步骤四:生成输出
将上下文向量 c t c_t ct 与解码器的上一隐藏状态 s t − 1 s_{t-1} st−1 拼接,然后输入到解码器网络(通常是另一个RNN)中,生成当前时间步的隐藏状态 s t s_t st 和输出词 y ^ t \hat{y}_t y^t。
公式 :
s t = RNN_decoder ( concat ( c t , s t − 1 ) ) s_t = \text{RNN\decoder}(\text{concat}(c_t, s{t-1})) st=RNN_decoder(concat(ct,st−1))
y ^ t = softmax ( W s s t + b s ) \hat{y}_t = \text{softmax}(W_s s_t + b_s) y^t=softmax(Wsst+bs)
1.3 特点总结
- Query : 解码器的前一个 隐藏状态 s t − 1 s_{t-1} st−1。
- Key/Value : 编码器的隐藏状态 h i h_i hi。
- 打分函数 : 一个前馈神经网络,计算成本相对较高。
- 对齐 : Bahdanau注意力是双向 的,解码器在时间步 t t t 可以"看到"自己已经生成的所有词(通过 s t − 1 s_{t-1} st−1)以及整个输入序列。
二、 Luong 注意力 (General / Multiplicative Attention)
Luong注意力由Thang Luong等人在2015年的论文《Effective Approaches to Attention-based Neural Machine Translation》中提出。它对Bahdanau注意力进行了简化和改进。也称为 乘性注意力(Multiplicative Attention)
。
2.1 核心思想
Luong注意力认为,计算查询和键的兼容性分数可以通过更简单的方式实现,比如直接使用向量间的点积。这使得计算更加高效。
2.2 计算步骤
与Bahdanau类似,但其打分函数和使用的Query不同。
步骤一:计算注意力分数
Luong注意力提供了几种不同的打分方法,其中最常用的是General 和Dot。
- General (点积变体) :
e t i = s t T W h h i e_{ti} = s_t^T W_h h_i eti=stTWhhi- 与Bahdanau最大的不同是,这里使用的是当前 解码器隐藏状态 s t s_t st 作为Query,而不是前一个状态 s t − 1 s_{t-1} st−1。
- W h W_h Wh 是一个可学习的权重矩阵,用于对键 h i h_i hi 进行线性变换。
- Dot (纯点积) :
e t i = s t T h i e_{ti} = s_t^T h_i eti=stThi- 这是General的特例,省略了权重矩阵 W h W_h Wh,计算速度最快。
- Concat (与Bahdanau类似) :
e t i = v a T tanh ( W a s t + U a h i ) e_{ti} = v_a^T \tanh(W_a s_t + U_a h_i) eti=vaTtanh(Wast+Uahi)- 形式上与Bahdanau类似,但同样使用当前 状态 s t s_t st 作为Query。
步骤二:分数归一化
与Bahdanau完全相同,使用Softmax函数。
α t i = exp ( e t i ) ∑ j = 1 T exp ( e t j ) \alpha_{ti} = \frac{\exp(e_{ti})}{\sum_{j=1}^{T} \exp(e_{tj})} αti=∑j=1Texp(etj)exp(eti)
步骤三:计算上下文向量
与Bahdanau完全相同。
c t = ∑ i = 1 T α t i h i c_t = \sum_{i=1}^{T} \alpha_{ti} h_i ct=i=1∑Tαtihi
步骤四:生成输出
Luong注意力在生成输出时有两种不同的结构:
- Concat :
s t = RNN_decoder ( concat ( c t , s t ) ) s_t = \text{RNN\_decoder}(\text{concat}(c_t, s_t)) st=RNN_decoder(concat(ct,st))- 这里将上下文向量 c t c_t ct 与当前 生成的隐藏状态 s t s_t st 拼接。
- General :
y ^ t = softmax ( W s concat ( s t , c t ) ) \hat{y}_t = \text{softmax}(W_s \text{concat}(s_t, c_t)) y^t=softmax(Wsconcat(st,ct))- 直接将 s t s_t st 和 c t c_t ct 拼接后通过一个线性层和Softmax生成输出。
2.3 特点总结
- Query : 解码器的当前 隐藏状态 s t s_t st。
- Key/Value : 编码器的隐藏状态 h i h_i hi。
- 打分函数 : 主要使用点积或其变体,计算效率高。
- 对齐 : 由于使用当前状态 s t s_t st 作为Query,Luong注意力更偏向于单向对齐,即输出词只关注输入序列中它之前或对应的部分,这更符合翻译任务中"从左到右"的特性。
三、 对比与选择
3.1 两种注意力对比
特性 | Bahdanau 注意力 | Luong 注意力 |
---|---|---|
提出时间 | 2014年 | 2015年 |
核心思想 | 通过FFN计算Query-Key兼容性 | 通过点积或其变体计算兼容性 |
Query | 解码器前一个 隐藏状态 s t − 1 s_{t-1} st−1 | 解码器当前 隐藏状态 s t s_t st |
打分函数 | score(s, h) = v_a^T * tanh(W_a*s + U_a*h) |
score(s, h) = s^T * W_h * h (General) score(s, h) = s^T * h (Dot) |
计算效率 | 较低(涉及矩阵乘法和FFN) | 较高(主要是矩阵乘法和点积) |
对齐方向 | 双向 (可以看到自己之前生成的所有词) | 单向 (更符合从左到右的生成过程) |
参数量 | 较多 ( W a , U a , v a W_a, U_a, v_a Wa,Ua,va) | 较少 (只有General变体有 W h W_h Wh) |
影响力 | 开创性的工作,首次引入注意力机制 | 更简洁高效,成为后续许多模型的基础 |
3.2 两种注意力的优缺点
1、Bahdanau 注意力
- 优点 :
- 对齐灵活:双向对齐特性使其在某些复杂任务中可能表现更好。
- 兼容性强:即使Query和Key的维度不同,也能通过权重矩阵进行匹配。
- 缺点 :
- 计算量大:FFN结构增加了计算开销,训练和推理速度较慢。
- 参数多:更多的参数意味着需要更多的数据来训练,否则容易过拟合。
2、Luong 注意力
- 优点 :
- 计算高效:点积操作非常快,显著提升了模型性能。
- 参数精简:模型更简单,泛化能力可能更强。
- 对齐更合理:单向对齐更符合语言生成的直觉。
- 缺点 :
- 维度依赖:Dot变体要求数据的维度必须匹配。
- 梯度问题 :当维度很高时,点积结果的方差会很大,可能导致Softmax函数梯度消失或爆炸。为此,Luong也提出了Scaled General Attention ,即在点积后除以一个缩放因子 d k \sqrt{d_k} dk ( d k d_k dk是键的维度),这与Transformer中的做法一致。
3.3 如何选择?
在现代深度学习实践中,Luong注意力,特别是其Scaled General变体,通常是首选。
- 性能与效率的权衡:在绝大多数NLP任务中,Luong注意力的表现优于或至少持平于Bahdanau注意力,同时计算效率更高。
- 简洁性:公式更简洁,实现起来更直接,参数更少,降低了过拟合的风险。
- 影响力:Luong注意力的点积思想,特别是经过缩放后的版本,是Transformer模型中多头注意力机制的基石。理解了Luong注意力,就更容易理解更现代的Transformer模型。
那何时会考虑Bahdanau?: 在一些非常特殊的场景下,比如输入和隐藏状态的维度差异巨大,或者你发现点积方式确实导致了训练不稳定时,Bahdanau的加性方式可能是一个备选方案。但在绝大多数情况下,Luong的Scaled General注意力是更优、更现代的选择。
总而言之,Bahdanau注意力为我们打开了动态对齐的大门,而Luong注意力则通过更高效的数学工具,让这条路走得更远、更快。理解它们的区别,对于深入掌握现代序列模型至关重要。