词嵌入与循环神经网络技术解析
1. 困惑度与语言模型基础
在语言模型中,对一个“示例”进行建模,本质上是为可能出现的下一个单词分配概率。因此,训练示例的数量等同于训练语料库中的单词数量。相较于讨论每个示例的平均损失,我们更关注每个单词的平均损失。为了更直观地衡量模型性能,我们不直接输出每个单词的平均损失,而是将其作为指数对自然常数 $e$ 进行幂运算。
对于一个包含 $|d|$ 个单词的语料库 $d$,若总损失为 $x_d$,则输出的公式为:
[f(d) = e^{\frac{x_d}{|d|}}]
这个值被称为语料库 $d$ 的困惑度。困惑度具有直观的意义,平均而言,预测下一个单词就相当于猜测具有相应面数的公平骰子的掷出结果。例如,如果语料库的词汇量大小为 10,000,且初始所有参数都接近零,那么第一个示例的 10,000 个对数几率(logits)均为零,所有概率均为 $10^{-4}$,此时困惑度恰好等于词汇量大小。
随着训练的进行,困惑度会逐渐降低。以一个词汇量约为 7,800 个单词的特定语料库为例,在使用约 106 个单词的训练集进行两个训练周期后,开发集的困惑度约为 180。在配备四个 CPU 的笔记本电脑上,每个周期的训练大约需要 3 分钟。
2. 改进前馈语言模型
提升语言模型性能有多种方法。例如,在之前的实践中,添加一个隐藏层(两层之间带有激活函数)能将 Mnist 数据集的识别准确率从 92% 提高到 98%。在当前的语言模型中,添加隐藏层可将开发集的困惑度从 180 降低到约 177。
不过,最直接有效的提升困惑度的方法是从二元语言模型过渡到三元语言模型。在之前的模型中,