我们已经知道一些手段来改进语言模型,比如:
-
更好的输入:词→词根→字符
-
更好的正则化/预处理
-
这些手段综合起来得到了更好的语言模型
更好的输入
文本的多种颗粒度:
更细的颗粒度相当于减小了词表,让模型更容易做对选择。试验表明的确降低了error:
更好的正则化和预处理
正则化就不说了。
预处理指的是,随机地将句子中的一些单词替换成另外的单词(比如把一个地名替换为另一个),或者使用BiGram统计信息来生成替换。
这样会得到一个更加平滑的分布,高频词将一些出场机会匀给了低频词。
对错误率的降低效果如下(左边是正则化,右边是预处理):
更好的模型?
Noise Contrastive Estimation(NCE)
与其用昂贵的交叉熵损失函数,不如用一种叫NCE损失的近似,理论证明当k值足够大时,两者梯度是接近的。
更大的LSTM单元数
LSTM单元数增加到1024,k值越大越好,直到吃满GPU显存。
用上了这些种种改进之后,总算是拿到如下成绩: