NLP语言模型详解

语言模型

1. 介绍

  • 语言模型刻画词序列概率大小。
  • 通常认为词序列概率更大的更符合语法的标准。所以经常用来判断一句话是否符合语法。
  • 例如 P(I \quad am \quad Light)>P(Light\quad I \quad am)
  • 我们就可以认为I \quad am \quad Light更符合语法

2. 链式法则

  • 把联合概率用条件概率表示

    • 链式法则:P(w_1,w_2,w_3,\cdots,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1w_2)\cdots P(w_n|w_1w_2w_3 \cdots w_n)

    • 例如:计算句子 今天是春节我们都休息 的联合概率为

      P(今天,是,春节,我们,都,休息)
      =P(今天)P(是|今天)P(春节|今天,是)\cdots P(休息|今天,是,春节,我们,都)

    • 每个词出现的概率计算过程:

      P(w_i|w_1,\cdots,w_{i-1}) = \frac {C{(w_1,w_2,\cdots,w_i)}}{\sum_w C{(w_1,w_2,\cdots,w_{i-1},w)}}

    ​ 解释:C(\cdot)表示子序列在训练集中出现的次数 。例如训练集中出现了以下几处话:

    ​ 今天是春节,我们都休息。
    ​ 今天是春节,我们都出去玩了。
    ​ 今天是工作日,我们都不休息。

    ​ 那么 P(春节|今天,是)=\frac {2}3,P(休息|今天,是,春节,我们,都)=\frac{1}{2}

  • 问题:事实上,如果条件过长,训练库中很少或者没有出现,计算每个词的出现的条件概率也是一种计算上的浪费。

  • 解决:所以我们引入马尔可夫假设(Markov assumption),即假设当前词出现的概率只依赖于前n-1个词。公式如下:

    P(w_i|w_1,\cdots,w_{i-1})=P(w_i|w_{i-n+1},\cdots,w_{i-1})

3. 马尔可夫假设

  • 作用:简化条件概率的计算,即当前词出现的概率只与前几个词有关。

  • 基于马尔可夫假设,定义n-gram语言模型如下:

    n的数值 公式 名称
    n=1 P(w_1,w_2,\cdots,w_n)=\prod_{i=1}^{n} P(w_i) unigram
    n=2 P(w_1,w_2,\cdots,w_n)=\prod_{i=1}^{n} P(w_i|w_{i-1}) bigram
    n=3 P(w_1,w_2,\cdots,w_n)=\prod_{i=1}^{n} P(w_i|w_{i-2}w_{i-1}) trigram
  • n=1时,即unigram模型。调整句子词的顺序,概率不变,这时可以认为词与词之间没有顺序关系。

  • n=2时,即bigram模型。当前词出现的概率只和前一个词出现的概率有关。

4. 使用语言模型过程

  1. 根据语料库(数据集)计算概率和条件概率
  2. 根据计算得到的概率,计算句子的联合概率
  3. 计算出的词语序列的联合概率更大的,我们更倾向于认为该词语序列符合语法。
  • 注意的点:
    1. 为了使句首词的条件概率有意义,需要给原序列加上一个或多个起始符<s>。例如P(今天)P(今天|<s>)的意义是完全不同的。
    2. 通常我们也会在序列末尾加一个结束符</s>。当不加结束符时,n-gram语言模型只能分别对所有固定长度的序列进行概率分布建模,而不是任意长度的序列。

5. n-gram语言模型中的平滑技术(smoothing)

  • 问题:当测试集中出现了训练集中未出现过的词,导致语言模型计算出的联合概率为零,此时就可以认为该词语序列不符合语法。但这是不合理的。例如 今天是星期三,我们都工作

    • **P(今天,是,星期三,我们,都,工作) **
      =P(今天)P(是|今天)P(星期三|今天,是)\cdots P(工作|今天,是,星期三,,我们,都)
    • 星期三 这个词在训练集中没出现,导致P(星期三|今天,是)=0,从而导致P(今天,是,星期三,我们,都,工作)=0。但这并不代表这句话不符合语法。
  • 解决上述问题,我们需要平滑技术。有以下几种平滑技术:

      1. Add-one平滑
      • P(w_i|w_{i-1})=\frac{C(w_{i-1},w_i)+1}{C(w_i)+v}
      • V是词典的大小。这样能满足P(w_i|w_0)的所有 i 求和是1。
      1. Add-K平滑
      • P(w_i|w_{i-1})=\frac {C(w_{i-1},w_i)+k}{C(w_i)+kv}
      • k的选择:用不同的k训练模型,在验证集上计算f(k)=perplexity,k=k*arg min f(k)
      1. interpolation平滑
      • 为什么要使用interpolation平滑?
        • P(a|c,d)=0,P(b|c,d)=0
        • P(c,d,a)=P(c)P(d|c)P(a|c,d)=0
        • P(c,d,b)=P(c)P(d|c)P(b|c,d)=0
        • 概率相同,不合理。(因为我们想知道c,d词后面更容易出现a还是b
      • 核心思路:计算Trigram概率时,同时考虑Unigram,Bigram,Trigram出现的频次。
      • P(w_i|w_{i-2},w_{i-1})=\lambda_1 P(w_i|w_{i-2},w_{i-1})+\lambda_2 P(w_i|w_{i-1})+\lambda_3P(w_i),其中\lambda_1+\lambda_2+\lambda_3=1
      1. 此外还有Laplace Smoothing,good-turning等平滑技术。

6. 神经网络语言模型NNLM

在神经网络(Neural Network, NN)被成功应用于语言建模之前,主流的语言模型为N-gram模型,采用计数统计的方式,在离散空间下表示语言的分布。由于缺乏对词的相似性的有效表示,N-gram语言模型存在严重的数据稀疏问题。虽然引入平滑技术,但数据稀疏问题仍不能得到有效的解决。神经网络语言模型则采用分布式的方式表示词,即通常所说的词向量,将词映射到连续的空间内,有效地解决了数据稀疏问题。并且神经网络具有很强的模式识别能力,神经网络语言模型的性能远优于N-gram模型。

前向神经网络是最早被引入到语言建模中的神经网络结构,随后是循环神经网络,包括标准循环神经网络、长短期记忆循环神经网络和门限循环单元神经网络,接着卷积神经网络也被引入语言建模中。

掌握NNLM对理解后续的ELMo,Transformer,BERT等NLP模型很有帮助。


神经网络语言模型.jpg

神经网络语言模型结构示意图如下图所示


神经网络语言模型结构示意图.png

添加LSTM网络的神经语言模型结构示意图如下图所示


循环神经网络语言模型.png

7. 评估语言模型-perplexity

  • 对于自然语言序列W=w_1,w_2,\cdots,w_n,可以推导出每个词的平均交叉熵为:

    H(W)=-\frac{1}{n}logP(w_1,w_2,\cdots,w_n)

  • 定义困惑度(perplexity)

    Perplexity(W)=2^{H(W)}=\sqrt[n]\frac{1}{P(w_1,\cdots,w_n)}

  • 困惑度在语言模型中的意义可以理解为 对于任意给定的序列,下一个候选词的可选范围大小。困惑度越小,说明所建模的语言模型越精确。

  • 扩展(与语言模型无关,可以跳过):

    • 信息论中常采用相对熵(relative entropy)来衡量两个分布之间的相近程度。
    • 对于离散随机变量X,熵、交叉熵以及相对熵的定义如下:
      • 熵:H(p)=-\sum_ip(x_i)logp(x_i)
      • 交叉熵:H(p,q)=-\sum_ip(x_i)logq(x_i)
      • 相对熵:D(p||q)=H(p,q)-H(p)=\sum_ip(x_i)logP(x_i)/q(x_i)
      • 其中 p(x)q(x)都是对随机变量概率分布的建模。
      • 假定p 是样本的真实分布,q是对其的建模。因为真实分布的熵H(P)值是确定的,因此优化相对熵D(p||q)等价于优化交叉熵H(p,q)
文档说明

读了一些文档,经过一段时间快忘了,才整理下来的。参考的文献和博客记不起来了,所以请原谅我不附参考链接了。文章用typora写的,自己码的字和公式,喜欢写作的伙伴,可以尝试一下。欢迎大家的评论与转发,转发时请附上文章出处。如果感觉文章对您有帮助,欢迎赞赏,您的支持是我及时记录的动力。

pdf文档链接:https://pan.baidu.com/s/10mfyX-A0S3Ji1-AOn6NTpA
提取码:kmmx

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容