目录
- ==参考资料==
- ==框架构成==
- *RNN和LSTM区别*
- *RNN模型*
- *LSTM模型*
- *双向RNN(Bi-RNN)*
- ==程序实现==
- *LSTM模型参数*
- *LSTM模型*
- *模型输入*
- *模型输出*
参考资料
LSTM输入输出结构
框架构成
RNN和LSTM区别
RNN没法回忆起久远的回忆,只能短暂记忆
长时间的回忆会造成:1.梯度消失2.梯度爆炸
RNN模型
按时间线展开:
RNN的隐藏层的计算是一个全连接:
LSTM模型
RNN在三个线分别加一个门就是LSTM
遗忘门:如果新的x改变了以前主线的一些想法,按比例替换为新的剧情
更新门:分线剧情按权重写入主线剧情
输出门:选择输出主线或者分线内容
双向RNN(Bi-RNN)
上下文有什么就都知道了
程序实现
LSTM模型参数
class torch.nn.LSTM(*args, **kwargs)
参数有:
input_size:x的特征维度,在NLP中就是一个词被embedding后的向量长度
hidden_size:隐藏层的特征维度(隐藏层神经元个数)
num_layers:LSTM 隐层的层数,默认为1
bias:False 则 bihbih=0 和 bhhbhh=0. 默认为True
batch_first:True则输入输出的数据格式为 (batch, seq, feature)
dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
bidirectional:True 则为双向lstm默认为False
LSTM模型
import torch
from torch import nn
class RegLSTM(nn.Module):
def __init__(self):
super(RegLSTM, self).__init__()
# 定义LSTM
self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers)
# 定义回归层网络,输入的特征维度等于LSTM的输出,输出维度为1
self.reg = nn.Sequential(
nn.Linear(hidden_size, 1)
)
def forward(self, x):
x, (ht,ct) = self.rnn(x)
seq_len, batch_size, hidden_size= x.shape
x = y.view(-1, hidden_size)
x = self.reg(x)
x = x.view(seq_len, batch_size, -1)
return x
模型输入
input(seq_len, batch, input_size)
参数有:
seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度
batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子
input_size:特征维度,和前面定义网络结构的input_size一致。
输入的维度是(NTF),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:
比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T。
模型输出
LSTM的输出是一个tuple,如下:
output,(ht, ct) = net(input)
output: 最后一个状态的隐藏层的神经元输出
ht:最后一个状态的隐含层的状态值
ct:最后一个状态的隐含层的遗忘门值
output的默认维度是:
output(seq_len, batch, hidden_size * num_directions)
ht(num_layers * num_directions, batch, hidden_size)
ct(num_layers * num_directions, batch, hidden_size)