from:https://baijiahao.baidu.com/s?id=1584177164196579663&wfr=spider&for=pc

seq2seq模型是以编码(Encode)和解码(Decode)为代表的架构方式,seq2seq模型是根据输入序列X来生成输出序列Y,在翻译,文本自动摘要和机器人自动问答以及一些回归预测任务上有着广泛的运用。以encode和decode为代表的seq2seq模型,encode意思是将输入序列转化成一个固定长度的向量,decode意思是将输入的固定长度向量解码成输出序列。其中编码解码的方式可以是RNN,CNN等。

上图为seq2seq的encode和decode结构,采用CNN/LSTM模型。在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间的输入x共同决定的,即

【编码阶段】

得到各个隐藏层的输出然后汇总,生成语义向量

也可以将最后的一层隐藏层的输出作为语义向量C

【解码阶段】

这个阶段,我们要根据给定的语义向量C和输出序列y1,y2,…yt1来预测下一个输出的单词yt,即

也可以写做

其中g()代表的是非线性激活函数。在RNN中可写成yt=g(yt1,ht,C),其中h为隐藏层的输出。

以上就是seq2seq的编码解码阶段,seq2seq模型的抽象框架可描述为下图:

http://blog.csdn.net/Jerr__y/article/details/53749693 这里汇总了seq2seq诞生的几篇论文

深度学习的seq2seq模型

from:http://blog.csdn.net/starzhou/article/details/78171936

从rnn结构说起

根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合。如下图,

  • one to one 结构,仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特征,例如图像分类场景。
  • one to many 结构,给一个输入得到一系列输出,这种结构可用于生产图片描述的场景。
  • many to one 结构,给一系列输入得到一个输出,这种结构可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感。
  • many to many 结构,给一些列输入得到一系列输出,这种结构可用于翻译或聊天对话场景,对输入的文本转换成另外一些列文本。
  • 同步 many to many 结构,它是经典的rnn结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,我们最熟悉的就是用于字符预测了,同样也可以用于视频分类,对视频的帧打标签。

seq2seq

在 many to many 的两种模型中,上图可以看到第四和第五种是有差异的,经典的rnn结构的输入和输出序列必须要是等长,它的应用场景也比较有限。而第四种它可以是输入和输出序列不等长,这种模型便是seq2seq模型,即Sequence to Sequence。它实现了从一个序列到另外一个序列的转换,比如google曾用seq2seq模型加attention模型来实现了翻译功能,类似的还可以实现聊天机器人对话模型。经典的rnn模型固定了输入序列和输出序列的大小,而seq2seq模型则突破了该限制。

其实对于seq2seq的decoder,它在训练阶段和预测阶段对rnn的输出的处理可能是不一样的,比如在训练阶段可能对rnn的输出不处理,直接用target的序列作为下时刻的输入,如上图一。而预测阶段会将rnn的输出当成是下一时刻的输入,因为此时已经没有target序列可以作为输入了,如上图二。

encoder-decoder结构

seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的rnn中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。

decoder处理方式还有另外一种,就是语义向量C参与了序列所有时刻的运算,如下图,上一时刻的输出仍然作为当前时刻的输入,但语义向量C会参与所有时刻的运算。

encoder-decoder模型对输入和输出序列的长度没有要求,应用场景也更加广泛。

如何训练

前面有介绍了encoder-decoder模型的简单模型,但这里以下图稍微复杂一点的模型说明训练的思路,不同的encoder-decoder模型结构有差异,但训练的核心思想都大同小异。

我们知道RNN是可以学习概率分布然后进行预测的,比如我们输入t个时刻的数据后预测t+1时刻的数据,最经典的就是字符预测的例子,可在前面的《循环神经网络》和《TensorFlow构建循环神经网络》了解到更加详细的说明。为了得到概率分布一般会在RNN的输出层使用softmax激活函数,就可以得到每个分类的概率。

对于RNN,对于某个序列,对于时刻t,它的输出概率为p(xt|x1,...,xt−1),则softmax层每个神经元的计算如下:

p(xt,j|x1,...,xt−1)=exp(wjht)∑Ki=1exp(wiht) 
其中ht是隐含状态,它与上一时刻的状态及当前输入有关,即ht=f(ht−1,xt)。

那么整个序列的概率就为

p(x)=∏Tt=1p(xt|x1,...,xt−1)

