文章目录
参考文献:《Recurrent neural network based language model》
语言模型
什么是语言模型?
语言模型包括传统与神经网络语言模型
神经网络语言模型的功能就是根据句子前w-1个词预测第w个词在词表中的概率分布。
RNN语言模型的结构
在论文中采用了最简单的RNN架构也就是被称为Elman network的架构。其中有一个输入层x,隐藏层s(也被叫做context层或state)和一个输出层y。在 t 时刻网络的输入是x(t),输出表示为y(t),s(t)是network的state。输入向量x(t)是由代表当前词的向量w和来自上一时间步context层的输出 s 组合而成。输入,隐藏和输出层接着进行以下计算:
对于初始化来说,s(0)可以被设置成一个很小值的向量,比如0.1,,当数据量很大时,初始值并不关键。在下一步,s(t+1)是s(t)的copy。输入向量x(t)代表时间 t 使用 1-of-N的编码和之前隐藏层的输出,向量的大小等于词汇量V的大小加上隐藏层的大小,隐藏层的大小一般是30-500个隐藏单元。通过我们的实验,隐藏层的大小应该反映训练集的大小–对于更大的数据集,需要更大的隐藏层。
网络训练了几个epochs,其中所有来自训练语料库的数据按顺序呈现。权重初始化为很小的值(random Gaussian noise with zero mean and 0.1 variance)。训练这个网络我们使用随机梯度下降的标准反向传播算法。初始学习率为 α = 0.1,每个轮次后,网络在验证集上测试。如果验证集的log-likelihood增加,训练将继续下一个新的轮次继续。如果没有观察的明显的进步,学习率α将会减半。如果减半后还是没有明显的进步,那么训练结束,拟合一般在10-20个轮次达到。
在我们的实验中,网络没有明显的过拟合,即使在非常大的隐藏层上使用正则来惩罚大的权重也没有得到好的进步。输出层y(t)呈现了下一个词基于之前词w(t)和context s(t-1)。Softmax保证几率分布是是有效的,比如对任何词来说y(t)>0并且
∑
k
y
k
(
t
)
=
1
\sum_ky_k(t)=1
∑kyk(t)=1。
在每个训练步中,根据交叉熵准则计算误差,用标准反向传播算法更新权值:
统计语言建模中的训练阶段和测试阶段通常是不同的,因为模型在处理测试数据时不会更新。因此,如果一个新的人名在测试集中重复出现,它将重复得到一个非常小的概率,即使它是由已知的单词组成的。可以假定,这样的长期记忆不应该存在于context单元的激活中(因为这些单元变化非常快),而是存在于 synapses本身——网络甚至在测试阶段也应该继续训练。我们把这种模型称为动态模型。对于动态模型,我们使用固定的学习率α=0.1.当在训练阶段时,所有的数据在多轮训练中被多次喂给网络,动态模型在处理测试数据时只更新一次。这当然不是最优的解决方案,但正如我们将看到的,这足以使静态模型的复杂程度大大降低。注意这种修改非常类似于使用回退模型的缓存技术,由于神经网络学习在连续空间的不同,所以假如‘dog’和’cat’是相关的,在测试集中’dog’的频繁出现将会增加’cat’的几率。
动态更新模型因此可以自动在新领域适应。
此处描述的训练算法也被称作随时间 t = 1截断反向传播。这并不是最佳的,因为网络的权重只是基于当前时间步的错误向量来更新。为了克服这种简单化,随时间反向传播(backpropagation through time (BPTT))算法被通常使用。
优化
为了提高性能,我们将所有在训练集中出现次数少于临界值的词合并到一个特殊的稀有token中,词的几率如下计算:
C
r
a
r
e
C_{rare}
Crare是词汇表中出现次数小于临界值的词的数量。所有的稀有词因此被同等对待。比如,概率在它们之间被均匀分布。
Schwenk描述了几种可能用来得到更好的表现的方式。
WSJ 实验
为了验证简单的RNN语言模型的性能,我们选择了几个标准的语言模型任务。