1. 首页 > 电脑手机 >

lstm神经网络算法_lstm神经网络原理

直观理解LSTM(长短时记忆网络)

长短时神经网络是一种特殊的递归神经网络,所谓递归神经网络就是网络能够解决时间序列问题的预测。所谓递归神经网络就是网络中具有循环结构。递归神经网路从某种程度来说和传统的神经网络并非完全不同。可以将递归神经网络想象成有多层相同网络结构的神经网络,每一层将信息传递给下一层(以下借鉴一些十分易懂的图片):

lstm神经网络算法_lstm神经网络原理lstm神经网络算法_lstm神经网络原理


上述是为了便于理解网络送展示的示意图,实际上网络结构只是上图左边的一小块。

普通的RNN没有办法解决需要长时记忆的功能。比如试图预测“I grew up in France… I speak fluent French.”中后一个词。近信息显示下一个词可能是一门语言的名字,但是如果我们想要缩小选择范围,我们需要包含“法国”的那段上下文,从前面的信息推断后面的单词。相关信息与预测位置的间隔很大是完全有可能的。然而RNNs并没有办法解决这种问题。

LSTM作为效果比较好的递归神经网络,拥有者对长时时间序列问题很好的解决能力。

LSTM也有这样的链式结构,但其重复模块内部的机构不同。具体如下:

之下说明一下内部四个网络的具体意义。

主要分为: 单元状态 + 门限。

单元状态:让信息以不变的方式向下流动,相当于一个传送带,但传送带上的东西会随着他通过每一个重复模块基于当时的输入有所增减。

门限:有能力向单元状态增加或者剔除信息的管理机构,相当于传送带上放东西或者拿走东西的那个人。在LSTM中由sigmoid函数和乘法加法来控制这个过程。

上图通过当前时间的输入和前一个时间的输出来通过sigmoid函数来使得单元状态乘以这个sigmoid函数的输出。若sigmoid函数输出0则该部分信息需要被遗忘,反之该部分信息继续在单元状态中继续传下去。

该门限功能是更新旧的单元状态。之前的遗忘门限层决定了遗忘或者添加哪些信息,由该门限层来执行实现。

后,我们需要决定需要输出什么。这个输出将会建立在单元状态的基础上,但是个过滤版本。首先,我们运行一个sigmoid层来决定单元状态中哪些部分需要输出。然后我们将单元状态输入到tanh函数(将值转换成-1到1之间)中,然后乘以输出的sigmoid门限值,所以我们只输出了我们想要输出的那部分。

上面提到的是非常常规的LSTM网络,LSTM有许多不同的变种,下面来介绍几种。

就是使用耦合遗忘和输入门限。我们不单独决定遗忘哪些、添加哪些新信息,而是一起做出决定。在输入的时候才进行遗忘。在遗忘某些旧信息时才将新值添加到状态中。

它将遗忘和输入门限结合输入到单个“更新门限”中。同样还将单元状态和隐藏状态合并,并做出一些其他变化。所得模型比标准LSTM模型要简单,这种做法越来越流行。

lstm具有什么特点

LSTM结构的文章,实在是太多了,小Dream哥本来是不想再讲的。出于文章完整性和系统性的考虑,这里还是将LSTM的模型结构和前向传播过程列一下。

可以看到LSTM的结构要比RNN的复杂的多,其主要是增加了细胞状态和3个门结构。看上去比较复杂,同学们先不要着急,下面我们一步一步来讲一讲LSTM的结构。

如上图,细胞状态C_t横向穿过,看起来像一条传送带,只是经过了少量的线性变化,因此状态容易保持下来。

上图是LSTM的第一个门,遗忘门。这个门根据输入信息(h_t-1和x_t)决定要忘记细胞状态C_t-1的哪些部分。

接下来是信息更新门,决定了细胞状态C_t,它分为两个部分。

第一步,根据输入信息,用tanh产生该时刻需要更新到细胞状态中的内容;用sigmoid函数产生更新的比例。

LSTM是一个应用广泛的模型,但随着Attention机制的提出,transfomer开始作为一种更为强大的特征抽取模型,开始横扫各大NLP任务的榜单。不出意外,transformer将会取代RNN及其衍生(LSTM GRU)模型,成为NLP中,、为强大的特征抽取模型。

