注意力机制(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的梯度衰减问题。
- 并行计算:自注意力允许序列元素同时计算,提升训练效率。