语言模型:Trigram-语言模型

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


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


有很多种定义语言模型的方式,在这里我们将重点介绍一种特别重要的方式,即三元语言模型(Trigram language model)。这将是根据上一节中关于马尔科夫模型的最直接的一个应用。在这一部分中,我们将给出三元语言模型的最基本定义,并且讨论三元模型的最大似然参数估计,并且讨论了三元模型的优势和劣势。

1.1 基础定义

在马尔科夫模型中,我们将每个句子构建成 n 个随机变量的序列 X1, X2,…,Xn。其中,长度 n 是可变的。并且,我们定义 Xn = STOP。在二阶马尔科夫模型下,任何序列 x1, x2, …, xn 的概率可以被表示为:

其中,正如我们之前假设的 x(0) = x(-1)=*。

我们假设对于任何的 i,和任何的 x(i-2),x(i-1),x(i)。

其中,q(w | u,v) 是任何参数 (u, v, w) 的一个参数模型。接下来,我们很快就会学习到如何从语料库中学习中模型 q(w | u,v) 的参数估计,我们模型采用的具体形式是:

该等式对于任何的序列 x1, x2, …, xn 对成立。

那么,接下来我们就可以推出如下定义:

定义 2(Trigram Language Model):一个三元语言模型包括一个有限集合 V,和一个参数 q(w | u, v) 。对于任何的三元 u, v, w,其中 w ∈ V ∪ {STOP}, 和 u, v ∈ V ∪ {*}。q(w | u,v) 的值可以理解为,在看到二元组 (u, v) 之后,看到单词 w 的概率是多少。对于任何的序列 x1, x2, …, xn,其中 xi ∈ V for i = 1 …(n − 1),并且 xn = STOP。那么,根据三元语言模型可以得出序列的概率为:

其中 x(0) = x(-1) = *。

举个例子,比如我们有一个句子:

the dog barks STOP

那么我们可以得到概率:

p(the dog barks STOP)
= q(the|*, *)×q(dog|*, the)×q(barks|the, dog)×q(STOP|dog, barks)

请注意,在这个表达式中,我们对句子中的每个单词 (the, dog, barks, STOP) 都有一个独立的符号。并且三元语言模型假设:每个单词只取决于前两个单词。

对于任何的三元组 (u, v, w) 都满足 q(w|u, v) ≥ 0。
对于任何的二元组 (u, v) 都满足:

因此,q(w | u,v) 是在已知语境 (u, v) 然后预测下一个词是 w 的分布概率。

那么,现在的关键问题就是,我们如何去求得这个模型的概率分布。即 q(w | u, v)。

其中,w 可以是集合 V ∪ {STOP} 中的任何值,u, v ∈ V ∪ {*}。那么,模型的参数量级将达到 |V|^3。这是一个非常大的值。比如,我们取 |V| = 10000,那么这个量级就将达到 |V|^3 ≈ 10^12。

1.2 最大似然估计

首先,我们从估计参数最通用的解决方案开始 —— 最大似然估计。我们将看到这些估计方法都有一个严重的缺陷,但是我们将讨论如何推导相关的参数估计,使得它能更好的在实际环境中工作。

首先,我们需要定义一些符号。* c(u, v, w) * 表示三元组 (u, v, w) 在语料库中出现的次数。比如,* c(the, dog, barks) * 表示序列 * the dog barks * 在语料库中出现的次数。相似地,* c(u, v) * 表示二元组 (u, v) 在语料库中出现的次数。对于任何的词 w, u, v,我们可以定义如下:

举个例子,如果我们要对 q(barks | the, dog) 进行估计,那么:

这个估计是非常自然的:分子是三元组 the dog barks 出现的次数,分母是二元组 the dog 出现的次数。然后把这两个进行相除就行了。

但不幸的是,这种参数估计的方法有一个非常严重的问题。设想一下,如果我们的模型中有很多的参数(比如,语料库的词汇大小是 10000,那么我们的参数规模将达到 10^12)。正因为这个原因,我们的很多计数都会变成 0。这将导致两个很严重的问题:

  • 由于分子会变成 0,那么很多的估计会 q(w|u, v) = 0。这将导致很多三元组的概率会等于 0 。但是一个在训练集中没有出现的三元组,在测试集中就把它的概率定义为 0,这显然是不合理的。

  • 还有一种更差的情况,如果分母 c(u, v) 等于,那么我们上式的定义将是无意义的。

