诸神缄默不语-个人CSDN博文目录
本文是ACL2021论文,在ACL上的官方网页为:TWAG: A Topic-Guided Wikipedia Abstract Generator - ACL Anthology
PDF版会议论文下载地址为:https://aclanthology.org/2021.acl-long.356.pdf
ArXiv网址为:[2106.15135] TWAG: A Topic-Guided Wikipedia Abstract Generator
代码为:THU-KEG/TWAG: Code and dataset for the ACL 2021 paper “TWAG: A Topic-guided Wikipedia Abstract Generator”
本文的研究任务是维基百科摘要生成(Wikipedia abstract generation),从网上海量文本信息中生成维基百科摘要。
本文将维基百科摘要视为对一个实体(entity)的描述,可以分解为不同的主题(topic)(如animal类实体的描述,可以分解为distribution、taxonomy、description等topic。每个topic对应多个维基百科内容中的小标题(section label)。具体的topic划分和section label与topic的对应关系见后文4.2部分对数据集的描述)。
以Arctic Fox的维基百科举例:
图中左半部分是Arctic Fox的维基百科摘要,包含一个动物的3个正交的主题(颜色对应):Description, Taxonomy and Distribution。
右半部分是Arctic Fox是维基百科section label,分别与topic对应(颜色)。
本文所用的topic是根据实体的domain(Wikipedia categories)得到的。
本文提出的是两阶段的模型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应用到其他富含主题信息的领域(如体育比赛报道)。
输入文档可以用不同粒度的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∗=SargmaxP(S∣D)
每个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∗=ZargmaxP(Z∣D)SargmaxP(S∣D,Z)
这样,这个任务就可以分解为topic detection(最大化 arg max Z P ( Z ∣ D ) \argmax_ZP(\mathcal{Z}|\mathcal{D}) ZargmaxP(Z∣D))和topic-aware abstract generation(最大化 arg max S P ( S ∣ D , Z ) \argmax_SP(\mathcal{S}|\mathcal{D,Z}) SargmaxP(S∣D,Z))
模型示意图:
图中示例的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生成该句话。
(其实我觉得这个图画得还不够清晰,尤其是sentence decoder部分,感觉画得有些含混。文本说明部分我也有些半看不懂的。感觉可能需要看一下原版PGN和TWAG代码才能彻底搞懂)
将该任务视为分类任务,表示为 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模型经过微调)
通过输入文档,对主题(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数)
预测摘要句的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_{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=giargmax(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就会停止解码。
基于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)
topic detection和abstract generation的模块是分开训练的。
数据集构建见本博文4.2数据集部分介绍。
本文使用negative loglikelihood损失函数。
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
本文使用的数据集是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。
用于摘要生成的数据则是非维基百科数据,以防数据泄露问题。
代码使用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效果差(生成文本出现重复,损失函数下降慢),本文怀疑是因为过拟合。
本文所使用的评估指标是ROUGE F1 指标(原文给出的原因:因为没有限制摘要生成长度,所以用这个combines precision and recall to eliminate the tendency of favoring long or short results的指标)。
TF-S2S和HierSumm使用原文数据集的子集来训练得到的结果小于原文结果,本文作者认为可能因为数据不足,这也证明了TWAG模型的data-efficient。
此外参考10,本文构建了含有2部分内容的human evaluation:
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上表现很差可能是因为在小数据集上欠拟合)
让参与人员从3个角度来阅读生成摘要并在1-5分间打分(分越高说明质量越高):
1e-7准确率高,但最终rouge值低,因此本文最终选择了3e-5。本文怀疑是因为学习率太低导致了过拟合。
n t = 20 n_t=20 nt=20 得到的最终实验结果最好。
具体内容持续更新。
大略来说,步骤是分类(topic detection)→生成(abstract generation),可以解耦也可以端到端地运行。(我看了一下,这个端到端说的好像是代码一步把分类和生成两步都做完,本质上还是解耦的。但是我还没有仔细看,具体的待补)
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)
没写,待补。
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 wikipedia by summarizing long sequences. ↩︎
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 ↩︎
GloVe: Global vectors for word representation. ↩︎
这个应该是因为生成式摘要里常见的重复问题。 ↩︎
Rouge: A package for automatic evaluation of summaries. ↩︎ ↩︎
Discourse constraints for document compression. ↩︎
简洁 ↩︎