基于字符级循环神经网络的语言模型
本节我们介绍如何应用循环神经网络来构建一个语言模型。设小批量中样本数为 1,文本序列为 “h”、“e”、“l”、“l”、“e”。如何使用循环神经网络基于当前和过去的字符来预测下一个字符。在训练时,我们对每个时间步的输出层输出使用 softmax 运算,然后使用交叉熵损失函数来计算它与标签的误差。
如下图所示,由于隐藏层中隐藏状态的循环计算,时间步 4 的输出 O4O_4O4 取决于文本序列 “h”、“e”、“l”、“l”。由于训练数据中该序列的下一个词为 “o”,时间步 4 的损失将取决于该时间步基于序列 “h”、“e”、“l”、“l” 生成下一个词的概率分布与该时间步的标签 “o”。
# 准备数据
idx2char = ['e', 'h', 'l', 'o']
x_data = [1, 0, 2, 2, 3] # "hello"
y_data = [3, 1, 2, 3, 2] # "onlol"
# one-hot 编码
one_hot_dir = [[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]]
x_one_hot = [one_hot_dir[x] for x in x_data]
batch_size = 1
input_size = 4
hidden_size = 4
inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)
labels = torch.LongTensor(y_data).view(-1, 1)
对每个时间步的输出层输出使用 softmax 运算,然后使用交叉熵损失函数来计算它与标签的误差。
# 损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
# 定义优化器时要传入网络参数和学习率
optimizer = torch.optim.Adam(net.parameters(), lr=0.1)
注意:图中第 2 个 P(y=e)P(y=e)P(y=e) 应该修改为 P(y=h)P(y=h)P(y