文本介绍 pointer-network 和 pointer-generator network。 从 seq2seq开始讲起,到注意力机制,再到pointer-network再到pointer-generator network,最后列出几个,指针生成网络的简单应用效果。 (好长时间没更了,期间搭过一个个人博客,域名就是tenliu.top,后来种种原因,域名和服务器都没有续费~~)
我们知道RNN单元,输入输出的长度是一样的。那么在序列问题中,输入和输出的序列长度不同(这类实际问题更多,机器翻译、文本摘要、阅读理解、语言识别····)。网络结构该是什么样的呢? 这就是seq2seq问题,这时候就要 encoder-decoder结构了。
我们先用一个LSTM作为 encoder编码网络,输入通过编码网络得到一个上下文向量c, 这个c有很多种,最简单的就是把编码网络LSTM的最后一个隐藏状态赋值给c,也可以把LSTM的所有隐藏状态复制给c,也可以把隐藏状态做些变换之后在赋值给c,
然后再来一个解码网络,也是LSTM。把编码网络的c作为输入,目标作为输出。这样就可以实现 输入和输出长度不同的 学习啦。
c可以作为解码网络的初始状态输入;
也有做法是把c作为 解码网络的每一步的输入:
seq2seq生成模型,主要的思想就是把问题看做一个条件语言模型,
即在已知输入序列和前序生成序列的条件下,最大化下一目标的概率,最终希望得到整个输出序列的生成出现的概率最大。(和语言模型不同在于,多列一个已知的输入序列这个条件,所有我们说是条件语言模型)
P ( Y ∣ X ) = ∏ t = 1 T P ( y t ∣ y 1 : t − 1 , X ) P(Y|X) = \prod_{t=1}^{T}P(y_t|y_{1:t-1},X) P(Y∣X)=t=1∏TP(yt∣y1:t−1,X)
或者我们为了便于计算,取log,把相乘变成相加:
P ( Y ∣ X ) = ∑ t = 1 T P ( y t ∣ y 1 : t − 1 , X ) P(Y|X) = \sum_{t=1}^{T}P(y_t|y_{1:t-1},X) P(Y∣X)=t=1∑TP(yt∣y1:t−1,X)
其中
X、Y分别表示输入输出序列 T T T表示输出序列的时间序列大小 y 1 : t − 1 y_{1:t-1} y1:t−1表示输出序列的前t-1个时间点对应的输出。在训练的时候这个是已知的,但是在测试阶段,就是未知的了,需要从开始位置探索这个公式就是我们的目标,不论模型如何变化,这个目标不变。
那么训练阶段,使用的是标注数据,在每一步decode阶段,如第t步decode,我们知道输入X,和之前 t − 1 t-1 t−1的输出,来预测当前时刻的输出。这个训练过程是”局部“的,完成训练之后,我们得到的也是这样的条件概率分布,在已知输入X,输出的前t个时刻的条件下,当前t时刻输出为 y t y_t yt的概率。
那么在测试和预测阶段呢?我们希望得到的是最大概率的是输出序列。(tenliu) 但是现实是,decode的第一步,我们知道输入X,也知道 y 0 y_0 y0这个初始值,我们通过训练好的模型知道 t = 1 t=1 t=1的概率分布,如何采样输出 y 1 y_1 y1? 1、贪心算法吗 2、随机采样 3、集束搜索 … (这里不是这次的重点)
上面我们介绍了 encoder-decoder作为一种通用框架,在具体的NLP任务上还不够精细化。比如在上面的模型中encoder编码后的上下文向量c,就会被decoder网络作为输入,而且是在不同时间步中的不加区分的使用C。
这就是不精细化的地方,比如机器翻译,输入的A语言的前几个字往往可能是输出B语言的前几个字(这个例子不是很好,但是比较直观理解问题),所以引入“注意力”,效果会更加精准。
我们以这个结构为例:
可以看待语义向量C仅仅是encode最后一个时间步的隐藏状态。
现在我们的注意力机制的切入点,就是希望吧encode所有隐藏状态 h 1 . . . h t h_1...h_t h1...ht都用上。
论文NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。attention在NMT基于seq2seq的改进模型再进行改进,原理如下:
这里encoder使用的是双向RNN,因为希望得到向前的词的顺序,也希望的代反向的词的顺序,
h j → 、 h j ← \stackrel{\rightarrow}{h_j}、\stackrel{\leftarrow}{h_j} hj→、hj←分别表示encode阶段,时间步长j的前向隐藏状态、后向隐藏状态。 h j h_j hj 表示encode阶段时间步长j的隐藏状态,由前向和后向隐藏状态连接组成, h j = [ h j → : h j ← ] h_j = [\stackrel{\rightarrow}{h_j} : \stackrel{\leftarrow}{h_j}] hj=[hj→:hj←] T x T_x Tx表示输入序列长度 s t s_t st 表示decode网络的隐藏状态,便于和encode区分。并且这里是没有引入注意力机制的隐藏状态 s t ^ \hat{s_t} st^ 表示在引入注意力机制之后,decode网络的隐藏状态。现在decode网络,时间步长i的隐藏状态 s i ^ \hat{s_i} si^,由前一时间步长的隐藏状态 s i − 1 ^ \hat{s_{i-1}} si−1^、当前时间的输入(即前一时间的输入) y i − 1 y_{i-1} yi−1,和 c i c_i ci计算得到。
其中 c i c_i ci就是由注意力机制得到的内容向量。
c i = ∑ j = 1 T x a i j h j c_i = \sum_{j=1}^{T_x} a_{ij}h_j ci=j=1∑Txaijhj
即 对于decoder的时间步长i的隐藏状态 s i s_i si,的输入语义向量 c i c_i ci等于 encoder网络所有的隐藏状态 h 1 . . . h j . . . h T x h_1...h_j...h_{T_x} h1...hj...hTx与其权重 a i j a_{ij} aij的乘积之和。 a i j a_{ij} aij表示 decoder网络的第i时刻受到encode网络第j时刻的影响,或者说表示第i时刻的输出受到输入的第j时刻的影响。
那么这个权重 a i j a_{ij} aij如何计算呢
a i j = e x p ( e i j ) ∑ k = 1 T x e x p ( e i k ) a_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})} aij=∑k=1Txexp(eik)exp(eij)
其中, e i j e_{ij} eij是得分函数,
这个有如下几种计算方法: e i j = s c o r e ( s i − 1 , h j ) = { s i − 1 T h j D o t ( 内 积 ) s i − 1 T W a h j G e n e r a l v a T t a n h ( W a . C o n c a t ( s i − 1 , h j ) ) C o n c a t e_{ij} = score(s_{i-1}, h_j) = \begin{cases} s_{i-1}^Th_j & Dot(内积) \\ s_{i-1}^T W_a h_j & General \\ v_a^Ttanh(W_a. Concat(s_{i-1}, h_j)) & Concat\end{cases} eij=score(si−1,hj)=⎩⎪⎨⎪⎧si−1Thjsi−1TWahjvaTtanh(Wa.Concat(si−1,hj))Dot(内积)GeneralConcat
普通的seq2seq输出长度是固定的,就是词典的大小。 1、如果输入中有未登录词,未登录词不会出现在输出中,如果输入中 2、普通seq2seq无法解决这样一类问题:输出验证依赖输入的问题,
这类问题,比如凸优化,求解凸包,即输入一系列的点(p1,p2…p7),求解可以把所有点包围起来的外围点。
这里的输出应该是{P2,P4,P3,P5,P6,P7,P2},所有的输出都是来自于当前的输入。
Pointer Network(ptr-net 指针网络)是seq2seq模型的一个变种。他们不是把一个序列转换成另一个序列, 而是产生一系列指向输入序列元素的指针。或者说是对输入元素顺序的再次排列,最基础的用法是对可变长度序列或集合的元素进行排序。
相比于 基于注意力机制的seq2seq,pointer-network其实是简化了注意力机制,
pointer-network在得到得分函数 e i j e_{ij} eij,softmax之后得到 a i j a_{ij} aij就OK了, a i j a_{ij} aij就是一系列指向输入元素的指针!!
为什么这么说:记得 a i j a_{ij} aij表示第i时刻的输出受到输入的第j时刻的影响大小。
假设输入长度是 T x T_x Tx,那么每一个输出时刻i的 a i a_i ai都是一个 T x T_x Tx长度的概率向量,找到其中最大概率,如果这个最大概率的下标是j,那这不就是相当与一个指针,输出的第i时间步长指向了输入的第j时间步长。
自动摘要任务中,我们希望摘要的绝大部分来自于当前的原文,也不是100%的。 Pointer-generator network设计最初就是用来 自动摘要 的!
论文《Get To The Point: Summarization with Pointer-Generator Networks》 下载地址:https://arxiv.org/pdf/1704.04368.pdf 源码地址:abisee/pointer-generator
并且论文中另个一创新点是:应用了coverage mechanism来解决了seq2seq的通病–repitition。
所以Pointer-generator network可以理解为是一个混合了Baseline seq2seq 和 PointerNetwork的网络。
既具有PointerNetwork的Copy能力; 也具有Baseline seq2seq的生成能力(即输出可以不完全来自输入)。 那么输出中的某个位置是生成还是复制?取决一个参数 p g e n p_{gen} pgen
摘自原论文,可以看到, h t ∗ h_t^* ht∗就是decode阶段时间步长t的语义向量(之前我们表示为 c t c_t ct), s t s_t st就是decoder阶段时间步长t的隐藏状态, x t x_t xt是decode的输入,其余 w h ∗ , w s , w x , b p t r w_{h^*},w_s,w_x,b_{ptr} wh∗,ws,wx,bptr都是要学习的参数。
那么这个时刻的预测词概率:
如何避免重复生成文本?
运用了Coverage Mechanism来解决重复生成文本的问题。
具体实现上,就是把之前时间步长的注意力权重加到一起,得到一个覆盖向量(coverage vector c t c^t ct),然后用这样的先前的注意力权重 来影响当前的注意力权重的决策,就可以避免在同一位置重复。
c t = ∑ i = 0 t − 1 a i c^t = \sum_{i=0}^{t-1} a^i ct=i=0∑t−1ai
用这个覆盖向量,计算得分函数
原词 缩写数据如下
夏汾高速公路 夏汾高速 农村普通中小学校建设标准建标 中小学校建设标准建标 一用就灵的中医保健操 一用就灵的保健操 上海梅山矿业有限公司 上海梅山矿业 学俄语 语学 长冲凹村 长冲凹 电子点菜系统 电点点菜 深圳市南山区残疾人联合会 南山区残疾人联合会 时尚乡村女孩 时尚村女 脊椎动物 脊椎动物 扬州大学外国语学院 扬大外语学院 江西省防震减灾条例 江西防震减灾条例 远东第一监狱 远东一监 华硕A53XI243SV-SL 华硕