本文是ACL2021论文,作者来自清华大学。
ACL论文主页:<https://aclanthology.org/2021.acl-long.356/<
ArXiv网址:https://arxiv.org/abs/2106.15135
1. 模型构造思路
本文的研究任务是维基百科摘要生成(Wikipedia abstract generation),从网上海量文本信息中生成维基百科摘要(即图中红色框部分)。
相当于多文档摘要+生成式摘要
本文将维基百科摘要视为对一个实体(entity)的描述,可以分解为不同的主题(topic)(如animal类实体的描述,可以分解为distribution、taxonomy、description等topic。每个topic对应多个维基百科内容中的小标题(section label)。具体的topic划分和section label与topic的对应关系见后文4.2部分对数据集的描述)。
以Arctic Fox的维基百科举例:
图中左半部分是Arctic Fox的维基百科摘要,包含一个动物的3个正交的主题(颜色对应)。
本文所用的topic是根据实体的domain(Wikipedia categories)得到的。
本文认为,这个topic信息很重要,所以提出了两阶段的模型TWAG(two-stage Topic-guided Wikipedia Abstract Generation model),使用主题信息指导摘要生成。
第一步topic detection:识别输入原文中每一个自然段属于哪一个主题(这个分类器(classifier-based topic detector)通过已有的Wikipedia文章生成)
第二步:sentence-wise生成摘要:预测摘要每一句的主题分布(topic distribution),以得到对应的topic-aware representation,用Pointer-Generator network1从中生成摘要句子。
本文提出的下一步研究方向是在topic-aware abstract generator模块应用预训练模型,并将topic-aware model应用到其他富含主题信息的领域(如体育比赛报道)。
2. 问题定义与模型介绍
2.1 通用的Wikipedia abstract generation
输入文档可以用不同粒度的textual units表示,本文中选取的粒度是自然段,因为它能表示相对完整、紧凑的语义信息。
输入文档
D
=
{
d
1
,
d
2
,
.
.
.
,
d
n
}
\mathcal{D}=\{d_1, d_2, . . . , d_n\}
D={d1,d2,...,dn}(n个自然段)
输出Wikipedia abstract S = { s 1 , s 2 , … , s m } \mathcal{S}=\{s_1,s_2,\dots,s_m\} S={s1,s2,…,sm}(m个句子)
任务目标:找到optimal abstract
S
∗
\mathcal{S}^*
S∗(原话是“最好地总结输入”,我认为按照下式也可以直观地理解为“给定输入,可能性最大的摘要”,“靠近真实摘要”):
S
∗
=
arg max
S
P
(
S
∣
D
)
\mathcal{S}^*=\argmax_SP(\mathcal{S}|\mathcal{D})
S∗=argmaxSP(S∣D)
2.2 基于topic的Wikipedia abstract generation
每个Wikipedia文章由abstract, the content table(section label
{
l
}
\{l\}
{l}), and textual contents(与content table对应的
{
p
}
\{p\}
{p})组成,abstract在语义上与section label指示的topics对应。
由于不同维基百科文章的content table不同,因此不便直接用section label,所以特定域都选用了共有的topics(合并相似section labels)。
topic集合
T
=
{
T
1
,
T
2
,
…
,
T
n
t
}
\mathcal{T}=\{T_1,T_2,\dots,T_{n_t}\}
T={T1,T2,…,Tnt}(
n
t
n_t
nt个topic),每个topic
T
i
=
{
l
i
1
,
l
i
2
,
…
,
l
i
m
}
T_i=\{l_i^1,l_i^2,\dots,l_i^m\}
Ti={li1,li2,…,lim}
对于输入文档
D
\mathcal{D}
D,每个自然段都对应一个隐主题(latent topic):
Z
=
{
z
1
,
z
2
,
…
,
z
n
}
\mathcal{Z}=\{z_1,z_2,\dots,z_{n}\}
Z={z1,z2,…,zn},其中
z
i
∈
T
z_i\in\mathcal{T}
zi∈T,是
d
i
d_i
di 的主题。
则我们的Wikipedia abstract generation任务目标可以重写为:
S
∗
=
arg max
Z
P
(
Z
∣
D
)
arg max
S
P
(
S
∣
D
,
Z
)
\mathcal{S}^*=\argmax_ZP(\mathcal{Z}|\mathcal{D})\argmax_SP(\mathcal{S}|\mathcal{D,Z})
S∗=argmaxZP(Z∣D)argmaxSP(S∣D,Z)
这样,这个任务就可以分解为topic detection(最大化 arg max Z P ( Z ∣ D ) \argmax_ZP(\mathcal{Z}|\mathcal{D}) argmaxZP(Z∣D))和topic-aware abstract generation(最大化 arg max S P ( S ∣ D , Z ) \argmax_SP(\mathcal{S}|\mathcal{D,Z}) argmaxSP(S∣D,Z))
2.3 TWAG模型
模型示意图:
图中示例的domain有3个主题。
左边部分是topic detector,判断每个输入自然段所属的主题。
右边部分是 topic-aware abstract generator,基于输入自然段(根据检测出的section进行分组为topic-specific text group (TTG)
G
k
\mathcal{G}_k
Gk)和对应主题逐句生成摘要:先预测该句的topic distribution,将其与全局hidden state融合,得到topic-aware representation,用copy-based decoder生成该句话。
2.3.1 topic detector
将该任务视为分类任务,表示为
Z
=
Det
(
D
)
\mathcal{Z}=\text{Det}(\mathcal{D})
Z=Det(D)。
具体的实现为:用ALBERT2进行编码,然后用一层全连接网络进行分类任务:
d
=
ALBERT
(
d
)
z
=
arg max
(
linear
(
d
)
)
\begin{aligned} \mathbf{d} & =\text{ALBERT}(d) \\ z & =\argmax\big(\text{linear}(d)\big) \end{aligned}
dz=ALBERT(d)=argmax(linear(d))
(
d
\mathbf{d}
d 是
d
d
d 的表示向量,ALBERT模型经过微调)
2.3.2 Topic-aware Abstract Generation
2.3.2.1 Topic Encoder
通过输入文档,对主题(topical representations)和每个token进行表征。
G
k
\mathcal{G}_k
Gk 包含了一个实体特定主题的显著信息:
G
k
=
concat
(
{
d
i
∣
z
i
=
T
k
}
)
\mathcal{G}_k=\text{concat}\Big(\big\{d_i|z_i=T_k\big\}\Big)
Gk=concat({di∣zi=Tk})
为了进一步捕获隐含语义信息(hidden semantics):
g
k
,
U
k
=
BiGRU
(
G
k
)
\mathbf{g}_k,\mathbf{U}_k=\text{BiGRU}\big(\mathcal{G}_k\big)
gk,Uk=BiGRU(Gk)(
g
k
\mathbf{g}_k
gk 是
G
k
\mathcal{G}_k
Gk 的final hidden state,
U
k
=
(
u
1
,
u
2
,
…
,
u
n
G
k
)
\mathbf{U}_k=(\mathbf{u}_1,\mathbf{u}_2,\dots,\mathbf{u}_{n_{G_k}})
Uk=(u1,u2,…,unGk) 是
G
k
\mathcal{G}_k
Gk 每个token的hidden state,
n
G
k
n_{G_k}
nGk 是
G
k
\mathcal{G}_k
Gk 中的token数)
2.3.2.2 Topic Predictor
预测摘要句的topic distribution,生成topic-aware sentence representation。
逐句:
arg max
S
P
(
S
∣
D
,
Z
)
=
∏
i
=
1
m
arg max
s
i
P
(
s
i
∣
D
,
Z
,
s
<
i
)
\argmax_SP(\mathcal{S}|\mathcal{D,Z})=\prod^m_{i=1}\argmax_{s_i}P(s_i|\mathcal{D,Z,s_{<i}})
SargmaxP(S∣D,Z)=i=1∏msiargmaxP(si∣D,Z,s<i)
第一步:用GRU decoder生成每一句的主题分布
e
t
\mathbf{e}_{t}
et。
在每一个time stamp
t
t
t,生成全局hidden state
h
t
\mathbf{h}_t
ht,然后估算主题上的概率分布
q
t
\mathbf{q}_t
qt:
h
t
=
GRU
(
h
t
−
1
,
e
t
−
1
)
q
t
=
softmax
(
linear
(
h
t
)
)
\begin{aligned} \mathbf{h}_t&=\text{GRU}(\mathbf{h}_{t-1},\mathbf{e}_{t-1})\\ \mathbf{q}_t&=\text{softmax}\big(\text{linear}(\mathbf{h}_t)\big) \end{aligned}
htqt=GRU(ht−1,et−1)=softmax(linear(ht))
h
0
\mathbf{h}_0
h0看代码(TWAG/src/c_generate_soft/model.py第241行左右)是通过2.3.2.1 topic encoder输出的。具体怎么做的我还没看。
e
t
−
1
\mathbf{e}_{t-1}
et−1 是上一步的topical information,
e
0
\mathbf{e}_{0}
e0 初始化为全0向量。
从
q
t
\mathbf{q}_t
qt 中得到
e
t
\mathbf{e}_{t}
et 有两种方式:
① hard topic:直接选择概率最大的主题作为该句主题,使用对应的topical representation作为该句的主题分布:
e
t
h
a
r
d
=
g
arg max
i
(
q
i
)
\mathbf{e}_t^{hard}=\mathbf{g}_{\argmax_i(q_i)}
ethard=gargmaxi(qi)
② soft topic:将每句话视为各个主题的融合体,用各主题的topical representation的加权求和作为该句的主题分布:
e
t
s
o
r
t
=
q
t
⋅
G
\mathbf{e}_t^{sort}=\mathbf{q}_t\cdot\mathbf{G}
etsort=qt⋅G(其中
G
=
(
g
1
,
g
2
,
…
,
g
n
t
)
\mathbf{G}=(\mathbf{g}_1,\mathbf{g}_2,\dots,\mathbf{g}_{n_t})
G=(g1,g2,…,gnt) 是topical representations组成的矩阵)
(最终本文选择soft topic。一是因为在语义上,摘要每句话会含有多个主题的信息;二见后文ablation study部分实验结果证明soft topic效果更好)
第二步:得到topic-aware representation(hidden state) r t = h t + e t \mathbf{r}_t=\mathbf{h}_t+\mathbf{e}_t rt=ht+et
每一步会运行一次stop confirmation:
p
s
t
o
p
=
σ
(
linear
(
h
t
)
)
p_{stop}=σ\big(\text{linear}(h_t)\big)
pstop=σ(linear(ht))(其中 σ 是sigmoid函数)
如果
p
s
t
o
p
>
0.5
p_{stop}>0.5
pstop>0.5,TWAG就会停止解码。
2.3.2.3 Sentence Decoder
基于topic-aware representations生成摘要中的该句话。
PGN1同时从输入文档和词表中选择token。
从输入文档中复制token:
decoder需要token-wise hidden states
U
=
(
u
1
,
u
2
,
…
,
u
n
u
)
\mathbf{U}=(\mathbf{u}_1,\mathbf{u}_2,\dots,\mathbf{u}_{n_{u}})
U=(u1,u2,…,unu)(
n
u
n_u
nu 是输入token数)(通过concat所有TTG的token-wise hidden states得到:
U
=
[
U
1
,
U
2
,
…
,
U
n
u
]
\mathbf{U}=[\mathbf{U}_1,\mathbf{U}_2,\dots,\mathbf{U}_{n_u}]
U=[U1,U2,…,Unu])
对句子的第
k
k
k个token,decoder计算所有输入自然段上的 attention distribution
a
k
\mathbf{a}_k
ak,
a
k
\mathbf{a}_k
ak的每个元素
a
k
i
\mathbf{a}_k^i
aki是输入自然段中token
i
i
i被选择的概率:
a
k
i
=
softmax
(
tanh
(
W
u
u
i
+
W
s
s
k
+
b
a
)
)
\mathbf{a}_k^i=\text{softmax}\big(\text{tanh}(\mathbf{W}_u\mathbf{u}_i+\mathbf{W}_s\mathbf{s}_k+\mathbf{b}_a)\big)
aki=softmax(tanh(Wuui+Wssk+ba))(其中
s
k
\mathbf{s}_k
sk是decoder hidden state,
s
0
=
r
t
\mathbf{s}_0=\mathbf{r}_t
s0=rt (topic-aware representation),
W
u
,
W
s
,
b
a
\mathbf{W}_u,\mathbf{W}_s,\mathbf{b}_a
Wu,Ws,ba 是可训练的参数)
从词表中生成token:
用attention mechanism计算context vector(encoder hidden states的加权求和):
c
k
∗
=
∑
i
a
k
i
u
i
\mathbf{c}_k^*=\sum\limits_i\mathbf{a}_k^i\mathbf{u}_i
ck∗=i∑akiui
将该向量传入一个新的2层神经网络得到词表上的probability distribution:
P
v
o
c
=
softmax
(
linear
(
linear
(
[
s
k
,
c
k
∗
]
)
)
)
P_{voc}=\text{softmax}\Bigg(\text{linear}\bigg(\text{linear}\Big(\big[\mathbf{s}_k,\mathbf{c}_k^*\big]\Big)\bigg)\Bigg)
Pvoc=softmax(linear(linear([sk,ck∗])))
在两种机制间转换:
p
g
e
n
=
σ
(
W
c
T
c
k
∗
+
W
s
T
s
k
+
W
x
T
x
k
+
b
p
)
p_{gen}=\sigma\big(\mathbf{W}_c^T\mathbf{c}_k^*+\mathbf{W}_s^T\mathbf{s}_k+\mathbf{W}_x^T\mathbf{x}_k+\mathbf{b}_p\big)
pgen=σ(WcTck∗+WsTsk+WxTxk+bp)(其中
x
k
\mathbf{x}_k
xk是decoder输入,
σ
\sigma
σ是sigmoid函数,
W
c
T
,
W
s
T
,
W
x
T
,
b
p
\mathbf{W}_c^T,\mathbf{W}_s^T,\mathbf{W}_x^T,\mathbf{b}_p
WcT,WsT,WxT,bp 是可训练的参数)
最终的probability distribution是:
P
(
w
)
=
p
g
e
n
P
v
o
c
(
w
)
+
(
1
−
p
g
e
n
)
∑
i
:
w
w
i
=
w
a
k
i
P(w)=p_{gen}P_{voc}(w)+(1-p_{gen})\sum\limits_{i:ww_i=w}\mathbf{a}_k^i
P(w)=pgenPvoc(w)+(1−pgen)i:wwi=w∑aki(其中
w
w
i
ww_i
wwi是
u
i
\mathbf{u}_i
ui对应的token)
2.3.3 训练
topic detection和abstract generation的模块是分开训练的。
2.3.3.1 Topic Detector Training
数据集构建见本博文4.2数据集部分介绍。
本文使用negative loglikelihood损失函数。
2.3.3.2 Abstract Generator Training
topic-aware abstract generation部分的损失函数由两部分构成:①sentence decoder对每一句摘要的损失函数 L s e n t \mathcal{L}_{sent} Lsent 的平均值。②stop confirmation的交叉熵损失函数 L s t o p \mathcal{L}_{stop} Lstop
①参考1,本文使用该句每个目标单词的negative log likelihood的平均值: L s e n t = 1 m ∑ t = 1 m ( 1 n s t ∑ i = 1 n s t − log P ( w i ) ) \mathcal{L}_{sent}=\dfrac{1}{m}\sum\limits_{t=1}^m\Big(\dfrac{1}{n_{s_t}}\sum\limits_{i=1}^{n_{s_t}}-\log P(w_i)\Big) Lsent=m1t=1∑m(nst1i=1∑nst−logP(wi))(其中 m m m是句子数, n s t n_{s_t} nst是摘要第 t t t 句的长度)
②
L
s
t
o
p
=
−
y
s
log
p
s
t
o
p
−
(
1
−
y
s
)
log
(
1
−
p
s
t
o
p
)
\mathcal{L}_{stop}=-y_s\log p_{stop}-(1-y_s)\log(1-p_{stop})
Lstop=−yslogpstop−(1−ys)log(1−pstop)
当
t
>
m
t>m
t>m 即应该停止生成摘要句子时,
y
s
=
1
y_s=1
ys=1,反之
y
s
=
0
y_s=0
ys=0
3. 模型原理
- 为什么不用基于图的表示学习方法做抽取式摘要:因为从各种来源收集到的输入文档往往有噪音,并缺乏内在联系3,因此难以构建relation graph。(introduction)
- 用topic生成摘要的好处:减少冗余,使内容更完整。(introduction)
- 本文的任务是生成紧凑的摘要,因此需要对topic进行fusion、理解topics之间的关联与差异(topic distribution),而非使用独立的topics(见本博文2.3.2.1部分对软主题的介绍)。(Wikiasp: A dataset for multi-domain aspect-based summarization. 则是反例。该文献使用aspect作为术语)(Wikipedia-related Text Generation)
- 识别文本中的主题信息“模仿人类识别实体的方法”(conclusion)
4. 实验
4.1 baseline
- TF-S2S4:用Transformer decoder,用卷积层压缩自注意力机制里的键值对。
- CV-S2D+T5:用一个卷积encoder和2层hierarchical decoder,用LDA建模主题信息。
- HierSumm6:用注意力机制建模自然段间关系,用图加强文档的表示学习。
- BART7:预训练的seq2seq模型。
4.2 数据集
本文使用的数据集是WikiCatSum5。
该数据集是WikiSum的子数据集。含有Wikipedia中的3个域:Company, Film and Animal
每个域的数据集划分比例都是train (90%), validation (5%) and test (5%)
删除了文章中的超链接和图像。用spaCy包划分自然段。经下述处理后最终得到的数据集划分比例是8:1:1。
对于topic detection阶段的标签构建,本文首先将已有的维基百科文章(2019-07-01)构建为 section label : textual contents { l : p } \{l:p\} {l:p} 形式,然后将textual contents分解为自然段 p = ( d 1 , d 2 , … , d n p ) p=(d_1,d_2,\dots,d_{n_p}) p=(d1,d2,…,dnp),这样数据集就变成了label-paragraph对 { l : d } \{l:d\} {l:d},然后再把同一topic的label合并(对每个域,选择了 n t = 20 n_t=20 nt=20个最常出现的label,手动将其分配给各主题。Reference或Notes等缺乏语义信息的label被丢弃。下图是分配表),这样数据集就变成了topic-paragraph对 { T : d } \{T:d\} {T:d}。
(不同颜色代表不同
n
t
n_t
nt时选择的label)
此外,每个域还专门构建了一个NOISE主题,指没用的部分(如scripts或广告),这一部分是通过正则表达式提取的,如含有“cookie”,“href”
或看起来像reference。
经处理后得到的最终的数据集信息:
用于摘要生成的数据则是非维基百科数据,以防数据泄露问题。
4.3 实验设置
代码使用PyTorch和transformers库,设备是NVIDIA GeForce RTX 2080。
topic detection阶段使用的预训练模型是transformers库的albert-base-v2,保持原参数,以3e-5为学习率训练了4个epoch。
abstract generation阶段用单层BiGRU将TTGs编码为512维的hidden states。输入文档保存开头400个tokens,转换为300维的GloVe8词向量。词表长度为50000,OOV token用其邻近10个tokens的平均嵌入表示。这个模块训练了10个epoch,第一个epoch的学习率是1e-4,其他的是1e-5。
在评估结果前,删除了所有与其他句重复超过50%的句子以减少冗余9。
需要beam search的模型,beam size都设置为5。
(Appendix B)使用BART-base,因为BART-large效果差(生成文本出现重复,损失函数下降慢),本文怀疑是因为过拟合。
4.4 实验结果
4.4.1 ROUGE10
本文所使用的评估指标是ROUGE F1 指标(原文给出的原因:因为没有限制摘要生成长度,所以用这个combines precision and recall to eliminate the tendency of favoring long or short results的指标)。
TF-S2S和HierSumm使用原文数据集的子集来训练得到的结果小于原文结果,本文作者认为可能因为数据不足,这也证明了TWAG模型的data-efficient。
案例分析:
4.4.2 human evaluation
此外参考10,本文构建了含有2部分内容的human evaluation:
4.4.2.1 QA
question-answering (QA),架构来自11,检查摘要中的factoid信息,根据不同的真实摘要,每个样例创造2-5个问题,问题示例:
(全部的评估集合在论文附带的GitHub项目中,待补)
从每个域抽取了15个样例,共45个来做human evaluation。
选了3名参与人员以自动生成的摘要作为背景知识来回答问题。能回答问题越多的摘要越好。
答案量化打分:正确答案——1,部分正确答案——0.5,错误答案——0.1,无法回答——0。
(对0.1的解释:Notice that we give a score of 0.1 even if the participants answer the question incorrectly, because a wrong answer indicates the summary covers a certain topic and is superior to missing information.)
结果:
(TF-S2S和HierSumm在域Film和Animal上表现很差可能是因为在小数据集上欠拟合)
4.4.4.2 linguistic quality
让参与人员从3个角度来阅读生成摘要并在1-5分间打分(分越高说明质量越高):
- Completeness (does the summary contain sufficient information?)
- Fluency (is the summary fluent and grammatical?)
- Succinctness12 (does the summary avoid redundant sentences?)
结果:
4.5 Ablation Study
4.5.1 Learning Rate of Topic Detector.
1e-7准确率高,但最终rouge值低,因此本文最终选择了3e-5。本文怀疑是因为学习率太低导致了过拟合。
4.5.2 Soft or Hard Topic.
4.5.3 Number of Section Labels.
section labels的频率符合长尾分布。
n
t
=
20
n_t=20
nt=20 得到的最终实验结果最好。
5. 代码实现和复现
5.1 论文官方实现
具体内容持续更新。
大略来说,步骤是分类(topic detection)→生成(abstract generation),可以解耦也可以端到端地运行。(我看了一下,这个端到端说的好像是代码一步把分类和生成两步都做完,本质上还是解耦的。但是我还没有仔细看,具体的待补)
5.1.1 分类
5.1.2 生成
TWAG/src/c_generate_soft/model.py:
BiGRUEncoder
:论文中的topic encoder,实现了一个BiGRU模型。
DocumentDecoder
:论文中的topic predictor,hidden
h
t
−
1
\mathbf{h}_{t-1}
ht−1 input
e
t
−
1
\mathbf{e}_{t-1}
et−1→decoder
(torch.nn.GRUCell
)→hidden_out
h
t
\mathbf{h}_t
ht→out_linear
(torch.nn.Linear
)→softmax
(torch.nn.Softmax
)→topic_dist
q
t
\mathbf{q}_t
qt
TopicDecodeModel
:整个生成部分。
预测每一句话的sent_hiddens
→avg_sent_hidden
(
e
t
\mathbf{e}_t
et)→h_0_sent=avg_sent_hidden+doc_hidden
(topic-aware representation
r
t
=
e
t
+
h
t
\mathbf{r}_t=\mathbf{e}_t+\mathbf{h}_t
rt=et+ht)
5.2 我自己写的复现
没写,待补。
Get to the point: Summarization with pointer-generator networks. ↩︎ ↩︎ ↩︎
Albert: A lite bert for self-supervised learning of language representations. ↩︎
Automatically Generating Wikipedia Articles: A Structure-Aware Approach ↩︎
Generating summaries with topic templates and structured convolutional decoders. ↩︎ ↩︎
Hierarchical transformers for multi-document summarization. ↩︎
Bart: Denoising sequence-to-sequence pretraining for natural language generation ↩︎
这个应该是因为生成式摘要里常见的重复问题。 ↩︎
Rouge: A package for automatic evaluation of summaries. ↩︎ ↩︎
简洁 ↩︎