循环层#
在循环神经网络中,通过引入与上一个时刻相关的隐状态变量 来描述当前时刻之前的序列,从而实现了保存神经网络的历史信息。具体来说,当前时刻的隐状态是由输入与上一时刻的隐状态共同参与计算得出:
对于该时刻的输出,可由当前时刻的隐状态计算得出:
基于循环计算的隐状态神经网络就叫循环神经网络 (Recurrent Neural Network) ,在循环神经网络中执行计算的层就叫循环层。
困惑度#
我们可以通过一个序列中所有的 个词元的交叉熵损失的平均值来衡量预测的好坏:
在自然语言处理领域,通常使用困惑度这一概念来评估语言模型的好坏,其为上式的指数:
简言之,困惑度的可理解为下一个词元的实际选择数的调和平均数。
循环神经网络的实现#
基于pytorch的模型的定义:
class RNNModel(nn.Block):
"""循环神经网络模型"""
def __init__(self, rnn_layer, vocab_size, **kwargs):
super(RNNModel, self).__init__(**kwargs)
self.rnn = rnn_layer
self.vocab_size = vocab_size
self.dense = nn.Dense(vocab_size)
def forward(self, inputs, state):
X = npx.one_hot(inputs.T, self.vocab_size)
Y, state = self.rnn(X, state)
# 全连接层首先将Y的形状改为(时间步数*批量大小,隐藏单元数)
# 它的输出形状是(时间步数*批量大小,词表大小)
output = self.dense(Y.reshape(-1, Y.shape[-1]))
return output, state
def begin_state(self, *args, **kwargs):
return self.rnn.begin_state(*args, **kwargs)
num_hiddens = 256
rnn_layer = rnn.RNN(num_hiddens)
rnn_layer.initialize()
net = RNNModel(rnn_layer, len(vocab))python