Pointer Network发展与应用

Pointer Network发展与应用

1. Pointer Network(Ptr-Nets)

论文:Pointer Networks

传统的 Seq2Seq 模型中 Decoder 输出的目标数量是固定的,例如翻译时 Decoder 预测的目标数量等于字典的大小。这导致 Seq2Seq 不能用于一些组合优化的问题,例如凸包问题(Convex Hull ),三角剖分(Delaunay Triangulation ),旅行商问题 (TSP) 等。Pointer Network 可以解决输出字典大小可变的问题,Pointer Network 的输出字典大小等于 Encoder 输入序列的长度并修改了 Attention 的方法,根据 Attention 的值从 Encoder 的输入中选择一个作为 Decoder 的输出。

1.1 Why Pointer Network?

提出Pointer Network的动机是什么?

需要先回顾Review : Seq2Seq + Attention

传统的seq2seq+attention会根据 Attention 值融合 Encoder 的每一个时刻的输出,然后和 Decoder 当前时刻的输出混在一起再预测输出。如下面的公式所示,其中\(e_j\)是Encoder的隐状态,\(d_i\)是Decoder的隐状态,\(v,W_1,W_2\)都是可学习的参数。

\[\begin{aligned} u_{j}^{i}&=v^{T}tanh(W_{1}e_j+W_{2}d_i) \quad j\in(1,\dots,n) \\ a_{j}^{i}&=softmax(u_{j}^{i})\quad\qquad\qquad j\in(1,\dots,n) \\ d_{i}^{'}&=\sum_{j=1}^{n}a_{j}^{i}e_j \end{aligned} \]

Attention机制三步骤:

  1. 编码器和解码器对每个单词的embedding,做权重和之后输入到tanh激活函数,来求编码器和解码器的单词embedding的相似性;
  2. 归一化;
  3. 求权重和 . 求得的值就是attention权重。每当Decoder生成一个单词的时候,都会考虑不同权重的Input。

通过Attention Mechanism将encoder的隐状态和decoder的隐状态结合成一个中间向量C,然后使用decoder解码并预测,最后经由softmax层得到了针对词汇表的概率分布,从中选取概率最高的作为当前预测结果。

传统的seq2seq模型是无法解决输出序列的词汇表会随着输入序列序列长度的改变而改变的问题。

如寻找凸包(Convex Hull )等。因为对于这类问题,输出往往是输入集合的子集。基于这种特点,作者考虑能不能找到一种结构类似编程语言中的指针,每个指针对应输入序列的一个元素,从而我们可以直接操作输入序列而不需要特意设定输出词汇表。

1.2 Structure of Pointer Network

为啥叫pointer network呢?对于凸包的求解,就是从输入序列\({\cal P_1,....,\cal P_{1000}}\)中选点的过程。选点的方法就叫pointer,它不像attention mechanism将输入信息通过encoder整合成context vector,而是将attention转化为一个pointer,来选择原来输入序列中的元素。

Pointer Network 对注意力模型的简单修改,用于解决输出序列的大小取决于输入序列中元素的数量这个问题。

Pointer Network 计算 Attention 值之后不会把 Encoder 的输出融合,而是将 Attention 作为输入序列\(\cal P\)中每一个位置输出的概率。

\[\begin{aligned} u_{j}^{i}&=v^{T}tanh(W_{1}e_j+W_{2}d_i) \quad j\in(1,\dots,n) \\ p(C_i|C_1,C_2,\dots,C_{i-1},\cal P)&=softmax(u^{i}) \end{aligned} \]

Pointer Network三步骤:

  1. 编码器和解码器对每个单词做embedding,求其权重和之后输入到tanh激活函数,来求编码器和解码器的单词的embedding相似性 ;
  2. 归一化;
  3. 将前\(i-1\)个输出的单词和Attention权重作为条件概率,来生成第\(i\)个单词。

这种方法专门针对输出离散且与输入位置相对应的问题。这种方法适用于可变大小的输入产生可变大小的输出序列)。 本质上,input Sequence里对生成第i个单词的影响(相似性,相关性)越大,权重就越大。

Pointer Network 和 Seq2Seq 的区别:

  • Seq2Seq 的 Decoder 会预测每一个位置的输出 (但是输出目标的数量是固定的);而 Pointer Network 的 Decoder 直接根据 Attention 得到输入序列中每一个位置的概率,取概率最大的输入位置作为当前输出。

  • seq2seq需要遍历全局词表,可能出现OOV问题;而Pointer Network 无需遍历全局词表,只需遍历source text(input sequence),输出的也是input sequence中出现的单词,避免OOV。

1.3 How to process language generation by incorporating Pointer Network ?

Pointer network 主要用在解决组合优化类问题(TSP, Convex Hull等等),实际上是Sequence to Sequence learning中encoder RNN和decoder RNN的扩展,主要解决的问题是输出的字典长度不固定问题(输出字典的长度等于输入序列的长度)。

  • Pointer Network 解决的是一个全集->子集的问题;遍历全局词表->遍历source text。
  • 在文本生成中,seq2seq本质:Encoder做输入序列的信息表征,Decoder是language model生成文本,遍历全局词表,比较自由灵活但不可控(出现OOV)。
  • 在文本生成中,Pointer Network相对可控,信息来源于输入的信息范围(source text)。例如seq2seq中会出现input sequence中某一个词无法由词表表示(OOV),但Pointer Network会定位到input sequence中那个词的位置,不需要遍历词表,直接输出输入中的那个词。
  • Pointer Network的优势:天生的复制粘贴器。
  • idea:generate combining language model with Pointer Networks ,通过Pointer Network的优势解决复制粘贴、OOV、输入序列长度问题等。

2. Ptr-Nets扩展——Pointer-Generator Networks

论文:Get To The Point: Summarization with Pointer-Generator Networks

发表机构:ACL 2017

源码:https://github.com/abisee/pointer-generator

指针生成网络其实是PointerNetwork的延续,应用于摘要生成任务中。该网络使用generator保留了其生成能力的同时,用pointer从原文中Copy那些OOV词来保证信息正确的重复。原文更为重要的创新点是应用了coverage mechanism来解决了seq2seq的通病--repitition,这个机制可以避免在同一位置重复,也因此避免重复生成文本。

2.1 Baseline seq2seq attention model

Pointer-Generator Networks是在Baseline sequence-to-sequence模型的基础上构建的。

Baseline seq2seq 的Encoder是一个双向LSTM,可以捕捉原文本的长距离依赖关系以及位置信息;编码时词嵌入经过双向LSTM后得到编码隐状态\(h_i\);Decoder是一个单向LSTM,训练阶段时参考摘要词依次输入(测试阶段时是上一步的生成词),在时间步\(t\)得到解码隐状态\(s_t\)。使用\(h_i\)\(s_t\)得到该时间步原文第\(i\)个词注意力权重:

\[\begin{aligned} e_{i}^{t}&=v^Ttanh(W_hh_i+W_ss_t+b_{attn})\\ a^t&=softmax(e^t) \end{aligned} \]

上下文向量(context vector)\(h_{t}^{*}\)

\[h_{t}^{*}=\sum_{i}a_{i}^{t}h_i \]

\(h_{t}^{*}\)可以看成是该时间步通读了原文的固定尺寸的表征。然后将 \(s_t\)\(h_{t}^{*}\)经过两层线性层得到单词表分布\(P_{vocab}\)

\[P_{vocab}=softmax(V'(V[s_t,h_{t}^{*}]+b)+b') \]

其中\([s_t,h_{t}^{*}]\)是拼接。这样得到了一个softmax的概率分布,可以预测需要生成的词:

\[P(w)=P_{vocab}(w) \]

在训练阶段,时间步\(t\)的损失:

\[loss_t=-logP(w_{t}^{*}) \]

那么source text的整体损失为:

\[loss = \frac{1}{T}\sum_{t=0}^{T}loss_t \]

2.2 Pointer-generator network

Pointer-Generator Networks是一个混合了 Baseline seq2seq和PointerNetwork的网络,它具有Baseline seq2seq的生成能力和PointerNetwork的Copy能力。如何权衡一个词应该是生成的还是复制的?原文中引入了一个权重\(p_{gen}\)

\(p_{gen}\)的计算用到了baseline seq2seq中的Decoder隐状态\(s_t\)、context vector \(h_{t}^{*}\)和Decoder输入\(x_t\)

\[p_{gen}=\sigma(w_{h_{t}^{*}}^{T}h_{t}^{*}+w_{s}^{T}s_t+b_{ptr}) \]

此时,会扩充词表形成一个更大的单词表——扩充词表(原词表+ source text),在时间步\(t\)预测词概率为:

\[P(w)=p_{gen}P_{vocab}(w)+(1-p_{gen})\sum_{i:w_i=w}a_{i}^{t} \]

在上图中,decoder生成单词的final distribution是由两个分布决定的,一个是由language model基于全局词表得到的vocabulary distribution(\(P_{vocab}\)),一个是Pointer network基于source text得到的attention distribution(\(a_{i}^{t}\)),两者通过一个可学习可变的\(p_{gen}\)加权,即decoder一个词的输出概率由它是否拷贝是否生成概率和决定。

对于OOV问题,如果一个词不出现在常规的词表上即\(P_{vocab}(w)=0\),那么就可以在source text上拷贝一个词;如果这个词不出现在source text中则\(\sum_{i:w_i=w}a_{i}^{t}=0\)

Considering a word \(w\) may appear multiple times in the input sequence S, we define the output distribution of word \(w\) by summing probability mass from all corresponding parts of the attention distribution, as in [38] :

\[p(y_t=w|S,y_{<t})=\sum_{i:w_i=w}a_{i}^{t} \]

如果source text中一个词出现多次,会累计attention distribution中该词出现的位置上的概率。

2.3 Coverage Mechanism

原文中最大的亮点就是运用了Coverage Mechanism来解决重复生成文本的问题,图3反映了前两个模型与添加了Coverage Mechanism生成摘要的结果:

蓝色的字体表示的是参考摘要,三个模型的生成摘要的结果差别挺大。红色字体表明了不准确的摘要细节生成(UNK未登录词,无法解决OOV问题),绿色的字体表明了模型生成了重复文本。为了解决此问题--Repitition,原文使用了在机器翻译中解决“过翻译”和“漏翻译”的机制--Coverage Mechanism(具体参考(邮递员小王:《Modeling Coverage for Neural Machine Translation》阅读笔记)。

具体实现上,就是将先前时间步的注意力权重加到一起得到所谓的覆盖向量 \(c^{t}\) (coverage vector),用先前的注意力权重决策来影响当前注意力权重的决策,这样就避免在同一位置重复,从而避免重复生成文本。计算上,先计算coverage vector \(c^{t}\)

\[c^{t}=\sum_{t'=0}^{t-1}a^{t'} \]

然后添加到注意力权重的计算过程中,\(c^{t}\)用来计算 \(e_{i}^{t}\)

\[e_{i}^{t}=v^Ttanh(W_hh_i+W_ss_t+w_cc_{i}^{t}+b_{attn}) \]

同时,为coverage vector添加损失是必要的,coverage loss计算方式为:

\[covloss_t=\sum_{t}min(a_{i}^{t},c_{i}^{t}) \]

这样coverage loss是一个有界的量\(covloss_t\le\sum_ia_i^t=1\) 。因此最终的LOSS为:

\[loss_t = -logP(w_{t}^{*})+\lambda\sum_{i}min(a_{i}^{t},c_{i}^{t}) \]

2.4 Summary

3. Ptr-Nets扩展——Multi-Source Pointer Network for Product Title Summarization

论文:Multi-Source Pointer Network for Product Title Summarization

发表机构:CIKM 2018

文章关注的是电商平台上的商品摘要的生成。这种摘要与传统的句子摘要有一定的区别,即商品摘要无法容忍事实细节的错误或关键信息的丢失。因此本文提出了商品摘要的两个限制

  • 不介绍无关信息
  • 保留关键信息(如品牌和商品名称)

提出了一个Multi-Source Pointer Network (MS-Pointer Net),模型框架如下图所示。

针对第一个限制,通过Pointer Network实现,即从source title中抽取单词生成一个short title。因为Pointer Network无法保证生成的short title包含source title的关键信息,提出了Knowledge Encoder ,它可以编码商品的关键信息。解码过程,MS-Pointer借助soft gating mechanism学习从相应的Encoder复制不同的信息。

  1. 输入包括Source title: \({\cal S}=(w_1,w_2,\dots,w_N)\)和Background Knowledge:\({\cal K}=(k_1,k_2,\dots,k_M)\),通过LSTM来对两个输入分别产生隐层序列:

    \[Title\; Encoder:(h_1,h_2,\dots,h_N)\\ Knowledge\; Encoder:(h_1',h_2',\dots,h_M') \]

  2. 用这两组隐状态序列来初始化解码器的初始状态\(d_0\)

    \[d_0=ReLU(W_f\cdot[h_N,h_M']) \]

  3. 解码过程,分别对输入的source title和background knowledge计算attention distribution:

    \[\begin{aligned} u_{ti}&=v^Ttanh(W_hh_i+W_dd_t+b_{attn})\\ u_{ti}'&=v'^Ttanh(W_h'h_i+W_d'd_t+b_{attn}')\\ a_t&=softmax(u_t)\\ a_t'&=softmax(u_t') \end{aligned} \]

  4. 解码过程,Decoder隐状态的输出:

    \[d_t=f(d_{t-1},y_{t-1},c_{t-1},c_{t-1}')\\ context\;vector: c_t=\sum_i a_{ti}h_i\qquad c_t'=\sum_i a_{ti}'h_i' \]

  5. 解码时,通过一个soft gating mechanism \(\lambda\)来加权结合两个注意力机制的分数,输出final output distribution:

    \[p(y_t=w|{\cal S, K},y_{<t})=\lambda\sum_{i:w_i=w}a_{ti}+(1-\lambda)\sum_{j:w_j=w}a_{tj}' \]

    模型学习通过调整\(\lambda\)复制不同编码器(Title Encoder和Knowledge Encoder)的词:

    \[\lambda=\sigma(w_d^Td_t+w_y^Ty_{t-1}+w_c^Tc_t+w_{c'}^Tc_t') \]

  6. 训练的损失为最小化关于目标序列的负对数似然:

    \[{\cal L}=\frac{1}{T}\sum_{t=0}^{T}-log[p(y_t=w_t^*|{\cal S,K},y_{<t})] \]

实验部分,作者使用多个常见的自动摘要baseline models进行对比:

  1. abstractive method(生成式):
    • Seq2seq-Gen:原始的seq2seq生成模型(uni/bi);
    • Ptr-Gen:指针生成网络(uni/bi);
  2. extractive method(抽取式):
    • Trunc:截断操作,对于输入序列,按照目标标题顺序截断开头内容;
    • TextRank:文本分词后进行词的重要性排序以选择最重要的TopK个词组成产品摘要;
    • LSTM-Del:通过序列标注的方式,从输入序列中选择重要词汇构成摘要;
    • Seq2seq-Del:接受输入,训练seq2seq获得删去无用信息保留关键信息作为摘要的能力;
    • Ptr-net:抽取式摘要模型,为本文模型的单输入baseline;
    • Ptr-Concat:对于background knowledge不采用双重编码后门控的方式融合,采用直接拼接的方法。

4. Ptr-Nets扩展——CopyNet

4.1 Intro

论文:Incorporating Copying Mechanism in Sequence-to-Sequence Learning

发表机构:ACL 2016

文章还是基于seq2seq改进的,因为seq2seq有一个问题:高度依赖词的表征,如果遇到生僻实体(Name, Organization,Place)或日期就会出现表达不准确。在对话领域,有些词仅需要模型对其简单少量的理解,但要求对其逐字符保真(literal fidelity),如下图所示,(R)需要对(I)中的词进行部分选择复制。

CopyNet与baseline seq2seq模型相比,两者区别:

  1. CopyNet的Decoder部分,有两种模式:Generate-Mode和Copy-Mode。Generate-Mode主要任务是根据语义来决定输出,而Copy-Mode是根据输入文本的位置来决定copy,即Decoder输出的词是两种模式概率相加的结果
  2. Decoder过程,每一个时间步解码隐状态\(s_t\)的更新不同,CopyNet添加了Selective Read。

CopyNet的优势:能够更好地处理OOV问题,比如生僻的人名、地名、组织等,它直接将这部分内容copy到输出。

4.2 CopyNet Structure

原文用所有的Encoder hidden states构成记忆\(M\)\(M\)包含输入句子的语义信息、长期依存关系及序列位置信息等。Figure 1 (a)是经典的Encoder,使用attention mechanism将所有的Encoder hidden states整合得到context vector,相当于对\(M\)做了带有注意力的选择,模型中称为Attentive Read。

\[h_t=f(x_t,h_{t-1}); \quad c=\phi({h_1,\dots,h_{T_s}}) \]

Decoder与以往不同的是:联合概率输出词(Figure 1 (b))以及Selective Read(Figure 1 (c))。

4.2.1 Generate-Mode & Copy-Mode

\(X\):表示输入序列(source text)的词汇集合;\(V\):表示输出词汇集合。

两个集合存在交集(\(X \cap V\)),并集(\(X \cup V\))之外的属于未知词(UNK)。可以将词分为4类:

  1. 常规单词表\(V: \frac{1}{Z}exp[\psi_g(v_i)]|v_i=y_t\)
  2. 属于source text又属于单词表\(V\)的词汇集合\(X \cap V:\frac{1}{Z}(\sum_{x_j}exp[\psi_c(x_j)]+exp[\psi_g(v_i)])|x_j=y_t,v_i=y_t\)
  3. 属于source text但不属于单词表\(V\)的词汇集合\(X \cap \overline{V}: \frac{1}{Z}\sum_{x_j}exp[\psi_c(x_j)]|x_j=y_t\)
  4. 不属于source text和V的词汇集合\(\overline{(X \cup V)}: \frac{1}{Z}exp[\psi_g(unk)]\)

CopyNet的Decoder最大特点是:Decoder输出词是生成模式和复制模式共同决定的,计算如下:

\[p(y_t|s_t,y_{t-1},c_t,M)=p(y_t,g|s_t,y_{t-1},c_t,M)+p(y_t,c|s_t,y_{t-1},c_t,M) \]

\[p(y_t,g|\cdot)= \begin{cases} \frac{1}{Z}e^{\psi_g(y_t)},\quad y_t\in V\\ 0, \quad y_t \in X\cap \overline{V} \\ \frac{1}{Z}e^{\psi_g(UNK)}, \quad y_t \notin V\cup X \end{cases} \]

\[p(y_t,c|\cdot)= \begin{cases} \frac{1}{Z}\sum_{j:x_j=y_t}e^{\psi_c(x_j)},\quad y_t\in X\\ 0, \quad otherwise \end{cases} \]

\[Z=\sum_{v\in V\cup\{UNK\}}e^{\psi_g(v)}+\sum_{x\in X}e^{\psi_c(x)} \]

其中\(g\)表示Generate-Mode,\(c\)是Copy-Mode。\(\psi_g(\cdot)\)\(\psi_c(\cdot)\)都是各自模式的得分函数,\(Z\)是两个模式共享的归一化因子。

\[\begin{aligned} \psi_g(y_t=v_i)&=v_i^TW_os_t,\quad v_i\in V\cup UNK\\ \psi_c(y_t=x_j)&=\sigma(h_j^TW_c)s_t,\quad x_j\in X \end{aligned} \]

通过\(\psi_g(\cdot)\)可以得到已知词表和UNK的每个词的score,\(\psi_c(\cdot)\)可以得到source text中出现的词的score。

有如下情况:

  • 当某个词是输入序列独有的则该词的生成概率为0,复制概率不变;
  • 若某个词是输出词汇表独有的则该词的复制概率为0,而生成概率不变;
  • 若某个词既存在于输入序列又存在于输出词汇表则生成概率和复制概率都不变。

最后,将生成概率和复制概率加和得到最终的概率。

4.2.2 Selective Read

Selective Read对应Figure 1 (c) State Update。

在传统的seq2seq中\(s_t\)的更新是:

\[s_t = f(y_{t-1},s_{t-1},c) \]

\(y_{t-1}\)是上一个时间步的输出结果,一般是经过softmax后的向量,取出其中最大的那个元素的索引就是该时间步生成的词。

在CopyNet中的一个小修改是:使用\([e(y_{t-1});\zeta(y_{t-1})]^T\)来代替\(y_{t-1}\)来更新\(s_t\),即:

\[s_t = f([e(y_{t-1});\zeta(y_{t-1})]^T,s_{t-1},c) \]

其中\(e(y_{t-1})\)表示\(y_{t-1}\)的词嵌入,\(\zeta(y_{t-1})\)就是Selective Read。CopyNet使用上一时间步的输出结果的词嵌入与Selective Read拼接。Selective Read和Attentive Read相似,都是对\(M\)操作,计算如下:

\[\zeta(y_{t-1})=\sum_{\tau=1}^{T_s}\rho_{t\tau}h_{\tau}\\ \rho_{t\tau}= \begin{cases} \frac{1}{K}p(x_{\tau},c|s_{t-1},M), \quad x_{\tau}=y_{t-1}\\ 0,\quad otherwise \end{cases}\\ K=\sum_{\tau':x_{\tau'}=y_{t-1}}p(x_{\tau'},c|s_{t-1},M) \]

\(\zeta(y_{t-1})\)就是针对Copy-Mode设计的,从\(x_{\tau}=y_{t-1}\)看出,如果source text中出现上一步输出的词,\(M\)就要参与计算,即\(\zeta(y_{t-1})\)要包含这些词在输入中的位置信息。如果\(y_{t-1}\)不在source text中,就令\(\zeta(y_{t-1})=0\)。这样\(\zeta(y_{t-1})\)如果有值且不为0向量,模型接下来的输出就会倾向于Copy-Mode。因为输出能在输入序列中找到,那么后面的内容也很有可能从输入copy。

上面Figure 1,比如t=4的时候,上一个时刻输出的是 Tony,Tony 这个词对应 source 中t=6的输入,那么就不为0。通过这种方式,便可以把输入中 Tony 的信息作用到 decoder 中,那么此时时刻拿到的就不仅仅是 Tony 的 embedding 信息,还有输入端 Tony 的位置信息以及上下文信息。

5. References

什么是Pointer Network?

指针网络 Pointer Network

Pointer Networks

指针生成网络(Pointer-Generator-Network)原理与实战

Pointer-Generator-Network

用于产品名称摘要的多源指针网络

Copy-Network

posted @ 2021-04-22 18:45  MissHsu  阅读(835)  评论(0编辑  收藏  举报