在接下来的学习中,我们将探讨n元模型(n-gram)。例如,当我们使用1-gram时,计算P(xi+1|xi)的方式如下:
我们可以观察到,在许多情况下,c(xi+1, xi)可能不会出现在语料库中,这时计算结果会为零。当n值较大时,这种情况会更加严重。为了应对这个问题,我们将学习如何应用平滑技术。
本文将介绍四种平滑处理方法,它们分别是: 1. Add-one 平滑 2. Add-k 平滑 3. Interpolation 平滑 4. Good-Turning 平滑
如图所示,分子加1处理,然后分母加V处理,其中V表示词汇表的大小。这样,所有P(wi|w0)的和为1。
其中k是一个超参数,可以通过不同的k值训练模型,并选择使语言模型困惑度最小的那个k值。
这种平滑方法的巧妙之处在于计算Trigram概率时,同时考虑Unigram和Bigram的频率。其中λ也是一个超参数,可以通过交叉验证确定。
Good-Turning平滑是所有平滑方法中最复杂的一种。为了更好地理解这种平滑方法,我们先来看一个钓鱼的例子: - 假设你已经钓到了18条鱼:10条鲤鱼、3条黑鱼、2条刀鱼、1条鲨鱼、1条草鱼、1条鳗鱼……
问题一:下次钓到鲨鱼的概率是多少? 问题二:下次钓到新鱼种的概率是多少? 问题三:重新思考问题一?
首先,从18条鱼中钓到鲨鱼的概率是1/18。 其次,从鲨鱼到鳗鱼,所有的鱼都是新鱼种,因此钓到新鱼种的概率是3/18。 最后,重新思考问题一,虽然鲨鱼被抓到的概率是1/18,但考虑到新鱼种的概率是15/18,因此实际答案应小于1/18。
我们将这一原理应用到文本中。例如,现在有一句话:“Sam I am I am Sam I do not eat”。单词“Sam”出现了2次,“I”出现了3次,“am”出现了2次,“do”出现了1次,“not”出现了1次,“eat”也出现了1次。
我们用Nc表示出现c次的单词个数: - N1表示出现一次的单词个数,N1=3(do、not、eat) - N2表示出现两次的单词个数,N2=2(Sam、am) - N3表示出现三次的单词个数,N3=1(I)
Good-Turning 平滑处理机制:
其中C表示某个单词的出现次数,Nc+1表示出现c+1次的单词个数,N表示总单词数。
对于出现过的单词和平滑处理,如果某个单词从未出现过,则采用出现一次的单词个数除以总单词数。如果单词已出现过,则按{(c+1) * Nc+1} / (N * Nc)来计算。
以草鱼为例,如果没有平滑处理,Pmle = 1/18;而通过平滑处理,Pgt = {(1+1) * 1} / (3 * 18) = 1/27。其中c=1,Nc+1=1(出现两次的鱼只有刀鱼),Nc=3(出现一次的鱼有鲨鱼、草鱼、鳗鱼)。
通过这种方式,我们可以完成平滑处理,从而得出真实答案是1/27。
尽管以上介绍了平滑处理的方法,但仍存在一个问题:如果某个单词出现c次,但在计算pgt时需要使用Nc+1,而出现c+1次的单词个数为0,该如何处理?
遇到这种情况,可以利用所有的N1、N2……来拟合一条线性回归曲线,通过这条曲线来预测Nc+1。这种平滑处理方式本质上是对出现次数多1次的单词进行平衡化处理。
以上介绍的语言模型是基于统计的方法,但也存在一些问题: 1. 基于统计的语言模型难以扩展,通常在3-gram较为常见,更大的n值会导致计算复杂度急剧增加。这使得统计语言模型无法很好地建模长距离上下文依赖。 2. 统计语言模型无法有效表征词语间的相似性。
针对这些问题,随着深度学习的发展,目前常用神经网络来构建语言模型。神经网络构建的语言模型原理与此类似,目的是学习出一句话是否符合人类语言的概率。因此,掌握统计语言模型后,理解神经网络语言模型也会变得相对容易。