精华内容
下载资源
问答
  • LSTM模型结构1、LSTM模型结构2、LSTM网络3、LSTM的输入结构4、Pytorch中的LSTM4.1、pytorch中定义的LSTM模型4.2、喂给LSTM的数据格式4.3、LSTM的output格式5、LSTM和其他网络组合 1、LSTM模型结构 BP网络和CNN网络...

    1、LSTM模型结构

    BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。
    在这里插入图片描述
    在这里插入图片描述
    图中的隐含层、卷积层、池化层、全连接层等,都是实际存在的,一层层前后叠加,在空间上很好理解,因此在写代码的时候,基本就是看图写代码,比如用keras就是:

    # 示例代码,没有实际意义
    model = Sequential()
    model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
    model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
    model.add(Dropout(0.25))                          # 添加dropout层
    
    model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
    model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
    model.add(Dropout(0.25))                          # 添加dropout层
    
    ....   # 添加其他卷积操作
    
    model.add(Flatten())                            # 拉平三维数组为2维数组
    model.add(Dense(256, activation='relu'))        添加普通的全连接层
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))
    
    ....  # 训练网络
    

    2、LSTM网络

    当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图:
    在这里插入图片描述
    这是RNN循环神经网络经典的结构图,LSTM只是对隐含层节点A做了改进,整体结构不变,因此本文讨论的也是这个结构的可视化问题。

    中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。

    看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。

    WTH?思维转不过来啊。这就是传统网络和空间结构的思维。

    实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。

    我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。
    举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复直到病情好转。因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。

    实际上,LSTM的网络是这样的:
    在这里插入图片描述
    上面的图表示包含2个隐含层的LSTM网络,在T=1时刻看,它是一个普通的BP网络,在T=2时刻看也是一个普通的BP网络,只是沿时间轴展开后,T=1训练的隐含层信息H,C会被传递到下一个时刻T=2,如下图所示。上图中向右的五个常常的箭头,所的也是隐含层状态在时间轴上的传递。
    在这里插入图片描述
    注意,图中H表示隐藏层状态,C是遗忘门,后面会讲解它们的维度。

    3、LSTM的输入结构

    为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示:
    在这里插入图片描述
    右边的图是我们常见模型的输入,比如XGBOOST,lightGBM,决策树等模型,输入的数据格式都是这种(NF)的矩阵,而左边是加上时间轴后的数据立方体,也就是时间轴上的切片,它的维度是(NT*F),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:
    在这里插入图片描述
    这样的数据立方体很多,比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,这个数据立方体就很好理解了。在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T,索引多个句子的embedding三维矩阵如下图所示:
    在这里插入图片描述

    4、Pytorch中的LSTM

    4.1、pytorch中定义的LSTM模型

    pytorch中定义的LSTM模型的参数如下:

    class torch.nn.LSTM(*args, **kwargs)
    参数有:
        input_size:x的特征维度
        hidden_size:隐藏层的特征维度
        num_layers:lstm隐层的层数,默认为1
        bias:False则bihbih=0和bhhbhh=0. 默认为True
        batch_first:True则输入输出的数据格式为 (batch, seq, feature)
        dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
        bidirectional:True则为双向lstm默认为False
    

    结合前面的图形,我们一个个看。

    (1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示:
    在这里插入图片描述
    2)hidden_size:隐藏层的特征维度(隐藏层神经元个数),如下图所示,我们有两个隐含层,每个隐藏层的特征维度都是5。注意,非双向LSTM的输出维度等于隐藏层的特征维度。
    在这里插入图片描述
    (3)num_layers:lstm隐层的层数,上面的图我们定义了2个隐藏层。

    (4)batch_first:用于定义输入输出维度,后面再讲。

    (5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht’, Ct’),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数2,而且H,C的维度是时间轴长度2。
    在这里插入图片描述

    4.2、喂给LSTM的数据格式

    pytorch中LSTM的输入数据格式默认如下:

    input(seq_len, batch, input_size)
    参数有:
        seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度
        batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子
        input_size:特征维度,和前面定义网络结构的input_size一致。
    

    前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是:

    input(batch, seq_len, input_size)
    

    刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。

    之前我们的embedding矩阵如下图:
    在这里插入图片描述
    如果把batch放在第一位,则三维矩阵的形式如下:
    在这里插入图片描述
    其转换过程如下图所示:
    在这里插入图片描述
    LSTM的另外两个输入是 h0 和 c0,可以理解成网络的初始化参数,用随机数生成即可。

    h0(num_layers * num_directions, batch, hidden_size)
    c0(num_layers * num_directions, batch, hidden_size)
    参数:
        num_layers:隐藏层数
        num_directions:如果是单向循环网络,则num_directions=1,双向则num_directions=2
        batch:输入数据的batch
        hidden_size:隐藏层神经元个数
    

    注意,如果我们定义的input格式是:

    input(batch, seq_len, input_size)
    

    则H和C的格式也是要变的:

    h0(batch, num_layers * num_directions,  hidden_size)
    c0(batch, num_layers * num_directions,  hidden_size)
    

    4.3、LSTM的output格式

    LSTM的输出是一个tuple,如下:

    output,(ht, ct) = net(input)
        output: 最后一个状态的隐藏层的神经元输出
        ht:最后一个状态的隐含层的状态值
        ct:最后一个状态的隐含层的遗忘门值
    

    output的默认维度是:

    output(seq_len, batch, hidden_size * num_directions)
    ht(num_layers * num_directions, batch, hidden_size)
    ct(num_layers * num_directions, batch, hidden_size)
    

    和input的情况类似,如果我们前面定义的input格式是:

    input(batch, seq_len, input_size)
    

    则ht和ct的格式也是要变的:

    ht(batc,num_layers * num_directions, h, hidden_size)
    ct(batc,num_layers * num_directions, h, hidden_size)
    

    说了这么多,我们回过头来看看ht和ct在哪里,请看下图:
    在这里插入图片描述
    output在哪里?请看下图:
    在这里插入图片描述

    4.4 LSTM笔记

    在这里插入图片描述
    在这里插入图片描述

    5、LSTM和其他网络组合

    还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图:在这里插入图片描述
    用pytorch实现上面的结构:

    import torch
    from torch import nn
    
    class RegLSTM(nn.Module):
        def __init__(self):
            super(RegLSTM, self).__init__()
            # 定义LSTM
            self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers)
            # 定义回归层网络,输入的特征维度等于LSTM的输出,输出维度为1
            self.reg = nn.Sequential(
                nn.Linear(hidden_size, 1)
            )
    
        def forward(self, x):
            x, (ht,ct) = self.rnn(x)
            seq_len, batch_size, hidden_size= x.shape
            x = y.view(-1, hidden_size)
            x = self.reg(x)
            x = x.view(seq_len, batch_size, -1)
            return x
    
    展开全文
  • 3. RNN神经网络-LSTM模型结构 1. 前言 之前我们对RNN模型做了总结。由于RNN也有梯度消失的问题,因此很难处理长序列的数据,大牛们对RNN做了改进,得到了RNN的特例LSTM(Long Short-Term Memory),它可以避免常规...

    1. RNN神经网络模型原理

    2. RNN神经网络模型的不同结构

    3. RNN神经网络-LSTM模型结构

    1. 前言

    之前我们对RNN模型做了总结。由于RNN也有梯度消失的问题,因此很难处理长序列的数据,大牛们对RNN做了改进,得到了RNN的特例LSTM(Long Short-Term Memory),它可以避免常规RNN的梯度消失,因此在工业界得到了广泛的应用。下面我们就对LSTM模型做一个总结。

    2. LSTM模型结构

    我们先看下LSTM的整体结构。
    image

    由于RNN梯度消失的问题,大牛们对于序列索引位置t的隐藏结构做了改进,可以说通过一些技巧让隐藏结构复杂了起来,来避免梯度消失的问题,这样的特殊RNN就是我们的LSTM。由于LSTM有很多的变种,这里我们以最常见的LSTM为例讲述。

    2.1 细胞状态

    在每个序列索引位置t时刻向前传播的除了和RNN一样的隐藏状态\(h_t\),还多了另一个隐藏状态,如图中上面的长横线。这个隐藏状态我们一般称为细胞状态(Cell State),记为\(C_t\)。如下图所示:

    image

    2.2 LSTM之遗忘门

    遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:

    image

    图中输入的有上一序列的隐藏状态\(h_{t-1}\)和本序列数据\(x_t\),通过一个激活函数,一般是sigmoid,得到遗忘门的输出\(f_t\)。由于sigmoid的输出\(f_t\)在[0,1]之间,因此这里的输出\(f_t\)代表了遗忘上一层隐藏细胞状态的概率。用数学表达式即为:

    \[ f_{t} = \sigma(W_fh_{t-1} + U_fx_{t} + b_f) \]
    其中\(W_f,U_f,b_f\)为线性关系的系数和偏倚,和RNN中的类似。\(\sigma\)为sigmoid激活函数。

    2.3 LSTM之输入门

    输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:

    image

    从图中可以看到输入门由两部分组成,第一部分使用了sigmoid激活函数,输出为\(i_t\)第二部分使用了\(tanh\)激活函数,输出为\(a_t\),两者的结果后面会相乘再去更新细胞状态。用数学表达式即为:
    \[ i_{t} = \sigma(W_ih_{t-1} + U_ix_{t} + b_i) \]

    \[ a_{t} =tanh(W_ah_{t-1} + U_ax_{t} + b_a) \]
    其中\(W_i,U_i,b_i,W_a,U_a,b_a\)为线性关系的系数和偏倚,和RNN中的类似。\(\sigma\)为sigmoid激活函数。

    2.4 LSTM之细胞状态更新

    在研究LSTM输出门之前,我们要先看看LSTM之细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态\(C_t\)。我们来看看从细胞状态\(C_{t-1}\)如何得到\(C_t\)。如下图所示:

    image
    细胞状态\(C_t\)由两部分组成,第一部分是\(C_{t-1}\)和遗忘门输出\(f_t\)的乘积,第二部分是输入门的\(i_t\)\(a_t\)的乘积,即:

    \[ C_{t} = C_{t-1} \odot f_{t} + i_{t} \odot a_{t} \]

    2.5 LSTM之输出门

    有了新的隐藏细胞状态\(C_t\),我们就可以来看输出门了,子结构如下:

    image

    从图中可以看出,隐藏状态\(h_t\)的更新由两部分组成,第一部分是\(o_t\),它由上一序列的隐藏状态\(h_{t-1}\)和本序列数据\(x_t\),以及激活函数sigmoid得到,第二部分由隐藏状态\(C_t\)\(tanh\)激活函数组成, 即:

    \[ o_{t} = \sigma(W_oh_{t-1} + U_ox_{t} + b_o) \]

    \[ h_{t} = o_{t} \odot tanh(C_{t}) \]

    3. 总结

    通过本节的剖析,相信大家对于LSTM的模型结构已经有了解了。当然,有些LSTM的结构和上面的LSTM图稍有不同,但是原理是完全一样的。

    转载于:https://www.cnblogs.com/huangyc/p/10366873.html

    展开全文
  • LSTM模型结构讲解

    千次阅读 2019-11-29 11:29:32
    最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。 GRU 这里只是部分流行的 LSTM 变体。当然还有很多其他的,如 Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决...

    人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。

    传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。

    RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。

                                                      

    在上面的示例图中,神经网络的模块A正在读取某个输入x{_i} ,并输出一个值h{_i} 。循环可以使得信息从当前步传递到下一步。

    这些循环使得 RNN 看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

    展开的 RNN

    链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。

    我建议大家参考 Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 来看看更丰富有趣的 RNN 的成功应用。

    而这些成功应用的关键之处就是 LSTM 的使用,这是一种特别的 RNN,比标准的 RNN 在很多的任务上都表现得更好。几乎所有的令人振奋的关于 RNN 的结果都是通过 LSTM 达到的。这篇博文也会就 LSTM 进行展开。

    1.长期依赖(Long-Term Dependencies)问题

    RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。

    有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。

    不太长的相关信息和位置间隔

    但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

    不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

    相当长的相关信息和位置间隔

    在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。

    然而,幸运的是,LSTM 并没有这个问题!

    2. RNN与LSTM的对比

    RNN:
    在这里插入图片描述
    LSTM:
    在这里插入图片描述
    其中的notation:
    在这里插入图片描述

    这里要注意:上图中四个黄框,每一个都是普通的神经网络,激活函数就是框上面所标注的。

    通过对比可以看出,RNN的一个cell中只有一个神经网络,而LSTM的一个cell中有4个神经网络,故一个LSTM cell的参数是一个RNN cell参数的四倍。
    在这里插入图片描述
    从上图也可以看出,原来的一个RNN cell只需要存储一个隐藏层状态h,而一个LSTM cell需要存储两个状态c和h。
    在这里插入图片描述
    LSTM比RNN多了一个细胞状态,就是最上面一条线(也就是c),像一个传送带,信息可以不加改变的流动。即Ct-2可能和Ct+1存储的信息可能非常相似,所以LSTM可以解决RNN长依赖的问题。

    3. LSTM信息的流动

    在这里插入图片描述
    一个LSTM cell有3个门,分别叫做遗忘门(f门)输入门(i门)输出门(o门)。要注意的是输出门的输出ot并不是LSTM cell最终的输出,LSTM cell最终的输出是ht和ct。
    这三个门就是上图中三个标着σ的黄色的框。sigmoid层输出0-1的值,表示让多少信息通过,1表示让所有的信息都通过。

    LSTM的输入: C{_{t-1}},h{_{t-1}}​和x{_{t}} 
    LSTM的输出: C{_t},h{_t}

    注意上面公式中的∗是对应元素乘,而不是矩阵的乘法

    (1)忘记门:扔掉信息(细胞状态)

    å¨è¿éæå¥å¾çæè¿°

    第一步是决定从细胞状态里扔掉什么信息(也就是保留多少信息)。将上一步细胞状态中的信息选择性的遗忘 。
    实现方式:通过sigmoid层实现的“忘记门”。以上一步的h{_{t-1}}​和这一步的x{_{t}} ​作为输入,然后为C{_{t-1}}​里的每个数字输出一个0-1间的值,记为f_{t},表示保留多少信息(1代表完全保留,0表示完全舍弃)
    例子:让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的类别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
    例如,他今天有事,所以我… 当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。

    (2)输入层门:存储信息(细胞状态)

    å¨è¿éæå¥å¾çæè¿°

    第二步是决定在细胞状态里存什么。将新的信息选择性的记录到细胞状态中。 实现方式:包含两部分,
           1.sigmoid层(输入门层)决定我们要更新什么值,这个概率表示为i{_t} 
           2.tanh层创建一个候选值向量\widetilde{C{_t}}​,将会被增加到细胞状态中。 我们将会在下一步把这两个结合起来更新细胞状态。
    例子:在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。 例如:他今天有事,所以我…当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。

    更新细胞状态(细胞状态)

    在这里插入图片描述
    注意上面公式中的∗是对应元素乘,而不是矩阵的乘法

    更新旧的细胞状态
    实现方式: f_{t}表示忘记上一次的信息C{_{t-1}}的程度,i{_t}表示要将候选值\widetilde{C{_t}}​加入的程度, 这一步我们真正实现了移除哪些旧的信息(比如上一句的主语),增加哪些新信息,最后得到了本细胞的状态C{_t} ​。

    (3)输出层门:输出(隐藏状态)

    å¨è¿éæå¥å¾çæè¿°

    最后,我们要决定作出什么样的预测。 实现方式:

    1. 我们通过sigmoid层(输出层门)来决定输出的本细胞状态C{_t} 的哪些部分;
    2. 然后我们将细胞状态通过tanh层(使值在-1~1之间),然后与sigmoid层的输出相乘得到最终的输出h{_t} ​。

    所以我们只输出我们想输出的部分。 例子:在语言模型的例子中,因为它就看到了一个 代词,可能需要输出与一个 动词相关的信息。例如,可能输出是否代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
    例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。 会把前面的信息保存到隐层中去。

    4.LSTM的各个变量

    在这里插入图片描述
    ⊙ 是element-wise乘,即按元素乘

    介绍下各个变量的维度,LSTM cell的输出h{_t} 的维度是黄框里隐藏层神经元的个数,记为d,即矩阵W{_f},W{_i},W{_c},W{_o}​的行数。t 时刻LSTM cell的输入x{_{t}}的维度记为 n,最终的输入是h{_{t-1}}x{_{t}}的联合,即[h{_{t-1}}​, x{_{t}}] ,其维度是d+n,所有矩阵(包括W{_f},W{_i},W{_c},W{_o}​)的维度都是[d,d+n],所有的向量包括(b{_f},b{_i},b{_c},b{_o}​,f{_t},i{_t},o{_t},h{_{t}},h{_{t-1}},C{_t},C{_{t-1}}和​\widetilde{C{_t}})维度都是d。(为了表示、更新方便,我们将bias放到矩阵里)
    以fW{_f}举例:
    在这里插入图片描述
    同理:
    在这里插入图片描述
    合并为一个矩阵就是:
    在这里插入图片描述

    5.LSTM 的变体

    我们到目前为止都还在介绍正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。

    其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。

    peephole 连接

    上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。

    另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。

    coupled 忘记门和输入门

    另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

    GRU

    这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。

    要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。

    Jozefowicz等人论文截图

    结论

    刚开始,我提到通过 RNN 得到重要的结果。本质上所有这些都可以使用 LSTM 完成。对于大多数任务确实展示了更好的性能!

    由于 LSTM 一般是通过一系列的方程表示的,使得 LSTM 有一点令人费解。然而本文中一步一步地解释让这种困惑消除了不少。

    LSTM 是我们在 RNN 中获得的重要成功。很自然地,我们也会考虑:哪里会有更加重大的突破呢?在研究人员间普遍的观点是:“Yes! 下一步已经有了——那就是注意力!” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,如果你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上,Xu, et al.(2015)已经这么做了——如果你希望深入探索注意力可能这就是一个有趣的起点!还有一些使用注意力的相当振奋人心的研究成果,看起来有更多的东西亟待探索……
    注意力也不是 RNN 研究领域中唯一的发展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是很有前途。使用生成模型的 RNN,诸如Gregor, et al. (2015) Chung, et al. (2015)Bayer & Osendorfer (2015) 提出的模型同样很有趣。在过去几年中,RNN 的研究已经相当的燃,而研究成果当然也会更加丰富!

     

     

     

    展开全文
  • LSTM模型结构的可视化

    2020-12-17 11:40:00
    来自 | 知乎 作者 | master苏链接 | https://zhuanlan.zhihu.com/p/139617364最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大...


    来自 | 知乎  作者 | master苏

    链接 | https://zhuanlan.zhihu.com/p/139617364

    最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就是LSTM在传统BP网络上加上时间步后,其结构就很难理解了,同时其输入输出数据格式也很难理解,网络上有很多介绍LSTM结构的文章,但是都不直观,对初学者是非常不友好的。我也是苦苦冥思很久,看了很多资料和网友分享的LSTM结构图形才明白其中的玄机。

    本文内容如下:

    1、传统的BP网络和CNN网络
    2、LSTM网络
    3、LSTM的输入结构
    4、pytorch中的LSTM
    4.1 pytorch中定义的LSTM模型
    4.2 喂给LSTM的数据格式
    4.3 LSTM的output格式
    5、LSTM和其他网络组合
    

    传统的BP网络和CNN网络

    BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。

    BP网络

    CNN网络

    图中的隐含层、卷积层、池化层、全连接层等,都是实际存在的,一层层前后叠加,在空间上很好理解,因此在写代码的时候,基本就是看图写代码,比如用keras就是:

    # 示例代码,没有实际意义model = Sequential()model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层model.add(Dropout(0.25))                          # 添加dropout层
    model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层model.add(Dropout(0.25))                          # 添加dropout层
    ....   # 添加其他卷积操作
    model.add(Flatten())                            # 拉平三维数组为2维数组model.add(Dense(256, activation='relu'))        添加普通的全连接层model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))
    ....  # 训练网络
    
    
    

    LSTM网络

    当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图:

    RNN网络

    这是RNN循环神经网络经典的结构图,LSTM只是对隐含层节点A做了改进,整体结构不变,因此本文讨论的也是这个结构的可视化问题。

    中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。

    看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。

    WTH?思维转不过来啊。这就是传统网络和空间结构的思维。

    实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。

    我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。

    举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复知道病情好转。因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。

    实际上,LSTM的网络是这样的:

    LSTM网络结构

    上面的图表示包含2个隐含层的LSTM网络,在T=1时刻看,它是一个普通的BP网络,在T=2时刻看也是一个普通的BP网络,只是沿时间轴展开后,T=1训练的隐含层信息H,C会被传递到下一个时刻T=2,如下图所示。上图中向右的五个常常的箭头,所的也是隐含层状态在时间轴上的传递。

    注意,图中H表示隐藏层状态,C是遗忘门,后面会讲解它们的维度。

     LSTM的输入结构

    为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示:

    三维数据立方体

    右边的图是我们常见模型的输入,比如XGBOOST,lightGBM,决策树等模型,输入的数据格式都是这种(N*F)的矩阵,而左边是加上时间轴后的数据立方体,也就是时间轴上的切片,它的维度是(N*T*F),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:

    这样的数据立方体很多,比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,这个数据立方体就很好理解了。在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T,索引多个句子的embedding三维矩阵如下图所示:

    pytorch中的LSTM

    4.1 pytorch中定义的LSTM模型

    pytorch中定义的LSTM模型的参数如下

    class torch.nn.LSTM(*args, **kwargs)参数有:    input_size:x的特征维度    hidden_size:隐藏层的特征维度    num_layers:lstm隐层的层数,默认为1    bias:False则bihbih=0和bhhbhh=0. 默认为True    batch_first:True则输入输出的数据格式为 (batch, seq, feature)    dropout:除最后一层,每一层的输出都进行dropout,默认为: 0    bidirectional:True则为双向lstm默认为False
    

    结合前面的图形,我们一个个看。

    (1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示:

    (2)hidden_size:隐藏层的特征维度(隐藏层神经元个数),如下图所示,我们有两个隐含层,每个隐藏层的特征维度都是5。注意,非双向LSTM的输出维度等于隐藏层的特征维度。

    (3)num_layers:lstm隐层的层数,上面的图我们定义了2个隐藏层。

    (4)batch_first:用于定义输入输出维度,后面再讲。

    (5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht', Ct'),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数*2,而且H,C的维度是时间轴长度*2。


    4.2 喂给LSTM的数据格式

    pytorch中LSTM的输入数据格式默认如下:

    input(seq_len, batch, input_size)参数有:    seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度    batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子    input_size:特征维度,和前面定义网络结构的input_size一致。
    

    前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是:

    input(batch, seq_len, input_size)
    

    刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。

    之前我们的embedding矩阵如下图:

    如果把batch放在第一位,则三维矩阵的形式如下:

    其转换过程如下图所示:

    看懂了吗,这就是输入数据的格式,是不是很简单。

    LSTM的另外两个输入是 h0 和 c0,可以理解成网络的初始化参数,用随机数生成即可。

    h0(num_layers * num_directions, batch, hidden_size)c0(num_layers * num_directions, batch, hidden_size)参数:    num_layers:隐藏层数    num_directions:如果是单向循环网络,则num_directions=1,双向则num_directions=2    batch:输入数据的batch    hidden_size:隐藏层神经元个数
    

    注意,如果我们定义的input格式是:

    input(batch, seq_len, input_size)
    

    则H和C的格式也是要变的:

    h0(batc,num_layers * num_directions, h, hidden_size)c0(batc,num_layers * num_directions, h, hidden_size)
    


    4.3 LSTM的output格式

    LSTM的输出是一个tuple,如下:

    output,(ht, ct) = net(input)    output: 最后一个状态的隐藏层的神经元输出    ht:最后一个状态的隐含层的状态值    ct:最后一个状态的隐含层的遗忘门值
    

    output的默认维度是:

    output(seq_len, batch, hidden_size * num_directions)ht(num_layers * num_directions, batch, hidden_size)ct(num_layers * num_directions, batch, hidden_size)
    

    和input的情况类似,如果我们前面定义的input格式是:

    input(batch, seq_len, input_size)
    

    则ht和ct的格式也是要变的:

    ht(batc,num_layers * num_directions, h, hidden_size)ct(batc,num_layers * num_directions, h, hidden_size)
    

    说了这么多,我们回过头来看看ht和ct在哪里,请看下图:

    output在哪里?请看下图:

       LSTM和其他网络组合

    还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图:

    用pytorch实现上面的结构:

    import torchfrom torch import nn
    class RegLSTM(nn.Module):    def __init__(self):        super(RegLSTM, self).__init__()        # 定义LSTM        self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers)        # 定义回归层网络,输入的特征维度等于LSTM的输出,输出维度为1        self.reg = nn.Sequential(            nn.Linear(hidden_size, 1)        )
        def forward(self, x):        x, (ht,ct) = self.rnn(x)        seq_len, batch_size, hidden_size= x.shape        x = y.view(-1, hidden_size)        x = self.reg(x)        x = x.view(seq_len, batch_size, -1)        return x
    

    当然,有些模型则是将输出当做另一个LSTM的输入,或者使用隐藏层ht,ct的信息进行建模,不一而足。

    好了,以上就是我对LSTM的一些学习心得,看完记得关注点赞。

    参考链接:

    https://zhuanlan.zhihu.com/p/94757947

    https://zhuanlan.zhihu.com/p/59862381

    https://zhuanlan.zhihu.com/p/36455374

    https://www.zhihu.com/question/41949741/answer/318771336

    https://blog.csdn.net/android_ruben/article/details/80206792

    展开全文
  • 本文内容如下: 1、传统的BP网络和CNN网络 2、LSTM网络 3、LSTM的输入结构 4、pytorch中的LSTM 4.1 pytorch中定义的LSTM模型 4.2 喂给LSTM的数据格式 4.3 LSTM的output格式 5、LSTM和其他网络组合 传统的BP网络和...
  • 本文内容如下: 1、传统的BP网络和CNN网络 2、LSTM网络 3、LSTM的输入结构 4、pytorch中的LSTM 4.1 pytorch中定义的LSTM模型 4.2 喂给LSTM的数据格式 4.3 LSTM的output格式 5、LSTM和其他网络组合 传统的BP网络和...
  • 6 种 LSTM 时序模型结构

    千次阅读 2020-04-21 01:38:34
    根据问题的输入输出模式划分,6种时间序列问题所对应的 LSTM 模型结构如何实现。 文章目录1.1 Univariate1.2 Multiple Input1.3 Multiple Parallel1.4 Multi-Step1.5 Multivariate Multi-Step1.6 Multiple Parallel ...
  • 5.3 LSTM模型

    2020-05-17 21:37:21
    3 LSTM模型 学习目标: 了解LSTM内部结构及计算公式. 掌握Pytorch中LSTM工具的使用. 了解LSTM的优势与缺点. LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, ...
  • LSTM模型

    2020-08-23 21:51:29
    由于独特的设计结构LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。 LSTM(Long short-term memory)是一种RNN模型是对simple rnn的一种改进,可以避免梯度消失的问题,可以有更长的记忆。LSTM是一种...
  • Tree-Structured LSTM模型

    2021-03-16 16:35:41
    Tree-Structured LSTM模型 论文概要 由于能够保持按照时序的序列信息,LSTM(Long Short-Term Memory)网络在序列模型任务上能够有非常好的表现。但是该模型只能输入线型的序列,对于树型的输入(比如依赖树)无法很好...
  • 学习LSTM模型

    千次阅读 2018-10-28 22:07:55
    全连接或卷积神经网络模型中,网络结构都是从输入层到隐藏层再到输出层,层与层之间都是全连接或部分连接,但每层之间的节点是没有连接的。这样就会存在无法捕捉时序特征的问题。不同时间序列的输入之间没有联系。 ...
  • LSTM模型可预测歌曲中的下一个音符 背景问题 给定前面的音符,我们可以建立一个LSTM模型来预测歌曲中的下一个音符吗? 结论 LSTM模型的下一个音符完全正确,观察到的率为72.31% 。 背景资料 在K大调的C大调上接受...
  • LSTM模型总结笔记

    2021-04-07 18:56:04
    LSTMRNN的弊端LSTM结构 RNN的弊端 RNN是在有序的数据上进行学习的,RNN会像人一样,产生对之前发生事情的记忆,不过一般形式的RNN,就像一位老爷爷,有的时候比较健忘。 为什么会这样呢? 想象输入X是一句话, 现在...
  • LSTM(Long Short Term Memory Network)长短时记忆...今天我们根据问题的输入输出模式划分,来看一下几种时间序列问题所对应的 LSTM 模型结构如何实现。 1. Univariate Univariate 是指: input 为多个时间步, o...
  • 并通过正交试验对LSTM模型的参数进行优化;最后通过实测数据对模型进行验证,实验结果表明,模型预测值与实际监测值吻合较好.通过与WNN、DBN-SVR和GRU模型相比,平均RMSE、MAE和MAPE分别降低了56.01%、52.94%和52.78...
  • LSTM输入结构

    千次阅读 多人点赞 2020-11-27 16:38:22
    为了更好理解LSTM结构,必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示: 三维数据立方体 右边的图是我们常见模型的输入,比如XGBOOST,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,121
精华内容 448
关键字:

lstm模型结构