指针网络摘要生成(Get To The Point: Summarization with Pointer-Generator Networks阅读笔记)
Motivation
摘要任务常用的方法有两种,一种是抽取式方法(extractive),另一种是生成式(abstractive)方法,抽取式方法是从原文中抽取出一些语句作为摘要,符合事实及语法,但是不能生成原文本中没有的句子。生成式方法是让模型去理解文本,再生成新的摘要,类似人类写摘要的方式,生成的摘要更加灵活,强大,而且可以更好的引入外部知识。生成式摘要方法主要是基于seq2seq模型和注意力机制,然而现有的生成式方法容易从源文本中再生出错误的事实信息,并且不能很好的处理OOV词汇,还容易生成重复的单词和句子。本文提出了pointer-generator模型,一方面利用pointing机制从源文本中复制单词,帮助模型准确地从源文本中再生出事实信息,并解决OOV词汇的问题,同时保留模型生成新的词汇的能力。另一方面使用coverage机制追踪已经生成的词汇,强迫模型关注之前未生成的词汇或句子,减少重复。
Model
pointer-generator
图1 pointer-generator模型架构:
图1给出了模型的总体架构,该模型结合了seq2seq模型和pointer network模型
与seq2seq模型相同,首先利用编码器将输入序列编码为隐状态向量。解码时,在每个时间步t,根据公式1和公式2,利用编码得到的隐状态向量和解码状态向量(上个时间步的word embedding)计算注意力分布。根据公式3,利用注意力分布计算得到上下文向量。最后根据公式4,计算模型从词汇表中生成词汇的概率分布(图1中的绿色柱状图)。
e
i
t
=
v
T
tanh
(
W
h
h
i
+
W
s
s
t
+
b
a
t
t
n
)
(1)
e_{i}^{t}=v^{T} \tanh \left(W_{h} h_{i}+W_{s} s_{t}+b_{\mathrm{attn}}\right) \tag{1}
e
i
t
=
v
T
tanh
(
W
h
h
i
+
W
s
s
t
+
b
a
t
t
n
)
(
1
)
a
t
=
softmax
(
e
t
)
(2)
a^{t}=\operatorname{softmax}\left(e^{t}\right) \tag{2}
a
t
=
s
o
f
t
m
a
x
(
e
t
)
(
2
)
h
t
∗
=
∑
i
a
i
t
h
i
(3)
h_{t}^{*}=\sum_{i} a_{i}^{t} h_{i}\tag{3}
h
t
∗
=
i
∑
a
i
t
h
i
(
3
)
P
vocab
=
softmax
(
V
′
(
V
[
s
t
,
h
t
∗
]
+
b
)
+
b
′
)
(4)
P_{\text {vocab }}=\operatorname{softmax}\left(V^{\prime}\left(V\left[s_{t}, h_{t}^{*}\right]+b\right)+b^{\prime}\right) \tag{4}
P
vocab
=
s
o
f
t
m
a
x
(
V
′
(
V
[
s
t
,
h
t
∗
]
+
b
)
+
b
′
)
(
4
)
同时该模型还结合了pointer network,可以直接从输入文本中复制一些词。pointer network输出的是针对输入序列的概率分布(图1中的蓝色柱状图)
为了更好的结合这两种概率分布,本文引入
p
gen
p_{\text {gen }}
p
gen
来进行soft选择,计算公式如下,用来决定当前预测是从输入文本中复制一个词还是从词汇表中生成一个词
p
gen
=
σ
(
w
h
∗
T
h
t
∗
+
w
s
T
s
t
+
w
x
T
x
t
+
b
p
t
r
)
(5)
p_{\text {gen }}=\sigma\left(w_{h^{*}}^{T} h_{t}^{*}+w_{s}^{T} s_{t}+w_{x}^{T} x_{t}+b_{\mathrm{ptr}}\right) \tag{5}
p
gen
=
σ
(
w
h
∗
T
h
t
∗
+
w
s
T
s
t
+
w
x
T
x
t
+
b
p
t
r
)
(
5
)
最后利用公式6将两部分概率分布结合在一起得到最终概率分布,前部分考虑了从词汇表中生成词的概率,如果该词不在词表中,这部分为0,后部分考虑了从输入序列中复制词的概率,如果该词没有在输入文本中出现,这部分为0,这里的累加符号是考虑到了该词的所有出现。
P
(
w
)
=
p
gen
P
vocab
(
w
)
+
(
1
−
p
gen
)
∑
i
:
w
i
=
w
a
i
t
(6)
P(w)=p_{\text {gen }} P_{\text {vocab }}(w)+\left(1-p_{\text {gen }}\right) \sum_{i: w_{i}=w} a_{i}^{t} \tag{6}
P
(
w
)
=
p
gen
P
vocab
(
w
)
+
(
1
−
p
gen
)
i
:
w
i
=
w
∑
a
i
t
(
6
)
使用负对数似然函数作为损失函数,计算公式如下:
loss
t
=
−
log
P
(
w
t
∗
)
(7)
\operatorname{loss}_{t}=-\log P\left(w_{t}^{*}\right) \tag{7}
l
o
s
s
t
=
−
lo
g
P
(
w
t
∗
)
(
7
)
loss
=
1
T
∑
t
=
0
T
loss
t
(8)
\operatorname{loss}=\frac{1}{T} \sum_{t=0}^{T} \operatorname{loss}_{t} \tag{8}
l
o
s
s
=
T
1
t
=
0
∑
T
l
o
s
s
t
(
8
)
Coverage mechanism
引入coverage机制来解决重复问题,主要思想为:每次预测的时候我们都会得到概率分布,这个就反映了模型对源文本各个元素的注意程度(概率越高的部分被认为得到越多的注意力),如果模型在预测时总是注意相同的部分,那么就很有可能会预测出相同的单词,因此为了防止这种情况发生,我们就强迫模型多去关注之前没被注意过的元素
根据公式9计算coverage向量,表示在预测t时刻的单词时,先看看前t-1个时刻源文本的被关注程度
c
t
=
∑
t
′
=
0
t
−
1
a
t
′
(9)
c^{t}=\sum_{t^{\prime}=0}^{t-1} a^{t^{\prime}} \tag{9}
c
t
=
t
′
=
0
∑
t
−
1
a
t
′
(
9
)
将coverage向量作为注意力机制输入的一部分,调整注意力,避免注意力机制重复的关注同一位置,减少生成文本的重复。
e
i
t
=
v
T
tanh
(
W
h
h
i
+
W
s
s
t
+
w
c
c
i
t
+
b
a
t
t
n
)
(10)
e_{i}^{t}=v^{T} \tanh \left(W_{h} h_{i}+W_{s} s_{t}+w_{c} c_{i}^{t}+b_{\mathrm{attn}}\right) \tag{10}
e
i
t
=
v
T
tanh
(
W
h
h
i
+
W
s
s
t
+
w
c
c
i
t
+
b
a
t
t
n
)
(
1
0
)
最后在pointer-generator的loss的基础上,附加一个coverage loss,惩罚重复的生成,计算公式如下
covloss
t
=
∑
i
min
(
a
i
t
,
c
i
t
)
(11)
\text { covloss }_{t}=\sum_{i} \min \left(a_{i}^{t}, c_{i}^{t}\right) \tag{11}
covloss
t
=
i
∑
min
(
a
i
t
,
c
i
t
)
(
1
1
)
loss
t
=
−
log
P
(
w
t
∗
)
+
λ
∑
i
min
(
a
i
t
,
c
i
t
)
(13)
\operatorname{loss}_{t}=-\log P\left(w_{t}^{*}\right)+\lambda \sum_{i} \min \left(a_{i}^{t}, c_{i}^{t}\right) \tag{13}
l
o
s
s
t
=
−
lo
g
P
(
w
t
∗
)
+
λ
i
∑
min
(
a
i
t
,
c
i
t
)
(
1
3
)
Code
https://github.com/abisee/pointer-generator
(tensorflow 原始代码)
https://github.com/atulkum/pointer_summarizer
(pytorch)
Reference
Get To The Point: Summarization with Pointer-Generator Networks
Pointer Networks简介及其应用