基于自注意力机制(Self-Attention)的文本表示学习算法
题目描述
在自然语言处理中,如何有效捕捉文本中词与词之间的依赖关系是核心挑战之一。传统循环神经网络(RNN)或卷积神经网络(CNN)在处理长距离依赖时存在局限性(如梯度消失或局部感知)。自注意力机制(Self-Attention)通过计算序列中每个词与其他所有词的关联权重,直接建模全局依赖关系,从而生成更丰富的文本表示。本题目将详解自注意力机制的原理、计算步骤及其在文本表示学习中的应用。
解题过程
1. 问题定义与输入表示
假设输入序列为 \(X = [x_1, x_2, ..., x_n]\),其中 \(x_i\) 是第 \(i\) 个词的词向量(维度为 \(d_{\text{model}}\))。目标是为每个词生成一个上下文感知的表示 \(Z = [z_1, z_2, ..., z_n]\),其中 \(z_i\) 融合了序列中所有词对 \(x_i\) 的贡献。
2. 自注意力机制的核心思想
自注意力通过三个可学习的权重矩阵(Query、Key、Value)将输入向量映射到三个空间:
- Query(查询):表示当前词需要关注其他哪些词。
- Key(键):表示其他词如何被当前词查询。
- Value(值):包含每个词的实际信息,用于加权求和。
具体步骤:
步骤1:线性变换生成Q、K、V
对每个输入向量 \(x_i\) 分别乘以权重矩阵 \(W^Q\)、\(W^K\)、\(W^V\)(维度均为 \(d_{\text{model}} \times d_k\)),得到:
\[q_i = x_i W^Q, \quad k_i = x_i W^K, \quad v_i = x_i W^V \]
其中 \(d_k\) 是Q、K的维度(通常设为 \(d_{\text{model}}\) 的倍数或约数)。
步骤2:计算注意力分数
通过点积计算每个查询 \(q_i\) 与所有键 \(k_j\) 的相似度:
\[\text{score}(q_i, k_j) = q_i \cdot k_j^T \]
得到分数矩阵 \(S \in \mathbb{R}^{n \times n}\),其中 \(S_{ij}\) 表示词 \(i\) 对词 \(j\) 的关注程度。
步骤3:缩放与Softmax归一化
为防止点积结果过大导致梯度消失,将分数除以 \(\sqrt{d_k}\)(缩放因子),再应用Softmax归一化:
\[A_{ij} = \text{Softmax}\left( \frac{S_{ij}}{\sqrt{d_k}} \right) = \frac{\exp(S_{ij} / \sqrt{d_k})}{\sum_{j=1}^n \exp(S_{ij} / \sqrt{d_k})} \]
得到注意力权重矩阵 \(A\),每行和为1。
步骤4:加权求和生成输出
用注意力权重对Value向量加权求和,得到每个词的新表示:
\[z_i = \sum_{j=1}^n A_{ij} v_j \]
输出 \(Z = [z_1, z_2, ..., z_n]\) 即为自注意力后的文本表示。
3. 多头注意力(Multi-Head Attention)
为捕捉不同子空间的依赖关系(如语法、语义),使用多个独立的注意力头:
- 每个头使用不同的 \(W^Q_h, W^K_h, W^V_h\)(\(h=1,...,H\)),并行计算注意力。
- 将多个头的输出拼接后通过线性层融合:
\[Z_{\text{multi}} = \text{Concat}(Z_1, Z_2, ..., Z_H) W^O \]
其中 \(W^O\) 是输出权重矩阵。
4. 在文本表示学习中的应用
- 位置编码:自注意力本身不包含位置信息,需通过正弦函数或可学习参数添加位置编码。
- 层归一化与残差连接:通常与Transformer架构结合,避免深层网络退化。
- 下游任务:生成的表示可直接用于文本分类、机器翻译等任务。
关键点总结
- 自注意力通过全局交互捕捉长距离依赖,避免了RNN/CNN的局限性。
- 缩放点积注意力防止梯度不稳定,Softmax确保权重归一化。
- 多头机制增强模型对不同语义关系的建模能力。
- 该方法为Transformer等现代NLP模型奠定了核心基础。