前言
本节学习循环神经网络
- 引⼊状态变量来存储过去的信息
- ⽤其与当前的输⼊共同决定当前的输出
1、语言模型
假设⼀段⻓度为T的⽂本中的词依次为w1,w2……wt
语言模型计算序列w1,w2……wt的概率P(w1,w2……wt)
需要计算词的概率,以及⼀个词在给定前⼏个词的情况下的条件概率,即语⾔模型参数
其中有个n元语法,即n阶⻢尔可夫链
2、循环神经网络
- 相较于多层感知机,多了个时间步的隐藏变量
- 由当前时间步的输⼊和上⼀时间步的隐藏变量共同决定
一个基于字符级循环神经⽹络的语⾔模型
- ⽂本序列为“想”“要”“有”“直”“升”“机”
- 对每个时间步的输出层输出使⽤softmax运算
- 然后使⽤交叉熵损失函数来计算它与标签的误差
3、实现
import d2lzh as d2l
import math
from mxnet import autograd, nd
from mxnet.gluon import loss as gloss
import time
"""实现⼀个基于字符级循环神经⽹络的语⾔模型"""
# 读取周杰伦专辑歌词数据集
(corpus_indices, char_to_idx, idx_to_char, vocab_size) = d2l.load_data_jay_lyrics()
def to_onehot(X, size): #将词表⽰成向量输⼊到神经⽹络
return [nd.one_hot(x, size) for x in X.T]
X = nd.arange(10).reshape((2, 5))
inputs = to_onehot(X, vocab_size)
print(len(inputs), inputs[0].shape)
# 模型参数
num_inputs, num_hiddens, num_outputs = vocab_size, 256, vocab_size
ctx = d2l.try_gpu()
print('will use', ctx)
def get_params():
def _one(shape):
return nd.random.normal(scale=0.01, shape=shape, ctx=ctx)
# 隐藏层参数
W_xh = _one((num_inputs, num_hiddens))
W_hh = _one((num_hiddens, num_hiddens))
b_h = nd.zeros(num_hiddens