前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认识LSTM模型

认识LSTM模型

作者头像
@小森
发布2024-05-27 08:09:50
2080
发布2024-05-27 08:09:50
举报
文章被收录于专栏:xiaosen

LSTM介绍

LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象。

  • 权重矩阵的连乘:在传统的循环神经网络(RNN)中,梯度需要通过时间步的权重矩阵连乘进行传递。
  • 激活函数的饱和性:常用的激活函数如tanh,其导数在饱和区域接近于零,导致梯度在传递过程中逐渐减小。
  • 长期依赖问题:当序列较长时,梯度在传递过程中可能因为多次乘以小于1的数而逐渐消失,使得网络难以捕捉到长距离的依赖关系。

LSTM的结构特点

  • 细胞状态的添加:LSTM通过引入细胞状态(cell state)这一结构,允许信息在细胞间直接传递,避免了过多的权重矩阵连乘。
  • 门控机制:LSTM包含遗忘门、输入门和输出门,这些门控单元可以控制信息的流动,决定何时读取、更新或忽略细胞状态中的信息

细胞状态的更新是通过加法而非乘法,这意味着梯度不会因为连乘而逐渐减小,从而在一定程度上避免了梯度消失,

同时LSTM的结构更复杂, 它的核心结构可以分为四个部分:

  • 遗忘门
  • 输入门
  • 细胞状态
  • 输出门

LSTM的内部结构图

遗忘门部分结构图与计算:

遗忘门结构分析:

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

激活函数sigmiod的作用:

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

输入门部分结构图与计算:

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

细胞状态更新图与计算公式:

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

输出门部分结构图与计算公式:

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

代码语言:javascript
复制
import torch
import torch.nn as nn

# 定义输入序列的长度和特征维度
input_size = 10
hidden_size = 20
num_layers = 2
batch_size = 3
seq_length = 5

# 创建LSTM模型
lstm = nn.LSTM(input_size, hidden_size, num_layers)

# 生成随机输入数据
inputs = torch.randn(seq_length, batch_size, input_size)

# 初始化隐藏状态和细胞状态
h0 = torch.randn(num_layers, batch_size, hidden_size)
c0 = torch.randn(num_layers, batch_size, hidden_size)

# 前向传播
outputs, (hn, cn) = lstm(inputs, (h0, c0))

# 输出结果的形状为 (seq_length, batch_size, hidden_size)
print("Output shape:", outputs.shape)

# 最后一个时间步的隐藏状态和细胞状态
print("Last hidden state shape:", hn.shape)
print("Last cell state shape:", cn.shape)

Bi-LSTM

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

Bi-LSTM结构:

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


实战案例 :

  • torch.nn.LSTM

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

  • input_size: 输入张量x中特征维度的大小。
  • hidden_size: 隐层张量h中特征维度的大小。
  • num_layers: 隐含层的数量,即堆叠在一起的LSTM单元的数量。
  • bidirectional: 是否选择使用双向LSTM, 如果为True, 则使用; 默认不使用。

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

  • input: 输入张量x.
  • h0: 初始化的隐层张量h.
  • c0: 初始化的细胞状态张量c
代码语言:javascript
复制
>>> import torch.nn as nn
>>> import torch
>>> rnn = nn.LSTM(5, 6, 2)
>>> input = torch.randn(1, 3, 5)
>>> h0 = torch.randn(2, 3, 6)
>>> c0 = torch.randn(2, 3, 6)
>>> output, (hn, cn) = rnn(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.2364,  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.2322,  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.0957,  0.5509, -0.7725,  0.0824,  0.0626],
         [ 0.3131,  0.0920,  0.8359,  0.9187, -0.4826, -0.0717]],

        [[ 0.1240, -0.0526,  0.3035,  0.1099,  0.5915,  0.0828],
         [ 0.0203,  0.8367,  0.9832, -0.4454,  0.3917, -0.1983],
         [-0.2976,  0.7764, -0.0074, -0.1965, -0.1343, -0.6683]]],
       grad_fn=<StackBackward>)

LSTM优缺点

LSTM优势:

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

LSTM缺点:

  • 由于内部结构相对较复杂,因此训练效率在同等算力下较传统RNN低很多
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LSTM介绍
  • LSTM的内部结构图
  • Bi-LSTM
  • LSTM优缺点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档