语言模型

斯坦福大学自然语言处理第四课“语言模型(Language Modeling)”

一、课程介绍

斯坦福大学于2012年3月在Coursera启动了在线自然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课:
https://class.coursera.org/nlp/

以下是本课程的学习笔记,以课程PPT/PDF为主,其他参考资料为辅,融入个人拓展、注解,抛砖引玉,欢迎大家在“我爱公开课”上一起探讨学习。

课件汇总下载地址:斯坦福大学自然语言处理公开课课件汇总

二、语言模型(Language Model)

1)N-gram介绍

在实际应用中,我们经常需要解决这样一类问题:如何计算一个句子的概率?如:

  • 机器翻译:P(high winds tonite) > P(large winds tonite)
  • 拼写纠错:P(about fifteen minutes from) > P(about fifteenminuets from)
  • 语音识别:P(I saw a van) >> P(eyes awe of an)
  • 音字转换:P(你现在干什么|nixianzaiganshenme) > P(你西安在干什么|nixianzaiganshenme)
  • 自动文摘、问答系统、... ...

以上问题的形式化表示如下:

p(S)=p(w1,w2,w3,w4,w5,…,wn)

=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)//链规则

p(S)被称为语言模型,即用来计算一个句子概率的模型。

那么,如何计算p(wi|w1,w2,...,wi-1)呢?最简单、直接的方法是直接计数做除法,如下:

p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)

但是,这里面临两个重要的问题:数据稀疏严重;参数空间过大,无法实用。

基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。

  • 假设下一个词的出现依赖它前面的一个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

=p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)   // bigram

  • 假设下一个词的出现依赖它前面的两个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)  // trigram

那么,我们在面临实际问题时,如何选择依赖词的个数,即n。

  • 更大的n:对下一个词出现的约束信息更多,具有更大的辨别力
  • 更小的n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。

理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,绝不使用trigram。

2)构造语言模型

通常,通过计算最大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,公式如下:

p(w1|wi-1) = count(wi1-, wi) / count(wi-1)

如给定句子集“<s> I am Sam </s>

<s> Sam I am </s>

<s> I do not like green eggs and ham </s>”

部分bigram语言模型如下所示:

c(wi)如下:

c(wi-1,wi)如下:

则bigram为:

那么,句子“<s> I want english food </s>”的概率为:

p(<s> I want english food </s>)=p(I|<s>)

×  P(want|I)

×  P(english|want)

×  P(food|english)

×  P(</s>|food)

=  .000031

为了避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算。

log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

推荐开源语言模型工具:

推荐开源n-gram数据集:

Total number of tokens: 1,306,807,412,486

Total number of sentences: 150,727,365,731

Total number of unigrams: 95,998,281

Total number of bigrams: 646,439,858

Total number of trigrams: 1,312,972,925

Total number of fourgrams: 1,396,154,236

Total number of fivegrams: 1,149,361,413

Total number of n-grams: 4,600,926,713

3)语言模型评价

语言模型构造完成后,如何确定好坏呢? 目前主要有两种评价方法:

  • 实用方法:通过查看该模型在实际应用(如拼写检查、机器翻译)中的表现来评价,优点是直观、实用,缺点是缺乏针对性、不够客观;
  • 理论方法:迷惑度/困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高概率值的语言模型较好,公式如下:

由公式可知,迷惑度越小,句子概率越大,语言模型越好。使用《华尔街日报》训练数据规模为38million words构造n-gram语言模型,测试集规模为1.5million words,迷惑度如下表所示:

4)数据稀疏与平滑技术

大规模数据统计方法与有限的训练语料之间必然产生数据稀疏问题,导致零概率问题,符合经典的zip‘f定律。如IBM, Brown:366M英语语料训练trigram,在测试语料中,有14.7%的trigram和2.2%的bigram在训练语料中未出现。

