深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大
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模型的抽象框架可描述为下图:
深度学习的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
深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大的更多相关文章
- 时间序列深度学习:seq2seq 模型预测太阳黑子
目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...
- 深度学习之seq2seq模型以及Attention机制
RNN,LSTM,seq2seq等模型广泛用于自然语言处理以及回归预测,本期详解seq2seq模型以及attention机制的原理以及在回归预测方向的运用. 1. seq2seq模型介绍 seq2se ...
- 深度学习基础(CNN详解以及训练过程1)
深度学习是一个框架,包含多个重要算法: Convolutional Neural Networks(CNN)卷积神经网络 AutoEncoder自动编码器 Sparse Coding稀疏编码 Rest ...
- 深度学习教程 | Seq2Seq序列模型和注意力机制
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...
- 使用深度学习检测TOR流量——本质上是在利用报文的时序信息、传输速率建模
from:https://www.jiqizhixin.com/articles/2018-08-11-11 可以通过分析流量包来检测TOR流量.这项分析可以在TOR 节点上进行,也可以在客户端和入口 ...
- 深度学习 vs. 概率图模型 vs. 逻辑学
深度学习 vs. 概率图模型 vs. 逻辑学 摘要:本文回顾过去50年人工智能(AI)领域形成的三大范式:逻辑学.概率方法和深度学习.文章按时间顺序展开,先回顾逻辑学和概率图方法,然后就人工智能和机器 ...
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
[caffe]深度学习之图像分类模型AlexNet解读 原文地址:http://blog.csdn.net/sunbaigui/article/details/39938097 本文章已收录于: ...
- [caffe]深度学习之图像分类模型VGG解读
一.简单介绍 vgg和googlenet是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是go deeper.跟googlenet不同的是.vgg继承了lenet以及alexnet ...
- 深度学习之 seq2seq 进行 英文到法文的翻译
深度学习之 seq2seq 进行 英文到法文的翻译 import os import torch import random source_path = "data/small_vocab_ ...
随机推荐
- DeepCloneObjects 和 DeepClone
ARX AcDbDatabase 中的方法 deepCloneObjects() 和 wblock() 区别以及和 AcDbObject 方法 clone() 和 deepClone() 的关系 Ac ...
- 05Oracle Database 表空间查看,创建,修改及删除
Oracle Database 表空间查看,创建,修改及删除 查看用户表空间 查看数据库管理员表空间表结构 desc dba_tablespaces; 查询表空间名称从管理员表空间表中 select ...
- 01网页<head></head>常用标记及属性
网页<head></head>常用标记及属性 <!DOCTYPE html> <html> <head> <!--网页标题--> ...
- Python爬虫:抓取手机APP的数据
摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 表单: 表单中包括了用户名和密码,当然都是加密 ...
- 【Hadoop】四、HDFS的java接口
Hadoop是用java语言实现的,因此HDFS有很好的java接口用以编程,重点就是Hadoop的FileSystem类,它是所有文件系统的抽象类,HDFS实例(DistributedFileS ...
- P1048 采药
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...
- TestNG异常测试
用@Test(expectedExceptions = xxx) 声明 package com.janson; import org.testng.annotations.Test; public c ...
- db2 in out inout
总结: in 给存储过程传的参数,传一个确定的值 out 传的时候传一个非确定的变量v或者“?” .在存储过程里面计算一个结果赋给v,这个变量v在存储过程执行完之后就是一个确定的值了. inou ...
- fork 系统调用
对自己知识储备的感觉就是过于肤浅,很多东西知其名后就不了了之 此系列博客将记录进程分析的学习过程,希望能够多些深度 提到进程,最容易的想到就是fork系统调用,比较好和快速的找到的fork的相关信息就 ...
- codechef 营养题 第一弹
第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...