这周讲核心的NLP方法。

2.1 语言建模:全是计数问题(Language modeling: it's all about counting!)

2.1.1 N-gram语言模型(N-gram language models)

我们从语言模型开始讲解。

什么是语言模型呢?语言模型就是计算序列单词(sequence words)或句子出现概率的模型,我们称之为language models或LMs。

假设你看到了一些句子的起始单词,那该如何预测接下来的单词,你会如何继续你的句子,搭配的单词是否听起来顺畅,我们人对此往往会有很好的判断,但怎么让机器拥有和人一样好的判断呢?我们可以预测在前一个词出现的情况下,后一个词出现的概率,首先我们需要一些数据,也就是语料,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

上图来自于Coursera国立高等经济大学NLP该小节PPT。

假设我们现在需要预测的是house出现在this is the之后的概率,直觉上我们知道这个概率值就等于在语料中this is the house出现的次数占this is the X出现次数的比例,这也是极大似然估计的结果。上图中有四个语句,this is the X出现四次,而this is the house出现一次,所以house出现在this is the之后的概率为1/4,而this is the house我们称为4-grams。什么是n-grams呢?

n-grams指连续n个单词所组成的语料中的一些片段,比如this is为2-grams,this is the house为4-grams。但其实将n-gram model中的model去掉之后,n-gram即可以代表n个单词组成的片段,也可以代表n-gram语言模型。

知道了有些词出现的条件概率,有时候我们需要判断整句话出现的概率,或者说有1000个单词的句子,这样做并不简单,因为这整句话可能并不出现在文本中,所以我们不能简单的count去计算整句话出现的概率,但我们可以在单词条件概率的基础上计算句子出现的概率。

计算一个句子出现的概率时,可以使用链式法则(chain rule),但是最后一项会有些复杂,因为它的条件很长,且我们无法计算,因为要用频率代替概率,首先需要很大的语料库,而语句在不断创新,且有些特定语句可能根本就不存在。那我们可以避免这种情况吗,当然是可以的,我们可以使用马尔科夫假设(markov assumption),马尔科夫假设是说你不必考虑所有历史,仅考虑前n-1个term就可以了,这个n在这里指n-grams中的n,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

如果按照链式法则,最后一个概率值要考虑前k-1个单词,而这(k-1)-grams可能在语料中就不存在,且实际情况中,一个单词的出现可能仅跟其前几个单词有紧密联系,太过久远的历史不仅没有用处且不便于计算。

所以这里我们提出了马尔科夫假设,即计算第i个单词出现的条件概率时,不必考虑前i-1个单词,只需要考虑前n-1个单词,而n在这里就是n-grams中的n(有些博客将n看作是第n个单词,这肯定是不对的,那就无区别于链式法则)。

下面来看一个2-grams的应用实例,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

按照马尔科夫假设,因为我们使用的是bigram语言模型,所以计算单词出现的条件概率时,仅考虑该单词的前一个单词,如上图所示。根据语料,我们计算this is the house这句话出现的概率如上图所示,最终的结果是1/24,但是这样的结果有什么问题呢?

其实,这样计算我们会存在两种问题,但我们可以解决它们:

首先,在计算开头单词出现的概率时我们可以不必考虑语料中所有单词,因为有些单词根本就不可能作为句子首单词,而this、that作为句首单词出现的概率更高些,解决方法如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

即我们可以先在语料中每一个句子的句首都加上一个假的符号(fake token),然后计算this出现在fake token之后的条件概率,这样做结果就由原来的1/24变为现在的1/4,结果更加准确。同时,有的同学应该已经发现了,这是在bigram的情况下,所以句首我们加了一个fake token,根据马尔科夫假设,如果是n-grams,我们就需要在句首加(n-1)个fake token,不要忘记了。

但是这个结果还存在一个问题,我们需要结束符号(end-symble)使所有句子拥有同一个概率分布。如果没有结束符号,不同长度的所有句子概率总和均为1。因为句子长度无限制,所以该模型将定义无限多个概率分布,即每个句子长度有一个分布。如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

上面的解释也许比较抽象,接下来是我自己的想法,我们可以这样想,在没有结尾符时,P(this)=P(_this)=P(this|_),表示以this开头的所有句子,同理,P(that)就表示以that开头的所有句子,就像我们之前学过的概率公式一样,即国立高等经济大学NLP学习笔记(2):语言建模(Language modeling),自然P(this)+P(that)=1,因为它已包含所有情况。同理,P(this is)=P(_this is),表示以this is开头的所有句子,所以只要这里bigram的情况是完备的,所有概率和为1,这又是一个概率分布。所以,如果没有结束符,我们将会有无数个概率分布。

而加上结束符之后,概率表示的意义就改变了,P(this)=P(_this_)=P(this|_)P(_|this),此时它仅表示this这个1-gram,这时,所有各式长度的句子合起来构成了一个总体,概率和为1,是一个概率分布。也可借下图理解:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

如上图所示,左侧dog表示所有以dog开始的句子,区别于右下角的cat_,仅表示cat这个1-gram,所有这些句子形式组成了一个概率分布。

最后再总结一下bigram模型,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

如上图所示,基于马尔科夫假设,在bigram模型中,每个单词出现的条件概率仅依赖于前一个单词,上式中k表示句子长度,而k+1是指加上了end-symble。

估计条件概率时,我们使用极大似然估计结果,分子表示国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)这个bigram出现的频数,分母表示以国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)开头的语料中出现的所有bigram的频数和,其实,也就是国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)这个1-gram出现的频数,所以概率估计结果可化简为上图所示形式。

2.1.2  Perplexity

上一小节我们介绍n-gram模型主要介绍了特例2-gram模型,这一小节我们将上小节得到的结论推广到n-gram模型,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

如上图所示,2-gram仅考虑前一个单词,n-gram则考虑前n-1个单词。n-gram模型该如何计算呢?如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

计算方法本质上还是极大似然估计,这里我们使用对数似然估计。这里提一下,在展示和计算语言模型概率时,我们倾向于使用对数形式,因为我们知道概率值在0-1之间,多个概率的乘积会越来越小,会造成数值下溢(numerical underflow),所以我们最好在对数空间内存储和计算某个句子出现的概率,在需要时再通过指数转换为原概率值。

上图中N是语料长度,如同上小节中k,加一自然是因为结束符。

模型计算解决了,我们如何怎么选择n-grams中的n呢?即我们该如何评价不同的语言模型呢?

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

一般在语言模型中令n=5是最好的,但这个取决于你的语料大小和你的具体任务,所以最重要的是如何评估和比较不同的模型来选择最好的。有两种方法,外在评估(extrinsic evaluation)和内在评估(intrinsic evalution)。外在评估是指用一些系统去评估我们的模型效果,比如语音识别系统,我们将拟合好的多种模型运用在语音识别上,通过准确性等去判断哪个模型效果最好,但实际上我们一般没有时间或者资源去搭建这整个系统,所以我们也需要内在评估方法,即直接评估模型本身,我们将语料分为训练集和开发集,在开发集上计算perplexity指标来选择最优模型。

什么是perplexity指标?

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

首先我们根据训练集语料计算测试集语句出现的概率(这里的测试集是开发集的作用,在吴老师深度学习笔记中讲过这一点),然后perplexity等于概率开N次方的倒数。这里对于训练集、开发集和测试集的划分多说一点,首先开发集和测试集的数目一定要能够达到其作用,能够给出一定置信度,这是基本的,我们之前在深度学习笔记中也说过了,但一般划分比例为,训练集:开发集:测试集=8:1:1。

我们使用不同模型基于训练集去计算测试集语句出现的概率,哪个模型计算出来的概率越大哪个模型就越好,为什么?我的想法是,因为训练集和测试集取自同一语料,所以属于同一分布,测试集语句出现的概率越大越表示该模型更能准确表现训练集中各个连接单词之间的联系。所以对应于概率越大越好,perplexity越小越好。

注意,在计算perplexity时,构造的n-gram模型不能知道测试集或测试集词汇表的任何先验知识。任何有关测试集的知识都会导致perplexity指标被人为地降低。两种语言模型的perplexity只有在使用相同的词汇时才是可比的。

perplexity指标的提升代表着内在的改善,但内在的改善并不能保证语言处理任务(如语音识别或机器翻译)的性能提高,也就是外在的改善。然而,由于perplexity常常与这种改进相关,它通常被用作对算法的快速检查。但是,在结束对模型的评估之前,模型在perplexity方面的改进应该总是通过实际任务的端到端评估来确认才可以。

有时测试集语料中会包含训练集语料中不存在的词,语料之外的单词会产生什么问题,我们又该如何处理呢?看下面这个例子:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

我们要预测this is the malt这句话出现的概率,使用bigram模型,发现训练集中不存在malt这个词,所以malt出现在the之后的概率计算结果为0,所以this is the malt这句话出现的概率也自然为0,这样来看,perplexity的值趋近于无穷大。

现在出现这个问题的原因是测试集中包含有训练集中不存在的词,我们该怎么解决这个问题呢?如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

我们可以直接将存在测试集中但不在训练集中的词使用<UNK>代替,或者建立一个词汇表,将词语按照出现频数排序,将低于某一个频数的所有词使用<UNK>代替,然后将<UNK>作为正常词进行统计。

<UNK>模型的正确选择确实会对perplexity之类的度量指标有影响。一个语言模型可以通过选择一个小词汇量和高概率分配<UNK>来达到低perplexity值。为什么这样说呢?我的想法是‘小词汇量’和‘高概率分配<UNK>’会使语料中存在大部分<UNK>,而我们将<UNK>作为同一个词处理,相比于以前频数稀少的精确词,使用<UNK>增大计算概率,也起到了一定的泛化效果,所以会降低perplexity值。

所以基于这个原因,perplexity值只应在具有相同词汇的语言模型中进行比较。

之前因为测试集中含有训练集中不包含的词语,导致概率计算为0,现在还有另一种情况也能导致这样的结果,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

这是因为在bigram模型中,我们需要计算测试集语料中bigram出现的频数,虽然训练集包含了测试集中所有单词,但它可能不包含测试集中出现的bigram,所以在计算概率时还是会导致概率为0,perplexity趋于无穷大。这种情况我们该如何解决呢?详见下节平滑技术。

2.1.3 平滑(smoothing)

平滑的思想在于将一些概率从高频的bigram转移到低频的bigram。即为了防止语言模型对从未见到过的bigram分配零概率,我们必须从一些更频繁的事件中去掉一些概率值,并将其提供给我们从未见过的事件。

平滑技术方法如下:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

主要有以上五种平滑方法,而我们最常使用的就是最后一种方法,Kneser-Ney平滑法。接下来我们就具体介绍一下这几种方法。

首先介绍一下Add-one(add-k)平滑法,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

Add-one平滑法也称拉普拉斯平滑法(Laplace Smoothing)。如上图所示,分子加1,分母加V,V表示词汇表中单词的个数,这样做既达到了平滑的目的,也保证了概率和为1。为什么分母是加V呢?分母中的V要跟分子中的1对应,分子中加了多少次1,分母中V就等于多少,以保证概率和为1。那分子中加了多少次1呢?在n-gram算法中,跟在国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)后的国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)可以是词汇表中任何一个单词,不论他存在不存在,我们都将其频数加1。这就是Add-one平滑法。

Add-k平滑法在Add-one平滑法上做了一点改进,将1变为了k(0.5? 0.05? 0.01?),所以分母也自然由加V变为了加Vk,k在这里属于超参数,需要我们根据开发集和评价指标选择最优参数值。

接下来介绍backoff平滑法,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

上图看起来比较复杂,但其实backoff的思想就是‘退而求其次’。假设我们现在使用3-gram模型,在计算概率时发现训练集中没有国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)组合,那我们就不再计算国立高等经济大学NLP学习笔记(2):语言建模(Language modeling),而是改为计算国立高等经济大学NLP学习笔记(2):语言建模(Language modeling),如果国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)都不能计算,那我们只能计算国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

换句话说,如果我们对于一个高阶N-gram计数为0,我们只能“退避”到一个低阶N-gram。

注意,上图中的国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)是用来保证概率归一化的,该方法也称为Katz backoff。其思想类同与add-one平滑法,因为add-one平滑法其实是将一些概率由高频词组转移到低频词组以保证概率不为0,但同时为了保证概率和为1,分母加上V,对于那些高频词组,分子加1可能不会产生太大影响,但分母加V就不同了,会降低概率值,这也是为什么说概率由高频词组转移到低频词组。这里Katz backoff想法类似,对于频数存在的词组(c>0),也不能使用本身计算得到的概率值,而是要稍微减少该概率值,因为在backoff方法中,我们会退而求其次用低阶N-gram得到概率代替高阶的概率,所以如果不对这两种概率同时做改变,我们就不能得到概率和为1的结果。所以在Katz backoff中,我们需要同时使用国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)来保证概率归一化。

注意上式中左侧国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)和右侧绿国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)是相同的,下图也许更清晰:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

上图摘自斯坦福大学Speech and Language Processing。

即这是一个循环的过程,如果低阶词组频数仍为0,那就继续下降阶数,直至到达1-gram。

Katz backoff通常与一个称为Good-Turing的平滑方法结合。该组合算法Good-Turing backoff对估计Good-Turing平滑度和国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)还有国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)都有相当详细的计算。

相比之下,在Interpolation平滑法中,我们总是混合来自所有n-gram模型的概率估计,假设我们现在对3-gram模型使用Interpolation平滑法,那就是对3-gram、2-gram和1-gram进行加权和组合,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

Interpolation平滑法有两种形式,一种是如上图所示,简单对三种模型作加权平均,还有一种是稍微复杂一点的,考虑到前文的影响,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

就是我可以根据一些关于前文的先验信息对三个lambda的大小有所判断,但是不论是简单形式,还是这个稍微有些复杂的形式,lambda的值都要通过开发集调试。

接下来介绍最常用的Kneser-Ney平滑法,在介绍之前,我们先介绍一下absolute discounting,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

这是一个有意思的思想,church和gale两人在同时比较了训练集和开发集中bigram发现,在训练集中同count值的bigram在开发集中的平均count值总是比训练集少0.75,这是一个固定值呀(fixed)。

将这个思想应用于bigrams上,同时加上Interpolation平滑法的思想,我们得到interpolated absolute discounting,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

我们可以对所有count值取d=0.75,或者特别对count=1的值取d=0.5。

Kneser-Ney discounting在这个基础上做了改进,对低阶的1-gram的分布用更复杂的方法去处理,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

以前的1-gram分布国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)表示的是国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)这个词出现的概率,Kneser-Ney discounting方法认为这样做是不够准确的,我们更多地是要关注这个单词前文的差异性,怎么理解呢?举个栗子,比如这句话I can’t see without my reading . 现在有两种选择glasses和Kong,直觉上肯定是选择glasses,但是如果单计算某个词出现的概率,Kong不一定输于glasses,因为Hong Kong是固定搭配,出现次数很多,但是一旦离开了Hong Kong这个背景,我们就很难再其他地方看到Kong了,而glasses则不一样,所以glasses相比Kong有一个更广阔的分布,所以在这个先验知识下,这里填空我们就果断选择glasses而不是Kong。

显然,一个单词前文类型越丰富,填空处为该词的概率就越大,如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)形式可如上图所示,分子表示w前单词类型个数,分母表示所有bigram组合数,国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)也有另外一种形式,详见学习资料。

可见,在这种定义下,Kong这个词虽频繁出现,但只有一种背景词Hong,所以Kong的国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)值很低。

对于bigram模型,最终的Interpolated Kneser-Ney平滑法如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

一般的递归公式如下图所示:

国立高等经济大学NLP学习笔记(2):语言建模(Language modeling)

表现最好的Kneser-Ney平滑法版本是modified Kneser- Ney smoothing,它不是只有一个d,而是对不同的n-gram有不同的d对应。

 

学习资料:CourseraNLP课程斯坦福Speech and Language Processing

 

 

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/82015589

 

相关文章:

  • 2021-11-15
  • 2021-10-26
  • 2021-09-30
  • 2021-06-08
  • 2021-06-07
  • 2021-10-06
  • 2021-12-05
猜你喜欢
  • 2022-01-05
  • 2021-11-16
  • 2022-01-11
  • 2021-06-22
  • 2021-07-19
  • 2021-09-27
  • 2021-10-05
相关资源
相似解决方案