基于层次化注意力网络(Hierarchical Attention Network, HAN)的文档分类算法详解
字数 3280 2025-12-18 20:13:46
基于层次化注意力网络(Hierarchical Attention Network, HAN)的文档分类算法详解
1. 题目描述
我们这次探讨的算法是基于层次化注意力网络(Hierarchical Attention Network, HAN)的文档分类算法。在自然语言处理中,文档分类是一项基础而重要的任务,旨在将一篇文档(如新闻文章、评论、论文)自动划分到预定义的类别中。传统方法如词袋模型或浅层神经网络往往忽略了文档的两个关键结构性特征:
- 文档由句子组成,句子由单词组成,这是一种自然的层次结构。
- 文档中不同单词和句子的重要性是不同的,例如,一些关键词或核心句子对分类的贡献更大。
HAN算法正是为了解决这两个问题而设计。它通过两个层次的注意力机制(单词级注意力、句子级注意力)来建模文档的层次结构,并自动学习哪些单词和句子更重要,从而生成更精准的文档表示用于分类。
2. 算法核心思想
HAN的核心思想是:“文档 → 句子 → 单词”的层次编码 + 层次化注意力。具体流程如下:
- 单词编码器:将每个句子中的单词序列转换为句子向量表示。
- 单词级注意力:对句子中的单词分配不同的权重,突出重要的单词,生成句子向量。
- 句子编码器:将句子向量序列(即整个文档)进一步编码。
- 句子级注意力:对文档中的句子分配不同的权重,突出重要的句子,生成最终的文档向量。
- 分类层:将文档向量输入一个全连接层和Softmax层,得到分类概率。
3. 算法逐步详解
步骤1:输入表示与嵌入层
- 输入:一篇文档 \(D\) 由 \(L\) 个句子组成,每个句子 \(s_i\) 由 \(T_i\) 个单词组成:
\(D = \{ s_1, s_2, ..., s_L \}\),
\(s_i = \{ w_{i1}, w_{i2}, ..., w_{iT_i} \}\)。 - 词嵌入:每个单词 \(w_{ij}\) 通过一个嵌入层(如Word2Vec、GloVe或随机初始化)转换为一个实数向量 \(x_{ij} \in \mathbb{R}^d\),其中 \(d\) 是词向量的维度。
步骤2:单词编码器与单词级注意力
目标:将每个句子的单词序列编码为一个句子向量。
-
单词编码器:
对于句子 \(s_i\) 中的每个单词 \(w_{ij}\),我们使用一个双向GRU(或BiLSTM)来编码其上下文信息。双向GRU包含前向和后向两个方向:- 前向GRU从左到右读取单词序列,得到前向隐藏状态 \(\overrightarrow{h}_{ij}\)。
- 后向GRU从右到左读取单词序列,得到后向隐藏状态 \(\overleftarrow{h}_{ij}\)。
- 将两个方向的隐藏状态拼接,得到单词的完整表示:
\(h_{ij} = [\overrightarrow{h}_{ij}; \overleftarrow{h}_{ij}]\),其中 \(h_{ij} \in \mathbb{R}^{2g}\),\(g\) 是单向GRU的隐藏层大小。
-
单词级注意力:
并非所有单词对句子的含义贡献相同。注意力机制为句子中的每个单词计算一个权重,加权求和得到句子向量 \(s_i\)。- 首先,将每个单词的隐藏状态 \(h_{ij}\) 通过一个单层感知机(MLP)转换为一个标量 \(u_{ij}\),作为该单词的“重要性”原始表示:
\(u_{ij} = \tanh(W_w h_{ij} + b_w)\),其中 \(W_w \in \mathbb{R}^{u_w \times 2g}\),\(b_w \in \mathbb{R}^{u_w}\) 是可学习参数,\(u_w\) 是注意力维度。 - 然后,计算每个单词的注意力权重 \(\alpha_{ij}\):
\(\alpha_{ij} = \frac{\exp(u_{ij}^\top u_w)}{\sum_{t=1}^{T_i} \exp(u_{it}^\top u_w)}\),其中 \(u_w \in \mathbb{R}^{u_w}\) 是一个可学习的“单词级上下文向量”,用于衡量单词的重要性。 - 最后,对单词的隐藏状态进行加权求和,得到句子向量 \(s_i\):
\(s_i = \sum_{j=1}^{T_i} \alpha_{ij} h_{ij}\)。
- 首先,将每个单词的隐藏状态 \(h_{ij}\) 通过一个单层感知机(MLP)转换为一个标量 \(u_{ij}\),作为该单词的“重要性”原始表示:
步骤3:句子编码器与句子级注意力
目标:将文档的句子向量序列编码为一个文档向量。
-
句子编码器:
与单词编码器类似,我们使用一个双向GRU来处理句子向量序列 \(\{ s_1, s_2, ..., s_L \}\):- 得到每个句子的双向隐藏状态:
\(h_i = [\overrightarrow{h}_i; \overleftarrow{h}_i]\),其中 \(h_i \in \mathbb{R}^{2h}\),\(h\) 是句子级GRU的隐藏层大小。
- 得到每个句子的双向隐藏状态:
-
句子级注意力:
对文档中的句子分配权重,突出关键句子。- 类似地,将每个句子的隐藏状态 \(h_i\) 通过一个MLP转换为标量 \(u_i\):
\(u_i = \tanh(W_s h_i + b_s)\),其中 \(W_s \in \mathbb{R}^{u_s \times 2h}\),\(b_s \in \mathbb{R}^{u_s}\)。 - 计算每个句子的注意力权重 \(\beta_i\):
\(\beta_i = \frac{\exp(u_i^\top u_s)}{\sum_{t=1}^{L} \exp(u_t^\top u_s)}\),其中 \(u_s \in \mathbb{R}^{u_s}\) 是“句子级上下文向量”。 - 加权求和得到文档向量 \(v\):
\(v = \sum_{i=1}^{L} \beta_i h_i\)。
- 类似地,将每个句子的隐藏状态 \(h_i\) 通过一个MLP转换为标量 \(u_i\):
步骤4:文档分类
- 将文档向量 \(v\) 输入一个全连接层,然后通过Softmax激活函数,得到文档属于各个类别的概率分布:
\(p = \text{softmax}(W_c v + b_c)\),其中 \(W_c\)、\(b_c\) 是分类层参数。 - 训练时使用交叉熵损失函数:
\(L = -\sum_{c=1}^{C} y_c \log p_c\),其中 \(y_c\) 是真实标签的one-hot编码,\(C\) 是类别总数。
4. 关键技术与优势
- 层次化结构:模仿人类阅读文档的方式(单词→句子→文档),逐层抽象语义信息。
- 注意力机制:
- 单词级注意力:自动识别句子中的关键词(如“fantastic”在情感分析中可能更重要)。
- 句子级注意力:自动识别文档中的核心句子(如新闻的导语、评论的总结句)。
- 注意力权重可视化,提供了模型决策的可解释性。
- 双向GRU:捕获单词和句子的上下文依赖关系。
- 端到端训练:整个模型从输入文档到分类结果可微分,可通过反向传播一次训练完成。
5. 应用与扩展
- 适用场景:长文档分类(如新闻分类、医学文献分类、情感分析)、多标签分类。
- 扩展方向:
- 结合预训练语言模型(如BERT)作为单词编码器,增强单词表示。
- 引入外部知识(如主题信息)指导注意力权重计算。
- 用于文档摘要、信息检索等其他任务。
总结
HAN算法通过层次化结构(单词→句子→文档)和双重注意力机制,有效地建模了文档的语义层次,并聚焦于重要内容,从而显著提升了长文档分类的准确性。其设计思想直观且强大,已成为文档级NLP任务的经典基准模型之一。