机器学习基础(3)- 数据平滑

作者: 蘑菇轰炸机 | 来源:发表于2019-06-07 22:25 被阅读33次

    本文主要用于理解数据平滑的原理,并且重点介绍了几种数据平滑的方法~

    基本目录如下:

    1. 数据平滑的本质理解
      1.1 为什么需要数据平滑?

    2. 数据平滑的方法
      2.1 加法平滑方法
      2.2 Good-Turing估计法
      2.3 Katz平滑方法

    ------------------第一菇 - 数据平滑的本质理解------------------

    1.1 为什么需要数据平滑?

    在传统AI领域,数据的平滑处理一般都是数据的预处理阶段的核心步骤。简单来说,平滑的本质就是用来解决零概率问题的。这里,以自然语言处理中的语言模型为例,进行展开理解。

    当我们构建一个Bi-Gram的语言模型的时候,假设我们的语料库为(参考《统计自然语言处理》第5章):

    (“ BROWN READ HOLY BIBLE”,
    “ MARK READ A TEXT BOOK”,
    “HE READ A BOOK BY DAVID”)

    则此时对于句子“BROWN READ A BOOK”,我们可以利用最大似然的方法估计该句子的概率为,

    p(S) = p(BROWN | <BOS>) * P(READ | BROWN) * P(A | READ) * P(BOOK | A) * P(<EOS> | BOOK)
    根据上述语料库,我们可以计算得到,

    p(S) = \frac{1}{3} * \frac{1}{1} * \frac{2}{3} * \frac{1}{2} * \frac{1}{2} \approx 0.06

    但如果我们对于一个句子“BROWN READ A PAPER”,我们同样可以利用上述的思路去计算,但是显然,训练语料库中,没有一句话是以PAPER结尾的,那也就会造成该句的概率为,

    p(S) = \frac{1}{3} * \frac{1}{1} * \frac{2}{3} * \frac{1}{2} * 0 = 0
    但这显然不是我们希望看到的,因为,PAPER这个词作为结尾确实在训练语料库中模型没有见到,但并不代表这句话的概率就应该是0,或者说,由于连乘的缘故,凡是有一种情况不符合语料库,那我们都会得到概率为0的情况,这其实是我们在训练模型的时候不希望看到的事情(在其他自然语言处理任务中也会频繁出现这样的问题),因此,我们必须分配给可能出现的情况一个非0的概率值来规避这种错误的发生。

    而本文所要介绍的平滑就是用来解决这类零概率问题的。其本质核心就是“劫富济贫”,即提高低概率,降低高概率,尽量使概率分布趋于均匀。

    ------------------第一菇 - 数据平滑的方法------------------
    数据平滑由于其重要性,也是学界的重点研究方向。本文接下来就重点介绍一些方法。

    2.1 加法平滑方法

    在上述语言模型利用最大似然的思想来计算条件概率的时候,我们可以总结出计算公式即为,

    P_{MLE}(w_i | w_{i-1}) = \frac{c(w_{i-1}, w_i)}{c(w_i)}
    而对于加法平滑方法,其本质思想很简单,就是假设每个二元语法出现的次数都比实际语料库中出现的次数多k次,其中当k=1的时候,我们又称为加一平滑或是拉普拉斯平滑,则上式就会改进为,

    P_{add}(w_i | w_{i-1}) = \frac{k + c(w_{i-1}, w_i)}{k*|V| + c(w_i)}
    其中|V|就是词库的大小。该平滑方法比较容易理解,也比较简单,但其实际的使用效果还要依使用场景而看。

    2.2 古德-图灵估计法

    该种平滑方法是由I.J.Good引用图灵(Turing)的方法提出来的。在介绍这个方法之前,首先介绍一个概念N_c,出现c次的单词的个数。

    举个例子:Sam I am I am Sam I do not eat。我们可以统计出单词出现的个数为:
    Sam - 2次
    I - 3次
    am - 2次
    do - 1次
    not - 1次
    eat - 1次
    那么我们可以统计出,
    N_3 = 1 即出现3次的单词有1个
    N_2 = 2 即出现2次的单词有2个
    N_1 = 3 即出现1次的单词有3个

    介绍完了上面这个例子,我们再来介绍Good-Turning平滑方法。这里需要分两种情况来讨论,
    1)对于没有出现过的单词,其计算方法为:
    P_{GT} = \frac{N_1}{N}
    2)对于已经出现过的单词,其计算方法为:
    P_{GT} = \frac{(c + 1)N_{c+1}}{N_c * N}

    这里将继续举例为大家解释。假设我们正在钓鱼,而且已经抓到来18只鱼,其中10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼。
    那么再试问下一条钓上来草鱼的概率为多少?此时草鱼为当前出现过的鱼,统计出出现次数为1的鱼有3种,出现次数为2的鱼有1种,则利用上述公式可计算得出,
    P_{GT}(草鱼) = \frac{(1 + 1) * 1}{3*18} = \frac{1}{27}

    那么再试问下一条钓上来飞鱼的概率为多少?此时飞鱼为当前未出现过的鱼,统计出出现次数为1的鱼有3种,则利用上述公式可计算得出,
    P_{GT}(飞鱼) = \frac{3}{18} = \frac{1}{6}

    因此,我们可以看出,如果是MLE的思想,则显然草鱼的概率为\frac{1}{18}而飞鱼的概率为0。因为对于一般的情况(之前出现过的事件),我们可以看到,
    P_{GT} < P_{MLE}
    这也符合预期,因为,该种平滑方法正是有\frac{N_1}{N}的概率剩余量用于分配给了之前没有发生过的情况。

    为了加深大家的理解,这边我再多贴一张图,用以表示在构建语言模型的时候统计出来的一张表格,

    语言模型统计表格.png

    这里其实就是统计了一份训练数据的结果,我们可以清晰看到大部分的单词其实是没有出现在训练语料之中的(7,514,941,065)的,而如果将这些统统置为0显然是不合理的,因此利用上述古德-图灵的平滑方法,我们可以看到调整后的预期的count还是比较符合预期的(与后一列的测试数据基本出入不大)。

    当然整个古德-图灵的方法并不是完美的,其最大的缺点就是,如果我的N_{c+1}为0咋办?就比如计算上式的N_{21}为0,则我们的N_{20}计算就会有问题。因此,当实际的应用场景中碰到这样的情况时,我们一般会采用另一种曲线平滑(比如机器学习算法去拟合)的方法,来弥补上缺陷值,然后再通过古德-图灵的方法去继续数据处理的工作。

    2.3 Katz平滑方法

    这种方法其本质是一种后备的平滑方法。其基本的思路就是当事件在样本中出现的频次大于某一数值k的时候,运用最大似然估计方法,通过减值来估计其概率值,而当事件的频次小于k的时候,使用低阶的语法模型作为代替高阶语法模型的后备,但这种代替受归一化因子的约束【1】。简单来讲,该方法仍是古德-图灵方法的延伸,其本质思想依然是将一部分的概率剩余量分配给未知事件,但与上一种平均分配的思想不同,该方法认为我们可以通过低阶的模型(语言模型里面就由2阶降为1阶等)来近似拟合每一个未知事件的权重,从而重新分配概率剩余量。具体的数学公式理解本文将不作展开,而与之相关的平滑方法还包括比如Kneser-Ney, Witten-Bell等。有兴趣的同学可以翻阅宗成庆老师的《统计自然语言处理》一书,来仔细研读。

    简单总结一下本文,先是讲述了一些数据平滑处理的背景,帮助大家理解认识到数据平滑的必要性。随后,又附上了多种现今流行的数据处理的平滑方法。希望大家读完本文后对机器学习中的数据平滑处理这一块有全新的认识。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁

    参考文献:
    【1】《统计自然语言处理-第五章》

    相关文章

      网友评论

        本文标题:机器学习基础(3)- 数据平滑

        本文链接:https://www.haomeiwen.com/subject/zgnxaqtx.html