LSTM 详解

本文深入解析LSTM的工作原理,包括其大体结构、输入输出、门控机制(遗忘门、更新门层、输出门层)及参数计算。通过对LSTM的详细阐述,帮助初学者理解细胞状态和隐层状态如何交互,并提供LSTM的参数量计算示例。

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

这篇文章打算讲一下LSTM,虽然这类文章已经很多了,但以前刚开始看的时候还是一知半解,有一些细节没有搞清楚,我打算借这篇文章好好梳理一下。

前言

在许多讲LSTM的文章中,都会出现下面这个图。
Alt text
在这里插入图片描述
说实话,这个图确实很清晰明了(对于懂的人来说)。在很多文章中我都发现了这样的问题,有的时候,对于已经明白的人,一些很“显然”的问题就被忽略了,但是对于刚入门的人来说,一些基础的问题却要搞很久才能弄明白。所以,我希望在这里能尽可能讲的“慢”一些,把细节部分都讲清楚。

当然了,在看这篇文章之前,大家应该对RNN有一个基础的了解。

LSTM的大体结构

相比于原始的RNN的隐层(hidden state), LSTM增加了一个细胞状态(cell state),我下面把lstm中间一个时刻t的输入输出标出来:在这里插入图片描述

我们可以先把中间那一坨遮起来,看一下LSTM在t时刻的输入与输出,首先,输入有三个: 细胞状态 C t − 1 C_{t-1} Ct1,隐层状态 h t − 1 h_{t-1} ht1, t t t时刻输入向量 X t X_t Xt,而输出有两个:细胞状态 C t C_t Ct, 隐层状态 h t h_t ht。其中 h t h_t ht还作为 t t t时刻的输出。

至于绿色框内部的结构与逻辑,我会在下面详细的讲,不过当前,我们从这个图里,只需要看出个大概就行了:

  1. 细胞状态 C t − 1 C_{t-1} Ct1的信息,一直在上面那条线上传递, t t t时刻的隐层状态 h t h_t ht与输入 x t x_t xt会对 C t C_t Ct进行适当修改,然后传到下一时刻去。
  2. C t − 1 C_{t-1} Ct1会参与 t t t时刻输出 h t h_t ht的计算。
  3. 隐层状态 h t − 1 h_{t-1} ht1的信息,通过LSTM的“门”结构,对细胞状态进行修改,并且参与输出的计算。

总的来说呢,细胞状态的信息一直在上面那条线上传递,隐层状态一直在下面那条线上传递,不过它们会有一些交互,在LSTM中,通常被叫做“门”结构。

LSTM的输入输出

LSTM也是RNN的一种,输入基本没什么差别。通常我们需要一个时序的结构喂给LSTM,数据会被分成 t t t个部分,也就是上面图里面的 X t X_t Xt X t X_t Xt可以看作是一个向量 ,在实际训练的时候,我们会用batch来训练,所以通常它的shape是**(batch_size, input_dim)**。当然我们来看这个结构的时候可以认为batch_size是1,理解和计算之类的也比较简单。

另外还有一点想啰嗦一下, C 0 C_0 C0 h 0 h_0 h0的值,也就是两个隐层的初始值,一般是用全0初始化。两个隐层的同样是向量的形式,在定义LSTM的时候,会定义隐层大小(hidden size),即 S h a p e

### Keras 中 LSTM 的详细介绍 #### 构建LSTM模型结构 在构建LSTM网络时,通常会定义一个顺序模型`Sequential()`并逐步添加各层。对于时间序列预测任务而言,可以采用如下方式创建基础架构: ```python from keras.models import Sequential from keras.layers import LSTM, Dense model = Sequential() ``` #### 添加LSTM层配置 为了使多个LSTM层能够连续工作,在前几层中应当设定`return_sequences=True`属性[^2]。这表示该层不仅返回最后一个时间步的结果,而是输出整个序列的信息给下一层处理。 ```python # 假设输入数据维度为 (batch_size, timesteps, features) model.add(LSTM(64, input_shape=(timesteps, features), return_sequences=True)) ``` #### 设置激活函数与输入形状 可以选择不同的激活函数来增强表达能力,默认情况下LSTM单元内部使用的激活函数是`tanh`。如果希望自定义,则可以在初始化LSTM层的时候指定它;同时也要注意正确指明输入张量的具体尺寸[^3]。 ```python model.add(LSTM(50, activation='relu', input_shape=(width, features))) ``` #### 多层堆叠实现更复杂的特征提取 通过增加更多隐藏层的数量可以让神经元之间形成更加复杂的关系网路,从而捕捉到更为抽象的数据模式。除了第一个LSTM层外,后续的LSTM层不需要再声明输入大小,因为它们可以直接从前一层次接收信息流。 ```python model.add(LSTM(32, return_sequences=True)) # 继续保持序列化输出供下一个LSTM层使用 model.add(LSTM(10)) # 最终LSTM层不再保留全部时间步骤的状态 ``` #### 编译模型准备训练过程 完成上述搭建之后就可以调用compile方法来进行编译操作了。这里需要选择合适的优化器(optimizer),损失函数(loss function)以及评估指标(metrics)[^1]。 ```python model.compile(optimizer='adam', loss='mean_squared_error') ```
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值