【nlp】2.3 LSTM模型
LSTM模型
- 1 LSTM概述
- 2 LSTM架构示意图
-
- 2.1 深入分析LSTM机制
- 2.2 双层LSTM及其应用
- 2.3 基于Pytorch的LSTM模型构建与实现
- 2.4 综述:LSTM的优势与适用范围探讨
- 2.1 深入分析LSTM机制
1 LSTM介绍
长短期记忆网络(LSTM)通常被称为长短时记忆网络。它是传统循环神经网络(RNN)的一种变体,在捕捉长序列间的关系方面表现出色,并且能够有效缓解梯度消失或爆炸的问题。同时其结构相对更为复杂,在分析过程中通常被划分为四个主要组成部分:第一部分用于捕获长期依赖关系;第二部分负责处理当前信息;第三部分管理短期依赖关系;第四部分用于输出生成。
- 遗忘门
- 输入门
- 细胞状态
- 输出门
2 LSTM的内部结构图
2.1 LSTM结构分析

结构解释图:

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

遗忘门结构分析:
与传统RNN在内部结构计算方面具有相似性,在每个时间步t的操作中都需要执行以下步骤:首先将当前输入x_t与其前一个时刻的隐含状态h_{t−1}进行组合生成新的向量;随后经过一个全连接层进行转换;最后使用sigmoid函数对结果进行激活处理得到f_t(即f_t)。其中f_t可视为一种控制机制,在其影响下所有相关的张量都会被相应地调节;这种调节好比调节开关的程度,并影响着该控制机制所作用的所有张量;具体来说,在这里我们关注的是所谓的"遗忘门"的作用机制;它反映着模型对过去信息保留程度的影响,并且值得注意的是:由于该遗忘机制由当前输入x_t和前一时刻隐藏态h_{t−1}共同决定;因此整个过程实际上是在根据最新的输入信息和历史记忆来决定如何筛选并更新记忆中的相关信息。
遗忘门内部结构过程演示:

激活函数sigmoid的作用:用于对网络中的数值进行调节;sigmoid函数将其压缩至0到1的范围内。

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

输入门结构分析:
我们观察到输入门的计算公式共有两个部分:第一部分是生成输入门门值的公式,在结构上与遗忘门极其相似;第二部分则是与传统RNN中的计算逻辑完全一致。对于LSTM网络而言,在这一环节所输出的内容并非传统的细胞状态信息;相反,在处理完这一过程后得到的是当前时刻的状态信息。

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

细胞状态更新分析:
细胞更新机制相对简单易懂,在此架构中没有全连接层设计, 而是通过上一时刻计算所得的遗忘度与当前时刻的状态进行结合. 具体而言, 上一步骤获得的遗忘度与前一状态进行乘积运算, 同时前一步骤输入度与当前状态下未被遗忘的信息也进行乘积运算. 这两个乘积的结果相加即为当前更新后的状态值. 最终生成的新状态被下一时刻的状态所采用, 完成了细胞状态信息的整体更新过程.
细胞状态更新过程演示:

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

输出门结构分析:
输出门部分包含两个公式:第一个用于计算输出门值(output gate value),其计算方式与遗忘门(forget gate)和输入门(input gate)一致;第二个则基于该门值生成隐含状态h(t),其作用于更新后的细胞状态C(t),并通过tanh激活函数进行处理以获得最终的隐含状态h(t),该结果作为后续时间步输入的一部分。整个输出门机制旨在生成隐含状态h(t)。
输出门内部结构过程演示:

2.2 Bi-LSTM介绍
Bi-LSTM即为双向LSTM模型,在不修改原始 LSTM 架构的前提下,分别以正向和反向两个方向应用 LSTM 网络,并将两者的计算结果连接起来形成最终输出.

Bi-LSTM结构分析:
我们识别为图中对"我爱中国"这一文本序列或者称为输入序列, 经历了从左到右和从右到左两次LSTM处理过程, 将处理所得的结果张量进行了连接作为最终输出. 该种结构具备这种能力: 即能捕捉语言语法中的某些特定前置或后置特征并提高语义关联性; 然而这必然导致模型参数数量以及计算复杂度相应提升了大约一倍. 因此通常建议在应用之前进行评估分析以决定是否采用该结构.
2.3 使用Pytorch构建LSTM模型
位置: 在torch.nn工具包之中, 通过torch.nn.LSTM可调用.
nn.LSTM类初始化主要参数解释:
input_dim: 输入向量x所具有的特征维度数量。hidden_dim: 隐层向量h所包含的特征空间维数。num_hidden_layers: 网络内部隐含层的数量。is_bidirectional: 根据需求决定是否采用双向LSTM架构; 当该参数设为True时会启用该功能,默认情况下该功能被禁用。
nn.LSTM类实例化对象主要参数解释:
input: 输入张量x.h0: 初始化的隐层张量h.c0: 初始化的细胞状态张量c.
nn.LSTM使用示例:
# 定义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 = 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) = 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.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>)
AI助手
在当前模型中设置\texttt{bidirectional}=2的时候,在初始状态向量(h0和c0)的第一个元素上进行乘以2的操作。代码如下
def dm01_bi_lstm():
#设置结果表现格式,不进行科学计数法表示,保留5个小数位数
torch.set_printoptions(precision=5, sci_mode=False)
# 1 定义模型
# 第1个参数:5 输入数据的尺寸
# 第2个参数:6 输出数据的尺寸
# 第3个参数:隐藏层的个数(隐藏层的个数*方向数)
mylstm = nn.LSTM(5, 6, 2,bidirectional=True) #A
print('mylstm-->', mylstm)
# 2 准备数据 input h0
# 第1个参数:1 单词数 seq_len 句子长度
# 第2个参数:3 批次数
# 第3个参数:5 每个单词的特征数 # 3个句话 每句话1个单词,每个单词有5个特征
input = torch.randn(1, 3, 5) #B
# 准备数据h0
# 第1个参数:2 隐藏层个数
# 第2个参数:1 批次数
# 第3个参数:6 神经元的个数
h0 = torch.randn(4, 3, 6) #C
c0 = torch.randn(4, 3, 6) # C
# 3 给模型喂数据 output hn input[1,3,5], (h0[2,3,6],c0[2,3,6]) ---> output[1,3,6],(hn[2,3,6],cn[2,3,6])
output, (hn, cn) = mylstm(input, (h0, c0))
print('output.shape-->', output.shape,output)
print('hn.shape-->', hn.shape,hn)
print('cn.shape-->', cn.shape)
AI助手
2.4 LSTM优缺点
- LSTM优势:
LSTM模型中的门结构设计旨在起到抑制长期依赖信息梯度消失或爆炸的影响作用,在实际应用中虽然无法完全消除这一现象,但通过优化机制实现了相较于传统RNN模型,在处理较长序列时展现出更好的性能表现
- LSTM缺点:
基于内部结构较为复杂的模型,在同等计算能力下相比传统RNN的训练效率明显不如。
