从头实现一个深度学习的对话系统--1,论文简介

https://blog.csdn.net/liuchonge/article/details/78809555

上篇文章我们介绍了DRL用于对话系统的应用,看完论文我们会发现,其是在一个Seq-to-Seq模型的基础上进行重新训练进而得到效果的提升,那么自然我们会想到如何使用Seq-to-Seq模型构造基础的对话系统呢,接下来我会使用几篇文章来一步步介绍使用Seq-to-Seq构造对话系统过程中所用到的知识和代码。首先让我们从提出Seq-to-Seq模型的论文说起:

本文主要介绍下面几篇Seq-to-Seq刚被提出时的几篇文章:

  1. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
  2. Sequence to Sequence Learning with Neural Networks
  3. Neural Machine Translation by Jointly Learning to Align and Translate
  4. Grammar as a Foreign Language
  5. On Using Very Large Target Vocabulary for Neural Machine Translation
  6. A Neural Conversational Model

这里不会详细的去介绍每一篇论文,而是从作者、时间线、模型结构、应用领域等几个方面介绍一下,因为我在看别人博客、论文的过程中发现这几篇论文总是会被提及,所以就简单做一个总结,至于Seq-to-Seq模型的细节我会放在下一篇文章中进行详细介绍。

Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

论文地址: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神经单元第一次提出的文章,怪不得引用量这么高==#

Sequence to Sequence Learning with Neural Networks

论文地址: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”。并使用下式作为目标函数进行训练:

除此之外模型为了取得比较好的效果还是用了下面三个小技巧来改善性能:

  • 深层次的LSTM:作者使用了4层LSTM作为encoder和decoder模型,并且表示深层次的模型比shallow的模型效果要好(单层,神经元个数多)。
  • 将source进行反序输入:输入的时候将“ABC”变成“CBA”,这样做的好处是解决了长序列的long-term依赖,使得模型可以学习到更多的对应关系,从而达到比较好的效果。
  • Beam Search:这是在test时的技巧,也就是在训练过程中不会使用。一般来讲我们会采用greedy贪婪式的序列生成方法,也就是每一步都取概率最大的元素作为当前输出,但是这样的缺点就是一旦某一个输出选错了,可能就会导致最终结果出错,所以使用beam search的方法来改善。也就是每一步都取概率最大的k个序列(beam size),并作为下一次的输入。更详细的解释和离子可以参考下面这个链接:https://zhuanlan.zhihu.com/p/28048246

最终的多层模型,结合一个具体事例来说明一下:

Neural Machine Translation by Jointly Learning to Align and Translate

论文地址: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向量。计算公式如上图所示。具体细节也会在下篇文章中进行介绍。

On Using Very Large Target Vocabulary for Neural Machine Translation

论文地址:https://arxiv.org/pdf/1412.2007.pdf

本文发表于2014年12月,作者是Sebastien Jean,Cho,主要是为了解决当vocab很大时计算速度慢的问题,提出了sampled softmax的方法,目前引用量是260+

首先指出当前NMT模型的两个缺点:

  • target的vocab比较大时计算速度会很慢,因为输出层需要计算vocab中每个词向量与输出向量之间的内积,非常耗时,所以一般把vocab控制在30000-80000之间。
  • 当前模型不在vocab中的单词使用UNKNOWN符号代替,所以当target中UNKNOWN占比较大时,效果很差,翻译出来的结果会有很多UNKNOWN符号。

当前存在的解决方案:

  • 基于模型的方法,model-specific:这种方法减少了训练时的计算量,但是在预测时,仍然需要计算全部的target单词 
    • 近似估计目标次词的概率
    • 将vocab中所有目标词进行聚类
  • 基于翻译的方法,translation-specific:基于翻译任务的特殊性而提出的改进方案。比如将source和target两两对应起来,使用OOV来表示,这样在翻译结果中出现OOV时,就用source所对应的target来代替。

本文提出的也是model-specific的方法,可以将计算复杂度变成常数级别。如下图所示,计算量主要集中在Z上,因为他需要遍历整个vocab,所以改进的思路就是采样一部分vocab V’来近似估计计算Z值,这样就可以将计算复杂度降低到O(V’)。但是V’必然是不能随便选的,不然会导致无法收敛。所以需要根据训练数据提前划分出很多个V’,具体的划分方案就不在这里赘述了。感兴趣的同学可以具体看论文。

Grammar as a Foreign Language

论文地址: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即可实现很好的效果,示意图如下所示:

A Neural Conversational Model

论文地址: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模型并把它带入到对话系统领域。

参考文献:

  1. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
  2. Sequence to Sequence Learning with Neural Networks
  3. Neural Machine Translation by Jointly Learning to Align and Translate
  4. Grammar as a Foreign Language
  5. On Using Very Large Target Vocabulary for Neural Machine Translation
  6. A Neural Conversational Model
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值