那么,如何修正这些问题将变成一个迫在眉睫的问题,具体的方法我们会在后续章节中给出。首先,我们需要讨论如何来评估一个语言模型的好坏。然后讨论三元语言模型的优缺点。

1.3 语言模型评估指标:困惑度(Perplexity)

那么,我们怎么来评估一个语言模型的好坏呢?一个非常常见的方法是评估模型在一些已知数据集上面的困惑度(Perplexity)。

具体方法是这样的。假设,我们有一个测试数据集:

每个测试样本 x^(i) for i ∈ {1 … m} 是由一个序列组成的,具体如下:

其中,n(i) 表示第 i 个句子的长度。正如我们之前所假设的,句子的最后一个符号是一个特殊符号 STOP。

这有一个非常重要的信息,那就是测试句子是不存在与训练集中的句子。从这个层面上来说,这个句子是新的句子,模型是从来没有看见过这些句子。

对于任何的测试句子 x^(i),我们都能利用语言模型计算出它的概率 p(x^(i)) 。对语言模型质量的度量就是在整个测试句子中进行概率计算,即:

从式子直观来看:如果最后的数值越大,那么该语言模型的建模效果越好。

测试语料库的困惑度直接由这个数值来决定。我们定义 M 是语料库中所有词的数量。更准确地说,n(i) 表示第 i 个句子的长度。

我们对模型的度量取对数操作,即:

上式只是对整个测试语料库的概率取了对数。在这里,对于任何 z>0,我们采用 log2(z) 来进行表示,因为都是一个递增函数,所有这个值越大,那么语言模型的表现也就越好。

接下来,我们来正式的定义困惑度(Perplexity),如下:

其中,

因此,我们对刚刚讨论的平均对数概率取了负值,并且将该值作为 2 的指数。困惑度将是一个正数。困惑度的值越小,语言模型的效果越好。

一些对于困惑度的直观解释如下。假设我们有一个词库 V,其中 |V ∪ {STOP}| = N 。我们假设对词 w, u, v 进行预测,得到的概率都是:

当然,这是一个非常差的模型,它把所有词的概率当做了一个均匀分布的概率来计算,包括 STOP 符号。在这种情况下,我们得到的困惑度将等于 N 。困惑度可以被认为是在该模型下,有效词汇的多少。例如,如果模型的困惑度是 123(尽管语料库中词汇数量为 10000),那么模型也认为具有有效的词汇数量是 123 个。

为了更好的说明这个问题,我们来定义一些相关的符号 1/t ,其中

也就是说, t 是一个几何平均数。比如,如果困惑度等于 100,那么几何平均数将是 0.01,即 t = 0.01。

关于困惑度还有另一个有用的事实。如果测试集中对于任何的三元组 (u, v, w),我们有估计概率:

那么,困惑度将达到无限大 ∞。请注意,在这种情况下,模型对测试语料库的预测概率都是 0,即平均对数概率将是负无穷大 −∞。因此,我们必须认真对待困惑度这个值,想尽任何办法把这个值趋近于 0 。

最后,我们来计算一些典型模型的困惑度。比如,我们有一个词库,里面有 50000 个词。在二元语言模型中,我们有的参数形式是 q(w | v),即:

因为,每个词只依赖于它前面一个词。在一元语言模型中,我们拥有的参数是 q(w),即:

也就是说,在一元语言模型中,每个词都是独立的,不依赖于任何的词。那么,对于三元语言模型,困惑度是 74;对于二元语言模型,困惑度是 137;对于一元语言模型,困惑度是 955;如果我们采用最初介绍的均匀分布,即每一个词的预测概率是 1/50000,那么模型的困惑度将达到 50000 。所以,我们能很直观的看到,三元语言模型对于一元语言模型和二元语言模型都是一个巨大的进步。

1.4 三元语言模型的优缺点
  • 高阶 n-gram 对更多的上下文敏感,但是数据拥有更多的稀疏性。
  • 低阶 n-gram 考虑非常有限的上下文信息,但是具有更强的鲁棒性。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值