与RNN类似,LSTM 也可以通过堆叠多个层来构建更深的网络,以增强模型对序列特征的建模能力。
在多层 LSTM 中,每一层 LSTM 的输出隐藏状态,会作为下一层 LSTM 的输入,同时每一层都维护独立的记忆单元。通过层层传递和提取信息,多层结构能够捕捉更复杂、更抽象的时序特征。
具体结构如下图所示
![图片[1]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-424.png)
4.2.4 双向结构
对于 LSTM,同样可以通过双向机制,利用序列中的过去信息和未来信息,进一步提升模型的建模能力。
在双向 LSTM 中,使用两套独立的 LSTM 网络:
正向 LSTM 按时间顺序处理输入序列;
反向 LSTM 按逆时间顺序处理输入序列。
每个时间步同时得到两个隐藏状态,通常将它们进行拼接,形成最终的输出,具体结构如下图所示:
![图片[2]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-425.png)
4.2.5 多层+双向结构
对于LSTM而言,多层结构和双向结构也可组合使用,每层都是一个双向LSTM,如下图所示
![图片[3]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-426.png)
4.2.6 API使用
torch.nn.LSTM是 PyTorch 中实现长短期记忆网络(Long Short-Term Memory, LSTM)的模块。它用于对序列数据建模,在自然语言处理(NLP)、时间序列预测等任务中广泛使用。该模块支持单层或多层 LSTM,可选择是否使用双向结构(bidirectional)。
torch.nn.LSTM与torch.nn.RNN的API十分相似,主要区别在于相较于RNN,多了一个记忆单元需要处理。
- 参数说明
构造RNN层所需的参数如下:
torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None)
各参数含义如下
| 参数名 | 类型 | 说明 |
| input_size | int | 每个时间步输入特征的维度(词向量维度) |
| hidden_size | int | 隐藏状态的维度 |
| num_layers | int | RNN 层数,默认为 1 |
| nonlinearity | str | 激活函数,’tanh’(默认)或 ‘relu’ |
| bias | bool | 是否使用偏置项,默认 True |
| batch_first | bool | 输入张量是否是 (batch, seq, feature),默认 False 表示 (seq, batch, feature) |
| dropout | float | 除最后一层外,其余层之间的 dropout 概率 |
| bidirectional | bool | 是否为双向 RNN,默认 False |
| proj_size | int | 隐藏状态的投影输出维度;若为 0,则不使用 projection。(详见官方文档) |
| device | torch.device or str | 模块的初始化设备,如 ‘cuda’, ‘cpu’ |
| dtype | torch.dtype | 模块初始化时的默认数据类型,如 torch.float32, torch.float64 |
2.输入输出
示例代码如下
lstm = torch.nn.LSTM()
output, (h_n, c_n) = lstm(input, (h_0, c_0))
输入输出内容如下
| 输入 | input | 输入序列,形状为(seq_len, batch_size, input_size),如果 batch_first=True,则为 (batch_size, seq_len, input_size) |
| h_0 | 可选,初始隐藏状态,形状为 (num_layers × num_directions, batch_size, hidden_size) | |
| c_0 | 可选,初始细胞状态,形状为 (num_layers × num_directions, batch_size, hidden_size) | |
| 输出 | output | LSTM层的输出,包含最后一层每个时间步的隐藏状态,形状为 (seq_len, batch_size, num_directions × hidden_size ),如果如果 batch_first=True,则为(batch_size, seq_len, num_directions × hidden_size ) |
| h_n | 最后一个时间步的隐藏状态,包含每一层的每个方向,形状为 (num_layers × num_directions, batch_size, hidden_size) | |
| c_n | 最后一个时间步的细胞状态,包含每一层的每个方向,形状为 (num_layers × num_directions, batch_size, hidden_size) |
输入输出形状如下
- 单层单向
![图片[4]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-427.png)
- 多层单向
![图片[5]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-428.png)
- 单层双向
![图片[6]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-429.png)
- 多层双向
![图片[7]-4.2.3 多层结构-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-430.png)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














请登录后查看评论内容