文本介绍 pointer-network 和 pointer-generator network。
从 seq2seq开始讲起,到注意力机制,再到pointer-network再到pointer-generator network,最后列出几个,指针生成网络的简单应用效果。
(好长时间没更了,期间搭过一个个人博客,域名就是tenliu.top,后来种种原因,域名和服务器都没有续费~~)
1 seq2seq
1.1 为什么诞生seq2seq
我们知道RNN单元,输入输出的长度是一样的。那么在序列问题中,输入和输出的序列长度不同(这类实际问题更多,机器翻译、文本摘要、阅读理解、语言识别····)。网络结构该是什么样的呢?
这就是seq2seq问题,这时候就要 encoder-decoder结构了。
1.2 基本概述
我们先用一个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个时间点对应的输出。在训练的时候这个是已知的,但是在测试阶段,就是未知的了,需要从开始位置探索
这个公式就是我们的目标,不论模型如何变化,这个目标不变。
1.3 训练和预测
那么训练阶段,使用的是标注数据,在每一步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、集束搜索
…
(这里不是这次的重点)
2 注意力机制 Attention
2.1 为什么会诞生Attention
上面我们介绍了 encoder-decoder作为一种通用框架,在具体的NLP任务上还不够精细化。比如在上面的模型中encoder编码后的上下文向量c,就会被decoder网络作为输入,而且是在不同时间步中的不加区分的使用C。
这就是不精细化的地方,比如机器翻译,输入的A语言的前几个字往往可能是输出B语言的前几个字(这个例子不是很好,但是比较直观理解问题),所以引入“注意力”,效果会更加精准。
2.2 基本概述
我们以这个结构为例:
可以看待语义向量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} h