平滑技术:
(1)把在训练语料中出现过的n元组的概率减少。
(2)把减少的概率质量分配给训练语料中没有出现的n元组。
根据平滑技术是否是组合使用的分为两类:简单平滑和组合平滑。
一. 简单平滑:
- 加法平滑
- 留存平滑
- Good Turing平滑
二. 组合平滑:
- 插值平滑
- 回退平滑
(1)加法平滑:
说白了就是让所有n元组的出现次数+k。在这个基础上来进行训练计算。
这个简单的平滑会引出两个问题:
1:是否存在“富人不公平”。
2:对于没有出现过的n元组给予均值的概率值是不是不合理。
(2)留存平滑:
通过把训练语料分成两个部分:训练语料 和 留存语料。通过留存语料内的数据分布来改善训练语料估计出来的值。
定义:
那么
而是 在训练语料中出现了r次的n元组在留存语料中出现的概率。
让前面这个概率均分给出现r次的n元组们。
这个就好像是训练好了之后做了一次预测一样。把预测的当做了答案。
(3)删除平滑:
留存平滑要求数据量很多,但是数据量往往是不够的。所以可以使用删除平滑。
其实就是两次留存,交叉验证。
将训练数据分成part0和part1
两次分别将不同的part设置为训练语料和留存语料。
之后
(4)Good Turing 平滑
定义:
普通Turing平滑有一个原则:
将平滑前出现r+1次的n元组的频率质量都给平滑后出现r次的n元组。
从频次的角度出发就是r+1次的n元组的总出现次数都给r次的n元组。
那么这样
并且每个r次的n元组可以获得以下的频率质量
但是这样会出现问题,也就是在之前出现m次的n元组如果没有的话。那么平滑后m-1次的n元组也会为0。
而图灵的学生Good就解决了这个问题:
他提出的是对使用一个估计。(好像多项式插值一样,对函数进行模拟,近似,把没有的值给填充起来。这样就不会为0了,而且结果也不会很偏离现实。)
通过研究函数可以发现比较好的函数是
并且研究 和 r的关系(r>1)
也就是对于真实和我们平滑后的并且是被拿出概率质量的那部分。明显,而也就是所谓的折扣率。
可以发现的是r越大,越可靠,折扣率越小。
综合上述两种平滑,可以给出以下策略:
---低频段(r比较小的时候)一般不会出现中断()所以使用Turing平滑。高频段使用Good-Turing。
具体地:
使用 Turing估计值方差:
当这个值>1.65*1.65的时候就差异比较大了。
最后要概率归一(保持那些平滑前没有出现的n元组的概率质量):
(二)组合平滑:
上面的后面的简单平滑一般缓和了“富人不公平”的问题,但是针对没有出现过的n元组的概率还是给与均一的概率。那么如何解决这个问题?
主要的思想是用小规模1...n-1-gram的概率来启发分配。
(1)插值平滑:把不同阶-gram线性组合。
- 简单插值平滑
可以人工设置或者学习而来,是固定的。
2.Jelinek-Mercer平滑:
固定明显是不合理的。(高阶模型如果可靠的时候应该变大)。
从而有以下:
注意
所以是递归式的。
终止:
- 平滑后的一元模型。
- 0元模型,均匀分布的。
问题:如何求? 通过学习,但是参数太多了怎么办?聚集一下。把出现频率差不多的弄成一个类,这个类的都是一个值。
???
根据修正的频次进行区间分类:
???
(2)回退模型:
高阶可以的时候用高阶,不然就用低阶。
Katz平滑:
引入折扣率,来对存在的进行减少。
多出来的概率质量,用低阶的概率分布来分配。
折扣率的设置通过图灵估计列出两个方程来求解。绝对减值法:
引入固定扣除值,低阶的平滑后(和上面的Katz不一样,这个是递归型的)的概率来启发分配。Kneser-Ney平滑(KN平滑)是现在最好的平滑。
考虑一个问题:
有一个专有名词:San Fracisco 。并且这个词汇在文中出现的次数很多很多。
那么对于一个问题:
I can't see without my reading _____
理论上是glasses但是因为Fracisco出现的次数很多。
从而用绝对减值的时候
前部分概率为0.但是后部分概率是大的。
而很可能文中出现没有几次。并且也很少,这样就有问题了。
???
会造成问题:
???
所以要按照的前驱词的种类数量来分配概率质量:
引入 接续概率:
从而获得以下:
最后还有一个修正的。不是很懂。