机器翻译:Bahdanau注意力和Luong注意力详解

文章目录

    • [一、 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 个时间步的隐藏状态(作为KeyValue)。
  • 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注意力提供了几种不同的打分方法,其中最常用的是GeneralDot

  • 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变体,通常是首选

  1. 性能与效率的权衡:在绝大多数NLP任务中,Luong注意力的表现优于或至少持平于Bahdanau注意力,同时计算效率更高。
  2. 简洁性:公式更简洁,实现起来更直接,参数更少,降低了过拟合的风险。
  3. 影响力:Luong注意力的点积思想,特别是经过缩放后的版本,是Transformer模型中多头注意力机制的基石。理解了Luong注意力,就更容易理解更现代的Transformer模型。

那何时会考虑Bahdanau?: 在一些非常特殊的场景下,比如输入和隐藏状态的维度差异巨大,或者你发现点积方式确实导致了训练不稳定时,Bahdanau的加性方式可能是一个备选方案。但在绝大多数情况下,Luong的Scaled General注意力是更优、更现代的选择。

总而言之,Bahdanau注意力为我们打开了动态对齐的大门,而Luong注意力则通过更高效的数学工具,让这条路走得更远、更快。理解它们的区别,对于深入掌握现代序列模型至关重要。

相关推荐
aneasystone本尊6 分钟前
学习 Coze Studio 的智能体会话接口
人工智能
高效匠人14 分钟前
能力评估:如何系统评估你的技能和经验
人工智能
小马敲马27 分钟前
[4.2-2] NCCL新版本的register如何实现的?
开发语言·c++·人工智能·算法·性能优化·nccl
阿里云大数据AI技术29 分钟前
【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
人工智能·gpt·llm
martinzh31 分钟前
AI智能体如何从错误中学习:反思机制详解
人工智能
duration~1 小时前
SpringAI实现Reread(Advisor)
java·人工智能·spring boot·spring
攻城狮7号1 小时前
MiniCPM-V 4.0开源,号称是手机上的GPT-4V
人工智能·开源大模型·openbmb·端侧大模型·minicpm-v-4
大志说编程1 小时前
LangChain框架入门12:深入解析文本嵌入组件
人工智能·langchain
大数据在线2 小时前
押注AI大模型交付业务,亚信科技构建战略支点
人工智能·亚信科技·ai大模型·ai大模型交付·ai大模型交付与应用