而对于encoder-decoder模型,设有输入序列x1,...,xT,输出序列y1,...,yT‘,输入序列和输出序列的长度可能不同。那么其实就是要根据输入序列去得到输出序列的可能,于是有下面的条件概率,x1,...,xT发生的情况下y1,...,yT‘发生的概率等于p(yt|v,y1,...,yt−1)连乘。其中v表示x1,...,xT对应的隐含状态向量,它其实可以等同表示输入序列。

p(y1,...,yT‘|x1,...,xT)=∏T‘t=1p(yt|x1,...xT,y1,...,yt−1)=∏T‘t=1p(yt|v,y1,...,yt−1)

此时,ht=f(ht−1,yt−1,v),decoder的隐含状态与上一时刻状态、上一时刻输出和状态向量v都有关,这里不同于RNN,RNN是与当前时刻输入相关,而decoder是将上一时刻的输出输入到RNN中。于是decoder的某一时刻的概率分布可用下式表示,

p(yt|v,y1,...,yt−1)=g(ht,yt−1,v)

所以对于训练样本,我们要做的就是在整个训练样本下,所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大,对应的对数似然条件概率函数为,1N∑Nn=1log(yn|xn,θ),使之最大化,θ则是待确定的模型参数。对于rnn、lstm和gru的结构可以看这几篇文章《循环神经网络》 《LSTM神经网络》 《GRU神经网络》。

seq2seq 入门

本文结构:

  • 什么是 seq2seq?
  • Encoder–Decoder 结构?
  • seq2seq 结构?

什么是 seq2seq?

seq2seq 是一个 Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。

这个结构最重要的地方在于输入序列和输出序列的长度是可变的,可以用于翻译,聊天机器人,句法分析,文本摘要等。

下面是写过的 seq2seq 的应用:

RNN与机器翻译
http://www.jianshu.com/p/23b46605857e
如何自动生成文本摘要
http://www.jianshu.com/p/abc7e13abc21
自己动手写个聊天机器人吧
http://www.jianshu.com/p/d0f4a751012b


Encoder–Decoder 结构?

Cho 在 2014 年提出了 Encoder–Decoder 结构,即由两个 RNN 组成,
https://arxiv.org/pdf/1406.1078.pdf

(其中的 RNNCell 可以用 RNN ,GRU,LSTM 等结构)

在每个时刻, Encoder 中输入一个字/词,隐藏层就会根据这个公式而改变,

到最后一个字/词 XT 时 ,隐藏层输出 c ,因为 RNN 的特点就是把前面每一步的输入信息都考虑进来了,所以 c 相当于把整个句子的信息都包含了,可以看成整个句子的一个语义表示。

Decoder 在 t 时刻的隐藏层状态 ht 由 ht−1,yt−1,c 决定:

yt 是由 ht,yt−1,c 决定:

f 和 g 都是激活函数,其中 g 函数一般是 softmax。

模型最终是要最大化下面这个对数似然条件概率:

其中每个 (xn, yn) 表示一对输入输出的序列, θ 为模型的参数。


seq2seq 结构?

Sutskever 在 2014 年也发表了论文:
https://arxiv.org/pdf/1409.3215.pdf

这个模型结构更简单,

因为 Decoder 在 t 时刻 yt 是由 ht,yt−1 决定,而没有 c:

论文中的 Encoder 和 Decoder 都用的 LSTM 结构,注意每句话的末尾要有 “” 标志。 Encoder 最后一个时刻的状态 [cXT,hXT] 就和第一篇论文中说的中间语义向量 c 一样,它将作为 Decoder 的初始状态,在 Decoder 中,每个时刻的输出会作为下一个时刻的输入,直到 Decoder 在某个时刻预测输出特殊符号 结束。

LSTM 的目的是估计条件概率 p(y1, … , yT′ |x1, … , xT ) ,
它先通过最后一个隐藏层获得输入序列 (x1, … , xT ) 的固定长度的向量表达 v,
然后用 LSTM-LM 公式计算输出序列 y1, … , yT′ 的概率,
在这个公式中,初始状态就是 v,

而且用了 4 层的 LSTM,而不是一层:论文中的实验结果表明深层的要比单层的效果好
下面是个 3 层的例子

计算公式如下:

为了便于理解,单层的表示如下:

并且对输入序列做了一个翻转,即不是把 a, b, c 映射到 α, β, γ, 而是把 c, b, a 映射到 α, β, γ, 这样的结果是相应的 a 会更接近 α,并且更利于 SGD 建立输入输出间的关系。


参考:
Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation
https://arxiv.org/pdf/1406.1078.pdf

