在看LSTM模型的时候,有讲原理的、有讲实现的,但是关于模型的应用总是存在一些困惑,特别是关于不同类型的时间预测。找了一篇英文博客感觉讲的比较清晰,从大的方面讲,LSTM模型可以分为单变量LSTM模型多变量LSTM模型多步LSTM模型多变量多步LSTM模型四种,以下简要介绍前三类LSTM模型。

目录

一、单变量LSTM模型

二、多变量LSTM模型

三、多步LSTM模型

四、模型的实现


一、单变量LSTM模型

        故名思意,单变量模型是输入的特征维度为1。其目标是根据过去的观测,来预测下一个观测点的值。根据具体模型的构建方式,又可以分为Vanilla LSTM、Stacked LSTM、Bidirectional LSTM, CNN LSTM, 以及ConvLSTM 模型。以下的描述主要以简单数据集作为示例。

1. 数据准备        

 [10, 20, 30, 40, 50, 60, 70, 80, 90],设置sequence 的步长为3,目的是预测一个时间步长的值(关于多步长时间的预测请直接看第三部分),则对应的输入输出为 

                                         X (输入时间序列)

y(输出)

10

20

30

40

20

30

40

50

......

......

......

......

2. Vanilla LSTM

       Vanilla LSTM 为只有一个隐含层以及一个输出层的LSTM模型。模型要求两个输入,分别是步长以及特征大小,对于单变量模型而言,输入的特征维度为1,步长可以根据需要设置,如上表中的3。

3. Stacked LSTM

        Stacked LSTM model指的是具有多个隐含层的LSTM模型,输出既可以是2维的(只输出最后一个time step的输出,即sample_numer * hidden_layer_feature_num),也可以是3维的(即给每一个time step 一个输出值, samplenumer * timestep * hidden_layer_feature_num)。

4. Bidirectional LSTM

Bidirectional LSTM同时通过前向和后向传播对输入进行学习,并将两者的结果相结合。

5. CNN LSTM

        CNN LSTM是专门为2D图像数据所设计的。同时使用CNN模型(在前)和LSTM模型(在后),其中CNN在前端用于理解输入数据的subsequences,并将其输出sequence 以作为LSTM的输入。对于1D的输入,第一步是将输入的sequences处理为CNN 可以处理的subsequences,然后CNN将subsequences理解之后输出时间序列用于LSTM model的输入。

6. ConvLSTM

        一种特殊的CNN LSTM,也是专门为2D图像数据所设计的。

二、多变量LSTM模型

        多变量时间序列意味着对于每个时间步长,观察变量的数量大于1,即特征数大于1。主要包括两种类型:1)多输入时间序列(Multiple input series);2) 多并行时间序列(Multiple parallel series)。

1) 多输入时间序列(Multiple input series)

假定输入两个1维的时间序列:
                in_seq1 = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
                in_seq2 = array([15, 25, 35, 45, 55, 65, 75, 85, 95])
        构造输出为:
                out_seq = array([in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))])
                out_seq = array([25, 45, 65, 85, 105, 125, 145, 165, 185])

如果我们的目标是根据两个时间序列的3个步长来预测第3个步长对应的输出,即可以构建以下输入输出:

                                         X(输入时间序列)

y(输出)

[10,15]

[20, 25]

[30, 35]

65

[20, 25]

[30, 35]

[40, 45]

85

......

......

......

......

2)多并行时间序列(Multiple parallel series)

对于多个并行的时间序列,多并行时间序列必须为每一个时间序列输出一个值。假设给定输入为:

in_seq1 = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
                in_seq2 = array([15, 25, 35, 45, 55, 65, 75, 85, 95])

        则对应的输入输出为:

                                         X(输入时间序列)

y(输出)

[10,15]

[20, 25]

[30, 35]

[40, 45]

[20, 25]

[30, 35]

[40, 45]

[50, 55]

......

......

......

......

        对比多输入时间序列和多并行时间序列的输入输出表可以发现两者的关键区别在于输出的特征维度不一样,对于多输入时间序列其输出特征维度为1,而多并行时间序列的输出特征维度与输入特征维度相同。

三、多步LSTM模型

        以上描述的单变量和多变量LSTM模型一个共同特点是,我们仅仅输出了下一个时间步长值。如果输出的是多个时间步长的值则称之为多步LSTM模型。多步LSTM模型可以分为两类:1)向量输出模型(Vector Output Model);2)Encoder-Decoder Model。

1) 向量输出模型(Vector Output Model)

 [10, 20, 30, 40, 50, 60, 70, 80, 90]

                                         X (输入时间序列)

y(输出)

10

20

30

[40, 50]

20

30

40

[50, 60]

......

......

......

......

2) Encoder-Decoder Model  

用于预测输出长度可变的序列。典型的一个应用场景就是机器翻译。被称之为sequence-to-sequence模型。Encoder 用于读取和理解输入的时间序列,输出的是一个固定长度的向量。Vanilla是一种常用的Encoder,当然也可以是Stacked, Bidirectional, 和 CNN 等模型。Decoder 使用Encoder的输出作为输入。具体操作包括以下三步:

        首先,对encoder固定长度的输出进行重复,重复的次数与输出sequence 的步长相同。

        然后,这个序列被提供给LSTM decoder模型,这个decoder模型为输出的每一个步长输出一个值。

        最后,我们可以使用这个输出的值或者再加一层来预测来得到最终的输出。

四、模型的实现

        关于模型的实现,原文中以Keras为例给出了代码,如果习惯使用Keras框架的同学可以直接点 How to develop LSTM models for time series forcasting 查看详情,其中还对多变量多步LSTM模型的模型也有具体的讲解。

后记

        在具体的应用中,我们需要根据应用场景设置对应的输入、输出,并根据问题特点设置相应的步长,比如一小时4个15分钟,一天24小时,一周7天,一个月30天等,另外还以根据问题的特点对LSTM模型进行改进等。