pointer networks
Pointer Networks提出了一种新的 neural architecture,可以解决输出序列的大小随着输入序列的大小而变化的问题。文章开头讲到,传统的seq2seq模型以及Attention Mechanism,都只能处理固定size的输入序列。下面主要围绕这Pointer Network展开学习。
首先需要回顾 seq2seq 模型 和 Attention 机制
1 Seq2Seq Model
传统的 seq2seq model 是由两个 RNN 构成,一个作为 Encoder ,另一个作为 Decoder。在输入 input sequence后,由Encoder进行处理,形成一个 Encoder Vector 送到 Decoder,由 Decoder 产生最终结果。
- Encoder 部分由 若干个 RNN 单元构成,每个单元接受前一个单元的 hidden state 和当前 input sequence 中的输入元素,生成新的 hidden state 并且向前传递。\(h_{i}\)表示前面所有输入信息的 hidden state,计算公式为 \(h_{t} = f(W^{hh}h_{t-1} + W^{hx}x_{t})\)
- Encoder Vector是Encoder部分的输出,也是最后一个 hidden state,并作为Decoder部分的初始hidden state输入Decoder。
- Decoder 部分同样由若干个 RNN 单元构成,每个单元接受前一个单元的 hidden state,生成当前状态下的 hidden state,并预测当前的输出。hidden state的公式为:\(h_{t} = f(W^{hh}h_{t-1})\),预测输出的公式为:\(y_{t} = softmax(W^{s}h_{t})\)
seq2seq模型的一个很重要的好处在于 input sequence 和 output sequence 的大小可以不一致。
但是seq2seq不能处理 output dictionary 的大小会发生变化的任务,因为seq2seq处理一项特定的任务时,其 output dictionary 是不会发生变化的,是一个相对固定的域,但是在Pointer Networks文章中所提到的闭包问题等组合相关问题,它们的 output dictionary 是和 input sequence 密切相关的。比如,给定10个点 {\(P_{1}, P_{2}, ..., P_{10}\)},要找到一个闭包,那结果肯定是这10个点的子集;如果换10个点,那结果就应该是新的10个点的子集。
2 with Attention
上面提到了,seq2seq模型的Encoder部分将input sequence转换成一个vector,也叫context,Decoder根据这个context做输出预测。这样的话,这个context vector就成为模型性能的瓶颈了,模型输出结果的正确性取决于这个context vector能多好地表达input sequence。
引入Attention机制,使得模型专注在input sequence的相关部分。
Attention机制主要在两个地方做了改进
给Decoder部分传递所有的 hidden state,而不是一个 context vector。
在Decoder的每一步,为所有的 hidden state 打分,用 softmax 后的分数乘上对应的 hidden state,然后加和形成这一步的 context vector。之后,得到的 context vector 和 Decoder hidden state 做连接,得到新的 vector 传递给 feedforward neural network,最后得到该步的输出。
完整步骤
Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
然后我们看看论文中对于Attention机制给的公式
- 第①个公式相当于就是上面说的打分,得到的\(u_{j}^{i}\)表示的是在 time-step 'i' 时,对Encoder的第 j 个 hidden state 的打分。
- 第②个公式:使用 \(softmax\) 函数对打分进行处理。
- 第③个公式:将 \(softmax\) 后的分数 \(\times\) Encoder的对应 hidden state,并加和算出这一步的 context vector。
3 Pointer Networks
而 Pointer Network 所做的改变就是,在 \(softmax\) 函数处理完打分后,选择其中 最大权重 的元素直接作为该步的输出。
如图,第一个时间步的输出是 "1",那么在下一个时间步,输入\([x_1,y_1]\)的相应token和上一个时间步的 hidden state 会被传递给网络以计算当前的 hidden state。
这样就使得输出序列完全取决于输入序列,所以可以很好适应输入序列大小的变化。
4 Ptr的应用
abstractive text summarization
首先text summarization
分为extractive
和abstractive
两种,extractive
是指通过选择和重组原文中的句子或短语形成的summarization
,而abstractive
是指更高级的概括,会产生全新的词语,像人写abstract
那样。
Get To The Point:
Summarization with Pointer-Generator
Networks介绍了一种hybrid pointer-generator network
+coverage mechanism
的架构来处理这一任务,可以很好地解决:①
不能准确再现细节;②不能处理超出词汇表以外的单词;③出现重复。其中hybrid pointer-generator network
主要解决①②,而coverage mechanism
解决③。
上图主要是hybrid pointer-generator network
的结构。之所以是hybrid
,是因为这里不是单纯使用pointer
,而是将pointer
和原先seq2seq-with-attention
结合起来的。从图中我们可看到有两个distribution
,一个是attention distribution
,它就是pointer network
中的pointer
,反应的是source text
中的分布;另一个是vocabulary distribution
,这个就是正常seq2seq
模型会产生的针对output dictionary
的分布。这两个分布是通过\(p_{gen}\)结合起来的,最后形成一个总的distribution
,由此产生结果。
而coverage mechanism
则是插入在产生attention distribution
的步骤中,因为它是用来反映source text
中单词在结果中的覆盖程度,通过将它加入attention distribution
的计算中,起到一个反馈的作用,从而有效减少重复问题。(下式红框部分就是coverage vector
作为额外输入传递给attention
机制的计算中)