美文网首页
【笔记】漫谈Language Model

【笔记】漫谈Language Model

作者: 神游物外的轮子 | 来源:发表于2019-07-26 15:28 被阅读0次

    前言

    本文是阅读专题漫谈 Language Model觉得很有帮助,记录阅读中的思考和困惑,整理为笔记。

    语言模型

    语言模型的作用,通俗的说法是 判断一句话多么像人话
    语言模型是一个概率分布模型P,对由基础单元(可以是单词、字符串等等)组成的序列S(=\omega_1\omega_2...\omega_n,其中\omega_i为第i个基础单元)给出一个概率P(S),使用条件概率形式进行分解:
    \begin{align} P(S) &= P(\omega_1\omega_2...\omega_n) \\ &= P(\omega_n | \omega_1\omega_2...\omega_{n-1}) P(\omega_1\omega_2...\omega_{n-1}) \\ &= P(\omega_1)\prod_{i=2}^{n}P(\omega_i | \omega_1\omega_2...\omega_{ i-1}) \end{align}

    上下文长度导致复杂度增长,解决方案:

    1. 朴素贝叶斯 不考虑上下文,只看单词的概率P(S)=\prod_{i=1}^nP(\omega_i)
    2. Ngram 假设长度为n的上下文有关联,常用n=3
      P(S)=P(\omega_1)P(\omega_2 | \omega_1)P(\omega_3 | \omega_1\omega_2)...P(\omega_n | \omega_{n-1}\omega_{n-2})

    存在的问题

    1. 语言模型的条件概率部分使用连乘形式,会导致浮点数下溢。为了避免由概率值精度导致的小数位问题,将连乘转为log形式:
      \begin{aligned} logP(S) &= log P(\omega_1\omega_2...\omega_n) \\ &= log \prod_{i=1}^nP(\omega_i) \\ &= \sum_{i=1}^n log P(\omega_i) \end{aligned}
    2. 概率为0导致的连乘失效
      对于没有出现过的单词,通过频率极大似然估计出的概率值为0,使得连乘结果为0,使其他有意义的上下文因素失效。
      常用的方法是Smoothing
      1. 最简单的做法就是所有单词频次+1,但是效果一般不佳:
        P(\omega_i) = \frac{N_{\omega_i} + 1}{N + | W |}
        其中N_{\omega_i}为单词\omega_i的出现频次,满足N=\sum_{i=1}^{n}N_{\omega_i}| W |是单词的总数
      2. Katz Smoothing(back-off)
        降维打击:用短序列概率估计长序列的概率
        举例来说如果trigram未出现过,回退为bigram,如果还是没有,回退到unigram进行计算
        \begin{aligned} P_{Katz}(\omega_3 | \omega_1 \omega_2) = \begin{cases} d_rP_{ML}(\omega_3 | \omega_1 \omega_2) &if \; C(\omega_1 \omega_2 \omega_3)>0\\ \alpha(\omega_1 \omega_2) P_{Katz}(\omega_3 | \omega_2) &if\; C( \omega_1 \omega_2\omega_3)=0 \end{cases} \end{aligned}
        其中C(\omega_1 \omega_2\omega_3)代表训练集中\omega_1 \omega_2\omega_3出现的频次,d_r代表折扣系数[1][2]\alpha(\omega_1 \omega_2)是回退系数

        折扣系数d_r 为分配概率给未出现的\omega_1 \omega_2\omega_3,则原概率需要打折扣,一般的做法是:
        1.不修改出现次数r较多的频率 ,订一个频率的threshold;
        2. 出现次数较少的情况,令d_r=\frac{(r+1)n_{r+1}}{rn_r}
        回退系数\alpha(\omega_1 \omega_2)
        Step1 所有条件为\omega_1\omega_2的概率总和为1
        Step2 转化为P_{Katz}形式
        \begin{aligned} 1 &= \sum_{C>0}P_{Katz}(\omega_i|\omega_1\omega_2) + \sum_{C=0}P_{Katz}(\omega_i|\omega_1\omega_2) \\ &= \sum_{C>0}d_rP_{ML}(\omega_i|\omega_1\omega_2) + \sum_{C=0}\alpha(\omega_1\omega_2)P_{Katz}(\omega_i|\omega_2) \\ & \end{aligned}
        Step3 将\alpha(\omega_1\omega_2)提到等号左边
        Step4 所有条件为\omega_2的条件概率总和为1,类似Step1
        \begin{aligned} \alpha(\omega_1\omega_2) &= \frac{1- \sum_{C>0}d_rP_{ML}(\omega_i|\omega_1\omega_2) }{\sum_{C=0}P_{Katz}(\omega_i|\omega_2)} \\ &=\frac{1- \sum_{C>0}d_rP_{ML}(\omega_i|\omega_1\omega_2) }{1-\sum_{C>0}P_{Katz}(\omega_i|\omega_2)} \end{aligned}

    修剪

    目的:减小模型

    基于相对熵的修剪方法[3]

    相对熵 概率分布的差异
    D_{KL}(P || Q)=\sum_iP(i)log\frac{P(i)}{Q(i)}
    修剪方法 对每一个ngram进行修剪,选取相对熵最小的ngram进行修剪。假设修剪操作对概率分布的影响相互独立(PS:感觉不太可能),则可以直接把相对熵低于threshold的全部删除

    举例:三元ngram中删除\omega_l\omega_{l+1}\omega_{l+2}

    符号定义 \omega^{*}\omega_{l+2}h表示上下文\omega_l\omega_{l+1}h'表示回退过的上下文\omega_{l+1}

    1. \omega_l\omega_{l+1}\omega_{l+2}本身的概率计算方法,需要改为回退形式P(\omega_l\omega_{l+1}\omega_{l+2})=\alpha'(\omega_l\omega_{l+1})P(\omega_{l+1}\omega_{l+2}),其余出现过的三元概率不受影响;
    2. 使用\alpha(\omega_1\omega_2)计算回退之后概率的其他三元单词会受到影响,因为计算\alpha(\omega_1\omega_2)中纳入了P(\omega_1\omega_2\omega_3),删去\omega_1\omega_2\omega_3需要重新计算:
      \alpha(\omega_1\omega_2) = \frac{1-\sum_{C>0}P(\omega_i | \omega_1\omega_2)}{1-\sum_{C>0}P(\omega_i | \omega_2)}
      只需在分子和分母的累加中删去这一项即可计算出新的\alpha'(\omega_1\omega_2)
    3. 相对熵的计算
      Step1 取自[3]
      Step2 除h以外其他历史的概率不受影响
      Step3 将\omega_l\omega_{l+1}\omega_{l+2}和未出现过的三元词提出来,其他词由于不受影响可以忽略
      Step4 将条件概率P(\omega^{*} ,h)拆解为P(h)P(\omega^{*} | h),将P'(\omega^{*} | h)使用回退方法计算出来\alpha'(h)P(\omega^{*} | h')
      \begin{align} D_{KL}(P || P') &= -\sum_{i,j}P(\omega_i,h_j)[logP'(\omega_i | h_j) - logP(\omega_i | h_j)] \\ &= -\sum_{i}P(\omega_i,h)[logP'(\omega_i | h) - logP(\omega_i | h )] \\ &= -P(\omega^{*} ,h )[logP'(\omega^{*} | h) - logP(\omega^{*} | h )] -\sum_{C=0}P(\omega_i,h)[logP'(\omega_i | h) - logP(\omega_i | h )] \\ &= -P(h)P(\omega^{*} | h) [log\;\alpha'(h) + logP(\omega^{*} | h') - logP(\omega^{*} | h )] -P(h)[log\; \alpha'(h) - log\;\alpha(h )]\sum_{C=0}P(\omega_i | h) \\ \end{align}

    参考文献


    1. Good-Turing frequency estimation

    2. Chen S F, Goodman J. An empirical study of smoothing techniques for language modeling[J]. Computer Speech & Language, 1999, 13(4): 359-394.

    3. Stolcke A. Entropy-based pruning of backoff language models[J]. arXiv preprint cs/0006025, 2000.

    相关文章

      网友评论

          本文标题:【笔记】漫谈Language Model

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