目录

  • ==参考资料==
  • ==框架构成==
  • *RNN和LSTM区别*
  • *RNN模型*
  • *LSTM模型*
  • *双向RNN(Bi-RNN)*
  • ==程序实现==
  • *LSTM模型参数*
  • *LSTM模型*
  • *模型输入*
  • *模型输出*

参考资料

LSTM原理详解

lstm讲解视频

LSTM输入输出结构

框架构成

RNN和LSTM区别

RNN没法回忆起久远的回忆,只能短暂记忆

长时间的回忆会造成:1.梯度消失2.梯度爆炸

RNN模型


【自然语言处理基础知识】LSTM_深度学习


按时间线展开:

【自然语言处理基础知识】LSTM_lstm_02


RNN的隐藏层的计算是一个全连接:

【自然语言处理基础知识】LSTM_神经网络_03


【自然语言处理基础知识】LSTM_lstm_04

LSTM模型


【自然语言处理基础知识】LSTM_深度学习_05

RNN在三个线分别加一个门就是LSTM

【自然语言处理基础知识】LSTM_lstm_06


遗忘门:如果新的x改变了以前主线的一些想法,按比例替换为新的剧情

【自然语言处理基础知识】LSTM_神经网络_07


更新门:分线剧情按权重写入主线剧情

【自然语言处理基础知识】LSTM_网络_08


【自然语言处理基础知识】LSTM_网络_09


输出门:选择输出主线或者分线内容

【自然语言处理基础知识】LSTM_网络_10

双向RNN(Bi-RNN)

【自然语言处理基础知识】LSTM_神经网络_11


上下文有什么就都知道了

程序实现

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),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:

【自然语言处理基础知识】LSTM_lstm_12


比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T。

【自然语言处理基础知识】LSTM_神经网络_13

模型输出

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)