机器学习(ML)六之RNN基础
循环神经网络
下图展示了如何基于循环神经网络实现语言模型。目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量𝐻,用𝐻𝑡表示𝐻在时间步𝑡的值。𝐻𝑡的计算基于𝑋𝑡和𝐻𝑡−1,可以认为𝐻𝑡记录了到当前字符为止的序列信息,利用𝐻𝑡对序列的下一个字符进行预测。
循环神经网络的构造
先看循环神经网络的具体构造。假𝑋𝑡∈ℝ𝑛×𝑑是时间步𝑡的小批量输入,𝐻𝑡∈ℝ𝑛×ℎ是该时间步的隐藏变量,则:
𝐻𝑡=𝜙(𝑋𝑡𝑊𝑥ℎ+𝐻𝑡−1𝑊ℎℎ+𝑏ℎ).
实现循环神经网络
one-hot向量
需要将字符表示成向量,这里采用one-hot向量。假设词典大小是𝑁,每次字符对应一个从0到𝑁−1的唯一的索引,则该字符的向量是一个长度为𝑁的向量,若字符的索引是𝑖,则该向量的第𝑖个位置为1,其他位置为0。下面分别展示了索引为0和2的one-hot向量,向量长度等于词典大小。
裁剪梯度
循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量 𝑔,并设裁剪的阈值是𝜃。裁剪后的梯度
的𝐿2范数不超过𝜃。
定义预测函数
以下函数基于前缀prefix
(含有数个字符的字符串)来预测接下来的num_chars
个字符。这个函数稍显复杂,其中我们将循环神经单元rnn
设置成了函数参数,这样在后面小节介绍其他循环神经网络时能重复使用这个函数。
困惑度
我们通常使用困惑度(perplexity)来评价语言模型的好坏。回忆一下“softmax回归”一节中交叉熵损失函数的定义。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,
- 最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
- 最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
- 基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。在本例中,困惑度必须小于词典大小vocab_size
。
定义模型训练函数
跟之前章节的模型训练函数相比,这里的模型训练函数有以下几点不同:
- 使用困惑度评价模型。
- 在迭代模型参数前裁剪梯度。
- 对时序数据采用不同采样方法将导致隐藏状态初始化的不同。