01 - Pointer Net
在对话系统和问答等一些NLP任务中,代理(agents)有时需要直接引用用户消息。Oriol等人[1] 2015年提出的Pointer Net网络 (图1)解决了直接从输入句子复制token的问题。
Sequence-to-sequence【图1a】
RNN(蓝色)对输入序列进行处理,产生一个代码向量,然后用概率链规则和另一个RNN生成输出序列(紫色)。问题的维度决定了输出维度,输出维度通过训练和推理保持不变。
Pointer Net【图1b】
通过编码RNN将输入序列转换为编码(蓝色),然后将编码RNN前馈给生成网络(紫色)。生成网络在每个步骤中生成一个向量,通过输入调节基于内容的注意力过程。该注意机制产生一个softmax分布,其字典大小等于输入长度。
图1 seq2seq & Pointer Net
传统的序列到序列模型用encoder-decoder结构映射源句子到目标句子。通常,这些模型首先利用编码器将源语句映射为隐藏状态向量,然后根据隐藏状态预测输出序列。序列预测是一步一步完成的,每一步都使用greedy
search或beam search来预测一个token。整体序列到序列模型可以用以下概率模型来描述:
序列到序列模型包括vanilla模型和基于attention的模型。vanilla模型预测目标序列仅基于编码器的最后隐藏状态,并通过不同的解码器时间步长传递它。这种机制限制了解码器在每个解码阶段所接收的信息。基于attention的模型在每个解码步骤中考虑编码器的所有隐藏状态,并在利用它们时计算它们的重要性。解码器部分根据编码器隐藏状态di的加权和来预测token:
在每个解码步骤中,vanilla模型和基于注意力的sequence-to-sequence模型都预测在固定字典X
=
{x1,…,xn}上的分布,其中xi表示token,n表示训练语料中不同token的总数。但是,当我们从输入句子中copy单词时,就不需要这么大的字典了。相反,n等于输入序列中token的数量(包括重复的token),并且不是固定的,因为它会随着输入序列的长度而变化。Pointer
Net对基于注意力的序列到序列模型做了一个简单的改变:它不是基于编码器隐藏状态(di)的加权和来预测token分布,而是直接使用归一化权值(αi)作为预测分布:
其中αi是一组概率数字αi1,…,αij,表示输入序列token的概率分布。
显然,token预测问题(token prediction)现在转化为位置预测问题(position prediction),其中模型只需要预测输入序列中的一个位置。这种机制类似于指向目标的指针,因此得名“指针网络(Pointer Net)”。
02 - CopyNet
论文:Incorporating copying mechanism in sequence-to-sequence learning
文章链接:https://arxiv.org/pdf/1603.06393.pdf
一、我所理解的CopyNet
先来看一个例子:
小伙伴们好,我是NLP分享汇,喜欢就点个关注吧!
一个对话系统,当你说出「NLP分享汇」这个名字的时候,回答中也会大概率重复这个名字,这不就很类似一种 copy 的思想吗?
但在实际应用程序中,仅仅从源消息复制是不够的。相反,在对话系统和QA等任务中,代理(agents)还需要有生成源句子之外的单词的能力。CopyNet是Gu等人[2] 2016(图2)提出将复制机制(copy mechanism)纳入传统的序列到序列模型中。模型在每个解码阶段决定是从源句子复制还是生成不在源句子中的新token。
图2 CopyNet整体结构
CopyNet的编码器与传统的序列到序列模型相同,而解码器与传统的基于注意力的解码器有一些不同。在预测时间步长t的token时,模型结合了生成模式(generate-mode)和复制模式(copy-mode)的概率:
其中t为时间步长。St是解码器隐藏状态,yt是被预测的token。ct和M分别表示编码器隐藏状态的加权和和编码器隐藏状态。g和c分别为生成模式和复制模式。
此外,虽然它仍然使用yt-1和加权注意向量ct来更新解码器的隐藏状态,但yt-1是唯一用其embedding和位置特定的隐藏状态进行编码的;特别之处,CopyNet结合了注意读(attentive read)和选择性读(selective read)从编码器隐藏状态捕获信息,其中选择性读与指针网络使用方法相同。与神经图灵机不同(Graves等,2014[3];Kurach et al., 2015[4]),CopyNet有一个基于位置的机制(location-based mechanism),使模型能够以更微妙的方式意识到训练数据中的一些具体细节。
二、细挖CopyNet模型结构
咋一看,结构这么复杂,要不我们还是别细挖了吧?哈哈,开个玩笑,听我解析。
图3 CopyNet结构图
看图 3,CopyNet结构图可分两部分看,左边部分(a)是基于Attention机制的序列到序列模型,下面绿色部分是编码器(Encoder)结构,上面橙色部分是解码器(Decoder)结构。右边部分(b & c)则是结构中的特殊部分,b讲的是模型在解码阶段到底是采用生成模式呢?还是拷贝模式呢?c讲的是模型的解码状态是怎样进行更新的。【是不是很简单】
Encoder部分是一个Bi-LSTM,每一个时间步对应一个输入,图上是表意直接输入每一个token,实际上一般是会先对token进行one hot编码,然后去look up embedding,实际输入的可是embedding size大小的向量哦。那么,如图3所示,对应的是每个时间步的Encoder输出,你可以理解它们代表了输入的一些高维度特征(隐藏状态)。对这些
进行变化后将结果送给decoder 进行解码,一般来说是最后一个时间步的输出哦。
Decoder部分,我们针对上图中这一个时刻来分析。
首先,对于传统RNN(不考虑attention),
加上attention以后,,其中
是一个动态变长的context,具体可以看下图。那么我们可以发现,应用了attention机制以后,可以考虑Encoder的每一个时刻的输出对
状态的影响。
说到这,其实我们才刚开始要接触模型核心啦,恭喜你看到这。可以发现,Encoder部分并没多做改变,创新点都是针对Decoder模块,主要有两个部分,分别是状态的更新(图3c)以及最后的映射(图3b)。
状态更新(State Update)
根据上面的描述,我们知道了接收三个输入,传统做法中
一般使用的是上一个时刻输出的token对应的embedding向量。CopyNet中首先对这个部分进行了调整,在embedding向量的后面concate一个称为"selective read"的向量
,公式如下:
从表达式中可以看到,时刻的
也是由一组系数
和
(对应的是每个时间步的Encoder 输出)作用得到的,看起来和attention几乎一样,区别在于
的计算:只有当上一个时刻的输出在 source 中出现的时候,对应的系数才有值。比如
的时候,上一个时刻输出的是Tony,Tony这个词对应source中
的输入,那么
就不为0。通过这种方式,便可以把输入中Tony的信息作用到Decoder中,那么
拿到的就不仅仅是Tony的embedding信息,还有输入端Tony的位置信息以及上下文信息。
Generate-Mode & Copy-Mode
传统做法中,RNN模型的输出会先通过线性变换映射成词汇大小的向量,然后通过最大化softmax来得到当前时刻的输出。在这里,该模型将这种输出模式称之为Generate-Mode,此外加入了Copy-Mode以复制模式作为补充。
一般,在自然语言处理任务中,会出现OOV(out-of-vocabulary)问题,就是源文本中的一些token在预设置好的词汇表中并没有,将该token置换成<UNK>,以致解码的时候效果不佳,而加入了Copy-Mode可以有效解决这一问题,相当于扩充了词汇表(因为直接从原句子中拷贝了该未出现在词汇表中的token)。
如图上,深紫色部分代表的是事先加载好的词表,传统做法是不属于其中的token都当做<UNK>处理。在本篇文章中,作者将训练样本中的source部分切字/词构成了X集合,由此便出现了上图的浅紫色圆圈。每个部分都对应有分数(score)的计算方式,整个合在一起进行归一化。
例子:假设Tony这个词出现在两个字典的交集部分,那么它的score就不只是传统的Generate-mode计算方式,同时还要计算Copy-Mode对应的score,那么相比别的只出现在V集合中的词,它的可能性会更大。再比如Jebara这个词,如果V中没有包含这个生僻的单词,那么传统做法下它会被映射成<UNK>,但是有了Copy-Mode,由于它在source中出现过,那么它会按照浅紫色部分获得score,从而被copy出来。具体的计算公式如下:
参考文献
[1] Oriol V, Meire F, Navdeep J (2015) Pointer networks. Advances in neural information processing systems 28:2692–2700
[2] Gu J, Lu Z, Li H, Li VO (2016) Incorporating copying mechanism in sequence-to-sequence learning.In: Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics(Volume 1: Long Papers),Association for Computational Linguistics, Berlin,Germany, pp 1631–1640, DOI 10.18653/v1/P16-1154, URL https://www.aclweb.org/anthology/P16-1154
[3] Graves A, Wayne G, Danihelka I (2014) Neural turing machines. arXiv preprint arXiv:14105401
[4] Kurach K, Andrychowicz M, Sutskever I (2015) Neural random-access machines. arXiv preprint arXiv:151106392
点赞+关注 就是最好的打赏