学习文本之间的潜在联系
一、导论
提到了wikisum,尽管wikisum向抽象多文档摘要迈出了重要的第一步,但是:
-
它仍然认为多个输入文档是连接的平面序列,不知道文档之间的层次结构和可能存在的关系。
-
选择搜索结果前10个,每个结果可能有重叠,用不同的方式表达同样的内容
-
作者强调文档间的图关系(PageRank?)
-
作者貌似要替换掉文档间的注意力机制计算
-
replacing inter-document attention
with a graph-matrix computed based on the basis of lexical similarity or discourse relations
-
-
二、相关工作
end2end模型的难点:训练数据难获取。wiki引用的文档太长了。
提取操作
- 基于单词与tf-idf权值的余弦相似度
- 基于话语关系
- 基于PageRank算法的几种变体
- 基于句子嵌入和图卷积网络
抽象摘要操作
跟单文档不一样,多文档处理有如下方案:
- model transfer (Zhang et al., 2018; Lebanoff and Liu, 2018)
- 在单文档摘要数据上预先训练一个序列到序列模型,并在DUC(多文档)基准测试上进行微调
- 无监督模型(靠重建句子等)
作者的创新
与wikisum的方法不同的是,我们使用了一个基于学习的排序器,我们的抽象模型可以分层地编码输入文档,具有学习跨文档的潜在关系的能力,并额外地将以众所周知的图表示形式编码的信息合并在一起。
三、模型
任务描述类似于wikisum
作者关注在encoder部分
段落排序
- 用LSTM+embedding对标题和段落进行建模
- 最大池化操作,获得固定长度表示
- 最后,为了估计是否应该选择一个段落,我们使用了一个线性变换和一个sigmoid型函数
段落encoding
这部分其实是在Transformer里面常见的一层,用来获取位置信息,参考解释
w i j w_{ij} wij→分配给标题 t i j t_{ij} tij的embedding
p e i j pe_{ij} peij→分配给标题 t i j t_{ij} tij,表示输入内部的位置embedding
Local Transformer Layer
用于为每个段落中的令牌编码上下文信息
由2层组成:
- 归一化多头注意力(允许每个标记关注具有不同注意分布的其他标记)
- FFN是一种以ReLU作为隐藏激活函数的两层前馈网络,是一层线性层
Global Transformer Layer
-
Multi-head Pooling
- 获得固定长度的段落表示
-
Inter-paragraph Attention
- 段落间注意机制来模拟段落间的依赖关系
-
Feed-forward Networks
- 我们将使用上下文信息更新令牌表示
- 段落Ri中的每个标记就可以以分层和有效的方式从其他段落收集信息
带有图信息的Attention机制
段落间注意机制可以看作是学习输入段落的潜在图表示(self-att权重)。
我们实验了两种完善的图表示:
- lexical relations
- 节点对应于段落
- 权值是基于段落的tf-idf表示的余弦相似度。
- Approximate Discourse Graph
- 统计段落之间共同出现的实体
- 统计话语标记(e.g., however, nevertheless )
得到的图,可以表示为权重矩阵的形式 G i j G_{ij} Gij
从而替代之前的段落间上下文向量中的query向量*key向量:
得到上下文向量:
四、实验
我们可以看到,我们的排序器有效地提取了相关的段落,并为下游的摘要任务生成了更多信息输入
作者把参数设置写的很清楚
discourse graph比similarity graph更能带来提升
评价
我们的第一个评估研究按照问答(QA)模式,量化了摘要模型从文档中保留关键信息的程度
我们第二次评估的总体质量评价研究总结通过要求参与者排名考虑以下标准:忠实度(并总结传达重要事实的主题问题吗?),流畅(总结流利和语法?),和简洁(总结避免重复吗?)。
大多读者都偏爱本文的HT模型生成的摘要
疑问
beam search 是啥?
答:就是每次生成句子的时候,不是一个词一个词生成的,而是每次找出Top B个词,参考
LayerNorm?
LN是对单个样本的所有维度来做归一化,参考
把输入的每一层归一化,变成标准正态
from torch.nn import LayerNorm
LN = LayerNorm(input.size()[1:])
LN_output = LN(input)
input = torch.tensor([[4.0, 3.0, 2.0],
[3.0, 3.0, 2.0],
[2.0, 2.0, 2.0]
])
#LN结果
LN_output = torch.tensor([[1.2247, 0, -1.2247],
[0.70709, 0.70709, -1.4142],
[0, 0, 0]
])
多头注意力?
Query,Key,Value首先进过一个线性变换,然后输入到放缩点积attention,注意这里要做h次,其实也就是所谓的多头,每一次算一个头。而且每次Q,K,V进行线性变换的参数W是不一样的。然后将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。可以看到,google提出来的多头attention的不同之处在于进行了h次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息
参考
q v k?
这个是计算attention权重的一种方法,参数矩阵从数据里学习