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可以让数据稀疏度有效的降低,所有词的概率估计会看起来很平滑。

  • 相关阅读:
    docker容器安装使用
    hashMap学习
    spark运行方式及其常用参数
    java面试题基础
    大数据面试题
    java面试题
    Java四种线程池
    大数据
    pyspark 日期格式
    CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp.
  • 原文地址:https://www.cnblogs.com/yhzhou/p/13325449.html
Copyright © 2011-2022 走看看