本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

时间:2017-07-10 07:34来源:天下彩论坛 作者:本港台直播 点击:
关键字 全网搜索 最新排名 『量化投资』:排名第一 『量 化』:排名第一 『机器学习』:排名第四 我们会再接再厉 成为全网 优质的 金融、技术类公众号 知乎专栏:机器不学习 作

关键字全网搜索最新排名

『量化投资』:排名第一

『量 化』:排名第一

『机器学习』:排名第四

我们会再接再厉

成为全网优质的金融、技术类公众号

知乎专栏:机器不学习

作者:天雨栗 | 蚂蚁金服 | 数据算法

已授权刊登

前言

好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用TensorFlow来实现一个基础版本的Seq2Seq,主要帮助理解Seq2Seq中的基础架构。

最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编成一个固定大小的状态向量S,继而将S传给Decoder,Decoder再通过对状态向量S的学习来进行输出。

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

图中每一个box代表了一个RNN单元,通常是LSTM或者GRU。其实基础的Seq2Seq是有很多弊端的,首先Encoder将输入编为固定大小状态向量的过程实际上是一个信息“信息有损压缩”的过程,如果信息量越大,那么这个转化向量的过程对信息的损失就越大,同时,随着sequence length的增加,意味着时间维度上的序列很长,RNN模型也会出现梯度弥散。最后,基础的模型连接Encoder和Decoder模块的组件仅仅是一个固定大小的状态向量,这使得Decoder无法直接去关注到输入信息的更多细节。由于基础Seq2Seq的种种缺陷,随后引入了Attention的概念以及Bi-directional encoder layer等,由于本篇文章主要是构建一个基础的Seq2Seq模型,对其他改进tricks先不做介绍。

总结起来说,基础的Seq2Seq主要包括Encoder,Decoder,以及连接两者的固定大小的State Vector。

实战代码

下面我们就将利用TensorFlow来构建一个基础的Seq2Seq模型,通过向我们的模型输入一个单词(字母序列),例如hello,模型将按照字母顺序排序输出,即输出ehllo。

版本信息:Python 3 / TensorFlow 1.1

1. 数据集

数据集包括source与target:

- source_data: 每一行是一个单词

- target_data: 每一行是经过字母排序后的“单词”,它的每一行与source_data中每一行一一对应

例如,source_data的第一行是hello,第二行是what,那么target_data中对应的第一行是ehllo,第二行是ahtw。

2. 数据预览

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

我们先把source和target数据加载进来,可以看一下前10行,target的每一行是对source源数据中的单词进行了排序。下面我们就将基于这些数据来训练一个Seq2Seq模型,来帮助大家理解基础架构。

3. 数据预处理

在神经网络中,对于文本的数据预处理无非是将文本转化为模型可理解的数字,这里都比较熟悉,不作过多解释。但在这里我们需要加入以下四种字符,<PAD>主要用来进行字符补全,<EOS>和<GO>都是用在Decoder端的序列中,告诉解码器句子的起始与结束,<UNK>则用来替代一些未出现过的词或者低频词。

< PAD>: 补全字符。

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

< UNK>: 低频词或者一些未遇到过的词等。

< GO>: 解码器端的句子起始标识符。

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

通过上面步骤,我们可以得到转换为数字后的源数据与目标数据。

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

4. 模型构建

Encoder

模型构建主要包括Encoder层与Decoder层。在Encoder层,我们首先需要对定义输入的tensor,同时要对字母进行Embedding,再输入到RNN层。

在这里,j2直播,我们使用TensorFlow中的tf.contrib.layers.embed_sequence来对输入进行embedding。

我们来看一个栗子,假如我们有一个batch=2,sequence_length=5的样本,features = [[1,2,3,4,5],[6,7,8,9,10]],使用

tf.contrib.layers.embed_sequence(features,vocab_size=n_words, embed_dim=10)

那么我们会得到一个2 x 5 x 10的输出,其中features中的每个数字都被embed成了一个10维向量。

官方关于tf.contrib.layers.embed_sequence()的解释如下:

Maps a sequence of symbols to a sequence of embeddings.

Typical use case would be reusing embeddings between an encoder and decoder.

wzatv:从Encoder到Decoder实现Seq2Seq模型(算法+代码)

Decoder

在Decoder端,我们主要要完成以下几件事情:

对target数据进行处理

构造Decoder

Embedding

构造Decoder层

构造输出层,输出层会告诉我们每个时间序列的RNN输出结果

Training Decoder

Predicting Decoder

下面我们会对这每个部分进行一一介绍。

1. target数据处理

我们的target数据有两个作用:

(责任编辑:本港台直播)

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容