n元模型
区分好 语言建模 和 语言模型。
理解好 直接预测的问题:
(1). 数据量需要庞大(为什么?)
(2). 计算量庞大。
如何解决这个问题?
(1). 条件概率链式法则
(2). 马尔可夫假设
理解n元模型的计算量。
理解n不同的时候的不同情况。
(1). n大的时候:
-有更多的语境信息。
-计算量大,数据量要求大,计算出来的概率结果不可靠。
(2). n小的时候:
-比较少的语境信息。
-计算量小,数据量要求小,计算出来的概率结果可靠。
n-元模型的训练:参数估计。不是隐马尔可夫,可以直接估计,可以使用相对频率估计,这种时候最大似然估计(MLE)和相对频率估计是一样的。
那么这里描述一下是怎么训练和跑出结果的:
考虑语料库:
<bos> John read Moby Dick <eos>
<bos> Mary read a different book <eos>
<bos> She read a book by Cher <eos>
对于bin-gram,我们会计算
...
所以这样我们就训练好了。训练的结果就是一个一个条件概率库。
那么对于一个句子。我们来计算句子的概率:
比如John read a book
所以求解如下:
处理模型中可能碰到的问题:
(1). 计算句子概率的时候使用概率连乘,容易造成数字很小,应该扩张一下,可以使用对数概率。
(2). 自然语言处理中的数据是十分稀疏的,很有可能某个词是没有出现的。那么这样会导致句子概率=0,这个是不符合常理的。
考虑解决办法:增大数据量?
但是根据Zipf定律,增大数据量是解决不了问题的。(增加的仍然是高频词)
甚至有数据显示:用150万词的训练语料来训练三元模型。同样来源的测试语料中仍旧有23%的三元组是没有出现过的。
解决办法:平滑。
平滑方法:
Add_one平滑:规定每个n-元组比真实出现的次数多一次。
但是会出现两个问题:
- 不公平,“富人不公平”。
- 假设不公平。没有出现的元组都给了他相同的概率。
因为NLP中 很容易产生数据稀疏问题,所以平滑至关重要。之后另开一篇,讲各种平滑方法。
语言模型的评价-交叉熵。
针对X这个随机变量。(在n-gram当中就是n-元组的概率分布)那么会存在一个理想中的分布p(x).我们通过训练数据训练出来的是q(x)。那么怎么衡量,不同q(x)对p(x)更加接近呢?使用交叉熵。
具体的操作:
比如说一元组模型。我们通过训练数据训练出模型,对于每个词w我们有对应的概率输出。
那么使用测试数据对模型进行评估。
设测试数据为
那么我们可以计算出也就是
各种(注意了。有可能是相同的。)所以引入来表示测试数据中出现w的种类数目。
从而交叉熵有以下:
值得注意的是w是一个一元组。是T这个测试数据中w的不同种类数目。而上述的T中一共有个w。
那么接下来让我们考虑n-gram时候的模型评估。
引用上面的符号。、Type:。
考虑我们应该评估什么,因为通过训练,我们获得的是条件概率。因此理论上我们应该是对条件概率分布求交叉熵。也就是求
但是实际中求的时候使用的是
个人认为可以的原因是对于每个项都只差一个常数级别。