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

深入浅出语言模型

语言模型主要有统计语言模型(n-gram语言模型)和神经网络语言模型等。下面分别介绍这两个语言模型以及两个模型之间的异同n-gram语言模型语言模型

语言模型主要有统计语言模型(n-gram语言模型)和 神经网络语言模型等。下面分别介绍这两个语言模型以及两个模型之间的异同

n-gram语言模型

语言模型简单来讲,就是计算一个句子的概率,更确切的说是计算组成这个句子一系列词语的概率。举个简单的例子:

s = “The cat jumped over the paddle”

一个好的语言模型应该会给这个句子比较高的概率。因为这个句子在语义语法上都没有任何问题。我们可以用如下的公式来计算概率
P(w1,w2,...,wn)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,...wn1)P(w1,w2,...,wn)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,...wn−1)

在统计语言模型中为了减少参数数量,基于马尔可夫假设,通常采用n-gram模型,我们可以认为下一个词的出现仅依赖于他前面的一个或者 n 个词,如果n=1,即假设每个单词之间相互独立,那么就会得到uni-gram表达式或者n=2的bi-gram模型去表示,因为,下一个单词和之前一个单词是有很强的关联性

  • Unigram model
    P(w1,w2,w3,...,wn)=ni=1P(wi)P(w1,w2,w3,...,wn)=∏i=1nP(wi)

  • Bigram model

  • P(w1,w2,w3,...,wn)=ni=2P(wi|wi1)P(w1,w2,w3,...,wn)=∏i=2nP(wi|wi−1)

一般来讲,n一般不会超过3, 否则参数空间过大,数据稀疏严重,对于非常对多词对的组合,在语料库中没有出现,依据最大似然估计得到的概率将会是0。

当然,对于n-gram模型来说,有很多的平滑方法。即对频率为0的n元对进行估计,典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑,等等。
例如加法平滑
P(wi|win+1,...,wi)=C(win+1,...,wi1,wi)+δC(win+1,...,wi1)+NδP(wi|wi−n+1,...,wi)=C(wi−n+1,...,wi−1,wi)+δC(wi−n+1,...,wi−1)+Nδ

神经网络语言模型

循环神经网络可以将任意长度的上下文信息存储在隐藏状态中,而不仅限于n-gram模型中的窗口限制,RNN的神经语言模型结构如下图1所示,假如针对一句话“大海的颜色是蓝色的”,其中包括了三个部分:

  • Embedding层 将输入单词 w_i 表示为实数向量
  • 循环神经网络
  • Softmax层,针对输入 xixi 输出为 y^iy^i 为一个向量 [y^i,1,y^i,2,...,y^i,|V|][y^i,1,y^i,2,...,y^i,|V|]

因此每一步的输出结果表示在上下文的情况下,该位置的单词是单词表中单词的概率,我们希望概率最大的单词就是真实的结果输出:
此处输入图片的描述

n-gram语言模型和神经语言模型的异同:

  • 共同点:都是计算语言模型,将句子看作一个词序列,来计算句子的概率
  • 不同点:
    • 计算概率方式不同,n-gram基于马尔可夫假设只考虑前n个词,nnlm要考虑整个句子的上下文
    • 训练模型的方式不同,n-gram基于最大似然估计来计算参数,nnlm基于RNN的优化方法来训练模型,并且这个过程中往往会有word embedding作为输入,这样对于相似的词可以有比较好的计算结果,但n-gram是严格基于词本身的
    • 循环神经网络可以将任意长度的上下文信息存储在隐藏状态中,而不仅限于n-gram模型中的窗口限制

语言模型评价指标

PPL(Perplexity)是用在自然语言处理领域(NLP)中,衡量语言模型好坏的指标。它主要是根据每个词来估计一句话出现的概率,并用句子长度作normalize,公式为

PP(s)=P(w1,w2,...,wn)1NPP(s)=P(w1,w2,...,wn)−1N
=1(w1,w2,...,wn)n=1(w1,w2,...,wn)n

这个式子可以这样理解,PPL越小,p(s)则越大,一句我们期望的sentence出现的概率就越高

训练n-gram语言模型的工具


  • 用SRILM构建语言模型

参考文献:
https://www.zhihu.com/question/29456588


推荐阅读
author-avatar
淘老婆桃桃_267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有