基于自注意力机制的多头指针网络文本摘要算法
字数 2927 2025-12-09 17:17:06
基于自注意力机制的多头指针网络文本摘要算法
算法描述
这是一个用于抽取式文本摘要的算法。它的核心思想是:直接从一篇长文档中,挑选出最具代表性、信息量最丰富的若干句子(或片段),并按其在原文中的顺序组合,形成一篇凝练的摘要。
传统的抽取式方法通常依赖于句子本身的特征(如位置、关键词频率等)或句子间的浅层关系(如余弦相似度)。而“基于自注意力机制的多头指针网络”则利用了强大的深度神经网络,通过自注意力机制来深度建模文档中所有句子之间的复杂语义关系,并引入指针网络结构来直接、灵活地从原文中选择句子。多头设计则让模型能够并行关注文档在不同语义子空间中的不同重要方面,从而做出更全面的选择决策。
简单来说,这个算法可以理解为:一个“聪明的阅读者”(模型)通过一遍又一遍地、从不同角度(多头)审视整个文档(自注意力),最终“用手指指出”(指针网络)哪些是必须放入摘要的核心句子。
解题过程详解
让我们把这个复杂算法拆解成几个循序渐进的步骤来理解。
第一步:问题定义与输入表示
- 输入:一篇包含
n个句子的文档D = [s1, s2, ..., sn]。其中每个句子si由一串词(或子词)组成。 - 输出:一个长度为
L的索引序列I = [i1, i2, ..., iL],其中每个i的取值范围是 1 到n,表示被选入摘要的句子在原文中的位置。例如,I = [2, 5, 9]表示将第2、5、9句按顺序组合成摘要。 - 目标:使选出的句子集合能最大程度地覆盖原文的核心信息,并且句子之间连贯、冗余度低。
第二步:句子编码
首先,我们需要将每个句子转化为计算机能理解的数值向量。
- 词嵌入:对文档中的每个词,通过一个预训练的词嵌入层(如Word2Vec, GloVe)或一个基础的Transformer编码器,将其转换为一个低维稠密向量。
- 句子向量:对于一个句子
si中的所有词向量,我们可以采用一个双向长短时记忆网络 或一个浅层Transformer编码器 来捕捉词序和局部依赖关系。通常会取BiLSTM最后时刻的隐藏状态,或者对词向量序列进行平均/最大池化,来生成一个固定维度的句子级向量表示ei。至此,文档被表示为句子向量序列E = [e1, e2, ..., en]。
第三步:文档编码与自注意力机制
这是算法的核心。仅仅有孤立的句子向量还不够,我们需要理解句子在整个文档上下文中的重要性。
- 自注意力计算:将句子向量序列
E输入到一个Transformer编码器 中。自注意力机制允许序列中的每个位置(句子)在编码自身时,“注意”到序列中所有其他位置(所有其他句子)。- Query, Key, Value:对于每个句子向量
ei,我们通过三个不同的线性变换,生成对应的查询向量qi、键向量ki和值向量vi。 - 注意力分数:句子
i对句子j的注意力分数,由qi和kj的点积计算得出。这个分数衡量了在处理句子i时,句子j应该获得多少“关注”。 - 加权聚合:对所有句子的注意力分数进行Softmax归一化,得到权重分布。然后,用这个权重对所有的值向量
vj进行加权求和,得到句子i的上下文感知表示ci。ci融合了全局信息。
- Query, Key, Value:对于每个句子向量
- 多头注意力:为了捕捉更丰富的关系,我们会并行运行多组(
h个“头”)上述的自注意力计算。每组有自己的Q, K, V变换矩阵,关注文档中不同类型的关系(例如,一个头关注话题相关性,另一个头关注逻辑转折关系)。最后,将h个头的输出拼接起来,再经过一个线性变换,得到最终经过文档级编码的句子表示hi。H = [h1, h2, ..., hn]就是富含全局语义信息的句子表示序列。
第四步:指针网络与句子选择
现在我们有了每个句子的“丰富描述” hi,接下来要决定选哪些。
- 指针网络原理:传统的序列生成模型(如Seq2Seq)有一个固定的输出词汇表。但在这里,我们的“词汇表”是动态变化的——就是当前文档的所有句子索引
{1, 2, ..., n}。指针网络就是为了解决这种“从输入序列中复制元素”的问题而设计的。它不生成新词,而是生成指向输入序列某个位置的指针。 - 选择过程:摘要生成被建模为一个序列决策过程。在每一步
t,模型根据当前状态,输出一个指向原文句子索引的概率分布。- 解码状态:初始化一个解码器状态
dt(例如,用文档的总体表示来初始化)。 - 计算选择概率:在步骤
t,将解码器状态dt与文档编码H中的每一个句子表示hi进行比较,计算一个“相关性”分数uti。通常通过一个注意力机制实现:
其中uti = v^T * tanh(W1*hi + W2*dt + b)v, W1, W2, b是可学习参数。然后对所有uti做Softmax,得到概率分布P(选择句子i | 步骤t) = softmax(uti)。 - 做出选择:选择概率最大的句子索引
it作为当前步的输出。关键技巧:为了避免重复选择,在下一步计算注意力时,会“遮盖”掉之前已选句子的位置(将其对应的uti设为负无穷大),强制模型关注未选句子。 - 更新状态:解码器状态更新为
d{t+1},通常基于当前的dt和选中的句子表示h{it},通过一个RNN(如GRU)来实现。这个过程重复L步,直到选出预定数量的摘要句子。
- 解码状态:初始化一个解码器状态
第五步:模型训练
模型需要学习如何选择“好”的句子。
- 监督信号:训练数据是(文档,人工编写的摘要)对。我们需要为每篇文档生成一个“伪标准答案”——即从原文中标注出哪些句子应该被抽取出来构成一个接近人工摘要的摘要。这可以通过ROUGE 等自动评估指标,寻找与人工摘要最匹配的句子集合来实现。
- 损失函数:模型训练的目标是最大化选出“伪标准答案”句子序列的概率。因此,使用负对数似然损失。如果第
t步的标准选择是句子y_t,那么这一步的损失是-log(P(y_t | 文档, 已选序列))。总损失是所有步骤损失之和。 - 训练流程:将文档输入网络,经过编码和指针网络选择,得到预测的句子索引序列。计算预测序列与“伪标准答案”序列之间的损失,通过反向传播算法更新模型中所有的参数(包括编码器、注意力机制、指针网络的参数)。
总结
基于自注意力机制的多头指针网络文本摘要算法巧妙地结合了现代深度学习的三大组件:
- 自注意力编码器:深度、并行地理解文档全局语义,为每个句子生成高质量的上下文表示。
- 指针网络:提供了一种优雅的方式,直接从输入序列中选取元素,完美适配抽取式摘要的任务形式。
- 序列到序列的决策框架:将摘要生成视为一个顺序决策过程,允许模型考虑已选内容,从而控制冗余和提升连贯性。
这个算法是深度学习时代抽取式摘要的经典代表,它摆脱了对手工特征的依赖,通过端到端的学习,直接从数据中掌握“摘要应该包含什么”的复杂模式。