Sequence to Sequence Learning
with Neural Networks
https://arxiv.org/pdf/1409.3215.pdf

Generating Sequences With
Recurrent Neural Networks
https://arxiv.org/pdf/1308.0850.pdf

转载于:https://www.cnblogs.com/bonelee/p/8484555.html

深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大...相关推荐

  1. 深度学习的seq2seq模型

    从rnn结构说起 根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合.如下图, one to one 结构,仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特 ...

  2. 深度学习的Attention模型

    前面看到谷歌发表的运用在机器翻译上的论文<Attention is all you need>,很是让人惊讶,这是一种全新的模型,与之前的经典的seq2seq模型改动较大,它完全摒弃了RN ...

  3. 深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要 ...

  4. R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification)

    R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification) Long Short Term 网络-- 一般就叫做 LSTM --是一 ...

  5. 深度学习基础-经典模型总结

    深度学习经典模型总结 卷积神经网络 介绍下转置卷积 循环神经网络 介绍下RNN 介绍下LSTM 一个LSTM cell的时间复杂度是多少 介绍下GRU RNN和LSTM的区别 注意力模型 介绍下Att ...

  6. 从零开始搭建深度学习验证码识别模型

    文章目录 从零开始搭建深度学习验证码识别模型 CNN模型与图像识别 验证码数据集介绍 生成数据集 生成EasyCaptcha 生成Kcaptcha 搭建模型 EasyNet模型 KCapNet模型 模 ...

  7. 深度学习100+经典模型TensorFlow与Pytorch代码实现大合集

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]深度学习在过去十年获得了极大进展,出现很多新的模型,并且伴随TensorF ...

  8. 深度学习CTR预估模型凭什么成为互联网增长的关键?

    本文是王喆在InfoQ开设的原创技术专栏"深度学习CTR预估模型实践"的第一篇文章(以下"深度学习CTR预估模型实践"简称"深度CTR模型" ...

  9. 深度学习 vs. 概率图模型 vs. 逻辑学

    深度学习 vs. 概率图模型 vs. 逻辑学 发表于2015-04-30 21:55|6304次阅读| 来源quantombone|1 条评论| 作者Tomasz Malisiewicz 深度学习de ...

最新文章

  1. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)...
  2. C#6.0语言规范(一) 介绍
  3. Elastic Stack简介和Elasticsearch基本介绍
  4. js验证开始日期不能大于结束日期_Excel之日期与时间函数YEAR/MONTH/DAY/DATE/DATEFIF...
  5. c语言可以编制出功能复杂的程序,2018级《C语言程序设计》复习题及答案(5页)-原创力文档...
  6. 经典分享:一份高达555页的技术PPT会是什么样子?
  7. python面试题之如何读取大文件
  8. 陈睿:B站是中国最适合实现元宇宙概念的公司之一
  9. CUDA和LAPACK混编的MakeFile文件
  10. Eclipse 常用快捷键(转)
  11. 【Nginx探究系列二】Nginx配置篇之客户Nginx白名单访问配置
  12. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客
  13. 英国脑科学领域_来自英国A级算法崩溃的数据科学家的4课
  14. 字节抖音电商NLP算法一面
  15. 重装win7系统显示:无法安装在gpt硬盘上
  16. 常用格式如何互相转换(jpg转png)
  17. make[2]:***没有规则制作目标XXX,由XXX需求。停止。
  18. 常用前端技术有哪些?
  19. #博学谷it学习技术支持#kafka及异步通知文章上下架
  20. 2023 软考中级 数据库系统工程师 考试题型

热门文章

  1. win10系统没声音 服务器,win10没有声音怎么解决
  2. 服务器无限火力时间,LOL无限火力2018时间表6月具体开启时间 无限火力模式什么时候出...
  3. 字符串对象转数组对象_js对象转数组的方法 js怎么将数组对象转变成字符串
  4. python的整数类型有几种进制_(一)Python入门-2编程基本概念:08整数-不同进制-其他类型转换成整数...
  5. 计算机能力挑战赛是线上的吗,全国高校计算机能力挑战赛验证码识别竞赛一等奖调参经验分享...
  6. 的注册表怎么才能删干净_白蚁怎么才能消灭干净?
  7. java 数据库操作代码_JAVA:对数据库的一系列操作代码
  8. 基于颜色特征的图像匹配MATLAB,基于颜色特征的图像检索系统 这是个MATLAB程序 - 下载 - 搜珍网...
  9. golang key map 所有_Golang面试知识点总结
  10. java开发五年多少钱,附超全教程文档