深度学习LSTM神经网络输入输出究竟是怎样的?

蓝海大脑深度学习高性能计算液冷工作站研究人员表示:第一要明确的是神经网络所处理的单位全部都是:向量

下面就解释为什么你会看到训练数据会是矩阵和张量

常规feedforward 输入和输出:矩阵

输入矩阵形状:(n_samples, dim_input)

输出矩阵形状:(n_samples, dim_output)

注:真正测试/训练的时候,网络的输入和输出就是向量而已。加入n_samples这个维度是为了可以实现一次训练多个样本,求出平均梯度来更新权重,这个叫做Mini-batch gradient descent。 如果n_samples等于1,那么这种更新方式叫做Stochastic Gradient Descent (SGD)。

Feedforward 的输入输出的本质都是单个向量。

常规Recurrent (RNN/LSTM/GRU) 输入和输出:张量

输入张量形状:(time_steps, n_samples, dim_input)

输出张量形状:(time_steps, n_samples, dim_output)

如何在Python中用LSTM网络进行时间序列预测

时间序列模型

时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。

RNN 和 LSTM 模型

时间序列模型常用强大的的工具就是递归神经网络(recurrent neural network, RNN)。相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。

典型的RNN网路结构如下:

右侧为计算时便于理解记忆而产开的结构。简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为St = f(UXt + WSt-1),实现当前输入结果与之前的计算挂钩的目的。对RNN想要更深入的了解可以戳这里。

RNN的局限:

LSTM模型

LSTM的特点就是在RNN结构以外添加了各层的阀门节点。阀门有3类:遗忘阀门(forget gate),输入阀门(input gate)和输出阀门(output gate)。这些阀门可以打开或关闭,用于将判断模型网络的记忆态(之前网络的状态)在该层输出的结果是否达到阈值从而加入到当前该层的计算中。如图中所示,阀门节点利用sigmoid函数将网络的记忆态作为输入计算;如果输出结果达到阈值则将该阀门输出与当前层的的计算结果相乘作为下一层的输入(PS:这里的相乘是在指矩阵中的逐元素相乘);如果没有达到阈值则将该输出结果遗忘掉。每一层包括阀门节点的权重都会在每一次模型反向传播训练过程中更新。更具体的LSTM的判断计算过程如下图所示:

LSTM模型的记忆功能就是由这些阀门节点实现的。当阀门打开的时候,前面模型的训练结果就会关联到当前的模型计算,而当阀门关闭的时候之前的计算结果就不再影响当前的计算。因此,通过调节阀门的开关我们就可以实现早期序列对终结果的影响。而当你不不希望之前结果对之后产生影响,比如自然语言处理中的开始分析新段落或新章节,那么把阀门关掉即可。(对LSTM想要更具体的了解可以戳这里)

黑色实心圆代表对该节点的计算结果输出到下一层或下一次计算;空心圆则表示该节点的计算结果没有输入到网络或者没有从上一次收到信号。

Python中实现LSTM模型搭建

Python中有不少包可以直接调用来构建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳这里)。这里我们选用keras。(PS:如果操作系统用的linux或者mac,强推Tensorflow!!!)

因为LSTM神经网络模型的训练可以通过调整很多参数来优化,例如activation函数,LSTM层数,输入输出的变量维度等,调节过程相当复杂。这里只举一个简单的应用例子来描述LSTM的搭建过程。

应用实例

基于某家店的某顾客的历史消费的时间推测该顾客前下次来店的时间。具体数据如下所示:

消费时间

具体操作:

消费间隔04418054..

2.生成模型训练数据集(确定训练集的窗口长度)

X1 X2 X3 Y0 44 18 044 18 0 54..

注:直接这样预测一般精度会比较,可以把预测值Y根据数值bin到几类,然后用转换成one-hot标签再来训练会比较好。比如如果把Y按数值范围分到五类(1:0-20,2:20-40,3:40-60,4:60-80,5:80-100)上式可化为:

X1 X2 X3 Y0 44 18 044 18 0 4...

Y转化成one-hot以后则是(关于one-hot编码可以参考这里)

1 0 0 0 00 0 0 0 1...

3. 网络模型结构的确定和调整

需要确定LSTM模块的激活函数(activation fucntion)(keras中默认的是tanh);

