上海网站建设工作室,珠海哪里做网站的,汽车城网站建设方案,网站做交互设计理论
门控隐状态
门控循环单元与普通的循环神经网络之间的关键区别在于#xff1a; 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态#xff0c; 以及应该何时重置隐状态。 这些机制是可学习的#xff0c;并且能够解决了上面列出的问题。 例如 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态 以及应该何时重置隐状态。 这些机制是可学习的并且能够解决了上面列出的问题。 例如如果第一个词元非常重要 模型将学会在第一次观测之后不更新隐状态。 同样模型也可以学会跳过不相关的临时观测。 最后模型还将学会在需要的时候重置隐状态。 下面我们将详细讨论各类门控。
重置门和更新门 R Z
重置门reset gate和更新门update gate。 我们把它们设计成01区间中的向量 这样我们就可以进行凸组合。 重置门允许我们控制“可能还想记住”的过去状态的数量 更新门将允许我们控制新状态中有多少个是旧状态的副本。 下图 描述了门控循环单元中的重置门和更新门的输入 输入是由当前时间步的输入和前一时间步的隐状态给出。 两个门的输出是由使用sigmoid激活函数的两个全连接层给出。
候选隐状态与R有关 隐状态与上面的候选隐状态有关 从零开始实现
import torch
from torch import nn
from d2l import torch as d2l# 1. 加载数据
batch_size, num_steps 32, 35
train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps)#2. 初始化模型参数
#我们从标准差为0.01的高斯分布中提取权重 并将偏置项设为0超参数num_hiddens定义隐藏单元的数量 实例化与更新门、重置门、候选隐状态和输出层相关的所有权重和偏置。
def get_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_xz, W_hz, b_z three() # 更新门参数W_xr, W_hr, b_r three() # 重置门参数W_xh, W_hh, b_h three() # 候选隐状态参数# 输出层参数W_hq normal((num_hiddens, num_outputs))b_q torch.zeros(num_outputs, devicedevice)# 附加梯度params [W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q]for param in params:param.requires_grad_(True)return params# 3. 定义模型
def init_gru_state(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), devicedevice), )def gru(inputs, state, params):W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q paramsH, stateoutputs []for X in inputs:Z torch.sigmoid((X W_xz) (H W_hz) b_z)R torch.sigmoid((X W_xr) (H W_hr) b_r)H_tilda torch.tanh((X W_xh) ((R * H) W_hh) b_h)H Z * H (1 - Z) * H_tildaY H W_hq b_qoutputs.append(Y)return torch.cat(outputs, dim0), (H,)# 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_params,init_gru_state, gru)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)简洁实现
num_inputs vocab_size
gru_layer nn.GRU(num_inputs, num_hiddens)
model d2l.RNNModel(gru_layer, len(vocab))
model model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)