1 为什么需要平滑处理技术?
在使用语言模型直接计算某个句子出现的概率时,可能会由于某个单词或单词对出现的概率为0而导致整个句子出现的概率为0。
例如下面这个场景:
在上面的场景中,由于部分单词对出现的概率为0,导致最终两句话出现的概率均为0。但实际上,s1=“今天没有训练营”比s2=“今天训练营没有”更符合语法习惯,我们也更希望计算出来的P(s1)大于P(s2)。
2 常见的平滑处理技术
为了解决上述问题,考虑引入平滑处理的技术,来修正计算过程中的概率值,避免某一项概率为0导致整个句子的概率为0。
一般来说,语言模型的平滑处理可分为以下三类:
- Discounting(折扣):通过给概率不为0的项打折扣,来提高概率为0的项的概率;
- Interpolation(插值):在使用N-gram模型计算某一项的概率时,同时结合低阶的模型所计算出的概率;
- Back‐off:approximate counts of unobserved N‐gram based on the proportion of back‐off events (e.g., N‐1 gram)。
2.1 Discounting:包括Add‐One Smoothing、Add‐K Smoothing、Good-Turing Smoothing等。
-
Add‐One Smoothing
假设N为语料中的单词个数,V为词典中单词的个数,那么对于Unigram和Bigram模型,平滑处理后计算每一项概率的公式为
可以看出,Add‐One Smoothing的处理方式为:在分子分母上分别加1和V(分子加1避免了这一项为0,分母加V让这一项变小也就是discount,同时也保证对于Unigram有 ∑ i = 1 V P ( w i ) = 1 \sum_{i=1}^{V} P\left(w_{i}\right)=1 ∑i=1VP(wi)=1,对于Bigram有 ∑ j = 1 V P ( w j ∣ w i ) = 1 \sum_{j=1}^{V} P\left(w_{j} | w_{i}\right)=1 ∑j=1VP(wj∣wi)=1)。
举例来说,假设使用Bigram模型,V=20,count(我们)=3,count(我们,是)=0。若不使用平滑处理,则P(是|我们)=0;若使用上述处理,则P(是|我们)=(0+1)/(3+20)=1/23。 -
Add‐K Smoothing
对于这种方式,有 P L ( w i ∣ w i − 1 ) = count ( w i w i − 1 ) + K count ( w i − 1 ) + K V P_{L}\left(w_{i} | w_{i-1}\right)=\frac{\operatorname{count}\left(w_{i} w_{i-1}\right)+K}{\operatorname{count}\left(w_{i-1}\right)+KV} PL(wi∣wi−1)=count(wi−1)+KVcount(wiwi−1)+K。可以看出,Add‐One Smoothing就是K=1的情况。
在使用Add‐K Smoothing的时候,可以使用优化的方法来寻找最佳的K。具体来说,先计算文本的perplexity,由于perplexity是关于K的函数,因此通过优化得到最小的perplexity时也同时得到了最佳的K。 -
Good-Turing
Good-Turing技术是在1953年由古德(I.J.Good)引用图灵(Turing)的方法而提出来的,其基本思想是,用观察计数较高的N元语法数重新估计概率量的大小,并把它指派给那些具有零计数或者较低计数的N元语法,具体使用公式如下:
c ∗ = ( c + 1 ) N c + 1 N c c^{*}=(c+1) \frac{N_{c+1}}{N_{c}} c∗=(c+1)NcNc+1
其中, c c c代表某个单词出现的频数, N c N_{c} Nc代表出现c次的单词的个数,而 c ∗ c^{*} c∗是频数为c的单词经过Good-Turing处理后的新的频数。例如,在某个语料库中,单词“love”出现了20次,而出现20次的单词共有100个,经过处理后,这100个出现过20次单词的频数可能变成18.2。(更加具体的例子可参考这里)
2.2 Interpolation:包括Linear Interpolation等。
- Linear Interpolation
这种方式的思路为:在使用N-gram模型计算某一项的概率时,同时结合低阶的模型所计算出的概率。
以Trigram模型来说,使用interpolation方式后,计算每一项的概率公式为:
P ^ ( w i ∣ w i − 2 , w i − 1 ) = λ 1 × P M L ( w i ∣ w i − 2 , w i − 1 ) + λ 2 × P M L ( w i ∣ w i − 1 ) + λ 3 × P M L ( w i ) \begin{aligned} \hat{P}\left(w_{i} | w_{i-2}, w_{i-1}\right)=& \lambda_{1} \times P_{M L}\left(w_{i} | w_{i-2}, w_{i-1}\right) \\ &+\lambda_{2} \times P_{M L}\left(w_{i} | w_{i-1}\right) \\ &+\lambda_{3} \times P_{M L}\left(w_{i}\right) \end{aligned} P^(wi∣wi−2,wi−1)=λ1×PML(wi∣wi−2,wi−1)+λ2×PML(wi∣wi−1)+λ3×PML(wi)
其中, λ 1 + λ 2 + λ 3 = 1 \lambda_{1}+\lambda_{2}+\lambda_{3}=1 λ1+λ2+λ3=1。
使用这种方式的理由可以用下面的例子来解释:
假如在上述的某小型语料库中,计算得到的p(kitchen | in the)和p(arboretum | in the)均为0,但实际上,随着语料库的扩充,两者的概率都将不会为0,并且前者的概率会比后者大(因为kitchen和the kitchen的出现概率大于arboretum和the arboretum)。因此,我们有理由借助Unigram和Bigram模型来帮助计算上面的式子,也就引入了interpolation处理方式。