zoukankan      html  css  js  c++  java
  • 语言模型 Language Model (LM)

    定义

    什么是语言模型,通俗的讲就是从语法上判断一句话是否通顺。即判断如下的概率成立:

    [p( ext{今天是周末})>p( ext{周末是今天}) ]

    链式法则(chain rule)

    [p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2)...p(w_n|w_1,w_2,...,w_{n-1}) ]

    Markov assumption

    Markov assumption(first order)

    [p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)...p(w_n|w_{n-1})=p(w_1)prod_{i=2}^{n}p(w_i|w_{i-1}) ]

    Markov assumption(second order)

    [p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2)...p(w_n|w_{n-2},w_{n-1})=p(w_1)p(w_2|w_1)prod_{i=3}^{n}p(w_i|w_{i-2},w_{i-1}) ]

    N-gram语言模型

    我们基于上述的Markov assumption将n=1、n=2、n=3等模型进行说明

    Unigram

    n=1的情况下,是相对于first order markov assumption情况更简单的语言模型,其假设各个词之间时相互独立的,如下示:

    [p(w_1,w_2,...,w_n)=p(w_1)=p(w_1)p(w_2)...p(w_n) ]

    Bigram

    n=2的情况下,即是Bigram语言模型,其来源于first order markov assumption,其考虑了词与词之间的先后顺序,如下所示:

    [p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)...p(w_n|w_{n-1})=p(w_1)prod_{i=2}^{n}p(w_i|w_{i-1}) ]

    trigram

    n=3的情况下,即是Trigram语言模型,其来源于second order markov assumption,其考虑了当前词与其前面两个词的先后顺序关系,如下所示:

    [p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2)...p(w_n|w_{n-2},w_{n-1})=p(w_1)p(w_2|w_1)prod_{i=3}^{n}p(w_i|w_{i-2},w_{i-1}) ]

    基于上述情况,常用的也就是Bigram,Trigram相对计算复杂结果更准确,n>3的情况下目前相对较少。

    如何训练语言模型

    上述我们说明了n=1、2、3等情况下的语言模型,那如何训练计算中的各个单词的概率值呢?
    一般情况下,我们是通过给定的训练语料经过分词后,统计各个词出现的频率(或者条件频率)进行计算的,即在Unigram语言模型中,我们计算单个词的概率,是拿该词出现的次数除以整个训练语料中词的个数;在Bigram语言模型中,计算 (p(w_i|w_{i-1})) 的值,则需要先计算 (w_{i-1}) 这个词出现的次数 (C(w_{i-1})) ,而后计算 (w_{i-1}) 词后出现 (w_i) 这个词的数目 (C(w_i|w_{i-1})) ,则

    [p(w_i|w_{i-1})=C(w_i|w_{i-1}) / C(w_{i-1}) ]

    Trigram的计算过程和上述基本一致,这里不再进行说明。

    如何评估语言模型

    perplexity

    基本思想是,给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好。表达式为:

    [pp(s)=2^{-frac{1}{N}sum logp(w_i)} ]

    上式中 (logp(w_i)) 是我们在测试集中计算各个单词的概率,比如Unigram即是单个词的概率,Bigram即是 (p(w_i|w_{i-1})) 的概率,依次类推。

    smoothing

    在计算各个概率的过程中,受限于语料集的问题,并不能涵盖所有的词,如果不做smoothing平滑的话,会导致某些词的概率为0,这种情况下不管其他词概率为多少,计算的结果均为0,这种情况违背了我们的初衷。解决此问题的方式是增加平滑项。

    • Add-one smoothing
    • Add-k smoothing
    • Interpolation
    • Good-turning smoothing
    Add-one smoothing

    计算公式如下所示:

    [P_{Add-1}(w_i|w_{i-1})=frac{C(w_i|w_{i-1})+1}{C(w_{i-1})+V} ]

    其中V是词库大小

    Add-k smoothing

    计算公式如下所示:

    [P_{Add-k}(w_i|w_{i-1})=frac{C(w_i|w_{i-1})+k}{C(w_{i-1})+k*V} ]

    Interpolation

    Interpolation综合Unigram、Bigram、Thrigram等方法进行平滑

    [p(w_n|w_{n-1},w_{n-2})=lambda_1 p(w_n|w_{n-1},w_{n-2})+lambda_2 p(w_n|w_{n-1})+lambda_3 p(w_n) ]

    其中 (lambda_1 + lambda_2 + lambda_3 = 1)

    Good-turning smoothing

    其主要思想是从概率的总量中分配少量的比例给零概率项。
    假定给定的语料库中出现(r) 次数的词有 (N_r) 个,则有

    [N = sum_{i=1}^{infty }rN_r ]

    (r) 较小时,我们使用 (d_r) 代替 (r) ,这里 (d_r < r)(d_r) 的值可有下式表示

    [d_r = ( r+1 )N_{r+1}/N_r ]

    其期望可以表示为

    [hat{ heta }left ( r ight )=frac{1}{N}left (r+1 ight )frac{N_{r+1}}{N_r} ]

    其中(N) 为现有语料库中所有单词频数的总和,这样可以保证

    [N = sum_{r}^{ }d_rN_r ]

    一般情况下,发生次数为(r) 的词个数大于发生次数为 (r) +1的词个数, (r) 越大,词的数量 (N_r) 越小。通过Good-turning smooth可以让数据稀疏度有效的降低,所有词的概率估计会看起来很平滑。

  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/yhzhou/p/13325449.html
Copyright © 2011-2022 走看看