数据稀疏问题定义:“The problem of data sparseness, also known as the zero-frequency problem arises when analyses contain configurations that never occurred in the training corpus.  Then it is not possible to estimate probabilities from observed frequencies, and some other estimation scheme that can generalize (that configurations) from the training data has to be used. —— Dagan”。

人们为理论模型实用化而进行了众多尝试与努力,诞生了一系列经典的平滑技术,它们的基本思想是“降低已出现n-gram条件概率分布,以使未出现的n-gram条件概率分布非零”,且经数据平滑后一定保证概率和为1,详细如下:

  • Add-one(Laplace) Smoothing

加一平滑法,又称拉普拉斯定律,其保证每个n-gram在训练语料中至少出现1次,以bigram为例,公式如下:

其中,V是所有bigram的个数。

承接上一节给的例子,经Add-one Smoothing后,c(wi-1, wi)如下所示:

则bigram为:

在V >> c(wi-1)时,即训练语料库中绝大部分n-gram未出现的情况(一般都是如此),Add-one Smoothing后有些“喧宾夺主”的现象,效果不佳。那么,可以对该方法扩展以缓解此问题,如Lidstone‘s Law,Jeffreys-Perks Law。

  • Good-Turing Smoothing

其基本思想是利用频率的类别信息对频率进行平滑。调整出现频率为c的n-gram频率为c*:

但是,当nr+1或者nr > nr+1时,使得模型质量变差,如下图所示:

直接的改进策略就是“对出现次数超过某个阈值的gram,不进行平滑,阈值一般取8~10”,其他方法请参见“Simple Good-Turing”。

  • Interpolation Smoothing

不管是Add-one,还是Good Turing平滑技术,对于未出现的n-gram都一视同仁,难免存在不合理(事件发生概率存在差别),所以这里再介绍一种线性插值平滑技术,其基本思想是将高阶模型和低阶模型作线性组合,利用低元n-gram模型对高元n-gram模型进行线性插值。因为在没有足够的数据对高元n-gram模型进行概率估计时,低元n-gram模型通常可以提供有用的信息。公式如下:

扩展方式(上下文相关)为:

λs可以通过EM算法来估计,具体步骤如下:

  • 首先,确定三种数据:Training data、Held-out data和Test data;

  • 然后,根据Training data构造初始的语言模型,并确定初始的λs(如均为1);
  • 最后,基于EM算法迭代地优化λs,使得Held-out data概率(如下式)最大化。
  • Kneser-Ney Smoothing
  • Web-scale LMs

如Google N-gram语料库,压缩文件大小为27.9G,解压后1T左右,面对如此庞大的语料资源,使用前一般需要先剪枝(Pruning)处理,缩小规模,如仅使用出现频率大于threshold的n-gram,过滤高阶的n-gram(如仅使用n<=3的资源),基于熵值剪枝,等等。

另外,在存储优化方面也需要做一些优化,如使用trie数据结构存储,借助bloom filter辅助查询,把string映射为int类型处理(基于huffman编码、Varint等方法),float/double转成int类型(如概率值精确到小数点后6位,然后乘10E6,即可将浮点数转为整数)。

2007年Google Inc.的Brants et al.提出了针对大规模n-gram的平滑技术——“Stupid Backoff”,公式如下:

数据平滑技术是构造高鲁棒性语言模型的重要手段,且数据平滑的效果与训练语料库的规模有关。训练语料库规模越小,数据平滑的效果越显著;训练语料库规模越大,数据平滑的效果越不显著,甚至可以忽略不计——锦上添花。

5)语言模型变种

  • Class-based N-gram Model

该方法基于词类建立语言模型,以缓解数据稀疏问题,且可以方便融合部分语法信息。

  • Topic-based N-gram Model

该方法将训练集按主题划分成多个子集,并对每个子集分别建立N-gram语言模型,以解决语言模型的主题自适应问题。架构如下:

  • Cache-based N-gram Model

该方法利用cache缓存前一时刻的信息,以用于计算当前时刻概率,以解决语言模型动态自适应问题。

