Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator

诸神缄默不语-个人CSDN博文目录

本文是ACL2021论文,作者来自清华大学。

ACL论文主页:<https://aclanthology.org/2021.acl-long.356/<
ArXiv网址:https://arxiv.org/abs/2106.15135

官方GitHub项目:THU-KEG/TWAG: Code and dataset for the ACL 2021 paper “TWAG: A Topic-guided Wikipedia Abstract Generator”

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(SD)

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} ziT,是 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(ZD)argmaxSP(SD,Z)

这样,这个任务就可以分解为topic detection(最大化 arg max ⁡ Z P ( Z ∣ D ) \argmax_ZP(\mathcal{Z}|\mathcal{D}) argmaxZP(ZD))和topic-aware abstract generation(最大化 arg max ⁡ S P ( S ∣ D , Z ) \argmax_SP(\mathcal{S}|\mathcal{D,Z}) argmaxSP(SD,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({dizi=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(SD,Z)=i=1msiargmaxP(siD,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(ht1,et1)=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} et1 是上一步的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=qtG(其中 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=iakiui
将该向量传入一个新的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)+(1pgen)i:wwi=waki(其中 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=1m(nst1i=1nstlogP(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(1ys)log(1pstop)
t > m t>m t>m 即应该停止生成摘要句子时, y s = 1 y_s=1 ys=1,反之 y s = 0 y_s=0 ys=0

3. 模型原理

  1. 为什么不用基于图的表示学习方法做抽取式摘要:因为从各种来源收集到的输入文档往往有噪音,并缺乏内在联系3,因此难以构建relation graph。(introduction)
  2. 用topic生成摘要的好处:减少冗余,使内容更完整。(introduction)
  3. 本文的任务是生成紧凑的摘要,因此需要对topic进行fusion、理解topics之间的关联与差异(topic distribution),而非使用独立的topics(见本博文2.3.2.1部分对软主题的介绍)。(Wikiasp: A dataset for multi-domain aspect-based summarization. 则是反例。该文献使用aspect作为术语)(Wikipedia-related Text Generation)
  4. 识别文本中的主题信息“模仿人类识别实体的方法”(conclusion)

4. 实验

4.1 baseline

  1. TF-S2S4:用Transformer decoder,用卷积层压缩自注意力机制里的键值对。
  2. CV-S2D+T5:用一个卷积encoder和2层hierarchical decoder,用LDA建模主题信息。
  3. HierSumm6:用注意力机制建模自然段间关系,用图加强文档的表示学习。
  4. 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} ht1 input e t − 1 \mathbf{e}_{t-1} et1decodertorch.nn.GRUCell)→hidden_out h t \mathbf{h}_t htout_lineartorch.nn.Linear)→softmaxtorch.nn.Softmax)→topic_dist q t \mathbf{q}_t qt

TopicDecodeModel:整个生成部分。
预测每一句话的sent_hiddensavg_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 我自己写的复现

没写,待补。


  1. Get to the point: Summarization with pointer-generator networks. ↩︎ ↩︎ ↩︎

  2. Albert: A lite bert for self-supervised learning of language representations. ↩︎

  3. Automatically Generating Wikipedia Articles: A Structure-Aware Approach ↩︎

  4. Generating wikipedia by summarizing long sequences. ↩︎

  5. Generating summaries with topic templates and structured convolutional decoders. ↩︎ ↩︎

  6. Hierarchical transformers for multi-document summarization. ↩︎

  7. Bart: Denoising sequence-to-sequence pretraining for natural language generation ↩︎

  8. GloVe: Global vectors for word representation. ↩︎

  9. 这个应该是因为生成式摘要里常见的重复问题。 ↩︎

  10. Rouge: A package for automatic evaluation of summaries. ↩︎ ↩︎

  11. Discourse constraints for document compression. ↩︎

  12. 简洁 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值