网络机器人吧社区

机器学习实战[49]---数据平滑

深南杂记 2019-02-10 14:10:02

  数据平滑这个词,最近在看文章时遇到了,感觉比较新鲜,就继续了解了一下,发现数据平滑也是一个很有历史的研究领域,在自然语言处理领域应用得相对比较多,这里简单记录一下:)

    数据平滑的产生和统计学习分不开。在统计学习中,往往会涉及到计算概率的问题,对于一个事物发生的可能性,具体点说就是一个词出现的可能性,我们是无法得到的。

以文本处理为例,现实世界中的文本那么多,你怎么可能统计出每一个文本的可能性,那么我们只有计算它的近似值,我们通过统计一个大的语料库中词出现的概率来近似它在真实世界中的概率,这种方法我们称作最大似然估计(MLE)。既然是估计,那么就会出现误差,因为我们的语料库是有限的,不能覆盖所有,而且会有倾斜,一些词在语料库中出现的可能性明显比真实世界小很多,这是显而易见的,对于一些未出现的词或者稀有的词,特别是未出现的词,我们不能说他的概率为0,这么做太不合理了,只能说概率很低。大家知道在n元语言模型中,我们算一句话总体的概率,并不能因为某一个词的概率为0,整体就为0了,所有我们要给那些未出现的情况给点概率,但是此时我们要保证所有情况的总体概率为1。怎么办呢?

    这里引出了数据平滑的基本思想:“劫富济贫”,也就是说把语料库中已有的那些情况的概率减去一部分然后分给语料库中未出现的情况

这又引出了几个问题:劫谁、怎么劫,怎么济。下面就围绕这四个问题介绍下几种常见的数据平滑算法,最后在对比他们之间的优劣。

    其实撇开一些限制条件,大家看到怎样消除概率为0的未出现情况,最简单的想法就是加个1,让它不为0,不就行了,这就是最简单的加法平滑法,朴素贝叶斯在计算先验概率时就采用了这种做法。但是说句实话,虽然看似解决问题,但是不合理呀,在有些情况下效果也很差,这里就不深入讲了,下面讲些正统的做法。

    首先要提的是Gooding Turing算法,对于n元语法来说,它劫的是所有n元语法,怎么劫,劫多少?假若说一个n元语法出现的次数为r,那么它就按比例缩小次数r,公式这里就不说了。劫出来的概率怎么分?针对所有测试集中未出现的情况平均分。这里有同学该问了,分的时候是不是不太合理呀,并不是每个未出现的词真实的概率都一样呀,这就引出了下一个算法。

    Katz平滑算法,它的思路就是在劫的时候不是所有n元语法都劫,出现次数很多的n元语法可靠性很高,出现误差的可能性不大,但是出现次数少的n元语法则可能和现实世界差别有点大,所有针对出现次数大于5的n元语法,不打折扣。而对于小于5次的n元语法乘以一个折扣率d,然后分给未出现的情况。上面已经说了,在分概率的时候不能平均分,这里提出了一个思想,如果n元语法模型对应的n-1元语法模型出现的概率高,那么n元语法模型相应的概率也高,例如 I am cool 和 think i do。假如cool和do都是未出现,但是我们肯定认为I am cool这个3元语法模型的概率要比think i do高,因为I am出现的概率要高。这里就用了一个很重要的思想,利用低阶语言模型的概率来推算高阶的未出现的语言模型的概率,这个过程是可以迭代计算的,一直算到1元模型或者0元模型(概率为平均值)。这里会有同学想了,既然高阶模型的概率和低阶模型相关性很大,那么在计算已经出现的高阶模型概率时,我们是不是也可以考虑一下低阶模型的概率呢?想法很不错,这又引入了下一个算法。

    讲到这里,其实可以简单做一个小的分类:在计算语料库中出现过的n元模型时,如果不考虑低阶语言模型的概率,只针对未出现的n元模型采用低阶模型来计算,那么这就是上面的katz算法,称为后备模型,而如果都考虑的话,那就是插值模型。下面的Jelinek Mereer平滑算法和Witten Bell平滑算法就是插值模型,它的计算公式可以简单描述为(n元模型的平滑概率=m×n元模型的最大似然概率+(1-m)×(n-1)元模型的平滑概率),按比例进行分裂。具体怎么计算m,有很多方法,其中一个方法叫做留存插值法,就是一部分语料用来计算先验概率就是最大似然估计,剩余的用来训练参数m,评价的标准就是使留存数据的困惑度最小。

    Kneser-Ney是一种比较重要的平滑算法,也比较有意思,有原版的和修正的。原版的采用了后备模型,而修正的采用了插值模型。还记得两者的区别吗,就是后备模型在计算未出现的n元语法模型时才考虑低阶模型的概率。这里特别要讲一个怎么劫的问题,Kneser-Ney平滑算法是后备模型,它采用的是绝对减值法,就是对所有的出现的n元语法模型减去一个固定的次数D,然后在按照n-1元语法模型的概率分布分给未出现的n元语法模型。修正后的Kneser-Ney算法和上面的插值模型不同的是,它也才采用了绝对减值法,而上面的插值模型是没有减值的,只是按比例分出去了。但是修正后的算法采用的绝对减值法和原版的又不一样,不是都减去同样的量。而是按照n元语法出现的次数的不同分为1、2和大于等于3次,三种情况减去的量不同。

    到现在,主流的平滑算法都介绍一遍了。

    上面主要以文本处理为例来进行了介绍,其实数据平滑并不只限于自然语言处理领域,所有涉及到统计学习的领域,需要处理未出现情况和出现较少的情况,都可以采用数据平滑的思想来解决问题。

Copyright © 网络机器人吧社区@2017