-People tends to use words as few as possible in the article.

-If a word has been used, it would possibly be used again in the future.

架构如下:

猜测这是目前QQ、搜狗、谷歌等智能拼音输入法所采用策略,即针对用户个性化输入日志建立基于cache的语言模型,用于对通用语言模型输出结果的调权,实现输入法的个性化、智能化。由于动态自适应模块的引入,产品越用越智能,越用越好用,越用越上瘾。

  • Skipping N-gram Model&Trigger-based N-gram Model

二者核心思想都是刻画远距离约束关系。

  • 指数语言模型:最大熵模型MaxEnt、最大熵马尔科夫模型MEMM、条件随机域模型CRF

传统的n-gram语言模型,只是考虑了词形方面的特征,而没有词性以及语义层面上的知识,并且数据稀疏问题严重,经典的平滑技术也都是从统计学角度解决,未考虑语法、语义等语言学作用。

MaxEnt、MEMM、CRF可以更好的融入多种知识源,刻画语言序列特点,较好的用于解决序列标注问题。

三、参考资料

  1. Lecture Slides: Language Modeling
  2. http://en.wikipedia.org
  3. 关毅,统计自然语言处理基础 课程PPT
  4. 微软拼音输入法团队,语言模型的基本概念
  5. 肖镜辉,统计语言模型简介
  6. fandywang,统计语言模型
  7. Stanley F. Chen and Joshua Goodman. Anempirical study of smoothing techniques forlanguage modeling. Computer Speech and 

    Language, 13:359-394, October 1999. 

  8. Thorsten Brants et al. Large Language Models in Machine Translation
  9. Gale & Sampson, Good-Turing Smoothing Without Tears
  10. Bill MacCartney,NLP Lunch Tutorial: Smoothing,2005

P.S. :  基于本次笔记,整理了一份slides,分享下:http://vdisk.weibo.com/s/jzg7h

转自:http://52opencourse.com/111/%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E7%AC%AC%E5%9B%9B%E8%AF%BE-%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%EF%BC%88language-modeling%EF%BC%89

时间: 2024-11-05 17:18:58

语言模型的相关文章

N-gram统计语言模型(总结)

