语言模型:Trigram 模型的平滑估计
语言模型:Trigram 模型的平滑估计
AllenOR灵感 发表于7个月前
语言模型:Trigram 模型的平滑估计
  • 发表于 7个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   


该系列将描述一些自然语言处理方面的技术,完整目录请点击这里


正如我们前面讨论的,三元语言模型有非常多的参数。利用最大似然估计会造成一个很严重的问题,就是很多的值都会变成零,数据将会非常稀疏。即使我们把训练集设置的非常大,但是很多的三元组 c(u, v, w) 或者二元组 c(u, v) 的值还是会很小或者等于 0 。

在这一部分,我们来学习一些平滑估计的方法,这些方法将对稀疏数据起到一定的缓和作用。这些方法的关键思想非常依赖于低阶统计估计,比如我们想要去对三元语言模型进行平滑估计,那么就非常依赖于一元语言模型或者二元语言模型的估计。现在,我们来讨论在实践中非常有用的两种平滑方法:第一,线性差值法(linear interpolation);第二,折扣方法(discounting methods)。

1.1 线性差值法

对三元语言模型进行线性差值模型如下。我们将三元语言模型(Trigram),二元语言模型(Bigram)和一元语言模型(Unigram)的最大似然估计定义如下:


这里,我们有一些符号之前没有讲到,先来补充一下。c(w) 表示词 w 在训练集中出现的次数,c() 表示训练集中所有词的数量。

一元语言模型,二元语言模型和三元语言模型在不同程度上有自己的优点和缺点。一元语言模型概率估计的分子和分母都不会出现 0 的情况,因此这个概率估计就非常好定义,并且该值是永远大于 0(我们假设每个词在训练语料库中出现的次数至少一次,这个假设是可信的)。但是,一元语言模型完全的忽视了上下文信息,也就是说丢弃了很多有价值的信息。相反,三元语言模型考虑了上下文信息,但是出现的问题是很多的语句组的统计数值变成了 0。二元语言模型的优缺点介于一元语言模型和三元语言模型之间。

接下来,我们正式开始讨论线性插值法。我们以三元语言模型为例,把线性差值用于三元语言模型,将得到如下式子:


其中,λ1, λ2 和 λ3 是三个附加的参数,它们满足如下关系:


因此,我们采用的是对三个估计采用加权平均的方式。

如何去确定 λ 的值存在很多种方式,这里我们介绍一种常见的方法。假设,我们有一些额外的数据,这个数据不同于训练数据和测试数据。我们将这个数据成为开发数据。我们定义 c'(u, v, w) 表示三元组 (u, v, w) 在开发数据集中出现的参数。我们很容易在开发数据集上面计算对数似然值,具体计算公式如下:


我们选择 λ 的值,使得 L(λ1, λ2, λ3) 的值越大越好。因此,λ 的取值如下:


其中,


接下来,我们的任务就是去寻找最佳的 λ1, λ2, λ3 值。

如上所述,我们有三个平滑参数 λ1, λ2, 和 λ3。这三个参数我们可以理解为对每个语言模型的估计置信度,或者权重。比如,如果 λ1 的值非常接近于 1 ,也就是说,我们认为三元组 qML(w | u, v) 的概率估计是有重大意义的。相反,如果 λ1 接近于 0,那么我们认为对三元组 qML(w | u, v) 的概率估计意义不大。

在实际过程中,我们需要额外的关注二元组 (u, v) 的大小,我们认为当 c(u, v) 更大时,我们应该将 λ1 的取值变得更大。从直观上来解释,当 c(u, v) 较大时,我们应该给三元组更多的置信度。

如果当 c(u, v) = 0 时,我们需要取 λ1 = 0。因为,这个时候分母等于 0,我们无法定义三元语言模型。


同理,如果 c(u, v) 和 c(v) 都等于 0,那么我们需要定义 λ1 = λ2 = 0,因为三元语言模型和二元语言模型都无法定义。

那么有没有一个比较好的 λ 参数定义方法呢?答案是有的。我们先来介绍一个很简单的方法,定义如下:


其中,γ > 0 是这个模型的唯一参数。但我们也很容易就能发现 λ1 ≥
0, λ2 ≥ 0,并且 λ1 + λ2 + λ3 = 1。

在这个定义下,我们可以发现 λ1 会随着 c(u, v) 的增大而增大,λ2 也会随着 c(v) 的增大而增大。而且,我们有如果 c(u, v) = 0,那么 λ1 = 0,如果 c(v) = 0,那么 λ2 = 0。至于 λ ,我们可以通过最大化一组开发数据上面的对数似然估计来决定。

这是决定参数的方式是非常粗糙的,而且一般情况下不是最优的。但是这种方法足够简单,而且在实际过程中,在一些应用中也能取得很好的结果。

1.2 折扣方法

我们现在再来介绍另一种估计的方法,这种方法在实际项目中也被广泛使用。首先,我们来考虑一下二元语言模型,即我们的定义如下:


