精华内容
下载资源
问答
  • 语言模型

    万次阅读 2014-01-07 19:07:04
    斯坦福大学自然语言处理第四课“语言模型(Language Modeling)” 一、课程介绍 斯坦福大学于2012年3月在Coursera启动了在线自然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课: ...

    斯坦福大学自然语言处理第四课“语言模型(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. An  empirical study of smoothing techniques for  language 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



    展开全文
  • 语言模型简介

    千次阅读 2018-05-17 19:18:40
    语言模型 语言模型可以对一段文本的概率进行估计,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型和神经网络语言模型。下面一次介绍着两类语言模型。 统计语言模型 要判断一段...

    语言模型
    语言模型可以对一段文本的概率进行估计,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型神经网络语言模型。下面一次介绍着两类语言模型。
    统计语言模型
    要判断一段文字是不是一句自然语言,可以通过确定这段文字的概率分布来表示其存在的可能性。 语言模型中的词是有顺序的,给定m个词看这句话是不是一句合理的自然语言,关键是看这些词的排列顺序是不是正确的。所以统计语言模型的基本思想是计算条件概率。比如一段文字有 w1,w2,w3...,wm w 1 , w 2 , w 3 . . . , w m 这m个词组成,看看是不是一句话,就可以用下面的公式计算其联合概率:
    P(w1,w2,w3...,wm)=P(w2|w1)P(w3|w1,w2)...P(wm|w1,w2,...wm1) P ( w 1 , w 2 , w 3 . . . , w m ) = P ( w 2 | w 1 ) P ( w 3 | w 1 , w 2 ) . . . P ( w m | w 1 , w 2 , . . . w m − 1 )
    在实际操作中,如果文本较长, P(wi|w1,w2,...wi1) P ( w i | w 1 , w 2 , . . . w i − 1 ) 的估计会非常困难,所以就出现了一个简化模型N-gram语言模型:当前词只和它前面的n个词有关,与更前面的词无关,上面的式子就可以写成:
    P(wi|w1,w2,...wi1)=P(wi|wi(n1),...,wi1) P ( w i | w 1 , w 2 , . . . w i − 1 ) = P ( w i | w i − ( n − 1 ) , . . . , w i − 1 )
    经典的统计语言模型就是N-gram语言模型。
    为什么说文本较长故居会非常困难?
    语言模型的任务是根据语料训练模型参数,根据词典中存在的词自动生成一句自然语言,需要保证生成的这句话是一段通顺的话,如果N-gram中的N选取的比较大,比如说5,那每个当前词的估计都和前面的5个词有关,比如我要生成‘中华人民共和国’,在生成第六个词‘和’时,要计算P(和|w1,w2,w3,w4,w5),要知道在生成第六个词的时候前面的5个词并不是确定的,需要将所有的可能性都列出来一个一个比较,选择概率最大的那个,而每个词的可能性都是词典大小的可能性,如果词典里有1万个词,那w1,w2,w3,w4,w5每个词都有1万中选择,这5个词组成的序列有10000^5个序列,这是一个非常大的数,每一种序列都回去训练语料中寻找该种序列出现的次数,也就是序列频率,这只是计算出了条件概率的分母,还有分子,分子是6个词所有可能性每一种可能性出现的次数,会得到10000^6个序列,用一个公式表示:

    P(w6|w1,w2,w3,w4,w5)=count(w1,w2,w3,w4,w5,w6)count(w1,w2,w3,w4,w5) P ( w 6 | w 1 , w 2 , w 3 , w 4 , w 5 ) = c o u n t ( w 1 , w 2 , w 3 , w 4 , w 5 , w 6 ) c o u n t ( w 1 , w 2 , w 3 , w 4 , w 5 )

    根据上面的分析每个词的预测我们都会得到10000^6个这样的概率,试想一下,如果不约束文本的长度,那后面的条件概率几乎是无法计算的,因为数量太多了,不仅有这个问题,还有如果 w1,w2,w3,w4,w5,w6 w 1 , w 2 , w 3 , w 4 , w 5 , w 6 组成的序列不是一个常用的序列,在预料中找不到这样的词序组合,那对应序列算出来的概率会很小很小,但是你也不能不计算他,所以就会面临你要计算非常多的概率,但是计算出来的大部分值非常小,甚至接近于0,而这些接近于0的概率还不能舍弃,必须存在,这样就会造成数据稀疏的问题。

    n-gram语言模型解决了用普通的条件概率计算句子概率参数太多难以训练的问题,理论上来说n取得越大保留的词序信息就越多,生成的句子越合理,但如果n取得比较大,同样会面临数据稀疏的问题,n-gram 模型解决了参数太多难以训练的问题,但没有解决数据稀疏的问题。

    之所以存在数据稀疏的问题,是因为我们想把n取得大一点来更多的保留词序信息,但n太大会导致 w1,w2,w3,...wn w 1 , w 2 , w 3 , . . . w n 这个序列在语料中很少出现或者根本不出现,(根据经验也知道太长的一句话在语料中出现的次数不是那么多,要远远小于2,3个词出现的次数)造成计算出的条件概率接近于0,那算出的句子的概率也是接近于0,这个语言模型就没法用了,这是数据稀疏导致的训练出的语言模型无法用的原因。

    现在问题来了,我们既想把n取的大一点以保留更多的词序信息,又想避免数据稀疏的问题,事实上,确实有这样的模型,那就是神经网络语言模型。
    神经网络语言模型
    神经网络语言模型的提出解决了n-gram模型当n较大时会发生数据稀疏的问题。
    与N-gram语言模型相同,神经网络语言模型(NNLM)也是对n元语言模型进行建模,估计 P(wi|win+1,win+2,...wi1) P ( w i | w i − n + 1 , w i − n + 2 , . . . w i − 1 ) 的概率,与统计语言模型不同的是,NNLM不通过计数的方法对n 元条件概率进行估计,而是直接通过一个神经网络对其建模求解。这里写图片描述
    NNLM的结构如图所示,分为三层,输入层,隐藏层,输出层,如果要生成‘中华人民共和国’这句话,已经生成了前面的四个词,要在前面的四个字为条件的情况下输出第五个词,输入层是将原始文字映射层向量,当然,这个向量是随机初始化得到的,也是我们要在训练过程中调整的参数(权重),在输入层将词向量拼接起来输入到隐藏层,隐藏层是一个非线性激活函数,输出层得到的是一个词典大小的向量,表示词典中的每个词作为语言模型生成的第五个词的可能性。
    NNLM也是N元语言模型,比如假设我们训练的是一个7元语言模型,在训练预料中我们会按照每7个词做一样样本,其中前6个词是输入,第七个词是正确的输出,模型通过6个词的输入在输出层预测第七个词在字典上的概率分布。对整个语料来说,语言模型需要最大化:

    wiDlogP(wi|win+1,...wi1) ∑ w i ∈ D l o g P ( w i | w i − n + 1 , . . . w i − 1 )

    训练时使用随机梯度下降法(就是求导取极值)来优化上述目标函数。
    为什么神经网络语言模型能够缓解数据稀疏的问题?
    这是由于NNLM使用词序列的词向量对上文(预测词前面的词被称为上文)进行表示,而统计语言模型使用的上文是各词的one-hot 表示,词是直接在字典里拿出来的,词与词之间是相互独立的,每个位置都可以在词典中任意选择词,可以这样理解,作为条件的每个词都是一个维度为词典大小的one hot向量,这样构成的条件矩阵是一个非常稀疏的矩阵,而NNLM将词向量压缩在一个低维空间,利用这种低维的实数表示,可以用相似的上文预测出相似的目标词,而传统模型只能用相同的上文预测出相同的目标词(无法计算词与词之间的距离,只能去语料中匹配找词频,很机械)。
    至此出现了两个数据稀疏,一个是说输入是one-hot的形式,输入词典大小的向量,但这个向量只有一个1,其余维度都是0,输入一个很大的矩阵但包含的信息太少,造成数据稀疏。另一个是说在输出层,由于n太大导致长度为n-1的序列在语料中出现的频次太少甚至不出现,导致计算出来的条件概率很多都是0或者接近于0,这样就会造成模型生成出来的句子概率基本都接近于0,无法分出那些是正常的句子,那些是不对的句子,使模型失效。NNLM对这两个数据稀疏问题都起到一定的缓解作用。
    语言模型是考虑上文,用 上文预测下一个词,而后来出现的Word2vec中的CBOW用 上下文来预测中间词训练词向量。

    即使使用了神经网络,本质上NNLM仍然是N元语言模型,就是你要预测的当前词只和他前面的N-1个词有关,与更前面的词无关,尽管这种方法一定程度上解决了数据稀疏的问题,但还是损失了一些信息。那有没有一种把要预测的当前词的前面所有的词都利用上的模型,显然是有的,这就要涉及到自然语言处理中的大杀器循环神经网络(RNN),我们都知道,循环神经网络的定义是当前的输出不仅和当前的输入有关,还和上一时刻的隐藏层的输出有关,这样讲神经网络展开后就会发现他把序列从开头到结尾全连起来了, 十分方便处理序列数据,而这个性质正是我们做语言模型所需要的:预测的当前词要和他前面的所有词有关,而不仅仅是他前面的N-1个词。

    循环神经网络语言模型(RNNLM)
    这个模型的结构图只需要把NNLM的隐藏层换成RNN神经元就可以了。输入不在限制长度,而是按照句子序列一个词一个词的迭代输入,比如将‘中华人民共和国’这句话作为训练样本,RNNLM先设隐藏层的初始状态为h(0),然后读入第一个词‘中’,预测下一个词‘华’(先不管预测的对不对),根据预测结果通过优化目标函数更新网络参数,然后在读入下一个词‘华’(读入的是样本中的词,与上一时刻输出什么无关,现在是在训练阶段),此时输入了‘中华’两个词,根据这两个词预测第三个词,再根据预测结果更新网络参数,在读入下一个词‘人’,此时根据读入的‘中华人’这三个词预测下一个词,在根据输出更新网络参数,依次类推,这就是RNNLM包含全部上文信息的原因,不管你预测第几个词,都会用到前面输入的所有词的信息(全部上文信息)。
    这里写图片描述

    神经网络语言模型都会在输入层得到一个词向量矩阵,当语言模型训练好之后,顺便也得到了词向量,词向量时神经网络语言模型的副产物。
    语言模型的隐藏层都是非线性函数,从输入到隐藏层的输出肯定要经过一个矩阵运算,即 tanh(Wx+b) t a n h ( W x + b ) ,有一个W,而在CBOW中,隐层是将输入直接相加,没有矩阵运算,所以CBOW相比NNLM要快很多,这也是隐藏层是线性比非线性更快的原因。

    展开全文
  • 语言模型:Trigram-语言模型

    千次阅读 2018-05-22 12:09:12
    有很多种定义语言模型的方式,在这里我们将重点介绍一种特别重要的方式,即三元语言模型(Trigram language model)。这将是根据上一节中关于马尔科夫模型的最直接的一个应用。在这一部分中,我们将给出三元语言模型...

    作者: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 考虑非常有限的上下文信息,但是具有更强的鲁棒性。
    展开全文
  • KenLM语言模型工具

    千次阅读 2019-10-22 21:47:38
    KenLM生成[语言模型] 的整理 PS:1.生成[语言模型]的同时,一定要注意生成的模型文件及路径是否正确,防止覆盖之前的模型 2. 使用xz解压.xz文件 自己训练语言模型(language model): kenlm 工具包 使用kenlm构建语言...

    KenLM生成[语言模型] 的整理
    PS:1.生成[语言模型]的同时,一定要注意生成的模型文件及路径是否正确,防止覆盖之前的模型
    2. 使用xz解压.xz文件

    自己训练语言模型(language model):
    kenlm
    工具包
    使用kenlm构建语言模型教程:
    参考链接1
    参考链接2
    参考链接3
    参考链接4
    参考链接5
    kenlm的-help
    训练语言模型的步骤:
    先进入kenlm/build文件夹

    用-o 5 训练成.arpa格式的文件
    可用:bin/lmplz -o 5 --verbose header --text mytext/19-01-au.txt mylmmodel/log3.arpa
    可用:bin/lmplz -o 3 --verbose header --text mytext/19-01-au.txt --arpa mylmmodel/log3.arpa
    可用:bin/lmplz -o 5 --prune 0 1 1 1 1 --text mytext/19-01-au.txt --arpa mylmmodel/log3.arpa

    在en.00(没有预处理的)上进行训练,修剪模型
    可用:bin/lmplz -o 5 --prune 0 1 1 1 1 --text mytext/lm_text/en.00.deduped --arpa mylmmodel/en.arpa
    但:Special word is not allowed in the corpus. I plan to support models containing in the future. Pass --skip_symbols to convert these symbols to whitespace.
    跳过空白字符:–skip_symbols
    可用:bin/lmplz -o 5 --skip_symbols --prune 0 1 1 1 1 --text mytext/lm_text/en.00.deduped --arpa mylmmodel/en.arpa

    不修剪模型:
    bin/lmplz -o 5 mytext/lm_text/en.00.deduped mylmmodel/en.arpa

    将生成的.arpa改成trie文件格式,并采用量化和指针压缩,也放到mylmmodel文件夹下
    可用:bin/build_binary trie -a 22 -q 8 -b 8 mylmmodel/log3.arpa mylmmodel/log3.binary

    将arpa文件改为.klm文件
    可用:bin/build_binary trie -a 22 -q 8 -b 8 mylmmodel/log3.arpa mylmmodel/log3.klm
    可用:bin/build_binary trie -a 22 -q 8 -b 8 mylmmodel/en.arpa mylmmodel/en.klm

    !!!在生成.arpa文件的时候,必须加上–arpa 使用txt文件的时候,也需要加上–text

    klm是kenlm定义的二进制格式,klm格式占用空间更少。
    参考链接1

    采用log4.arpa语言模型先把deepspeech2的语言模型执行完再说
    生成log4.arpa文件
    可用:bin/lmplz -o 5 --prune 0 1 1 1 1 --text mytext/19-01-au.txt --arpa mylmmodel/log4.arpa
    可用:bin/lmplz -o 5 --skip_symbols --prune 0 1 1 1 1 --text mytext/19-01-au.txt --arpa mylmmodel/log4.arpa
    使用–skip_symbols得到的模型才能被deepspeech2的sh run_infer.sh使用

    生成二进制文件.klm
    可用:bin/build_binary trie -a 22 -q 8 -b 8 mylmmodel/log3.arpa mylmmodel/log3.klm
    可用:bin/build_binary trie -a 22 -q 8 -b 8 mylmmodel/log4.arpa mylmmodel/log4.klm

    xz的使用
    压缩的时候保留源文件的方式:xz -k file.txt
    解压的时候保留源文件的方式:xz -d -k sources-19-01.txt.xz

    展开全文
  • 自然语言处理之语言模型(LM)

    万次阅读 多人点赞 2018-04-29 17:06:02
    经过几天对nlp的理解,接下来我们说说语言模型,下面还是以PPT方式给出。一、统计语言模型1、什么是统计语言模型?一个语言模型通常构建为字符串s的概率分布p(s),这里的p(s)实际上反映的是s作为一个句子出现的概率...
  • 生成语言模型

    千次阅读 2018-05-11 10:17:09
    这里主要介绍我使用过的两种根据文本生成语言模型的两种方法1. 通过网站: Sphinx 上传文件,生成对应的语言模型,需要注意的是文件最好不要太大,网站容易报504错误,贴下图吧,傻瓜式的操作方式:2. 使用SRILM ...
  • 预训练语言模型是近年来自然语言处理领域的热门话题,以BERT为代表的预训练模型在下游任务上取得了很好的效果。在本次报告中,讲者将梳理融合知识的预训练语言模型的研究进展与典型问题,并对于预训练模型学到了哪些...
  • NLP常见语言模型总结

    千次阅读 2019-01-19 10:35:19
    3、N-gram语言模型 二、词的分布式表示(Distributed Representation) 1、共现矩阵(Co-currence Matrix) 2、神经网络语言模型(Neural Network Language Model,NNLM) 3、Word2Vec,G...
  • 大多数现代的NLP系统都...屏蔽语言模型解释 在屏蔽语言建模中,我们通常屏蔽给定句子中特定百分比的单词,模型期望基于该句子中的其他单词预测这些被屏蔽的单词。这样的训练方案使这个模型在本质上是双向的,因为掩蔽词
  • 语言模型和ppl

    千次阅读 2018-07-26 17:44:39
    语言模型的ppl计算公式:
  • 词向量:语言模型

    千次阅读 2017-12-07 21:44:55
    一、统计语言模型 1、什么是统计语言模型? 一个语言模型通常构建为字符串s的概率分布p(s),这里的p(s)实际上反映的是s作为一个句子出现的概率。 这里的概率指的是组成字符串的这个组合,在训练语料中出现的似然,与...
  • 语言模型——n元语法模型

    千次阅读 2019-03-05 20:55:50
    语言模型:n元语法模型1. 概念2. 类型:2.1 unigram model2.2 bigram model3. unigram、bigram频率统计;参考链接: 1. 概念 N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行...
  • 深入浅出语言模型

    千次阅读 2018-08-23 17:07:16
    语言模型主要有统计语言模型(n-gram语言模型)和 神经网络语言模型等。下面分别介绍这两个语言模型以及两个模型之间的异同 n-gram语言模型 语言模型简单来讲,就是计算一个句子的概率,更确切的说是计算组成这个...
  • NLP之语言模型

    万次阅读 2018-09-16 21:41:56
    语言模型(language model, LM)在自然语言处理中占有重要的地位,尤其在基于统计模型的语音识别、机器翻译、汉语自动分词和句法分析等相关研究中得到了广泛应用。目前主要采用的是n元语法模型(n-gram model),...
  • 语言模型评价指标Perplexity

    万次阅读 多人点赞 2017-12-24 13:33:02
    语言模型(Language Model,LM),给出一句话的前k个词,希望它可以预测第k+1个词是什么,即给出一个第k+1个词可能出现的概率的分布p(xk+1|x1,x2,...,xk)。 在报告里听到用PPL衡量语言模型收敛情况,于是从公式角度...
  • 统计语言模型

    千次阅读 2017-05-07 15:34:00
    统计语言模型, Statistical Language Model.1. 简介自然语言具有上下文相关的特性, 所以统计语言模型就是为这种相关特性建立语言模型. 它是今天所有自然语言处理的基础. 判断一个句子是否合理, 就用概率来衡量. 一...
  • 讲讲语言模型和中文分词

    千次阅读 2018-07-09 11:51:24
    一、语言模型无论什么做自然语言处理的工具,都是基于计算机程序实现的,而计算机承担了数学计算的职责,那么自然语言和数学之间的联系就是语言模型,只有理解语言模型才能理解各种工具的实现原理,本节让我们深究...
  • 自然语言处理之语言模型综述

    千次阅读 2016-04-15 10:35:13
    语言模型 0 文法型语言模型 文法型语言模型是人工编制的语言学文法,文法规则来源于语言学家掌握的语言学知识和领域知识,但这种语言模型不能处理大规模真实文本。 1 统计语言模型 1). 无历史,一元模型 2). 最近...
  • (坑)神经网络语言模型NNLM模型

    万次阅读 2018-01-26 22:46:24
    参考: NNLM模型; licstar.net; 神经网络语言模型
  • 自然语言处理(二 RNN语言模型

    千次阅读 2017-11-26 18:13:35
    RNN语言模型RNN语言模型 语言模型 RNN语言模型 模型扩展语言模型语言模型就是指语言产生的规律,一般用来预测所使用语言语序的概率,或者是当前上下文使用某个词语的概率。换句话说,就是用来表示语言产生顺序的建模...
  • 语音识别语言模型介绍

    千次阅读 2020-06-07 01:09:23
    语言模型技术广泛应用于语音识别、OCR、机器翻译、输入法等产品上。语言模型建模过程中,包括词典、语料、模型选择,对产品的性能有至关重要的影响。语言模型的建模需要利用复杂的模型公式进行模拟计算,是人工智能...
  • 语言模型:介绍

    千次阅读 2018-05-22 12:07:55
    作者:chen_h 微信号 &amp; QQ:862251340 微信公众号:coderpai ... ...这个专题,我们主要学习如何从一个句子中来构建一个语言模型语言模型最早是应用在语音识别的问题上,当然...最原始的语言模型是采用参...
  • CMUSphinx 构建语言模型

    千次阅读 2016-11-04 13:50:37
    CMUSphinx 构建语言模型
  • N元语言模型

    千次阅读 2017-03-11 23:54:15
    语言模型是干嘛的?语言模型可以计算任何句子的概率。例如,“I love you”的概率是多少?用数学语言表述,NN元语言模型(NN-gram model)根据一个词语的前N−1N-1个词语,来计算这个词语的概率。如果我们有了一个2元...
  • 谷歌新语言模型Switch Transformer

    千次阅读 2021-01-27 09:48:27
    在过去的三年中,基于transformer的语言模型(LMs)在自然语言处理(NLP)领域一直占据着主导地位。Transformer 通常是在大量非结构化文本上预先训练的巨大网络,它能够捕捉有用的语言属性。然后,我么可以对预先训练的...
  • 一、传统语言模型 1.1 稀疏性 1.2泛化能力差 二、神经网络语言模型 2.1 前馈神经网络模型(FFLM) 2.2 循环神经网络模型(RNNLM) 2.2.1循环神经网络模型示例 2.2.2RNN语言模型训练过程 2.2.3RNN语言模型...
  • 经典统计语言模型

    万次阅读 2015-06-01 23:11:24
    本文介绍三个经典统计语言模型, HAL,LSA, 与COALS.
  • 预训练语言模型 | (1) 概述

    千次阅读 2020-02-05 21:58:57
    自从Bert问世以来,预训练语言模型的各种变体层出不穷,在预训练语言模型专栏,我将参考一些资料,对一些主要的平时使用比较多的预训练语言模型做一些理论层面的整理。 至于预训练语言模型的应用,可以查阅我的文分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 801,659
精华内容 320,663
关键字:

语言模型