摘要:本章首先提出原始问题,然后引入指针网络(Pointer Networks),介绍了Pointer Network(指针网络)的方法与基本原理,由于传统的seq2seq模型是无法解决输出序列的词汇表会随着输入序列长度的改变而改变的问题的。使用Pointer Networks方法预测的时候每一步都找当前输入序列中权重最大的那个元素,而由于输出序列完全来自输入序列,它可以适应输入序列的长度变化。之后,提及了Pointer Network的实际应用,像如何用Pointer Network改进传统模型去Summarization(摘要),与机器翻译,智能对话等。
1.Introduce(引入)
原始问题:就是输入一大堆数据点,然后再输出一些点且这些点连起来可以将输入点全部包围起来。
这个本来是一个演算法可以解决的问题,现在我们用NN来解决。
我们把所有点的坐标(当前假设是二维的),丢到NN里面,要求输出得到最外围点的下标。这个问题实际上可以看做是Sequence-to-sequence问题。如下图: sequence2Sequence模型:是RNN的一个重要的应用场景,它实现了把一个序列转换成另外一个序列的功能,并且不要求输入序列和输出序列等长。如下图: 上图中可以看出,输入的Sequence是所有的点,输出的Sequence是包围所有点的点。
但是这个模型是不行的,因为此模型的输入和输出的点的数量是不固定的。输入长度不固定好解决,但是Decoder输出不固定不好弄。
那我们要怎么解决这个问题呢?
由于seq2seq模型是无法解决输出序列的词汇表会随着输入序列长度的改变而改变的问题的,如寻找凸包等。因为对于这类问题,输出往往是输入集合的子集。所以当输入的数量发生变化,超出训练时的最大范围之后,模型就失效了(Encoder可以处理任意长短序列,但是Decoder却不行)。
所以我们引入指针网络(Pointer Networks),用每个指针对应输入序列的一个元素,从而我们可以直接操作输入序列而不需要特意设定输出词汇表。提出的Pointer Networks,它预测的时候每一步都找当前输入序列中权重最大的那个元素,而由于输出序列完全来自输入序列,它可以适应输入序列的长度变化。
2. Pointer Networks指针网络(动态决定输出范围)
抛弃了SEQ2SEQ的encoder和decoder,基于attention based 模型的思想。过程如下图的例子: 首先根据label训练得到key(
z
0
z^0
z0),然后用
z
0
z^0
z0和所有的点做attention 操作,不同的是,得到的结果不做加权求和,而是直接做归一化,然后去找概率最大的那个。
例如,上图中1号点概率为0.5最大。然后把1号点作为输入生成
z
1
z^1
z1,然后做attention并求分布最大值,得到4号点:(如下图) 以上步骤不断重复,直到The process stops when "END"has the largest attention weights(直到END的机率最大才停止)。
优点:该做法可以根据输入点的数量变化决定输出点的数量,解决了Sequence-to-Sequence输出点固定的问题。
3. Applications-Summarization(应用:文章摘要提取)
我们当然可以用seq2seq模型去做文本摘要,但是往往存在两大缺陷:
- 模型容易不准确地再现事实细节,也就是说模型生成的摘要不准确
- 往会重复,也就是会重复生成一些词或者句子。
传统seq2seq模型结构图: 传统seq2seq模型正如我们之前的过程,通过Attention Mechanism将encoder的隐状态和decoder的隐状态结合成一个中间向量C,然后使用decoder解码并预测,最后经由softmax层得到了针对词汇表的概率分布,从中选取概率最高的作为当前预测结果。
Pointer-Generator模型结构图: Pointer-Generator模型除了上述过程,加入了Pointer Networks的部分,对Pointer Networks应用的思想非常直观,就是用它来复制源文本中的单词。
简单来说,在每一次预测的时候,通过传统seq2seq模型的预测(即softmax层的结果)可以得到针对词汇表的概率分布(绿色柱形图),然后通过Pointer Networks可以得到针对输入序列的概率分布(蓝色柱形图),对二者做并集就可以得到结合了输入文本中词汇和预测词汇表的一个概率分布,这样一来模型就有可能直接从输入文本中复制一些词到输出结果中。当然,直接这样操作未必会有好的结果,因此又加入了一个Pgen来作为软选择的概率。
Pgen的作用:决定当前预测是直接从源文本中复制一个词过来(Pointer Networks方法),还是从词汇表中生成一个词出来(传统方法)。
优点:加入了Pointer Networks方法,并结合传统seq2seq模型,解决了传统模型容易不准确地再现事实细节。(使machine可以直接从输入document中提取word,解决了不在machine的名词的words几率永远是0,导致结果不准确。)
4. Applications-Machine Translation(应用:机器翻译)
在翻译的过程中,经常会遇到专有名词,例如人名、地名。此时可以用Pointer Network直接把对应原文的名词抽取出来(直接复制过去)。如下图:
5. Applications-Chat-bot(应用:对话)
对话的过程也是一样,如果是传统的seq2seq模型,这里可能学不到,因为库洛洛这个词根本不在词库里面。所以用Pointer Network直接复制过去。如下图:
6. 总结与展望
Pointer Networks可以根据输入点的数量变化决定输出点的数量,解决了Sequence-to-Sequence输出点固定的问题。由于Pointer Networks具备输出元素来自输入元素这样的特点,于是它非常适合用来实现“复制”这个功能。另外在文章摘要的实际应用中,这个任务所需的词汇较多,也非常适合使用复制的方法来复制一些词。以及机器翻译中出现的专有名词,与对话中出现的名词等,传统的模型难以准确的生成,所以使用复制这一功能最为合适。
对于当下较为热门的电商软件领域,使用多来源Pointer Network方法,对电子商务的商品标题摘要任务,我们可以将Pointer Networks与knowledge encoder等技术结合起来,可以做到很好的效果!
|