在上一节lesson中主要总结了HMM在声学模型中的用法,本小节主要总结语言模型相关的内容。在语音识别领域,语言模型评估的是一句话到底有多像一句人话,在语音识别、拼写纠错、机器翻译、音字转换都有许多应用。
1.语言模型简介
语言模型P(W)实际上提供了训练集中的语言约束,通过计算一句话或词序列出现的概率来帮助选择正确的候选。举例来讲就是,比如说了一句"The computer is listening",由于存在很多音的confuse,会导致像"they come tutor list sunny"也有可能正确,我们需要让机器知道正确的词序列,于是就是让机器会统计这句话出现的机率,不太可能是一句话的候选概率将会比较低。
在详细介绍语言模型之前,还需要一些预备知识,比如信息熵。在第5节中总结过信息熵的相关知识。
信息熵的上限是
,下限是0。假设language source,如果别人给你手机发英文文本消息,假设英文字母是一个个显示地话,每看到一个字母能够带给你多少信息,这个是可以通过计算每个字母的信息量得到的。所有的英文字母加标点符号是小于
的,则每符号的平均信息量也就是信息熵
不会超过6bits information;假设消息是以word依次显示地话,假设常用的英文单词是30000个,则信息熵
不会超过15 bits information。
假设language source,如果别人给你手机发普通话语音消息,假设你是一个syllable(音节)一个音节地听,中文一共有
个音节(包括tone),则信息熵
不会超过6bits information每音节,如果不包括tone(400个音节)的话信息熵
不会超过9bits information每音节;假设是以字为单位的话,基于常用字8000字的假设,则信息熵
不会超过13bits information每字。
1.1 信息熵与混淆度(Entropy and Perplexity)
之前总结过,N-gram是在语言模型中最核心的建模方法。N-gram只依赖于前面n-1个word。
假设一句话进入语音识别系统,这句话是由很多word构成的,每个word都是以一定概率存在的,有高有低。计算第一个word的概率只能通过unigram进行计算,通过计算第1个word的信息熵可以得知第1个word的选词之难度,信息熵可以描述为概率分布之间的分散程度或者集中程度(越分散熵越大),表明了选词的难度(越难熵越大)。假设第1个word计算出来的信息熵为10bits,这与1024个单词以均匀分布的方式计算得到的信息熵是一样的,所以该单词的几率可以等价为
。其中,混淆度是计算公式为
,也就是1024。在这里我们将1024称为branching factor estimate。也就是通过计算第1个word的难度可以得知选word之难度就等同于从1024个单词中选1个的难度。假设已经有了第1个word了,第2个word就可以采用bi-gram进行,但是仍然会有词库大小那么多机率,由于第1个word已经知道了,所以该单词的选取的难度会小一些,则信息熵稍微会小一点(集中一点),假设计算出来的信息熵是9bits,则该单词的选题难度就等同于从以均匀分布的方式分布的512个单词选1个的难度。依次类推,第三个word可以采用trigram,选词难度会进一步降低....
语言模型P(W)实际上计算一句话或一词序列出现的概率,计算公式可以表达为:
,在上述的例子中
,
,依次类推。那我平均猜一次能够看到该可能的几率是多少呢,采用几何平均计算,得到是一个小于1的分数取倒数就可以得到平均的可能性。图中的312代表的是我每一次猜这句话的难度与从312个句子里面选1个的难度是相等的。
我们将求得的average braching facotor这个指标当做语言模型的度量标准(perplexity,简称PPL),代表的是选词在多少个里面取一个的难度。我们希望这个PPL越低越好,越低表明模型的预测能力越好。训练集上的PPL代表模型与训练数据的匹配程度,测试集上的PPL代表模型预测新数据的泛化能力。将上面PPL计算可以表示为:
其中
是测试集所有的word数目,
代表的是依赖前面的word。
在语言模型里面,我们用训练集(train corpus)来训练一个语言模型,我们拿测试集(test corpus)来测试语言模型的性能。
举个简单的示例:
图中所示domain specific指的是用各类的数据分别训练各类的模型,比如说用政治新闻训练政治新闻的语言模型,再用政治新闻测训练的政治新闻的模型。我们会发现图中的cultures新闻的复杂度是比较高的,因为政治新闻覆盖面比较广,主题会有很多,句型种类比较多。体育新闻主题比较少,内容比较简单,所以语言模型在比较少的数据集上也能训练一个不错的模型。general domain是将所有类别的数据组合起来训练一个比较大的model,在测试的时候分别拿各类别的数据进行测试,会发现语言模型的性能有所下降,主要是由于不同domain的词组相互干扰导致。这个图表明在语言模型中,似乎是越是单一并且集中主题的语料库,由于有着比较特定的distribution,训练的语言模型越好。
有些课本上会写道:The Perplexity is a kind “Cross-Entropy” when the true statistical characteristics of the test corpus D is incorrectly estimated as
by the language model,下面针对这句话做一个解释。
之前介绍过KL散度的概念,是衡量两个分布的相似性的。
,有人也会称KL散度为交叉熵(cross entropy),利用Jensen不等式知道
,左边是信息熵计算公式,也有一部分人不等式右面的称为交叉熵。根据大数定律,我们可以知道
其中红色框统计的是测试集里面的概率,蓝色框统计的是训练集得到的统计。
2. 语言模型的平滑(Smoothing)
多退少补。有几种具体的平滑做法,接下来分别介绍。
2.1 Add-one smoothing
思想:所有的events的出现次数都加1.
举个例子:,在bigram中,
实验效果不是特别理想,在某些情况下回表现的比较好,有些会变差。
2.2 back-off Smoothing
back-off意为回退,也就是说ngram计算出来的概率为0,我们可以可以回退到n-1gram。如果ngram计算的比较大,那n-1 gram计算的不会小,实验效果不错。
2.3 Interpolation Smoothing
对于非0的events将ngram和n-1 gram的概率内插一下效果会更好一点。
这种思想也可以用将special domain的语言模型和一个background的语言模型进行内插,比如继续用上面讲的例子,我们将用体育新闻和所有类别新闻的语言模型做内插会好一些。或者说可以将一个general domain的语言模型adapt到一个special domain中去。
2.4 Good-Turing
来源:1953年Good在Turing的指导下提出的一种概率估计方法。
举个例子:在钓鱼的时候,总共调到了6种鱼,1号鱼钓到了10 条,2号鱼调到了3条,3号鱼钓到了2条,4、5、6号鱼掉到了 分别调到了1条,总共18条鱼。根据掉到的18条鱼来估计海里的所有的鱼的种类的distribution。可能海里游1000种鱼,只钓到了6种,其余994种是不知道的,如何估计994种的鱼的机率?我们可能会用3/18来表示,为什么?因为出现1次的物种的概率是3种,也就是
(出现1次的种类是3),代表的是在他们这3种鱼被钓起来的时候也算是新的种类。将剩下的5/18重新分配给6种鱼。这是该算法的设想。
基本思想:假设样本总数为
,
是样本中刚好出现
次的事件(这里为ngram)数目,
为折扣后的次数。在假设中,
代表的是出现1次的gram数,
代表的是出现2次的gram数目,以此类推。根据假设,依次类推,所以有:
,得到
,这里面可以计算一个折扣率
也就是说出现的1次的所有的概率之和送给0次的,0次所有的events(gram数)再进行平均分配;出现2次的所有概率之和送给1次的,1次所有的events(gram数)再进行平均分配;出现3次的所有概率之和送给2次的,2次的所有events(gram数)平分这些概率(),依次类推。
但是该算法存在缺点:
- 平均分配真的合理吗?仔细想想不太合理,举个例子:C(burnish the)=C(burnish thou)=0,很明显,P(the|burnish)>P(thou|burnish),因为P(the)>P(thou)。
- 出现次数最多的events的概率变没了,因为他所有的概率送给次高频了。在实际应用中,越高频越重要。
2.5 Katz Smoothing
是基于Good-Turing的一个改进,克服了Good-Turing的两个缺点。
基本思想:在统计中相信可信(出现次数比较高)的统计数据,这部分的概率不做改变,而对不可信(出现次数比较低)的统计数据进行打折处理,同时将折扣出来的那一小部分概率给予未看见的事件。
具体来说可以分为3种情况:
- 对于频率超过一定阈值的词(或设定一定的次数 ),根据大数定理,它的最大似然估计的结果就很接近于真实概率,此时它们的概率估计就是它们在语料库中的相对频率, 不做改变;
- 对于频率小于一定阈值的词,由于它的统计数据比较少,那么最大似然估计就跟真实概率没有关系,是不可信的,换句话说,就是最大似然估计的结果既有可能接近概率也有可能和概率相差很大,为了避免过高地估计概率,或者说为了减小风险提高可靠性,就对这样的估计进行打折处理,而且是出现次数越少,折扣越多。要满足 ,其中折扣率 是和Good-Turing计算一样;
- 对于未看见的词,也给予一个比较小的概率,具体就是把第二种情况打折的概率分给未出现的词。这样所有词的概率估计都很平滑了。具体怎么分,不是平均分配,是根据n-1阶的概率来按比例分配。
举个例子:Bi-gram
Katz效果非常好,一般用其做平滑做的比较多。
3. Class-based Language Modeling(类语言模型)
N-gram模型的一个很大缺点就是它把所有的词都看成完全不同的东西。因此,对于某一个词,模型需要足够多的训练数据才能比较准确的估计其概率。但是人类不是这样使用语言的。我们知道’Tuesday’和’Wednesday’在句法和语义上都有某种类似的属性。即使训练数据中可能没有出现过’store open Tuesday’,但是因为训练数据中出现过’store open Wednesday’,所以我们还是能够给前者比较高的概率。也就是说,我们需要考虑词的这种相似性。
类语言模型可以根据语言或者文法把类似的词进行聚类,组成词类,在构建语言模型的时候使用词类标签来替代词。
所以原先关于词的trigram可以写成词类(词群)的trigram. 下面公式中
代表的是
所属的那个词类,
。也就是看到前面两个词类的几率,我能得到下一个词类的几率,在基础上能看到该词的一个概率。这种方法更适用于ngram数目比较少、不可靠的情况,
这对于unseen data和不可靠数据起到了一定的平滑效果,并且该方法和低阶的语言模型互补。这种方式参数比较少。
这种方式在Limited domian应用效果不错:比如基于人类规则的一些订票业务。
那怎么得到词类的主要有两种方法:利用先验知识或者数据驱动。
那么怎么得到词类呢?一种是利用先验知识,通常是应用的领域知识。比如我们为一个旅行的app做一个语言模型,我们需要识别目的城市的名字(比如’Tahiti’, ‘Oslo’)、航班信息以及周几(周一到周日)。不管训练数据多大,它也不可能出现所有的城市和航班信息。因此我们可以根据先验知识平均的认为每个城市的类成员概率都是一样,也可以根据城市的热度来按比例的分配这个概率(而不是训练数据的概率)。有的实体是两个及其以上的词,比如’Los Angeles’,这是需要修改类语言模型,读者可以参考Word-Phrase-Entity Language Models: Getting More Mileage out of N-grams。
另一种方法就是纯数据驱动的方法,而不需要人或者领域的知识。比如我们可以先定义多少个类别,然后搜索所有的词和类别的映射关系(每一种映射就是一种聚类),然后找出PPL最小的那种聚类。当然穷举的计算复杂度是不可行的,有一些算法来解决计算的问题,读者可以参考Class-Based n-gram Models of Natural Language。
再说两个数据驱动的例子:
例子1:刚开始所有的词都当做1类,然后任意两个词进行合并,如果该词的合并会使语言模型的perplexity降低的话合并为1个,不断迭代,知道模型的性能不在提高就停止。
例子2:把出现在该词前面的全部历史数据用决策树对其进行分类,利用专家知识构建question set。
链接: