LSTM模型

什么是LSTM模型

LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LSTM的结构更复杂,它的核心结构可以分为四个部分去解析:
●遗忘门
●输入门
●细胞状态
●输出门

LSTM的内部结构

结构图

在这里插入图片描述
与RNN很类似,LSTM有两个输出,下一个时间步有三个输入

隐藏层结构解释

在这里插入图片描述

遗忘门

遗忘门部分结构图与计算公式

遗忘门结构分析:

●与传统RNN的内部结构计算非常相似,首先将当前时间步输入x()与上-个时间步隐含状态h(t-1)拼接, 得到[x(t), h(t-1)],然后通过-个全连接层做变换, 最后通过sigmoid函数进行激活得到f(),我们可以将f(t)看作是门值,好比一扇门开合的大小程度,门值都将作用在通过该扇门的张量,遗忘门门值将作用的上一层的细胞状态上,代表遗忘过去的多少信息,又因为遗忘门门值是由x(t), h(t-1)计算得来的,因此整个公式意味着根据当前时间步输入和上一个时间步隐含状态h(t- 1)来决定遗忘多少上一层的细胞状态所携带的过往信息。

激活函数的作用

用于帮助调节流经网络的值,sigmoid函数将值压缩在0-1之间

输出门

输出们部分结构分析

在这里插入图片描述
i t i_t it代表输入, C t C_t Ct代表细胞状态

●输入门结构分析: :
●我们看到输入门的计算公式有两个,第-个就是产生输入门门值的公式, 它和遗忘门公式几乎相同,区别只是在于它们之后要作用的目标上.这个公式意味着输入信息有多少需要进行过滤.输入门的第二个公式是与传统RNN的内部结构计算相同.对于L STM来讲,它得到的是当前的细胞状态,而不是像经典RNN- -样得到的是隐含状态。

细胞状态更新分析:

细胞状态更新图与计算公式
在这里插入图片描述

●细胞更新的结构与计算公式非常容易理解,这里没有全连接层,只是将刚刚得到的遗忘门门值与上一个时间步得到的C(t 1)相乘,再加上输入门门值与当前时间步得到的未更新C(t)相乘的结果.最终得到更新后的C()作为下一一个时间步输入的一部分.整个细胞状态更新过程就是对遗忘门和输入门的应用。

输出门结构分析

在这里插入图片描述
●输出门部分的公式也是两个,第一个即是计算输出门的门值,它和遗忘门,输入门计算方式相同.第二个即是使用这个门值产生隐含状态h(t),他将作用在更新后的细胞状态C(t)上,并做tanh激活,最终得到h(t)作为下一时间步输入的一部分.整个输出门的过程,就是为了产生隐含状态h(t)。

Bi-LSTM

Bi-LSTM即双向LSTM,他没有改变LSTM本身任何的内部结构,只是将LSTM应用两次且方向不同,再将两次得到的LSTM结果进行拼接作为最终输出。

在这里插入图片描述
BiLSTM结构分析:
●我们看到图中对我爱中国"这句话或者叫这个输入序列,进行了从左到右和从右到走两次LSTM处理,将得到的结果张量进行了拼接作为最终输出。这种结构能够捕捉语言语法中一些特定的前置或后置特征,增强语义关联,但是模型参数和计算复杂度也随之增加了一倍, 一般需要对语料和计算资源进行评估后决定是否使用该结构。

代码实现

Pytorch中LSTM工具 的使用:

●位置:在torch.nn工具包之中,通过torch.nn.LSTM可调用.

nn.LSTM类初始化主要参数解释:

●input size: 输入张量x中特征维度的大小
●hidden. size:隐层张量h中特征维度的大小
●num. layers:隐含层的数量
● bidirectional: 是否选择使用双向LSTM,如果为True,则使用;默认不使用

nn.LSTM类实例化对象主要参数解释:

●input: 输入张量x
● h0:初始化的隐层张量h
●c0: 初始化的细胞状态张量c

#定义LSTM的参数含义: (input_ size, hidden_ size, num_ layers)
#定义输入张量的参数含义: (sequence_ length, batch. size, input_ size)
#定义隐藏层初始张量和细胞初始状态张量的参数含义:
# (num_layers * num_ directions, batch_ size,hidden_ size)
import torch.nn as nn
import torch
#实例化LSTM对象
#第一个参数: input_ size(输入张量x的维度)
#第二个参数: hidden_ size( 隐藏层的维度,隐藏层神经元数量)
#第三个参数: num_ .layers (隐藏层的层数)

lstm= nn.LSTM(5, 6,20)
#设定输入的张量x
#第一个参数: sequence_ length( 输入序列的长度)
#第二个参数: batch Isize(批次的样本数)
#第三个参数: input_ _size(输入张量x的维度)

input1 = torch. randn(1, 3,5)
#设定初始化的h0,和细胞状态c0
#第一个参数: num_ .layers * num_ directions (层数*网络方向数)
#第二个参数: batch_ size( 批次的样本数)
#第三个参数: hidden_ size( 隐藏层的维度)

h0 = torch. randn(2, 3,6)
c0 = torch. randn(2, 3,6)

#输入input1,h0,c0放入LSTM中,得到输出张量结果
output, (hn, cn) = lstm(input,(h0,c0))
output
'''
tensor([[[ 0.0447,-0.0335,0.1454,0.0438,0.0865,0. 0416],
[0.0105,0.1923,0.5507,-0.1742,0.1569,-0.0548],
[-0.1186,0.1835,-0.0022,-0.1388,-0.0877,-0.4007]]],grad_ fn=<StackBackward>)'''

hn
'''
tensor([[[ 0.4647,-0.236,0.0645,-0.3996,-0.0500,-0.0152],
[0.3852,0. 0704,0.2103,-0.2524,0 .0243,0. 0477],
[ 0.2571,0. 0608,0.232, 0.1815,-0.0513,-0. 0291]],
[[ 0.0447,-0.0335,0.1454, 0.0438,0.0865,0.0416],
[0.0105,0.1923,0.5507,-0. 1742,0.1569,-0.0548 ],
[-0.1186,0.1835,-0.0022,-0. 1388,-0.0877,-0.4007]]],
grad_fn=<StackBackward> )'''

cn
'''
tensor([[[ 0.8083,-0.5500,0.1009,-0.5806,-0.0668,-0.1161],
[0.7438,0.095,0.5509,-0.7725,0.0824,0.0626 ],
[ 0.3131,0.0920,0.8359,0.9187,-0.4826,-0.0717]],grad_fn=<StackBackward> )'''

优缺点

LSTM优势:

LSTM的门 门结构能够有效减缓长序列问题中可能出现的梯度消失或爆炸,虽然并不能杜绝这种现象,但在更长的序列问题上表现优于传统RNN。

LSTM缺点:

●由于内部结构相对较复杂,因此训练效率在同等算力下较传统RNN低很多。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