LSTM
- 什么是LSTM模型
- 定义
- RNN简介
- LSTM模型的数学原理
- LSTM模型的应用
- 应用场景
- pytorch实现
- 模型的改进
- 评价LSTM模型
什么是LSTM模型
定义
LSTM全称是长短期记忆网络,是一种机器学习算法,属于机器学习监督学习领域,是RNN(Recurrent Neural Network)的一个分支种类。
RNN简介
RNN中文名叫循环神经网络或递归神经网络,主要指已经通过网络得到输出的信息,不会直接消失,而会影响之后进入网络的信息的判断。
RNN网络的神经元不再是简单的向后传播结果,而是进行循环输入,允许输入某个神经元的信息持续存在。
RNN比较难训练,且难以处理长距离的依赖,因此我们对其进行了改进。
LSTM模型的数学原理
LSTM是RNN的一种,用于学习连续的前后关联的输入,如语言、语音等。
为了保存长距离的依赖,LSTM与RNN的区别在LSTM的隐藏层存有两个状态,一个对短期的输入比较敏感,一个对长期的输入比较敏感。这样相当于把每个隐含层分成两部分。
公式推导如下:
首先是反向传播,与rnn的误差项传播公式相同。
反向传播后,是如何控制两个状态的更新,短期状态的控制同RNN,长期状态的控制通过三个开关实现。一个开关控制继续保持长期状态c,一个开关控制把即时状态输入到长期状态c,一个状态负责控制是否把长期状态c作为当前的输出。
之后是如何进行全链接,难点就是上面三个开关,通过遗忘门、输入门和输出门三个门来实现。
具体训练过程的公式,只能说很复杂。
LSTM模型的应用
应用场景
应用于时间序列、自然语言识别,语音识别等领域。
相当于有连续的输入,且输入之间存在先后关系。
pytorch实现
pytorch有官方实现的LSTM的多个版本的框架,直接使用即可。
import torch
# 实现一个num_layers层的LSTM-RNN
class RNN(torch.nn.Module):
def __init__(self,input_size, hidden_size, num_layers):
super(RNN,self).__init__()
self.input_size = input_size
self.hidden_size=hidden_size
self.num_layers=num_layers
self.lstm = torch.nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True)
def forward(self,input):
# input应该为(batch_size,seq_len,input_szie)
self.hidden = self.initHidden(input.size(0))
out,self.hidden = lstm(input,self.hidden)
return out,self.hidden
def initHidden(self,batch_size):
if self.lstm.bidirectional:
return (torch.rand(self.num_layers*2,batch_size,self.hidden_size),torch.rand(self.num_layers*2,batch_size,self.hidden_size))
else:
return (torch.rand(self.num_layers,batch_size,self.hidden_size),torch.rand(self.num_layers,batch_size,self.hidden_size))
input_size = 12
hidden_size = 10
num_layers = 3
batch_size = 2
model = RNN(input_size,hidden_size,num_layers)
# input (seq_len, batch, input_size) 包含特征的输入序列,如果设置了batch_first,则batch为第一维
input = torch.rand(2,4,12)
model(input)
模型的改进
LSTM模型有众多改进版本,其中比较出名的是GRU。
GRU将上面的三个门改为更新门和重置门两个门,同时将单元状态与输出合并为一个状态。
GRU在保证模型效果的情况下,大大简化了计算。
评价LSTM模型
通过分开存储长期与短期记忆的方式,很大程度上解决了RNN无法进行长期记忆的问题。
与此同时,模型的计算量增加了许多。