确定接收LSTM输出的完全连接人工神经网络(fully-connected artificial neural network)的激活函数(keras中默认为linear);

确定每一层网络节点的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;

确定误的计算方式,这里我们使用均方误(mean squared error);

确定权重参数的迭代更新方式,这里我们采用RMSprop算法,通常用于RNN网络。

确定模型训练的epoch和batch size(关于模型的这两个参数具体解释戳这里)

如果需要将多个序列进行同一个模型的训练,可以将序列分别输入到独立的LSTM模块然后输出结果合并后输入到普通层。结构如下:

4. 模型训练和结果预测

实现代码

时间间隔序列格式化成所需的训练集格式

import pandas as pdimport numpy as npdef create_interval_dataset(dataset, look_back):

LSTM网络结构搭建

import pandas as pdimport numpy as npimport randomfrom keras.models import Sequential, model_from_jsonfrom keras.layers import Dense, LSTM, Dropoutclass NeuralNetwork():

深度学习LSTM结构推导,为什么比RNN好?

蓝海大脑深度学习AI人工智能服务器研究人员表示:推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。

lstm是什么

LSTM是一种循环神经网络模型,其全称为“长短时记忆网络”(Long Short-Term Memory Network)。它是RNN的一种改进形式,在解决传统RNN在处理序列数据时会出现梯度消失或梯度爆炸等问题方面表现更加优异。

LSTM模型的核心是由门控单元(Gate Units)和记忆单元(Memory Units)构成的。其中门控单元主要负责控制信息是否流经,以此控制信息的输入、输出和遗忘;而记忆单元主要记录和保存历史状态的信息,并通过门控单元的调节实现信息的筛选、保留与更新。

相比于传统RNN,LSTM可以更好地处理长时序列数据,使得我们能够更有效地对文本、音频、视频等序列数据进行建模,从而在自然语言处理、语音识别、图像描述等领域获得了广泛的应用。

LSTM神经网络输入输出究竟是怎样的?

常规feedforward输入和输出:矩阵输入矩阵形状:(n_samples,dim_input)输出矩阵形状:(n_samples,dim_output)注:真正测试/训练的时候,网络的输入和输出就是向量而已。加入n_samples这个维度是为了可以实现一次训练多个样本,求出平均梯度来更新权重,这个叫做Mini-batchgradientdescent。如果n_samples等于1,那么这种更新方式叫做StochasticGradientDescent(SGD)。Feedforward的输入输出的本质都是单个向量。常规Recurrent(RNN/LSTM/GRU)输入和输出:张量输入张量形状:(time_steps,n_samples,dim_input)输出张量形状:(time_steps,n_samples,dim_output)注:同样是保留了Mini-batchgradientdescent的训练方式,但不同之处在于多了timestep这个维度。Recurrent的任意时刻的输入的本质还是单个向量,只不过是将不同时刻的向量按顺序输入网络。所以你可能更愿意理解为一串向量asequenceofvectors,或者是矩阵。

关于如何输入的问题,LSTM是一个序列模型,对于输入数据也是一个序列,LSTM每个时间步处理的是序列中一个时刻的输入,比如你当前输入是一个汉字“我”,因为模型只能接受的是数值向量,因此需要embedding,“我”就需要变成了一个向量,假如是[0.1,0.8,3.2,4.3](通过wordembedding技术获得),这里向量维度是4,那么就需要4个神经元去接收向量中的每个元素,而这四个神经元就构成了当前时刻的LSTMUnit,其他时刻也是这样,从而完成输入。因此就可以知道输入层神经元(LSTMunit中神经元数)的个数等于词向量的size。

lstm神经网络输入输出究竟是怎样的

LSTM的三个门输出数字和向量的情况都有。门(input,forget,output)输出的维度和cell状态的维度一致即可。也就是说三个门的输出分别控制被控制向量(cell input,cell(t-1),cell(t))中的元素。举个例子,如果cell状态的维度是1,那么被控制向量(cell input,cell(t-1),cell(t))的维度也都是1,那么三个门的输出都是0-1之间的数字(选用sigmoid激活函数);如果cell状态的维度是N,那么被控制向量(cell input,cell(t-1),cell(t))的维度也分别都是N,那么三个门的输出都是0-1之间的向量(选用sigmoid激活函数),且门输出向量的维度都是N。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息