三元模型的平滑估计
极大似然估计会导致稀疏数据的问题,即使训练集非常大,很多 和 也会很小,甚至为 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 都造成了一些概率质量丢失(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 为:
然后取能最大化这个值的 。