中山 照明 骏域网站建设,linux wordpress安装,许昌网站seo,一般建站需要多少钱文章目录 长短期记忆网络LSTM1.门控记忆元1.1输入门、忘记门、输出门1.2候选记忆元1.3记忆元1.4隐状态 2.从零实现2.1加载数据集2.2初始化模型参数2.3定义模型2.4 训练与预测 3.简洁实现 长短期记忆网络LSTM
学习视频#xff1a;长短期记忆网络#xff08;LSTM#xff09;【… 文章目录 长短期记忆网络LSTM1.门控记忆元1.1输入门、忘记门、输出门1.2候选记忆元1.3记忆元1.4隐状态 2.从零实现2.1加载数据集2.2初始化模型参数2.3定义模型2.4 训练与预测 3.简洁实现 长短期记忆网络LSTM
学习视频长短期记忆网络LSTM【动手学深度学习v2】
官方笔记长短期记忆网络LSTM
长期以来隐变量模型存在着长期信息保存和短期输入缺失的问题解决这一问题的最早方法之一是长短期存储器(LSTM)它有许多与GRU一样的属性有趣的是长短期记忆网络的设计比门控循环单元稍微复杂一些 却比门控循环单元早诞生了近20年。
1.门控记忆元
可以说长短期记忆网络的设计灵感来自于计算机的逻辑门。 长短期记忆网络引入了记忆元memory cell或简称为单元cell。 有些文献认为记忆元是隐状态的一种特殊类型 它们与隐状态具有相同的形状其设计目的是用于记录附加的信息。 为了控制记忆元我们需要许多门。 其中一个门用来从单元中输出条目我们将其称为输出门output gate。 另外一个门用来决定何时将数据读入单元我们将其称为输入门input gate。 我们还需要一种机制来重置单元的内容由遗忘门forget gate来管理 这种设计的动机与门控循环单元相同 能够通过专用机制决定什么时候记忆或忽略隐状态中的输入。
1.1输入门、忘记门、输出门
忘记门将值朝0减少输入门决定不是忽略掉输入数据输出门决定是不是使用隐状态
就如在门控循环单元中一样 当前时间步的输入和前一个时间步的隐状态 作为数据送入长短期记忆网络的门中如下图所示 它们由三个具有sigmoid激活函数的全连接层处理 以计算输入门、遗忘门和输出门的值。 因此这三个门的值都在(0,1)的范围内。 1.2候选记忆元 1.3记忆元 1.4隐状态 2.从零实现
2.1加载数据集
import torch
from torch import nn
from d2l import torch as d2lbatch_size, num_steps 32, 35
train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps)2.2初始化模型参数
接下来我们需要定义和初始化模型参数。 如前所述超参数num_hiddens定义隐藏单元的数量。 我们按照标准差0.01的高斯分布初始化权重并将偏置项设为0。
def get_lstm_params(vocab_size, num_hiddens, device):num_inputs num_outputs vocab_sizedef normal(shape):return torch.randn(sizeshape, devicedevice)*0.01def three():return (normal((num_inputs, num_hiddens)),normal((num_hiddens, num_hiddens)),torch.zeros(num_hiddens, devicedevice))W_xi, W_hi, b_i three() # 输入门参数W_xf, W_hf, b_f three() # 遗忘门参数W_xo, W_ho, b_o three() # 输出门参数W_xc, W_hc, b_c three() # 候选记忆元参数# 输出层参数W_hq normal((num_hiddens, num_outputs))b_q torch.zeros(num_outputs, devicedevice)# 附加梯度params [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc,b_c, W_hq, b_q]for param in params:param.requires_grad_(True)return params2.3定义模型
在初始化函数中 长短期记忆网络的隐状态需要返回一个额外的记忆元 单元的值为0形状为批量大小隐藏单元数。 因此我们得到以下的状态初始化。
def init_lstm_state(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), devicedevice),torch.zeros((batch_size, num_hiddens), devicedevice))实际模型的定义与我们前面讨论的一样 提供三个门和一个额外的记忆元。 请注意只有隐状态才会传递到输出层 而记忆元 C t C_t Ct不直接参与输出计算。
def lstm(inputs, state, params):[W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c,W_hq, b_q] params(H, C) stateoutputs []for X in inputs:I torch.sigmoid((X W_xi) (H W_hi) b_i)F torch.sigmoid((X W_xf) (H W_hf) b_f)O torch.sigmoid((X W_xo) (H W_ho) b_o)C_tilda torch.tanh((X W_xc) (H W_hc) b_c)C F * C I * C_tildaH O * torch.tanh(C)Y (H W_hq) b_qoutputs.append(Y)return torch.cat(outputs, dim0), (H, C)2.4 训练与预测
vocab_size, num_hiddens, device len(vocab), 256, d2l.try_gpu()
num_epochs, lr 500, 1
model d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_lstm_params,init_lstm_state, lstm)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)3.简洁实现
使用高级API我们可以直接实例化LSTM模型。 高级API封装了前文介绍的所有配置细节。 这段代码的运行速度要快得多 因为它使用的是编译好的运算符而不是Python来处理之前阐述的许多细节。
num_inputs vocab_size
lstm_layer nn.LSTM(num_inputs, num_hiddens)
model d2l.RNNModel(lstm_layer, len(vocab))
model model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)