热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

语言模型:Trigram-模型的平滑估计

作者:chen_h微信号&QQ:862251340微信公众号:coderpai该系列将描述一些自然语言处理方面的技术,完整目录请点击这里。正如我们前面

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


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


正如我们前面讨论的,三元语言模型有非常多的参数。利用最大似然估计会造成一个很严重的问题,就是很多的值都会变成零,数据将会非常稀疏。即使我们把训练集设置的非常大,但是很多的三元组 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


推荐阅读
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 推荐 :以数据驱动的方式讲故事
    直觉vs数据首先,你有思考过一个问题吗?当你的直觉与你所掌握的数据矛盾的时候,你是听从于直觉还是相信你所掌握的数据呢?201 ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
  • 本文将给大家介绍五个十分可怕但还鲜为人知的人工智能机器学习项目,囊括了一些潜在的机器学习以及人工智能的新想法。它们基本都是Python项目。1.LiveLossPlo ... [详细]
  • ACMMM 2022 | 首个针对跨语言跨模态检索的噪声鲁棒研究工作
    作者:王雅冰方向:多模态学习论文:Cross-LingualCross-ModalRetrievalwithNoise-RobustLearning录取: ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • oracle安装时找不到启动,Oracle没有开机自启是怎么回事?这一步骤很重要
    重启Oracle数据库重启Oracle数据库包括启动Oracle数据库服务进程和启动Oracle数据库两步,大家继续往下看。按照《【Oracle】什么?作为DBA&# ... [详细]
  • 本文整理了Java中org.apache.uima.cas.CAS.createShortArrayFS()方法的一些代码示例,展示了CAS.createS ... [详细]
author-avatar
Justine-zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有