注意力机制(Attention Mechanism)的原理与实现
字数 1819 2025-11-03 08:33:37

注意力机制(Attention Mechanism)的原理与实现

一、问题描述
注意力机制是深度学习中的核心组件,用于解决序列建模中信息分配不均的问题。传统模型(如RNN)在处理长序列时存在信息瓶颈,而注意力机制通过动态计算权重,使模型能够聚焦于输入中更相关的部分。例如,在机器翻译中,生成每个目标词时,模型可以自动关注源语句中与之最相关的词。

二、核心思想

  1. 权重分配:对于输入序列的每个元素(如单词),计算一个权重系数,反映其当前时刻的重要性。
  2. 上下文向量:通过加权求和将输入序列编码为动态的上下文向量,替代传统的固定长度编码。

三、计算步骤(以编码器-解码器结构为例)
假设编码器输出隐藏状态序列 \(\mathbf{h}_1, \dots, \mathbf{h}_N\),解码器当前隐藏状态为 \(\mathbf{s}_t\)

步骤1:计算注意力分数(Attention Score)
对每个编码器隐藏状态 \(\mathbf{h}_i\),计算其与 \(\mathbf{s}_t\) 的相似度:

\[e_{ti} = \text{score}(\mathbf{s}_t, \mathbf{h}_i) \]

常用评分函数包括:

  • 点积(Dot-Product)\(e_{ti} = \mathbf{s}_t^\top \mathbf{h}_i\)(要求 \(\mathbf{s}_t\)\(\mathbf{h}_i\) 维度相同)
  • 加性(Additive)\(e_{ti} = \mathbf{v}^\top \tanh(\mathbf{W}_1 \mathbf{s}_t + \mathbf{W}_2 \mathbf{h}_i)\)\(\mathbf{v}\)\(\mathbf{W}_1\)\(\mathbf{W}_2\) 为可学习参数)

步骤2:归一化权重
使用Softmax将分数转换为概率分布:

\[\alpha_{ti} = \frac{\exp(e_{ti})}{\sum_{j=1}^N \exp(e_{tj})} \]

权重 \(\alpha_{ti}\) 满足 \(\sum_i \alpha_{ti} = 1\),表示 \(\mathbf{h}_i\) 对当前解码步骤的重要性。

步骤3:生成上下文向量
对编码器隐藏状态加权求和:

\[\mathbf{c}_t = \sum_{i=1}^N \alpha_{ti} \mathbf{h}_i \]

\(\mathbf{c}_t\) 融合了输入序列中与当前时刻最相关的信息。

步骤4:更新解码器输出
将上下文向量 \(\mathbf{c}_t\) 与解码器当前状态 \(\mathbf{s}_t\) 拼接,通过全连接层生成最终输出:

\[\mathbf{o}_t = \tanh(\mathbf{W} [\mathbf{s}_t; \mathbf{c}_t] + \mathbf{b}) \]

四、自注意力(Self-Attention)的扩展
在Transformer中,注意力机制被推广为自注意力:

  1. Query、Key、Value:输入序列通过线性变换生成三组向量:
    • Query(\(\mathbf{Q}\)):当前需要比较的向量
    • Key(\(\mathbf{K}\)):被比较的向量
    • Value(\(\mathbf{V}\)):实际用于加权求和的信息
  2. 缩放点积注意力

\[\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_k}}\right)\mathbf{V} \]

其中 \(d_k\) 为Key的维度,缩放因子防止点积过大导致梯度消失。

五、注意力机制的意义

  1. 可解释性:权重分布可视化为模型提供决策依据(如对齐关系)。
  2. 长程依赖:直接捕捉序列中任意位置的关联,避免RNN的梯度衰减问题。
  3. 并行计算:自注意力允许序列元素同时计算,提升训练效率。
注意力机制(Attention Mechanism)的原理与实现 一、问题描述 注意力机制是深度学习中的核心组件,用于解决序列建模中信息分配不均的问题。传统模型(如RNN)在处理长序列时存在信息瓶颈,而注意力机制通过动态计算权重,使模型能够聚焦于输入中更相关的部分。例如,在机器翻译中,生成每个目标词时,模型可以自动关注源语句中与之最相关的词。 二、核心思想 权重分配 :对于输入序列的每个元素(如单词),计算一个权重系数,反映其当前时刻的重要性。 上下文向量 :通过加权求和将输入序列编码为动态的上下文向量,替代传统的固定长度编码。 三、计算步骤(以编码器-解码器结构为例) 假设编码器输出隐藏状态序列 \( \mathbf{h}_ 1, \dots, \mathbf{h}_ N \),解码器当前隐藏状态为 \( \mathbf{s}_ t \)。 步骤1:计算注意力分数(Attention Score) 对每个编码器隐藏状态 \( \mathbf{h}_ i \),计算其与 \( \mathbf{s} t \) 的相似度: \[ e {ti} = \text{score}(\mathbf{s}_ t, \mathbf{h}_ i) \] 常用评分函数包括: 点积(Dot-Product) : \( e_ {ti} = \mathbf{s}_ t^\top \mathbf{h}_ i \)(要求 \( \mathbf{s}_ t \) 和 \( \mathbf{h}_ i \) 维度相同) 加性(Additive) : \( e_ {ti} = \mathbf{v}^\top \tanh(\mathbf{W}_ 1 \mathbf{s}_ t + \mathbf{W}_ 2 \mathbf{h}_ i) \)(\( \mathbf{v} \)、\( \mathbf{W}_ 1 \)、\( \mathbf{W}_ 2 \) 为可学习参数) 步骤2:归一化权重 使用Softmax将分数转换为概率分布: \[ \alpha_ {ti} = \frac{\exp(e_ {ti})}{\sum_ {j=1}^N \exp(e_ {tj})} \] 权重 \( \alpha_ {ti} \) 满足 \( \sum_ i \alpha_ {ti} = 1 \),表示 \( \mathbf{h}_ i \) 对当前解码步骤的重要性。 步骤3:生成上下文向量 对编码器隐藏状态加权求和: \[ \mathbf{c} t = \sum {i=1}^N \alpha_ {ti} \mathbf{h}_ i \] \( \mathbf{c}_ t \) 融合了输入序列中与当前时刻最相关的信息。 步骤4:更新解码器输出 将上下文向量 \( \mathbf{c}_ t \) 与解码器当前状态 \( \mathbf{s}_ t \) 拼接,通过全连接层生成最终输出: \[ \mathbf{o}_ t = \tanh(\mathbf{W} [ \mathbf{s}_ t; \mathbf{c}_ t ] + \mathbf{b}) \] 四、自注意力(Self-Attention)的扩展 在Transformer中,注意力机制被推广为自注意力: Query、Key、Value :输入序列通过线性变换生成三组向量: Query(\( \mathbf{Q} \)):当前需要比较的向量 Key(\( \mathbf{K} \)):被比较的向量 Value(\( \mathbf{V} \)):实际用于加权求和的信息 缩放点积注意力 : \[ \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_ k}}\right)\mathbf{V} \] 其中 \( d_ k \) 为Key的维度,缩放因子防止点积过大导致梯度消失。 五、注意力机制的意义 可解释性 :权重分布可视化为模型提供决策依据(如对齐关系)。 长程依赖 :直接捕捉序列中任意位置的关联,避免RNN的梯度衰减问题。 并行计算 :自注意力允许序列元素同时计算,提升训练效率。