3 N-gram Language Models(N元语法语言模型)
本章节主要介绍了N-gram语言模型。3.1节对N-gram模型的原理及应用场景进行概述;3.2节说明了如何衡量语言模型的优良,引入困惑度的概念,并在3.8节深入讨论困惑度与信息熵的联系;3.3节说明从一个语言模型中抽取句子的具体操作;3.4节讨论了语言模型泛化问题,其困境主要源于训练集和测试集的差异,并提出零值问题;3.5节阐述了如何通过平滑处理概率零值问题,平滑方式包括拉普拉斯平滑,加k平滑,回退插值和Kneser-Ney平滑等;3.6节具体说明了应用较为广泛的Kneser-Ney平滑的原理;3.7节讨论了在互联网时代如何应对承载海量数据的语言模型以及简单有效的傻瓜回退平滑算法。
语言模型是将概率分配给单词序列的模型。有效且合理地计算单词序列的概率是语音识别、语法错误修正、机器翻译等任务的基础。N-gram是最简单的语言模型,同时N-gram也指n个单词组成的序列,即元语法,可依次递增,包括二元语法bigram、三元语法tri-gram等。为了计算单词序列概率,引入链式法则将其拆分为,是的历史信息,通过多个条件概率相乘来估计单词序列的联合概率。但难以计算。N-gram模型提出可以应用Markov假设,即一个单词概率仅取决于其前几个词。二元语法中单词概率仅取决于前一个词,N-gram中单词的概率仅仅取决于其前(n-1)个词。N-gram概率可通过最大似然估计(MLE)估计,从语料中获取单词计数,并进行归一化。
评估语言模型的方法包括外部评估和内部评估。前者通常将语言模型嵌入应用程序中,测量对应用程序的改进程度,但该种方法费时费力。后者是度量独立于任何应用程序的模型的质量,通常将数据集划分为训练集(training set)和测试集(test set),在训练集中训练改进前后两个模型的参数,比较模型拟合测试集的情况。在实践中,引入困惑度(perplexity)的概念作为评估语言模型的度量标准。其为测试集单词序列概率的倒数并由单词数量归一化。单词序列条件概率越高,困惑度越低,因此可以通过最小化困惑度最大化测试集概率。
从语言模型中采样(sampling)即是根据模型定义的概率生成一些句子,容易生成模型认为概率高的句子。诸如许多概率模型,N-gram依赖于训练语料;其在做预测时,只有当测试语料和训练语料相似时效果才好。实际应用中,需要构建鲁棒性高的泛化(generalization)模型,会遇到概率零值(zeros)问题,即词序列在训练集未见,在测试集可见。零值意味着我们低估了可能存在的词的可能性,且如果测试集所有词的概率为0,则无法计算困惑度。零值包括两种情况。首先是某些词是从未见过的(unknown)。在封闭词表(closed vocabulary)系统中不存在未见词,但其可能出现于开放词表(open vocabulary)系统中,属于在词表外的词(OOV),对其有两种处理方式。在词表事先明确时,所有未知词均设为<UNK>,回归封闭词表;词表未明确时,隐式构造词表,对训练集根据词频筛选高于某阈值n的词,其他词为<UNK>。
零值问题的第二种情况是词在词表中,但其上下文关系在训练集中未见,在测试集可见。可以通过平滑(smoothing/discounting)的方式处理,即从可见量中剔除一些概率,为未见量赋予较小的概率。平滑包括加1平滑(add-1 smoothing,计算概率前为所有N-gram计数加1 )、加k平滑(add-k smoothing,所有N-gram计数加一个小数)、补偿(backoff,如果高阶的N-gram存在零值,则回退到低阶(n-1)-gram)、插值(interpolation,混合使用多种N-gram,通过平衡trigram、bigram和unigram之间权重)等。最常用性能最好的N-gram平滑算法之一是插值的Kneser-Ney平滑算法,其综合了回退和插值算法。其通过计算考虑了一个单词是否能出现在新的上下文的可能性。
在互联网时代,应用了大语料(如Google Web corpus)的语言模型应用广泛。针对巨大的语言模型时,应充分考虑存储效率,可以仅存储词的index,链接磁盘中具体的词。也可以通过剪枝来压缩,只保存计数大于某阈值的N-grams,或利用信息熵来筛选重要的N-grams。此外,可以应用更加简单却有效的傻瓜回退(stupid backoff)算法做平滑处理。