简单理解LSTM

      文章对LSTM入门的基础知识进行讲解,希望有助于您的理解。

      LSTM(长短时记忆网络)的理解要从简单的RNN(循环神经网络)说起。

     RNN理解

     学习LSTM我们经常会先看到RNN的例子,因为LSTM是RNN的一种优化的变形。下图是RNN的结构:

       参数:  X:输入   h:输出   下标t:当前的时刻

       横向的箭头表示传递一个参数给下一时刻的RNN细胞,假设传递的参数为C(t)(t表示时间下标)

       猛地一看这里有个等号!左边才是真正的一个RNN的模型,右边只是为了让你好理解才展开的,并不是像右边一样有很多个RNN细胞连接在一起,而是一个RNN细胞不同时刻输入输出并且把待传递的参数传递给下一个时刻的过程。比如说现在每隔一秒就输入一个数,第一秒输入一个X(0),然后输出一个h(0),但是我们还要将传递参数C(0)保留下来传给下一个时刻的RNN细胞,然后就跟循环一样,过了一秒,输入变成了X(1),前一时刻保留下来的C(0)也传了进来,然后输出h(1),传递C(1)给下一时刻。 左边的图相当于你现在在设计一个循环,你每次输入后不仅输出了,还要把值传递下去,下面是简单的代码理解:

# _*_ coding:utf-8 _*_
#   author: James-J
#   time: 2018/10/14

# 训练的数据集 假设有10个时刻 就有10个输入
data = [1,2,3,4,5,6,7,8,9,10]

# 传入当前时刻的输入X、上一时刻传递的C  这个函数是RNN计算输出和当前状态方法
def rnn_calculate(X, C):
    return X + C, X - C  # 我随便写的计算方法 真正的情况复杂得多

C = 0   # 初始时刻RNN没有上一时刻传进来的状态值  我先默认为0
for time in range(10):        # 假设有十个时刻
    X = data[time]            # 获取不同时刻的输入
    h, C = rnn_calculate(X, C)   # 上一时刻的C会和X一起传入RNN计算  然后得到新的输出h和传递的C
    # print(h)

    LSTM理解

现在你可能大概理解RNN的基本思想了,让我们来看下LSTM。 LSTM是RNN的优化变形,它的计算同时综合了当前输入、上一时刻输出以及序列的状态,可以很好的解决梯度消失梯度爆炸的问题(不详细展开),所以用LSTM来做长时间的时序预测是比较有效果的。下图是LSTM模型:

先别看内部构造,整体上看,跟上面的RNN一样,这个也是相当于一个展开图。实际上上面的三个LSTM细胞你可以看成是一个LSTM细胞不断的自身循环,并且每次传递两个参数给下一个时刻。这两个参数是什么呢?一个是上一时刻的输出h(t-1),另一个是上一时刻细胞状态变量C(t-1)。所以说每一个时刻,输入的东西有三个:当前时刻输入X(t)、上一时刻输出h(t-1)、上一时刻状态C(t-1)。那输出了什么呢?我们看到一个LSTM细胞有三个箭头出来了,分别是当前时刻输出h(t)、传递给下个时刻的当前细胞状态状态C(t),还有一个输出的传递值也是当前时刻输出h(t),只不过是多画了一个箭头分支,表示拷贝了一份传给下一时刻的LSTM细胞罢了。如下图:

     了解了LSTM的外部构造,现在来看下内部的构造。LSTM著名的特点就是有三个门,这三个门用来控制输入输出和记忆,三个门其实是全连接层。它们分别是:1.遗忘门(顾名思义拿来选择性忘记以前的东西的)、2.输入门(控制输入的信息能不能拿来使用)、3.输出门(控制哪些信息要不要输出)。

       LSTM有着看起来很吓人的内部构造,而且公式看起来也很吓人,但是实际上是矩阵运算等操作,所以为了好理解我会用一些实际数据大小取代未知数据大小来演示,这样比较好理解。

       假设当前时刻输入一个X进行计算,这个时刻的X可能有很多特征(比如股票有当天的最高价、最低价、开盘价、收盘价…),比如有6个特征,那我们用一个矩阵来表示[x1,x2,x3,x4,x5,x6],表示X有6个特征的值,所以这是一个1*6的矩阵作为当前时刻输入。LSTM的三个门实际上是全连接层,所以会有隐藏层,用来做矩阵相乘的运算,我们假设隐藏层节点数量为128。通常情况下,细胞状态C也是跟隐藏层的数目一样的,所以细胞状态C的数据可以看成一个1*128的矩阵,假设是[c1,c2……,c127,c128]。细胞的输出h一般跟细胞状态C也是一样的维度,所以是1*128的矩阵[h1,h2……,h127,h128]。

 

     遗忘门

     遗忘门的构造如下:

 

      现在,我们拿到一个当前时刻的输入X(t)和上一时刻的输出h(t-1),这个图和公式表示:我们要整合两个矩阵h(t-1)和X(t)成一个矩阵,然后经过一层全连接层的矩阵乘法乘以W并加上偏置值b,最后经过一个sigmoid函数的计算。注意,图的左边这个计算结果f(t)最后要按位乘以(不是矩阵相乘)状态C(t-1)的,所以上面公式计算的结果应该是跟C(t-1)同种维度,也就是说遗忘门输出结果f(t)也是含128个值的矩阵。

     我们先整合两个输入。首先我们假设了输入数据X(t)是1*6的矩阵[x1,x2,x3,x4,x5,x6],然后h(t-1)是1*128的矩阵[h1,h2,…,h127,h128]。想要合并两个矩阵,只能排成一行[x1,x2,x3,x4,x5,x6,h1,h2,…,h127,h128],所以这里就有6+128 = 134个数了,即1*134的矩阵。但是这里是权重矩阵W乘以这个合并的矩阵加上偏置b得到,所以要转置一下矩阵变成134*1。实际的数据格式如下(小编随便画的草图,觉得很丑只能忍着点了…):

      到这里我们完成了遗忘门的计算,得到的矩阵是一个128*1的矩阵,即 隐藏层数目*1,这个矩阵的维度跟我们的输出h的维度、输出C的维度一样。

      遗忘门输出一个128*1的矩阵后,与维度为128*1的C(t-1)按位相乘,来达到忘记或记忆先前状态的效果。

     输入门

     输入门结构如下:

     有了刚才的遗忘门的计算方法,相信你应该能看懂这个公式了。遗忘门分为两个独立的全连接层,计算上面的i(t)、C_(t)时,也是跟上面我画的草图一样,各自的一个128*(6+128)的权重矩阵乘以h(t-1)和X(t)合并的(6+128)*1的矩阵,最后都是得到一个128*1的矩阵,但是经过了不同的函数处理,一个是sigmoid,另一个是tanh。

     最后两个维度相同的矩阵在这个门输出后进行了一次按位相乘(不是矩阵乘法),得到新的一个128*1的矩阵,然后再和刚才C(t-1)与遗忘门按位相乘计算得到的128*1的矩阵相加,又得到一个新的128*1的矩阵,这就是我们传递给下一个时刻LSTM细胞的状态,即当前状态C(t)。这样,输入的值也改变了细胞状态,使得输出会有所调整。

    输出门

  输出门结构如下:

 

     最后一个输出门用来决定输出。右边的第一个式子跟上面的两个门计算类似我就不重复了,全连接层后使用Sigmoid得到的是一个128*1的矩阵O(t)。然后先使用tanh函数将维度为128*1的当前状态C(t)的各个值缩放为[-1,1]之间,再和刚才全连接输出的O(t)按位相乘,得到一个128*1的h(t)矩阵,作为当前时刻输出,并且传递给下一时刻。利用当前细胞状态,使得输出具有选择性。

      所以,单个时刻我们最终的输出维度为  隐藏层数量*1,即128*1。那么多个时刻输入则会有多个128*1输出,即一个二维矩阵。

      到此,我们对LSTM内部的计算讲了一遍。

其他有关LSTM的知识

     我们知道LSTM和RNN一样,输入的时候都是有时序性的。当前时刻LSTM可能先输入X(1),得到状态和输出后传递给下一时刻的LSTM并输入X(2),以此类推。所以我们就直接设定一个参数time_step(时间步),表示输入多少个时间序列,比如时间步是10,那么我们就输入X(1)到X(10)的值到LSTM里面训练,就是说从X(1)开始依次传入到LSTM细胞里开始训练,直到X(10)传入后训练结束。所以我们训练的时候一般是传入time_step个X,而X又有多个特征(比如股票有当天的最高价、最低价、开盘价、收盘价…),假设有n个特征,所以往往是输入一个[time_step, n]的二位矩阵到LSTM里。现实中机器学习我们还会使用batch_size这个单位,表示一次性喂入多少组数据进行计算,例如batch_size = m,那就是一次性喂入[m, time_step, n]的三维矩阵了,如果batch_size = 1,那就是直接喂入一组。

    我简单的举个栗子。假设现在每天的股票数据有4个特征,用input_size表示,特征有:最高价,最低价,开盘价,收盘价,想要预测下一天的最高价h,即输出。使用LSTM,时间步为4,表示每次只是输入4天的股票信息,batch_size为1,只是输入一组数据,那么数据格式是[1,4,4],分别表示[batch_size, time_step, input_size]。每个时间间隔输入一天的股价信息X(t),包含了4个特征,那么根据LSTM的输出(一般还会经过全连接等处理),预测下一天结果的输出分别为第2、3、4、5天的预测值,选取最后一个预测第五天的值,这样我们就达到了时序性预测下一天股价的目的了,所以这也是量化投资的一种方式。效果如图(字丑,见谅……):

    LSTM对于时序性预测还是蛮有效果的, 现在正在学习中,希望我的文章有助于大家的理解。如果文章中有什么不对的地方麻烦请大家指正,我会努力改进。

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值