N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型. 这个数学模型就是自然语言处理中常说的统计语言模型,它是今天全部自然语言处理的基础,而且广泛应用与机器翻译.语音识别.印刷体和手写体识别.拼写纠错.汉字输入和文献查询. 2.N-Gram N-Gram是大词汇连续语音识别中经常使用的一种语言模型.对中文而言,我们称之为汉语语言模型(CLM, Chi

NLP中的用N-gram语言模型做英语完型填空的环境搭建

本文是对github上fork的xing_NLP中的用N-gram语言模型做完型填空这样一个NLP项目环境搭建的一个说明,本来写在README.md中.第一次用github中的wiki,想想尝试一下也不错,然而格式非常的混乱,自己都不满意,所以先在博客园记录一下,等github博客搭建成功了再说. 1. 操作系统: 作为programer,linux自然是首先选择,ubuntu,centos等等都可以.我用的是CentOS7.3,之前用Centos6.5各种报错,建议装最新版的linux系统,何

基于并行化的神经网络和复旦中文语料库,构建中文概率语言模型

本文旨在基于复旦中文语料库和神经网络模型构建中文的概率语言模型. 统计语言模型的一个目标是找到句子中不同词汇的联合分布,也就是找到一个单词序列出现的概率,一个训练好的统计语言模型可以被应用于语音识别.中文输入法.机器翻译等领域.在神经网络方法被提出之前,一个非常成功的构建语言模型的方法是 n-gram,n-gram 模型学习出统计出给出特定的单词序列时某个单词出现的条件概率,并且通过把一系列重叠的短语拼接起来,获得了模型的泛化能力.然而 n-gram 模型也有很多不如人意的地方.第一, n 的数

用CNTK搞深度学习 (二) 训练基于RNN的自然语言模型 ( language model )

前一篇文章  用 CNTK 搞深度学习 (一) 入门    介绍了用CNTK构建简单前向神经网络的例子.现在假设读者已经懂得了使用CNTK的基本方法.现在我们做一个稍微复杂一点,也是自然语言挖掘中很火的一个模型: 用递归神经网络构建一个语言模型. 递归神经网络 (RNN),用图形化的表示则是隐层连接到自己的神经网络(当然只是RNN中的一种): 不同于普通的神经网络,RNN假设样例之间并不是独立的.例如要预测“上”这个字的下一个字是什么,那么在“上”之前出现过的字就很重要,如果之前出现过“工作”,

NLP系列(5)_从朴素贝叶斯到N-gram语言模型

作者: 龙心尘 && 寒小阳 时间:2016年2月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50646528 http://blog.csdn.net/han_xiaoyang/article/details/50646667 声明:版权所有,转载请联系作者并注明出处 1. 引言:朴素贝叶斯的局限性 我们在之前文章<NLP系列(2)_用朴素贝叶斯进行文本分类(上)>探讨过,朴素贝叶斯的局限性来源于其条件独立

CSC321 神经网络语言模型 RNN-LSTM

主要两个方面 Probabilistic modeling 概率建模,神经网络模型尝试去预测一个概率分布 Cross-entropy作为误差函数使得我们可以对于观测到的数据 给予较高的概率值 同时可以解决saturation的问题 前面提到的线性隐层的降维作用(减少训练参数) ? ? 这是一个最初版的神经网络语言模型 ? ? 选取什么要的loss function,为什么用cross-entropy,为什么不用squared loss呢? 首先 可以看到 cross-entropy更能从数值上体

读《数学之美》第三章 统计语言模型

自然语言从产生开始,逐渐演变为一种基于上下文相关的信息表达和传递方式,在计算机处理自然语言时,一个最基本的问题就是为自然语言上下文相关的特性建立数学模型,叫做统计语言模型(Statistical Language Model),它是自然语言处理的基础,广泛应用于机器翻译.语音识别.印刷体或手写体识别.拼音纠错.汉字输入和文献查询等. 对于一句通顺的话<1>,如果改变一些词的顺序,或替换掉一些词<2>,它的意思就含糊了,如果随机打乱<3>,则完全不知所云了.对于<1

语言模型基本概念-n元语法

一个语言模型通常构建为字符串s的概率分布p(s),这里p(s)试图反映的是字符串s作为一个句子出现的频率.例如,在一个人所说的话中每100个句子里面大约有一句是Okay,则可以认为p(Okay)约等于0.01.而对于句子“An apple ate the chicken”我们可以认为其概率是0,因为几乎没有人会说这样的句子.需要注意的是,与语言学中不同,语言模型与句子是否合乎语法是没有关系的,即使一个句子完全合乎语法逻辑,我们仍然可以认为它出现的概率接近为0. 对于一个由l个基元(“基元”可以为

N-gram语言模型简单介绍

N-gram语言模型 考虑一个语音识别系统,假设用户说了这么一句话:"I have a gun",因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1.I have a gun. 2.I have a gull. 3.I have a gub. 那么问题来了,到底哪一个是正确答案呢? 一般的解决方法是采用统计的方法.即比较上面的1.2和3这三句话哪一句在英语中出现的概率最高,哪句概率最高就把哪句返回给用户.那么如何计算一个句子出现的概率呢?说白了就是"数数"

MIT自然语言处理第三讲:概率语言模型

一. 简单介绍 a) 预测字符串概率 i. 那一个字符串更有可能或者更符合语法 1. Grill doctoral candidates. 2. Grill doctoral updates. (example from Lee 1997) ii. 向字符串赋予概率的方法被称之为语言模型(Methods for assigning probabilities to strings are called Language Models.) b) 动机(Motivation) i. 语音识别,拼写检