基于多头自注意力机制(Multi-Head Self-Attention)的文本情感分类算法详解
1. 问题描述
在自然语言处理中,情感分类旨在判断一段文本所蕴含的情感倾向(如正面、负面、中性)。传统方法依赖手工特征或简单的神经网络,难以捕捉文本中复杂的语义依赖和长距离情感线索。例如,在句子“这部电影的剧情虽然平庸,但演员的演技却令人惊叹”中,“平庸”和“令人惊叹”分别表达负面和正面情感,且两者通过“虽然…但…”形成转折关系,需要模型深入理解这种语义关联和上下文对比。
多头自注意力机制通过并行学习文本中不同位置的语义关联,能够有效建模此类复杂依赖,提升情感分类的准确性。本题目将详细讲解如何利用多头自注意力机制构建端到端的情感分类模型。
2. 算法核心思想
自注意力(Self-Attention) 机制允许序列中的每个词与其他所有词进行交互,计算出一组加权表示,以捕捉全局依赖。多头(Multi-Head) 扩展了这一思想,通过多个独立的注意力“头”并行学习不同的语义关联模式(如语法结构、情感对比、指代关系等),最后将多头的输出融合,增强模型的表达能力。
3. 逐步详解
步骤1:输入表示
- 给定一个长度为 \(n\) 的文本序列,首先将每个词转换为词向量。假设词向量维度为 \(d_{\text{model}} = 512\)。
- 加入位置编码(Positional Encoding):由于自注意力本身不包含位置信息,需通过正弦/余弦函数或可学习参数,为每个词添加位置信息,得到输入表示矩阵 \(X \in \mathbb{R}^{n \times d_{\text{model}}}\)。
步骤2:自注意力机制详解
自注意力的核心是计算每个词相对于所有词的注意力权重,步骤如下:
- 线性变换:
对输入 \(X\) 进行三次线性变换,生成查询(Query)、键(Key)、值(Value)矩阵:
\[ Q = X W_Q, \quad K = X W_K, \quad V = X W_V \]
其中 \(W_Q, W_K, W_V \in \mathbb{R}^{d_{\text{model}} \times d_k}\),通常设 \(d_k = d_v = d_{\text{model}} / h = 64\)(\(h\) 为注意力头数,例如 \(h=8\))。
- 计算注意力分数:
对于每个位置 \(i\),计算其查询向量 \(q_i\) 与所有键向量 \(k_j\) 的点积,并除以缩放因子 \(\sqrt{d_k}\) 以防止梯度消失:
\[ \text{Score}_{ij} = \frac{q_i \cdot k_j^\top}{\sqrt{d_k}} \]
- 归一化与加权求和:
对分数进行 softmax 归一化,得到权重 \(\alpha_{ij}\),然后对值向量加权求和:
\[ \alpha_{ij} = \frac{\exp(\text{Score}_{ij})}{\sum_{t=1}^n \exp(\text{Score}_{it})}, \quad \text{Output}_i = \sum_{j=1}^n \alpha_{ij} v_j \]
最终得到自注意力输出矩阵 \(A \in \mathbb{R}^{n \times d_v}\)。
步骤3:多头注意力机制
-
并行多头计算:
将 \(Q, K, V\) 按头数 \(h\) 分割为 \(h\) 组(每组维度 \(d_k\)),独立计算自注意力,得到 \(h\) 个输出 \(\text{head}_1, \dots, \text{head}_h \in \mathbb{R}^{n \times d_v}\)。 -
多头输出拼接与投影:
将所有头的输出拼接为 \(\text{Concat}(\text{head}_1, \dots, \text{head}_h) \in \mathbb{R}^{n \times (h \cdot d_v)}\),再通过线性投影 \(W_O \in \mathbb{R}^{(h \cdot d_v) \times d_{\text{model}}}\) 融合信息:
\[ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W_O \]
此步骤使模型能够同时关注不同语义层面的信息,例如一个头学习“虽然…但…”的转折关系,另一个头关注“令人惊叹”的强度。
步骤4:情感分类模型架构
-
编码器层:
每个编码器层包含:- 多头自注意力子层:如上所述,计算上下文感知的表示。
- 前馈网络子层:对每个位置独立应用两层全连接网络(例如维度 2048 → 512),增强非线性。
- 残差连接与层归一化:每个子层输出为 \(\text{LayerNorm}(x + \text{Sublayer}(x))\),缓解梯度消失。
-
堆叠编码器:
重复多个编码器层(例如 6 层),逐步抽象高层语义特征。 -
分类输出层:
- 取编码器最终输出的第一个位置(通常对应 [CLS] 标记)或全局平均池化的向量作为文本表示 \(h_{\text{cls}}\)。
- 通过全连接层 + softmax 输出情感概率分布:
\[ p(y|X) = \text{softmax}(W_c h_{\text{cls}} + b_c) \]
步骤5:训练与优化
- 损失函数:使用交叉熵损失:
\[ \mathcal{L} = -\sum_{i=1}^N \log p(y_i | X_i) \]
- 优化技巧:
- 使用 AdamW 优化器,搭配学习率预热和衰减。
- 在多头注意力中加入 Dropout(如 0.1)防止过拟合。
- 可结合梯度裁剪稳定训练。
4. 算法优势
- 长距离依赖建模:自注意力直接计算任意词对的关系,解决了 RNN/CNN 在长序列中的信息衰减问题。
- 并行计算高效:矩阵运算可完全并行化,加速训练。
- 可解释性:可通过可视化注意力权重(如图 1)分析模型聚焦的关键词(如“平庸”与“令人惊叹”的权重对比)。
- 灵活扩展:可融入位置编码、掩码机制等适应不同任务。
5. 总结
基于多头自注意力机制的情感分类算法,通过并行学习多层次的语义关联,有效捕捉文本中的复杂情感线索。其核心在于自注意力的全局交互与多头的异构特征提取,结合 Transformer 的堆叠结构,实现了端到端的高性能情感分类。实际应用中,可进一步结合预训练语言模型(如 BERT)的迁移学习,提升小数据场景下的性能。