LSTM模型介绍

本文详细介绍了LSTM模型,包括其结构组成(遗忘门、输入门、细胞状态和输出门)、工作原理,以及Bi-LSTM的扩展。重点讨论了LSTM如何解决长序列问题和梯度消失问题,并提到了其训练效率相对较低的缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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低很多。

<think>嗯,用户想了解双层LSTM结构的工作原理和实现方法。首先,我得回忆一下LSTM的基础知识。LSTM是循环神经网络的一种变体,解决了梯度消失的问题,通过门控机制控制信息的流动。那双层LSTM呢,应该是在单层的基础上堆叠了另一层,可能涉及到参数共享或者独立参数的问题。 记得引用中提到,在双向LSTM中,翻转数据顺序是为了适应反向处理的需求,比如引用[1]里提到的翻转操作。这可能和双向LSTM的结构有关,而双层LSTM可能指的是堆叠的两个单向LSTM层,或者是双向的叠加。需要明确用户的问题,是双向还是单纯的层数叠加。 然后,用户的问题是关于原理和实现的。原理部分需要解释双层LSTM的结构,比如每一层的输入输出如何连接,参数是否独立。根据引用[3],PyTorch中的LSTM每层确实有自己的权重参数,所以双层LSTM每层参数独立。实现方法可能需要用代码示例,比如PyTorch中的LSTM模块,设置num_layers参数为2。 还要注意门控机制在每层中的运作方式,每一层的细胞状态和隐藏状态如何传递到下一层。比如,第一层的输出作为第二层的输入,同时每一层都有自己的遗忘门、输入门、输出门。这部分需要详细说明,确保用户理解层与层之间的数据流动。 可能用户的应用场景是分类或者回归任务,比如引用[2]提到的minist手写集分类,所以实现部分可以结合这样的例子,展示如何构建网络结构。需要确保代码示例正确,比如在PyTorch中定义LSTM时指定层数,并解释参数的含义。 另外,用户可能对为什么使用双层LSTM感兴趣,比如提升模型表达能力,捕捉更复杂的时间依赖关系。需要解释堆叠层数带来的好处,比如每层可以提取不同层次的特征,底层捕捉短期模式,上层处理更长期的信息。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如参数共享、梯度处理、应用场景比较等。这些问题需要覆盖原理、实现细节和实际应用,帮助用户全面理解双层LSTM。</think>### 双层LSTM结构原理与实现解析 #### 一、双层LSTM结构原理 1. **基本单元组成** 双层LSTM由两个独立的LSTM层堆叠而成,每层包含完整的LSTM单元结构: - **遗忘门**:$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$ - **输入门**:$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$,$\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)$ - **细胞状态更新**:$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$ - **输出门**:$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$,$h_t = o_t \odot \tanh(C_t)$ 其中$W$和$b$为各层独立参数[^3]。 2. **层级连接机制** - **第一层输出作为第二层输入**:第二层LSTM接收第一层输出的隐藏状态序列$h^{(1)}_t$ - **参数独立性**:每层LSTM拥有独立的权重矩阵$W$和偏置$b$,实现分层特征提取 3. **时间步展开示例** $$ \begin{cases} \text{第一层输出:} h^{(1)}_t = \text{LSTM}(x_t, h^{(1)}_{t-1}) \\ \text{第二层输出:} h^{(2)}_t = \text{LSTM}(h^{(1)}_t, h^{(2)}_{t-1}) \end{cases} $$ #### 二、实现方法(PyTorch示例) ```python import torch.nn as nn class DoubleLSTM(nn.Module): def __init__(self, input_dim, hidden_dim, num_layers=2): super().__init__() self.lstm = nn.LSTM( input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, # 关键参数:层数 batch_first=True ) self.fc = nn.Linear(hidden_dim, 10) # 分类输出层 def forward(self, x): # x形状:(batch_size, seq_len, input_dim) out, (hn, cn) = self.lstm(x) # out形状:(batch_size, seq_len, hidden_dim) return self.fc(out[:, -1, :]) # 取最后时间步输出分类 ``` #### 三、关键特性解析 1. **层级特征提取** - 第一层捕捉局部时序模式 - 第二层处理更高层次的时序特征[^2] 2. **参数配置** ```python nn.LSTM(input_size=128, hidden_size=64, num_layers=2) ``` - 总参数量:$4 \times [(128+64) \times 64 + 64] \times 2 = 98,816$个参数 (每层独立参数,4个门结构) 3. **双向扩展** 结合`bidirectional=True`可构建双向双层LSTM,此时需要数据翻转处理[^1]: ```python torch.flip(rnn_layer0, dims=[1]) # 时间维度翻转 ``` #### 四、典型应用场景 1. 文本情感分析(处理长距离语义依赖) 2. 时序预测(股票价格、气象数据) 3. 语音识别(分层声学特征提取)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值