文章目录
8.4. 循环神经网络
隐藏层和隐状态指的是两个截然不同的概念。
- 隐藏层是在从输入到输出的路径上(以观测角度来理解)的隐藏的层
- 隐状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入, 并且这些状态只能通过先前时间步的数据来计算。
循环神经网络(recurrent neural networks,RNNs) 是具有隐状态的神经网络。
8.4.1. 无隐状态的神经网络
当前时间步隐藏变量由当前时间步的输入 与前一个时间步一起计算得出
8.4.2. 有隐状态的循环神经网络
当前时间步隐藏变量由当前时间步的输入 与前一个时间步的隐藏变量一起计算得出
具有隐状态的循环神经网络图示
import torch
from d2l import torch as d2l
X, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
# result
tensor([[-1.4258, 1.8849, -1.2227, -3.2763],
[ 0.5912, -0.8081, 0.6962, -0.0819],
[-3.9654, 1.2145, -4.2720, -0.6869]])
# 沿列(轴1)拼接矩阵X和H, 沿行(轴0)拼接矩阵W_xh和W_hh。
torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))
# result
tensor([[-1.4258, 1.8849, -1.2227, -3.2763],
[ 0.5912, -0.8081, 0.6962, -0.0819],
[-3.9654, 1.2145, -4.2720, -0.6869]])
8.4.3. 基于循环神经网络的字符级语言模型
设小批量大小为1,批量中的那个文本序列为“machine”。 为了简化后续部分的训练,我们考虑使用 字符级语言模型(character-level language model), 将文本词元化为字符而不是单词.
基于循环神经网络的字符级语言模型:输入序列和标签序列分别为“machin”和“achine”
在训练过程中,我们对每个时间步的输出层的输出进行softmax操作, 然后利用交叉熵损失计算模型输出和标签之间的误差。
8.4.4. 困惑度(Perplexity)
- 通过计算序列的似然概率来度量模型的质量.
- 困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”
- 信息论
8.4.5. 小结
-
对隐状态使用循环计算的神经网络称为循环神经网络(RNN)。
-
循环神经网络的隐状态可以捕获直到当前时间步序列的历史信息。
-
循环神经网络模型的参数数量不会随着时间步的增加而增加。
-
我们可以使用循环神经网络创建字符级语言模型。
-
我们可以使用困惑度来评价语言模型的质量。