基于自注意力机制(Self-Attention)的文本表示学习算法详解
字数 1611 2025-11-18 16:55:53
基于自注意力机制(Self-Attention)的文本表示学习算法详解
问题描述
在自然语言处理中,如何将文本转换为有意义的向量表示是一个核心问题。传统的词袋模型或循环神经网络(RNN)存在忽略长距离依赖或计算效率低的问题。自注意力机制通过计算序列中每个位置与其他所有位置的关联权重,能够高效捕捉全局依赖关系,生成高质量的文本表示。本题目将详细讲解如何利用自注意力机制学习文本的向量表示。
算法原理
自注意力机制的核心思想是:对于输入序列中的每个元素,通过计算其与序列中所有元素的关联分数,生成一个加权求和的表示。这种表示能够动态融合全局信息,克服了RNN的序列依赖和CNN的局部性限制。
解题步骤
-
输入表示
- 假设输入是一个词序列 \(X = [x_1, x_2, ..., x_n]\),其中 \(x_i\) 是第 \(i\) 个词的词向量(维度为 \(d_{\text{model}}\))。
- 输入序列可表示为矩阵 \(X \in \mathbb{R}^{n \times d_{\text{model}}}\)。
-
生成查询、键和值
- 通过线性变换将输入 \(X\) 映射到三个不同的空间:
- 查询(Query):\(Q = X W^Q\)(\(W^Q \in \mathbb{R}^{d_{\text{model}} \times d_k}\))
- 键(Key):\(K = X W^K\)(\(W^K \in \mathbb{R}^{d_{\text{model}} \times d_k}\))
- 值(Value):\(V = X W^V\)(\(W^V \in \mathbb{R}^{d_{\text{model}} \times d_v}\))
- 其中 \(d_k\) 和 \(d_v\) 是投影维度,通常设为 \(d_k = d_v = d_{\text{model}}\)。
- 通过线性变换将输入 \(X\) 映射到三个不同的空间:
-
计算注意力分数
- 通过点积计算查询 \(Q\) 和键 \(K\) 的相似度:
\[ \text{Scores} = Q K^T \]
- 缩放分数以避免梯度消失(缩放因子为 \(\sqrt{d_k}\)):
\[ \text{Scaled Scores} = \frac{\text{Scores}}{\sqrt{d_k}} \]
- 应用Softmax归一化得到注意力权重:
\[ A = \text{Softmax}\left( \frac{Q K^T}{\sqrt{d_k}} \right) \]
- 输出为权重加权的值向量:
\[ \text{Output} = A V \]
- 多头注意力
- 使用多组 \(W^Q, W^K, W^V\) 并行计算多个注意力头,捕获不同子空间的依赖关系。
- 将各头的输出拼接后通过线性层融合:
\[ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h) W^O \]
\[ \text{head}_i = \text{Attention}(Q W_i^Q, K W_i^K, V W_i^V) \]
- 文本表示生成
- 对序列中每个位置的输出向量进行池化(如平均池化或取首词向量)得到全局文本表示。
- 该表示可直接用于分类、相似度计算等下游任务。
关键点说明
- 并行计算:自注意力无需按序列顺序计算,显著提升训练效率。
- 长距离依赖:每个位置直接关联所有其他位置,避免RNN的梯度消失问题。
- 可解释性:注意力权重可可视化,显示词与词之间的关联强度。
应用场景
- 机器翻译、文本分类、语义相似度计算等任务中作为核心编码层。
- 作为预训练模型(如BERT)的基础组件,学习上下文相关的文本表示。