9.3 深度循环神经网络

要点
  • 一般多层神经网络里面,每一层的隐藏元大小是一致的
  • 一般来说取两层,因为最后输出的时候还有一层 dense layer(CNN 的 FC 层也没有很多)

1. 基本思想

目前为止只基于单层网络,为了让状态更具有非线性关系,实际上可以将状态构造为多层神经网络

9.3 深度循环神经网络.png|center|500 单层 RNN 架构,不管是 GRU 还是 LSTM,只是更新状态 H 的方式不一样,输入输出是类似的

9.3 深度循环神经网络-1.png|center|700 两层 RNN 架构,可以重复这种结构. 此时输出的是多层的状态 H,最后一层的状态再构造自定义层得到输出

  • 第一层等价于普通的 RNN,输入当前 Xt 和上一时间步的状态 Ht11 得到 Ht1
  • 第二层输入上一层传过来的 Ht1 和上一时间步的状态 Ht12 得到 Ht2

假设在时间步 t 有一个小批量的输入数据 XtRn×d (样本数: n, 每个样本中的输入数: d )。同时, 将 OtRn×q (输出数: q )。设置 Ht(0)=Xt, 第 l 个隐藏层的隐状态使用激活函数 ϕl, 则:

Ht(l)=ϕl(Ht(l1)Wxh(l)+Ht1(l)Whh(l)+bh(l)),

其中, 权重 Wxh(l)Rh×h,Whh(l)Rh×h 和偏置 bh(l)R1×h 都是第 l 个隐藏层的模型参数。最后, 输出层的计算仅基于第 l 个隐藏层最终的隐状态:

Ot=Ht(L)Whq+bq,

其中, 权重 WhqRh×q 和偏置 bqR1×q 都是输出层的模型参数。

2. 简洁实现

import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
device = d2l.try_gpu()
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)

训练与预测

num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr*1.0, num_epochs, device)
perplexity 1.0, 186005.7 tokens/sec on cuda:0
time traveller for so it will be convenient to speak of himwas e
travelleryou can show black is white by argument said filb

9.3 深度循环神经网络-2.png|center|400

参考文献



© 2023 yanghn. All rights reserved. Powered by Obsidian