lstm 订阅
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。 展开全文
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
信息
外文名
Long-Short Term Memory
缩    写
LSTM
中文名
长短期记忆网络
长短期记忆人工神经网络简介
长短期记忆网络(Long-Short Term Memory,LSTM)论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好,比如用在不分段连续手写识别上。2009年,用LSTM构建的人工神经网络模型赢得过ICDAR手写识别比赛冠军。LSTM还普遍用于自主语音识别,2013年运用TIMIT自然演讲数据库达成17.7%错误率的纪录。作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。 [1] 
收起全文
精华内容
下载资源
问答
  • LSTM

    千次阅读 2020-02-15 23:19:07
      递归神经网络  长期依赖问题  LSTM Networks  LSTM背后的核心理念  遗忘门  输入门  输出门  LSTM变体 目录 递归神经网络 长期依赖问题 LSTM Networks LSTM背后的核心理念 遗忘门 输入...

    目录

      递归神经网络
      长期依赖问题
      LSTM Networks
      LSTM背后的核心理念
      遗忘门
      输入门
      输出门
      LSTM变体

    目录

     


    回到顶部

    递归神经网络

    关于RNN和LSTM 李宏毅老师的课讲的十分清晰

    https://www.youtube.com/watch?v=xCGidAeyS4M

     

    人类不会每时每刻都开始思考。当你阅读这篇文章时,你会根据你对之前单词的理解来理解每个单词。你不要扔掉所有东西,然后再从头开始思考。你的想法有持久性。

    传统的神经网络不能做到这一点,这似乎是一个主要的缺点。例如,假设您想要对电影中每个点发生的事件进行分类。目前尚不清楚传统神经网络如何利用其对电影中先前事件的推理来告知后者。

    循环神经网络解决了这个问题。它们是带有循环的网络,允许信息持续存在。

    递归神经网络具有循环。

    在上图中,一块神经网络,A一个,看一些输入xtxt并输出值htht。循环允许信息从网络的一个步骤传递到下一个步骤。

    这些循环使得循环神经网络看起来有点神秘。但是,如果你多想一点,事实证明它们与普通的神经网络并没有什么不同。可以将循环神经网络视为同一网络的多个副本,每个副本都将消息传递给后继者。考虑如果我们展开循环会发生什么:

    展开的递归神经网络。

    展开的递归神经网络。

    这种类似链的性质表明,递归神经网络与序列和列表密切相关。它们是用于此类数据的神经网络的自然架构。

    他们肯定会被使用!在过去几年中,将RNN应用于各种问题取得了令人难以置信的成功:语音识别,语言建模,翻译,图像字幕......这个列表还在继续。我将讨论使用RNNs可以实现的惊人壮举,以及Andrej Karpathy的优秀博客文章,回归神经网络的不合理有效性。但他们真的很棒。

    这些成功的关键在于使用“LSTM”,这是一种非常特殊的递归神经网络,对于许多任务而言,它比标准版本好得多。几乎所有基于递归神经网络的令人兴奋的结果都是用它们实现的。这篇论文将探讨这些LSTM。

    回到顶部

    长期依赖问题

    RNN的一个吸引力是他们可能能够将先前信息连接到当前任务,例如使用先前的视频帧可能通知对当前帧的理解。如果RNN可以做到这一点,它们将非常有用。但他们可以吗?这取决于。

    有时,我们只需要查看最近的信息来执行当前任务。例如,考虑一种语言模型,试图根据之前的单词预测下一个单词。如果我们试图预测“云在天空中”的最后一个词,我们不需要任何进一步的背景 - 很明显下一个词将是天空。在这种情况下,如果相关信息与所需信息之间的差距很小,则RNN可以学习使用过去的信息。

    但也有一些情况需要更多的背景。考虑尝试预测文本中的最后一个词“我在法国长大......我说流利的法语。”最近的信息表明,下一个词可能是一种语言的名称,但如果我们想缩小哪种语言,我们需要从更进一步的背景来看,法国的背景。相关信息与需要变得非常大的点之间的差距是完全可能的。

    不幸的是,随着差距的扩大,RNN无法学习连接信息。

    RNN-longtermdependencies.pnguploading.4e448015.gif转存失败重新上传取消神经网络与长期依赖关系斗争。

    理论上,RNN绝对能够处理这种“长期依赖性”。人类可以仔细挑选参数来解决这种形式的玩具问题。遗憾的是,在实践中,RNN似乎无法学习它们。Hochreiter(1991)[德国]Bengio等人对该问题进行了深入探讨(1994),他找到了一些非常根本的原因,为什么它可能很难。

    值得庆幸的是,LSTM没有这个问题!

    回到顶部

    LSTM Networks

    长短期内存网络 - 通常只称为“LSTM” - 是一种特殊的RNN,能够学习长期依赖性。它们由Hochreiter&Schmidhuber(1997)介绍,并在以下工作中被许多人提炼和推广。1它们在各种各样的问题上运作得非常好,现在被广泛使用。

    LSTM明确旨在避免长期依赖性问题。长时间记住信息实际上是他们的默认行为,而不是他们难以学习的东西!

    所有递归神经网络都具有神经网络重复模块链的形式。在标准RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。

    LSTM3-SimpleRNN.pnguploading.4e448015.gif转存失败重新上传取消

    标准RNN中的重复模块包含单个层。

    LSTM也具有这种类似链的结构,但重复模块具有不同的结构。有四个,而不是一个神经网络层,以一种非常特殊的方式进行交互。

    LSTM3-chain.pnguploading.4e448015.gif转存失败重新上传取消LSTM神经网络。

    LSTM中的重复模块包含四个交互层。

    不要担心发生了什么的细节。我们将逐步介绍LSTM图。现在,让我们试着对我们将要使用的符号感到满意。

    在上图中,每一行都携带一个整个向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如矢量加法,而黄色框表示神经网络层。行合并表示连接,而行分叉表示其内容被复制,副本将转移到不同的位置。

    回到顶部

    LSTM背后的核心理念

    LSTM的关键是单元状态,水平线贯穿图的顶部。

    电池状态有点像传送带。它直接沿着整个链运行,只有一些次要的线性交互。信息很容易沿着它不变地流动。

    LSTM确实能够移除或添加信息到细胞状态,由称为门的结构精心调节。

    门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。

    sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。

    LSTM通过三个这样的本结构来实现信息的保护和控制。

    这三个门分别输入门、遗忘门和输出门。

    回到顶部

    遗忘门

    在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取ht−1 和xt ,输出一个在 0到 1之间的数值给每个在细胞状态 Ct−1 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

    让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

     

    其中ht−1表示的是上一个cell的输出,xt表示的是当前细胞的输入。σ表示sigmod函数。

    回到顶部

    输入门

    下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,C^t 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。

     

    现在是更新旧细胞状态的时间了,Ct−1更新为Ct。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

    我们把旧状态与ftft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

    在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

     

    回到顶部

    输出门

    最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

    在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

    回到顶部

    LSTM变体

    原文这部分介绍了 LSTM 的几个变种,还有这些变形的作用。在这里我就不再写了。有兴趣的可以直接阅读原文。

    下面主要讲一下其中比较著名的变种 GRU(Gated Recurrent Unit ),这是由 Cho, et al. (2014) 提出。在 GRU 中,如下图所示,只有两个门:重置门(reset gate)和更新门(update gate)。同时在这个结构中,把细胞状态和隐藏状态进行了合并。最后模型比标准的 LSTM 结构要简单,而且这个结构后来也非常流行。


     

    其中, rt表示重置门,zt表示更新门。重置门决定是否将之前的状态忘记。(作用相当于合并了 LSTM 中的遗忘门和传入门)当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏状态h^t会被重置为当前输入的信息。更新门决定是否要将隐藏状态更新为新的状态h^t(作用相当于 LSTM 中的输出门) 。

    和 LSTM 比较一下:
    - GRU 少一个门,同时少了细胞状态Ct。
    - 在 LSTM 中,通过遗忘门和传入门控制信息的保留和传入;GRU 则通过重置门来控制是否要保留原来隐藏状态的信息,但是不再限制当前信息的传入。
    - 在 LSTM 中,虽然得到了新的细胞状态 Ct,但是还不能直接输出,而是需要经过一个过滤的处理:ht=ot∗tanh(Ct);同样,在 GRU 中, 虽然我们也得到了新的隐藏状态h^t, 但是还不能直接输出,而是通过更新门来控制最后的输出:ht=(1−zt)∗ht−1+zt∗h^t

    展开全文
  • lstm

    2021-03-15 17:46:26
    lstm是从网上找到的两篇blog看到的,仅供参考学习。其中每一处的操作都是模型自动学习操作,模型训练时间较长。同时双向lstm就是从前到后、从后到前分别生成一个lstm,进行cat相连接就可以 参考文献: ...

    lstm是从网上找到的两篇blog看到的,仅供参考学习。其中每一处的操作都是模型自动学习操作,模型训练时间较长。同时双向lstm就是从前到后、从后到前分别生成一个lstm,进行cat相连接就可以

    参考文献:

    https://zhuanlan.zhihu.com/p/97815919 lstm具体流程图

    https://www.jianshu.com/p/4b4701beba92 lstm简介以及变种

    展开全文
  • 简单粗暴LSTMLSTM进行时间序列预测

    万次阅读 多人点赞 2018-12-14 21:12:48
    使用LSTM进行时间序列预测 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新...

    简单粗暴LSTM

    LSTM进行时间序列预测

    示例数据下载

    https://download.csdn.net/download/weixin_40066612/13714885?utm_source=bbsseo

    此数据是1949 到 1960 一共 12 年,每年 12 个月的航班乘客数据,一共 144 个数据,单位是 1000。我们使用它来进行LSTM时间序列预测的实验。
    数据如图所示
    在这里插入图片描述
    第一列为时间 第二列为数据

    编写代码

    头文件

    import numpy
    import matplotlib.pyplot as plt
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import LSTM
    import  pandas as pd
    import  os
    from keras.models import Sequential, load_model
    

    加载数据
    在这里我们设置时序数据的前65%为训练数据 后35%为测试数据

    dataframe = pd.read_csv('./international-airline-passengers.csv', usecols=[1], engine='python', skipfooter=3)
    dataset = dataframe.values
    # 将整型变为float
    dataset = dataset.astype('float32')
    #归一化 在下一步会讲解
    scaler = MinMaxScaler(feature_range=(0, 1))
    dataset = scaler.fit_transform(dataset)
    
    train_size = int(len(dataset) * 0.65)
    trainlist = dataset[:train_size]
    testlist = dataset[train_size:]
    

    对数据进行处理
    LSTM进行预测需要的是时序数据 根据前timestep步预测后面的数据
    假定给一个数据集
    {
    A,B,C->D
    B,C,D->E
    C,D,E->F
    D,E,F->G
    E,F,G->H
    }
    这时timestep为3,即根据前三个的数据预测后一个数据的值
    所以我们需要对数据进行转化
    举一个简单的情况 假设一个list为[1,2,3,4,5],timestep = 2
    我们转化之后要达到的效果是

    train_X train_Y
    [1,2] [3]
    [2,3] [4]
    [3,4] [5]

    即依据前两个值预测下一个值


    对数据进行归一化
    LSTM可以不进行归一化的操作,但是这样会让训练模型的loss下降很慢。本教程如果不进行归一化,100次迭代后loss还是很高

    #上面代码的片段讲解
    scaler = MinMaxScaler(feature_range=(0, 1))
    dataset = scaler.fit_transform(dataset)
    

    对数据进行处理

    def create_dataset(dataset, look_back):
    #这里的look_back与timestep相同
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
            a = dataset[i:(i+look_back)]
            dataX.append(a)
            dataY.append(dataset[i + look_back])
        return numpy.array(dataX),numpy.array(dataY)
    #训练数据太少 look_back并不能过大
    look_back = 1
    trainX,trainY  = create_dataset(trainlist,look_back)
    testX,testY = create_dataset(testlist,look_back)
    

    LSTM模型
    LSTM的输入为 [samples, timesteps, features]
    这里的timesteps为步数,features为维度 这里我们的数据是1维的

    trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
    testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1] ,1 ))
    
    # create and fit the LSTM network
    model = Sequential()
    model.add(LSTM(4, input_shape=(None,1)))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
    model.save(os.path.join("DATA","Test" + ".h5"))
    # make predictions
    

    进行预测

    #model = load_model(os.path.join("DATA","Test" + ".h5"))
    trainPredict = model.predict(trainX)
    testPredict = model.predict(testX)
    
    #反归一化
    trainPredict = scaler.inverse_transform(trainPredict)
    trainY = scaler.inverse_transform(trainY)
    testPredict = scaler.inverse_transform(testPredict)
    testY = scaler.inverse_transform(testY)
    

    查看结果

    plt.plot(trainY)
    plt.plot(trainPredict[1:])
    plt.show()
    plt.plot(testY)
    plt.plot(testPredict[1:])
    plt.show()
    

    这个时候我们的结果为
    训练数据
    测试数据

    参考
    用 LSTM 做时间序列预测的一个小例子
    Keras中文文档-Sequential model

    注:代码已上传

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,608
精华内容 9,443
热门标签
关键字:

lstm