SEIQR模型,seq to seq模型

  SEIQR模型,seq to seq模型

  http://blog.csdn.net/pipisorry/article/details/78258198

  Seq2seq型号seq2seq是什么?简单来说就是根据一个输入序列x生成另一个输出序列Y,Seq2seq有很多应用,比如翻译,文档抽取,问答系统等等。在翻译中,输入序列是要翻译的文本,输出序列是翻译后的文本;在问答系统中,输入序列是被问问题,而输出序列是答案。

  编码器-解码器模型为了解决seq 2的问题,已经提出了编码器-解码器模型,即编码-解码模型。所谓编码,就是把输入序列变换成固定长度的向量;解码就是把之前生成的固定向量转换成输出序列。

  基本的seq2seq模型由两个RNN、解码器和编码器组成,最基本的Seq2Seq模型由三部分组成,即编码器、解码器和连接它们的中间状态向量。编码器通过学习输入将其编码成固定大小的状态向量S,然后传输给解码器,解码器再通过学习状态向量S将其输出,如下图所示:

  模型扩展

  编码器和解码器可以使用相同的权重,或者更常见的是,编码器和解码器可以分别使用不同的参数。多层神经网络已成功地用于序列模型。

  实现时,编码器和解码器不是固定的。你可以选择CNN/RNN/伯恩/GRU/LSTM等等。可以自由组合。例如,编码时使用BiRNN,解码时使用RNN,编码时使用RNN,解码时使用LSTM,等等。每个矩形代表一个RNN核心,通常是GRU(门控循环单位)或LSTM(长期和短期记忆)核心。

  为了便于解释,编码和解码都是RNN的组合。

  在RNN编码器中,当前时间的隐藏状态是由前一时间的状态和当前时间的输入决定的,即

  ht=f(ht1,xt)

  在获得每个时间段的隐含层后,对隐含层的信息进行汇总,生成最终的语义向量。

  C=q(h1,h2,h3,…,hTx)

  一个简单的方法是使用最后一个隐藏层作为语义向量C,即

  C=q(h1,h2,h3,…,hTx)=hTx

  解码器解码阶段可以看作是编码的逆过程。在这个阶段,我们将根据给定的语义向量C和之前生成的输出序列Y1,Y2,… YT1来预测下一个输出单词yt,即

  yt=argmaxP(yt)=t=1Tp(yt{y1,…,yt1 },C)

  还能写。

  yt=g({y1,…,yt1 },C)

  在RNN,上述公式可以简化为

  yt=g(yt1,st,C)

  其中s是输出RNN中的隐藏图层

  ST=f(st1,y t1,C)

  c代表前面提到的语义向量,yt1代表上一个时间段的输出,反过来作为这个时间段的输入。另一方面,g可以是一个非线性多层神经网络,它可以生成字典中每个单词属于yt的概率。

  

