上篇文章我们介绍了DRL用于对话系统的应用,看完论文我们会发现,其是在一个Seq-to-Seq模型的基础上进行重新训练进而得到效果的提升,那么自然我们会想到如何使用Seq-to-Seq模型构造基础的对话系统呢,接下来我会使用几篇文章来一步步介绍使用Seq-to-Seq构造对话系统过程中所用到的知识和代码。首先让我们从提出Seq-to-Seq模型的论文说起:
本文主要介绍下面几篇Seq-to-Seq刚被提出时的几篇文章:
这里不会详细的去介绍每一篇论文,而是从作者、时间线、模型结构、应用领域等几个方面介绍一下,因为我在看别人博客、论文的过程中发现这几篇论文总是会被提及,所以就简单做一个总结,至于Seq-to-Seq模型的细节我会放在下一篇文章中进行详细介绍。
论文地址:https://arxiv.org/pdf/1406.1078.pdf
发表于2014年6月份,作者是Cho、Bahdanau、Bengio,可以视为Seq-to-Seq的前身,目前引用量已高达1800+。
文章提出了一种RNN Encoder-Decoder的网络结构,如下图所示:之所以说它可以看作是Seq-to-Seq的前身(个人理解),是因为本文并未实现end-to-end训练,而是作为SMT翻译框架中的一部分进行训练。
从上图可以看出,先使用一个RNN模型将输入序列进行编码得到最终的隐藏层状态向量C作为输入序列的向量表示,然后接下来使用另外一个RNN模型对C进行解码,解码过程中每一步的输入是上一部的输出yt-1、上一时刻隐层状态ht-1和C向量,公式如下所示:
然后将所有输出yt的概率相乘即是该序列的概率。然后计算loss、反向传播即可完成对模型的训练。该论文的应用场景是翻译系统,也就是将一个源语言翻译成另一个目标语言,“我爱你”–>“I Love You”,这恰好是Seq-to-Seq的使用场景。在一开始的时候Seq-to-Seq也是用于翻译模型才慢慢被大家所重视,后来被应用到对话等领域中。而且,更重要的一点,本文是GRU神经单元第一次提出的文章,怪不得引用量这么高==#
论文地址:https://arxiv.org/pdf/1409.3215.pdf
文章发表于2014年9月份,作者是Sutskever,就把他当做是第一篇Seq-to-Seq的论文吧,目前引用量是2640+。
文章所提出的Seq-to-Seq模型结构如下图所示,同样适用于翻译模型,但是实现了end-to-end的训练,使得模型更加简单而且不需要特定领域知识和人工提取特征,可以说是极大地促进了翻译模型的发展,摒弃了SMT的框架,目前谷歌翻译系统就是采用这种结构。
与上一篇文章不同的是,这里Decoder部分的输入不再是上一时刻的输出和C向量,而是前一时刻的目标值,这样做的好处是正确的输入可以指导模型进行快速收敛并产生正确的输出。当模型输出时,表明翻译结束。可以看出来,模型的输入包括三个,encoder_input:“ABC”,decoder_input:“WXYZ”, decoder_label:“WXYZ”。并使用下式作为目标函数进行训练:
除此之外模型为了取得比较好的效果还是用了下面三个小技巧来改善性能:
最终的多层模型,结合一个具体事例来说明一下:
论文地址:https://arxiv.org/pdf/1409.0473
文章同样发表于2014年9月份,作者是Bahdanau(第一篇文章的二作),鼎鼎大名的NMT模型,想必大家都已经十分熟悉了吧,目前引用量是2440+。
文章所提出的Seq-to-Seq模型架构如下图所示,亮点在于融入了Attention机制,很好的解决长序列的long-term问题,同样用于翻译系统,大大改善了模型的准确度。
传统的Seq-to-Seq模型将source序列通过一个RNN模型编码成一个固定维度的向量,但这对于长序列而言是远远不够的,一个向量并没有办法编码该序列所有包含的信息。所以作者提出将encoder RNN的每一个隐藏状态都保存在一个列表中,在每次decode时,都取计算st-1与所有隐层向量之间的相关程度,然后对其进行加权求和得到ci向量,也就是说ci在每次解码时都是不一样的,它会自动寻找最相关的hi向量。计算公式如上图所示。具体细节也会在下篇文章中进行介绍。
论文地址:https://arxiv.org/pdf/1412.2007.pdf
本文发表于2014年12月,作者是Sebastien Jean,Cho,主要是为了解决当vocab很大时计算速度慢的问题,提出了sampled softmax的方法,目前引用量是260+
首先指出当前NMT模型的两个缺点:
当前存在的解决方案:
本文提出的也是model-specific的方法,可以将计算复杂度变成常数级别。如下图所示,计算量主要集中在Z上,因为他需要遍历整个vocab,所以改进的思路就是采样一部分vocab V’来近似估计计算Z值,这样就可以将计算复杂度降低到O(V’)。但是V’必然是不能随便选的,不然会导致无法收敛。所以需要根据训练数据提前划分出很多个V’,具体的划分方案就不在这里赘述了。感兴趣的同学可以具体看论文。
论文地址:https://arxiv.org/pdf/1412.7449.pdf
本文同样发表于2014年12月份,作者是Oriol Vinyals,是第一篇将Seq-to-Seq运用到句法分析问题上,目前引用量是280+。
传统的句法分析器都是使用解析树的方法实现,但是本文使用Seq-to-Seq模型实现了端到端的训练,将解析树通过深度优先遍历的方法表示成一行文本,这样就可以作为Seq-to-Seq的输出进行训练。模型上到没有什么新奇的地方,使用的就是NTM的模型,多层LSTM+Attention+Dropout即可实现很好的效果,示意图如下所示:
论文地址:https://arxiv.org/pdf/1506.05869.pdf
本文发表于2015年6月份,作者还是Oriol Vinyals,看得出来作者是致力于推广Seq-to-Seq到各个领域,同样是第一篇用于对话的论文,目前引用量为250+。
其实论文很简单,模型架构上完全没有任何创新,短短几页纸还全是实验结果截图展示,但也耐不住人家是开山之作啊。模型和结果如下图所示,就不详细解释了。
介绍了几篇Seq-to-Seq模型的开山之作,主要是为了了解一下其发源,因为看论文是老是会提到这么几篇所以就一块介绍下。可以看得出来Seq-to-Seq模型从一开始在机器翻译领域被提出,到后来被广泛应用到NLP各个领域,原因就在于其对序列数据的完美使用,而且解决了以前RNN模型输出维度固定的难题,所以很快得到了推广。接下来应该会介绍其他几篇将Seq-to-Seq运用到对话系统的文章,这里不展开,因为本文介绍的几篇文章主要是为了引入Seq-to-Seq模型并把它带入到对话系统领域。