对于任何的 w ∈ V ∪ {STOP}, v ∈ V ∪ {∗} 都成立。

第一步,我们需要定义什么是折扣数(discounted counts)。对于二元语言模型 c(u, w) ,其中 c(v, w) > 0,我们能定义折扣数为:


其中 β 是一个介于 0 和 1 之间的数值(一般我们取 β = 0.5)。因此,我们只是简单的从计数中减去了一个常数值 β 。从直观上来讲,如果我们从训练语料库中获得数据,其实系统会高估二元组 (u, v) 在语料库中出现的概率(并且低估了语料库中没有出现的二元组)。

对于任何的二元组 (v, w),其中 c(v, w) > 0。我们可以定义


因此,我们在分子上面使用了折扣数,分母上面没有任何变化。


图1:一个折扣方法的例子

上图是一个折扣方法的例子。我们假设一元语言 the 出现的次数是 48 词,然后我们罗列了所有的二元语言组合 (u,v) ,其中 u = the,c(u, v) > 0。另外,我们规定折扣因子 β = 0.5。最后我们计算出二元语言模型的概率值。

对于任何的上下文 v,该定义都会导致一些概率质量丢失,其值定义为:


我们再次考虑图一中的计算。在图一中,我们对所有的概率进行相加,可以得到如下:


那也就是说,我们缺失了一些概率,即:


对于任何上下文 v,我们直观上来解释,那些丢失的概率应该是属于 c(v, w) = 0 的。

更准确的说,对任何 v 的完整概率估计定义应该如下:


在图 1 中,我们可以观察到我们的词库是


B(the) 表示词汇中剩下的一组单词。

那么,我们就可以将估计定义为


这个方法可以很自然的扩展到三元语言模型,比如对于任何的二元组 (u, v) ,我们定义


那么我们定义 c^∗(u, v, w) 为三元组 (u, v, w) 的折扣值,也就是


其中,β 是折扣因子,那么我们得到的三元模型最终结果如下:


其中,


α(u, v) 还是损失的概率质量。

这个方法的唯一参数只有折扣值 β ,在线性插值模型中,去求得参数的一般方法就是采用在开发数据集上面求得最大似然。我们规定 c'(u, v, w) 表示三元组 (u, v, w) 在开发数据集上面出现的次数。开发数据集的对数似然估计是:


其中,qD(w|u, v) 是上面所定义的。对 qD(w|u, v) 的参数估计会随着 β 的变化而变化。通常,我们会测试一组可能的 β 值,例如,我们会对 β 取 {0.1, 0.2, 0.3, ..., 0.9} - 并且,对于每个 β 值,我们计算相应的对数似然值。然后我们选择最大化的对数似然的 β 值。

1.3 线性差值法与 Bucketing

在线性差值模型中,参数估计定义为:


其中,λ1, λ2 和 λ3 是该方法中的平滑参数。

在实际的环境中,允许平滑参数根据 (u, v) 的变化而变化是非常重要的,特别是,当二元组 (u, v) 越大时,参数 λ1 也应该越大。(类似地,当一元组 (v) 越大时,λ2 也应该越大)。一个实现这个目标的典型方法是延伸,即 " bucketing"。

这个方法的第一步需要去定义一个函数 Π,这个函数是将二元组 (u, v) 映射到值 Π(u, v) ∈ {1, 2, . . . , K},其中 K 是指定的 “bucket” 的数量。因此,函数 Π 将二元组 (u, v) 划分为 K 个不同的子集。这个函数是手动定义的,通常情况下,这取决于训练数据中看到的计数。举个例子,我们定义 K = 3 时,得到如下场景:


这是一个非常简单的定义,可以简单的测试二元组 c(u, v) 和一元组 c(v) 是否等于 0 。

另一个稍微复杂的定义,对二元组 (u, v) 的频率进行分析,得到如下结果:


至此,我们完成了对函数 Π(u, v) 的定义,接下来我们介绍平滑参数:


因此,每个 "bucket" 都会有一组自己的平滑参数。因此,我们对所有的 k ∈ {1 . . . K} 得到如下:


因此,线性插值估计将如下:


其中,k = Π(u, v)。

因此,我们完全的解释了,平滑参数是如何依赖于 Π(u, v) 的值。因此,根据 Π(u, v) 二元组可以获得自己的一套平滑参数。平滑参数可以根据 Π(u, v) 的值变化而发生改变。(这个值通常与计数 c(u, v) 和 c(v) 相关)。

我们再次使用开发数据集来进行平滑参数估计,如果我们还是定义 c'(u, v, w) 是三元组 (u, v, w) 在开发数据集上面出现的次数。那么开发数据集的对数似然度是:


其中,我们需要选择


的值,使得函数估计最大。


来源: COMS W4705

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 8
博文 2139
码字总数 82983
×
AllenOR灵感
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: