三元模型的平滑估计

极大似然估计会导致稀疏数据的问题,即使训练集非常大,很多 也会很小,甚至为 0。因此本节将讨论用于缓和数据稀疏问题的平滑估计(Smoothed Estimation),它的核心思想依赖于 lower-order statistical estimates,即用一元和二元模型的估计去平滑三元模型的估计。本节将讨论两种常用方法:线性插值(Linear Interpolation)和 Discounting Methods,以及与装桶(Bucketing)结合的线性插值。

线性插值

定义三元、二元和一元模型的极大似然估计为:

表示单词 在训练集中出现的次数, 表示训练集中所有单词的数量。

它们有各自的优缺点:一元模型估计出的参数的分子和分母一定会大于 0(因为每个词在训练集中都至少出现了一次),但它完全忽视了上下文信息。而三元模型考虑了上下文信息,但很多参数会被估计为 0,数据更稀疏。二元模型则介于两者之间。

因此线性插值(Linear Interpolation)的思想是把三种估计加权平均,定义三元估计为:

其中 ,且

 

估计 的值有多种方式,一种常见的方法是:假设我们有一些不同于训练集和测试集的额外的数据,称之为验证集(development set/validation set)。 为三元组 在验证集中出现的次数。则验证集上的 log-likelihood(对数似然函数值)为:

我们要选择使 尽可能大,且满足 值:

 

综上,我们引入了三个平滑参数 ,这三个参数可以被理解为是三元、二元、一元极大似然估计的置信度或权重。比如,如果 的值非常接近于 1 ,则意味着我们认为 的意义很大;相反,如果 接近于 0,则意味我们认为 的意义不大。

在实际操作中,我们应该让 根据不同的二元组 进行改变。具体来说,当 更大时,我们应该将 变得更大。因为我们认为当 较大时,应该给三元估计更高的置信度。

需要保证当 时,。因为此时 的分母为 0,三元极大似然估计的无法定义。同样,如果 都为 0,那么需要保证 $ \lambda_1 = \lambda_2 = 0$,因为此时三元和二元极大似然估计都无法定义。

 

另一种更简单的定义 的方法是:

是该方法中唯一的参数。这种方法可以保证

会随着 的增大而增大, 会随着 的增大而增大。如果 ,则有 ;如果 ,则有 依然取能最大化验证集上的 log-likelihood 的值。

这种决定参数的方式非常粗糙,而且一般情况下并不是最优的。但它足够简单,且有较好的实际应用效果。

Discounting Methods

先考虑一下二元模型的估计,目标是对任意 ,估计出

对任意 ,定义 discounted counts 为:

的值在 0 到 1 之间(一般取 )。减去 是因为如果完全使用训练集中的统计数据,会导致高估训练集中出现过的二元组的概率,低估训练集中未出现过的二元组的概率。

对任意满足 的二元组 ,定义:

相当于在分子上减去了 discounted counts。

如:对以下数据,单词 在训练集中出现了 48 次。下表列出了所有满足 的二元组 (这些二元组的总数为 48)、所有 discounted counts:)和所有

discounting-methods-example

对于所有 ,Discounting Methods 都造成了一些概率质量丢失(missing probability mass):

如上例中:

这些丢失的质量应该是属于 的。

 

因此,这种估计方法的完整定义如下,令:

如上例中,有:

包括词典中剩下额单词。

则该估计的定义为:

 

这种方法可以推广到三元模型,对任意二元组 ,定义:

定义三元组 的 discounted counts 为:

则三元估计为:

其中:

 

是该方法中唯一的参数,跟线性插值模型一样,一般也是用能最大化 development data 上的 log-likelihood 。定义 为三元组 在 development data 中出现的次数,development data 上的 log-likelihood 为: 会随着 的变化而变化,一般我们会尝试一系列可能的 值,如 ,对每个 值都计算一遍 development data 上的 log-likelihood,最后选择能最大化 development data 上的 log-likelihood 的

线性插值 + bucketing

线性插值模型中参数估计的定义为:

更大时,我们应该将 变得更大;同样,当 更大时,也应该将 变得更大。一个实现这个目标的典型方法是 bucketing。

第一步是定义一个函数 ,它将二元组 映射到值 是指定的 bucket 的数量。也就是说函数 将二元组 划分为了 个不同的子集。这个函数是手动定义的,它通常取决于不同二元组在训练集中的出现频率。

如:

然后我们对所有 引入平滑参数 ,因此每个 bucket 都会有一组自己的平滑参数。这些平滑参数同样需要满足

则线性插值估计的定义为:

其中

因此,平滑参数依赖于 的值,而 依赖于

 

平滑参数还是取能最大化验证集上的 log-likelihood 的值。定义 为三元组 在验证集中出现的次数,则验证集上的的 log-likelihood 为:

然后取能最大化这个值的