解码分为训练和推理两个阶段

  注意,解码器分为训练和预测。这两个编码器实际上共享参数,即通过训练解码器学习的参数,预测将使用它们来进行预测。

  那么为什么一定要一分为二呢?这里我们主要考虑模型的稳健性。在训练阶段,为了使模型更加准确,我们不使用t-1的预测输出作为T阶段的输入,而是直接使用目标数据中的时序元素输入编码器。在预测阶段,我们没有目标数据,只有t-1阶段的输出和隐藏层状态。当然,虽然预测和训练是分开的,但是它们会共享参数,训练训练出来的参数会被预测使用。

  培训过程

  优化时采用最大似然估计,使得seq a编码后得到seq b的概率最高。

  上图代表了培训过程。在训练的过程中,我们不会把每一阶段的预测输出作为下一阶段的输入,直接用目标数据作为下一阶段的输入,这样可以保证模型更加准确。

  预测阶段

  这个数字代表我们的预测阶段。在这个阶段,我们没有目标数据。此时,前一阶段的预测结果将被用作下一阶段的输入。

  【干货实现Seq2Seq模型从编码器到解码器】

  解释的过程可以理解为使用贪婪算法(一种局部最优解算法,即选择一个度量,默认在当前状态下做出最佳选择)返回对应概率最高的词;

  或者通过Beam Search(Bahdanau,Bengio 2014),一种启发式搜索算法,可以基于设备的性能在允许的时间内给出最优解),在输出序列之前可以搜索大量的词,从而得到最优选择;

  或者通过随机抽样(Graves 2013)。

  【深度学习:聚类搜索波束搜索】

  [seq2seq型号]

  序列模型的损失函数

  一般来说,最大似然法是根据输入序列最大化输出序列的条件概率:

  因此,损失函数可以表示为:

  【台大李宏毅深度学习——seq2seq】

  seq2seq多层LSTM神经网络的处理行为

  编码器-解码器最大的限制是编码和解码的唯一环节是一个定长的语义向量c,也就是说,编码器会把整个序列的信息压缩成一个定长的向量。

  这种方式有两个缺点。一个是语义向量不能完全代表整个序列的信息,另一个是第一个输入内容携带的信息会被后面的输入信息冲淡或覆盖。输入序列越长,这种现象就越严重。这使得解码之初无法获得足够的输入序列信息,解码的准确率自然会打折扣。

  由于基本Seq2Seq的缺陷,引入了注意和双向编码层的概念。

  在机器翻译的任务上,Cho等人在解码器部分进行了改进,将编码器获得的上下文向量加入到解码器RNN的每个节点作为输入,使得解码过程中每一时刻的上下文信息都可以获得,从而加强了输出序列和输入序列之间的相关性(Cho Ket al. 2014)。

  注意bucking,fill,reversing编码器输入桶的方法,这也是变长句子翻译的有用工具。当我们想从英语翻译成法语时,输入英语的长度是L1,输出法语的长度是L2。而且现在我们知道英语是从encoder_input到French,从decoder_input出去的(标有go的前缀),所以我们需要一个(L1,L2 1)长的SEQ 2模型来处理每一对英语和法语。这将导致一个巨大的图,由许多非常相似的子图组成。另一方面,我们可以用特殊的填充符号填充每个句子。那么我们只需要一个seq2seq模型来填充长度。但是,对于一些非常短的句子和单词,我们的模型会变得效率低下,过多的填充符编码和解码都没有意义。

  看来,我们需要在太短和太长句子的处理之间找到一个平衡点。我们会用不同长度的桶,把不同的句子放在桶上,装满,直到桶满为止。在translate.py中,我们将使用具有以下默认长度的桶。

  存储桶=[(5,10),(10,15),(20,25),(40,50)]

  这意味着,如果输入是一个具有3个标记的英语句子,而对应的输出是一个具有6个标记的法语句子,那么它们将被放入第一个数据桶,并填充到长度为5的编码器输入和长度为10的解码器输入。如果我们有一个英语句子有8个标记,对应的法语句子有18个标记,那么它们不会应用于(10,15)桶,所以会使用(20,25)桶,即英语句子填充到20个长度,而法语句子填充到25个长度。

  记住,在构建解码器输入时,我们添加了特殊的GO符号。这是在seq2seq_model.py的get_batch()函数中完成的,该函数也对英文的输入进行了反向操作。正如Sutskever所说,这有助于提高机器学习后的结果。现在有一个英语我去。它将被分解成[I , go ,.],它将被用作编码器的输入,而输出Je vais。会分解成[Je , vais ,.].它将被放入(5,10)的桶中。因此,输入是[PAD PAD]. go I]输出为[go je vais]。EOS垫垫垫垫】。

  [入坑seq2seq模式]

  SEQ 2选择SEQ模型一个小皮肤

  注意力模型整合了注意力的解码器:

  [具有多任务学习的两阶段会话式查询重写模型]

  【深度学习:注意力模型】

  代码实现和示例seq2seq有各种形式,使用不同的RNN核,但它总是接受一个编码和解码的输入。

  TensorFlow seq2seq模型TensorFlow也为此创建了一个模型:tensor flow/tensor flow/Python/OPS/seq 2 seq . py .最基本的RNN编解码是这样的:

  Outputs,States=basic _ rnn _ seq 2 seq(encoder _ inputs,decoder _ inputs,cell)[进入pit seq 2 seq模型]

  Tensorflow中编码器-解码器模型的实现tensorflow中的数据预处理在神经网络中,文本的数据预处理无非是将文本转换成模型可以理解的数字,这里比较熟悉,不再过多解释。

  目标端的数据需要一步预处理。在这里,我们需要添加以下四个字符。PAD主要用于字符补全,EOS和GO用于解码器的序列中,告诉解码器句子的开头和结尾,UNK用于替换一些生词或低频词。

  填充:完成字符。

  EOS:解码器的句子结束标识符。

  UNK:低频词或一些不熟悉的词等。

  GO:解码器中句子的开始标识符。

  用下图解释一下:

  这时我们只看右边的解码器,可以看到我们的目标序列是[go,W,X,Y,Z,eos],其中go,W,X,Y,Z是每个时间序列中输入到RNN的内容。我们发现eos没有作为输入传递给RNN。因此,我们需要删除目标中的最后一个字符,同时需要在前面添加go标志,告诉模型这代表一个句子的开始。

  构造解码器嵌入目标数据。

  在解码器端构建RNN单元。

  构建输出层以获得每个时间序列的预测结果。

  构造训练解码器。

  构造一个预测解码器。

  【干货实现Seq2Seq模型从编码器到解码器】

  编解码器对联的例子给出了上联和下联的图例。

  编码器-解码器框架加上注意应该显著提高下行链路的质量,因为它需要严格的对抗。

  Uplink给出一个完全自动生成的对联(uplication也是自动生成的)。

  【使用编解码模型自动生成对联的思路】

  seq2seq在响应生成任务中的应用及论文尚等提出了单轮对话任务的混合模型,利用基本模型的上下文向量对输入序列的整体信息进行建模,利用关注度加权和动态捕捉每次解码所需的局部信息,将两者拼接为新的上下文向量进行解码(尚L等2015)。

  此外,塞尔班等人提出了一个多层次的RNN模型来完成多轮对话任务。下级编码器负责句子级编码,上级编码器读取下级编码器对所有历史句子的编码作为输入对上下文进行编码。最后,解码器根据上下文编码对输出序列进行解码(Serban I Vet al. 2016a)。

  由用于回复生成的序列到序列模型生成的回复有一个共同的问题:回复内容的相关性。通过对实验结果的观察发现,该模型总是倾向于产生一般的普适回复,如“我不知道”、“我也是”。许多人改进了序列对序列模型来解决这个问题。

  李等提出可以用最大互信息目标函数来训练模型,将输入输出序列的互信息作为相关性的参考指标,使模型可以预测与输入序列互信息最大的输出序列,从而获得较好的相关性响应(LiJ etal .2015).

  Serban等人提出在生成阶段引入一个随机隐藏变量来增强回复的多样性(Serban I V等人2016b),然后提出在基本结构中增加一个关键字编码器的方法来增强回复和输入序列之间的相关性(Serban I V等人2016c)。

  此外,牟等人还基于这种使用主题词的方法解决了通用回复问题。他们首先以统计的方式计算出一个应该出现在回复中的主题词,然后从这个主题词开始使用Sequence to sequence模型反向生成回复的前半部分,然后正向生成回复的后半部分。这两个词被拼接成最后的答复(牟L等,2016)。

  (朱q等2016)认为模型中的所有回复都是从起始字符生成的,这可能是导致通用回复的问题。然后,生成阶段被分成两部分,并且在不使用开始字符的情况下生成第一回复字符。我们把编码器最后一个隐藏状态向量C作为当前时刻的上下文,用一个相似度矩阵计算C与所有候选嵌入向量的相似度,然后在所有候选词中选择相似度最大的一个作为第一个字符。相似矩阵作为模型的一个参数,在训练过程中与其他参数一起学习。得到第一个字符后,用这个字符继续解码器后续的生成。

  [用于回复生成的Seq2Seq模型概述]

  图像标题图片描述

  LSTM模型与CNN图像嵌入器(如[24]中所定义)和单词嵌入相结合。

  [展示和讲述:2015年MSCOCO图像字幕挑战赛的经验教训]

  出发地:http://blog.csdn.net/pipisorry/article/details/78258198

  参考:两篇文章是关于机器翻译的。

  谷歌大脑团队【Ilya Sutskever,Oriol Vinyals,和Quoc VV Le。用神经网络进行序列间学习。Innips,2014。]

  Yoshua Bengio小组《Learning Phrase Representation using RNN Encoder-Decoder for Statistical Machine Translation》

  [图片seq2seq车型]

SEIQR模型,seq to seq模型