前言
- LSTM是RNN模型的升级版,神经网络模型较为复杂,这里是学习笔记的记录;
- LSTM比较复杂,可以先看:
- RNN:RNN讲解
- 参考:李沐动手学习学习>深度学习;
- 欢迎收藏加关注,本人将会持续更新。
文章目录
- 长距离依赖问题
- LSTM的核心思想
- LSTM门简介
- 三个输入门
- 候选记忆单元
- 记忆状态
- 隐状态
- 总结
- Pytorch实践
- 参考资料
LSTM也称为长短期记忆网络,他说RNN、GRU的升级版,它能够学到长期依赖,说白了,RNN是理解一句话,但是LSTM就是理解一段话.
长距离依赖问题
RNN模型中,核心的是有一个隐藏层,这个隐藏层记录之前的信息,但是这个隐藏层的每次更新,权重都是一样的,但是我们生活中不是所有信息都是等价的,[知乎大佬一个案例](LSTM - 长短期记忆递归神经网络 - 知乎):
我们看到这句话,核心就是几个关键词:“纸好”、“没味道”、“便宜”、“质量好”,我们看完这句话其实和看到这几个关键词没什么大得区别,从这来看,这里也可以得出两点:
- 在一个时间序列中,前后信息不是所有都是等效的,“关键词”往往最核心,也有一些词“没有啥效果”;
- 我们在从左到右阅读的时候,脑子自动会帮我们过滤掉一些无用的信息,只留下一些“关键词”的理解,并且能够利用之前的信息去理解后面的信息,这也是我们熟悉的“上下文”;
LSTM也称“长短期记忆网络”,他的核心就是**“记忆”**,有点像我们大脑一样,对于过去的一些信息,有些“忘记”,有些“记得牢”,也有些“只是有个印象”。
LSTM的核心思想
相比于RNN,LSTM的核心就是,除了有隐藏态ht 之外,还有Ct, Ct代表T这个时刻的记忆,从Ct-1计算得来,用于信息的赛选,对重要信息进行保留,如图:
那怎么进行保留呢?对上一层的信息Ct-1保留,无非就是全部保留,全部不保留,或者保留一部分,这样的话就需要输入一个[0, 1]之间的值,而这个在神经网络中,有一个激活函数可以很好的做到,叫做:sigmoid,记忆保留过程,如图:
输入0,全部不要;输入1,全部保留;输入(0, 1),保留部分信息。
LSTM门简介
LSTM有三个门,分别是:
- 忘记门(遗忘门):将朝着0减少
- 输入门:决定是不是要忽略输入数据
- 输出门:决定是不是要使用隐状态
👀 提示:一下数学公式组合成一块,我感觉就不是那么容易理解了,但是能大概理解即可,后面在案例中实践学习。
三个输入门
首先数据经过输入、输出、遗忘门,这三个门第一步都是做线性运算+激活函数进行非线性运算,由于是RNN的升级版,故都会吸取前面的特征Ht-1。
候选记忆单元
候选记忆单元经过先进过线性计算,在经过激活函数tanh
的作用,将函数值映射到[-1,1]之间,这个的作用需要结合记忆状态更新来看,结合隐藏层更新公式,可以发现,这个其实的作用可以理解为:对当前的输入信息“记忆多少”
;
记忆状态
记忆状态:这是LSTM
的核心,看公式有两部分组成,第一部分是遗忘门的更新,决定对之前的记忆信息“吸取多少”
,第二个是结合候选记忆单元结合输入门数据,这个我感觉就是代表者说是对当前的数据输入“吸收多少信息”
,用于下一个数据的更新。
这个极端情况下,数据范围是[-2, 2]。
隐状态
在这里,对当前的记忆**Ct**再一次进行了tanh激活函数的作用,他的用处是将记忆单元数据映射到[-1, 1],然后再结合当前输入,这样当前的输入结合了之前的记忆做了更新,然后输出。
blog.csdnimg.cn/direct/29dd0a2418c04d2d98866a31dccd52d3.png#pic_center)
总结
LSTM原理具体细节确实复杂,但是我感觉可以结合实践慢慢理解,毕竟小编还是本科生🤠🤠.
Pytorch实践
pytorch
的API
:
class torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0, bidirectional=False, proj_size=0
)
- nput_size: 输入特征的数量。
- hidden_size: 隐藏状态(或输出)特征的数量。
- num_layers: LSTM 层的数量。默认是 1。
- bias: 如果为 False,则不会使用偏置项。默认是 True。
- batch_first: 如果为 True,则输入和输出张量提供给模块的形式为 (batch, seq, feature)。默认是 False,即 (seq, batch, feature)。
- dropout: 如果非零,则在除了最后一层之外的所有RNN层之后引入一个Dropout层。默认是 0。
- bidirectional: 如果为 True,则会变成双向LSTM。默认是 False。
- proj_size: 如果 > 0,则将 LSTM 的隐藏状态投影到这个大小。这有助于减少内存消耗。默认是 0,表示没有投影。
下面将用这个API接口进行搭建一个简单的LSTM网络结构。
import torch
import torch.nn as nn class SimpleLSTM(nn.Module):def __init__(self, input_size, hidden_size, num_layers, output_size):super().__init__()# 定义LSTMself.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)# 定义线性层self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):list_out, (hh, cn) = self.lstm(x)# 取最后一个时间步输出out = list_out[:, -1, :]output = self.fc(out)return output.view(-1, 1, 1) # 保持维度# 设置参数
input_size = 10 # 输入维度
hidden_size = 20 # 隐藏层维度
num_layers = 2 # LSTM层数
output_size = 1 # 输出维度# 实例化模型
model = SimpleLSTM(input_size, hidden_size, num_layers, output_size)# 随机生产数据
# 示例输入(batch_size, seq_len, input_size)
x = torch.randn(5, 15, input_size)# 模型
out = model(x)print(out.shape)
输出:
torch.Size([5, 1, 1])
参考资料
LSTM - 长短期记忆递归神经网络 - 知乎