编解码器长短期记忆神经网络

        编码器-解码器LSTM是一个循环神经网络,旨在解决序列到序列问题,有时称为seq2seq。

        序列到序列的预测问题具有挑战性,因为输入和输出序列中的项数可能会发生变化。 例如,文本翻译和学习执行程序就是seq2seq问题的示例。

       在这篇文章中,您将发现用于序列到序列预测的Encoder-Decoder LSTM体系结构。

       完成这篇文章后,您将知道:

  • 序列间预测的挑战。
  • 编码器-解码器体系结构以及旨在解决的LSTM中的限制。
  • 如何使用Keras在Python中实现Encoder-Decoder LSTM模型架构。
    在我的新书中找到了如何开发LSTM(例如,堆叠式,双向,CNN-LSTM,Encoder-Decoder seq2seq等)以及更多内容,其中包括14个循序渐进的教程和完整代码。

       让我们开始吧。

Encoder-Decoder Long Short-Term Memory Networks

序列到序列的预测问题

        序列预测通常涉及预测实值序列中的下一个值或输出输入序列的类别标签。

       这通常被构造为一个输入时间步长到一个输出时间步长(例如一对一)的序列或多个输入时间步长到一个输出时间步长(多个一对一)类型的序列预测问题。

      存在一种更具挑战性的序列预测问题,该问题需要将序列作为输入并需要将序列预测作为输出。 这些称为序列到序列预测问题,或简称seq2seq。

       使这些问题具有挑战性的一个建模问题是输入和输出序列的长度可能会变化。 假设有多个输入时间步长和多个输出时间步长,则这种形式的问题称为多对多类型序列预测问题。

编解码器LSTM架构


       一种已经证明非常有效的解决seq2seq预测问题的方法称为Encoder-Decoder LSTM。

        该体系结构由两个模型组成:一个模型用于读取输入序列并将其编码为固定长度的向量,第二个模型用于解码固定长度的向量并输出预测的序列。 协调使用这些模型使该架构的名称专门针对seq2seq问题设计的Encoder-Decoder LSTM。

Encoder-Decoder LSTM Model Architecture

编解码器LSTM的应用

       下面的列表重点介绍了Encoder-Decoder LSTM体系结构的一些有趣应用。

机器翻译,例如 短语的英语到法语翻译。
学习执行,例如 计算小程序的结果。
图片字幕,例如 生成图像的文本描述。
会话建模,例如 生成文本问题的答案。
运动分类,例如 从一系列手势生成一系列命令。

在Keras中实现编码器-解码器LSTM

       编码器-解码器LSTM可以直接在Keras深度学习库中实现。

       我们可以认为模型由两个关键部分组成:编码器和解码器。

       首先,将输入序列一次显示给网络一个编码字符。 我们需要一个编码级别来学习输入序列中步骤之间的关系,并开发这些关系的内部表示形式。

       一层或多层LSTM层可用于实现编码器模型。 该模型的输出是一个固定大小的向量,代表输入序列的内部表示。 该层中存储单元的数量定义了此固定大小的向量的长度。

model = Sequential()
model.add(LSTM(..., input_shape=(...)))

        解码器必须将学习到的输入序列的内部表示形式转换为正确的输出序列。

       一个或多个LSTM层也可以用于实现解码器模型。 该模型从编码器模型的固定大小的输出中读取。

        与Vanilla LSTM一样,密集层用作网络的输出。 通过将Dense层包装在TimeDistributed包装器中,可以使用相同的权重来输出输出序列中的每个时间步。

model.add(LSTM(..., return_sequences=True))
model.add(TimeDistributed(Dense(...)))

       不过有一个问题。

       我们必须将编码器连接到解码器,但它们不合适。

       也就是说,编码器将产生一个二维输出矩阵,其长度由该层中存储单元的数量定义。 解码器是一个LSTM层,它需要[样本,时间步长,特征]的3D输入,以便产生问题定义的某些不同长度的解码序列。

       如果尝试将这些部分拼合在一起,则会出现错误,指示解码器的输出为2D,并且需要将3D输入解码器。

       我们可以使用RepeatVector层解决此问题。 该层简单地多次重复提供的2D输入以创建3D输出。

       RepeatVector层可以像适配器一样使用,以将网络的编码器和解码器部分配合在一起。 我们可以将RepeatVec

model.add(RepeatVector(...))

       放在一起,我们有:

model = Sequential()
model.add(LSTM(..., input_shape=(...)))
model.add(RepeatVector(...))
model.add(LSTM(..., return_sequences=True))
model.add(TimeDistributed(Dense(...)))

     总而言之,RepeatVector用作适配器,以将编码器的固定大小的2D输出适配到解码器期望的不同长度和3D输入。 TimeDistributed包装器允许将相同的输出层重用于输出序列中的每个元素。

      很高兴有时间可以亲自翻译和实践一下大神Jason这篇基于LSTM的多种类型网络的数据建模分析教程,欢迎感兴趣的同学一起交流学习共同进步。

发布了521 篇原创文章 · 获赞 490 · 访问量 323万+

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/103598472
今日推荐