美文网首页
n元模型

n元模型

作者: Milkmilkmilk | 来源:发表于2018-10-12 16:24 被阅读0次

    区分好 语言建模 和 语言模型。
    理解好 直接预测P(w_1,w_2,w_3,...,w_l)的问题:
    (1). 数据量需要庞大(为什么?)
    (2). 计算量庞大。
    如何解决这个问题?
    (1). 条件概率链式法则
    (2). 马尔可夫假设
    理解n元模型的计算量。
    理解n不同的时候的不同情况。
    (1). n大的时候:
    -有更多的语境信息。
    -计算量大,数据量要求大,计算出来的概率结果不可靠。
    (2). n小的时候:
    -比较少的语境信息。
    -计算量小,数据量要求小,计算出来的概率结果可靠。

    n-元模型的训练:参数估计。不是隐马尔可夫,可以直接估计,可以使用相对频率估计,这种时候最大似然估计(MLE)和相对频率估计是一样的。

    那么这里描述一下是怎么训练和跑出结果的:
    考虑语料库:
    <bos> John read Moby Dick <eos>
    <bos> Mary read a different book <eos>
    <bos> She read a book by Cher <eos>
    对于bin-gram,我们会计算
    P(John|<bos>) = \frac{c(<bos>John)}{c(<bos>)} = \frac{1}{3}
    P(book|a) = \frac{c(a book)}{a}
    ...
    所以这样我们就训练好了。训练的结果就是一个一个条件概率库。
    那么对于一个句子。我们来计算句子的概率:
    比如John read a book
    所以求解如下:
    P(John read a book) = P(John|<bos>)*P(read|John)*P(a|read)*P(book|a)*P(<eos>|book)

    处理模型中可能碰到的问题:
    (1). 计算句子概率的时候使用概率连乘,容易造成数字很小,应该扩张一下,可以使用对数概率。
    (2). 自然语言处理中的数据是十分稀疏的,很有可能某个词是没有出现的。那么这样会导致句子概率=0,这个是不符合常理的。

    考虑解决办法:增大数据量?
    但是根据Zipf定律,增大数据量是解决不了问题的。(增加的仍然是高频词)
    甚至有数据显示:用150万词的训练语料来训练三元模型。同样来源的测试语料中仍旧有23%的三元组是没有出现过的。

    解决办法:平滑。

    平滑方法:
    Add_one平滑:规定每个n-元组比真实出现的次数多一次。

    但是会出现两个问题:

    1. 不公平,“富人不公平”。
    2. 假设不公平。没有出现的元组都给了他相同的概率。

    因为NLP中 很容易产生数据稀疏问题,所以平滑至关重要。之后另开一篇,讲各种平滑方法。

    语言模型的评价-交叉熵。
    针对X这个随机变量。(在n-gram当中就是n-元组的概率分布)那么会存在一个理想中的分布p(x).我们通过训练数据训练出来的是q(x)。那么怎么衡量,不同q(x)对p(x)更加接近呢?使用交叉熵。
    H(X,q) = -\sum_{x\epsilon X}p(x)log q(x)
    具体的操作:
    比如说一元组模型。我们通过训练数据训练出模型,对于每个词w我们有对应的概率输出。
    那么使用测试数据对模型进行评估。
    设测试数据为T = w_1w_2w_3...w_{N^T}
    那么我们可以计算出p(x)也就是
    各种p(w)(注意了。w_1,w_2...,w_n有可能是相同的。)所以引入V_T来表示测试数据中出现w的种类数目。
    从而交叉熵有以下:
    p(w) = \frac{c(w)}{N^T}
    \begin{equation} \begin{aligned} H(T,q)& = -\sum_{w\epsilon V_T} p(w)log q(w)\\ &=-\frac{1}{N^T}\sum_{w\epsilon V_T}c(w)*log q(w)\\ &=-\frac{1}{N^T}\sum_{w\epsilon T} log q(w)\\ &=-\frac{1}{N^T}log\prod_{w\epsilon T} q(w)\\ &=-\frac{1}{N^T}log q(T)\\ \end{aligned} \end{equation}
    值得注意的是w是一个一元组。V_T是T这个测试数据中w的不同种类数目。而上述的T中一共有N^T个w。

    那么接下来让我们考虑n-gram时候的模型评估。
    引用上面的符号。T = w_1w_2w_3...w_{N^T}、Type:V_T
    考虑我们应该评估什么,因为通过训练,我们获得的是条件概率p(w_i|w_{i-n+1}...w_{i-2}w_{i-1})。因此理论上我们应该是对条件概率分布求交叉熵。也就是求
    p(w_n|w_1w_2...w_{n-1}) = \frac{c(w_1w_2...w_n)}{c(w_1w_2...w_{n-1})}
    H(X,q) = \sum_{w_1w_2w_3...w_n\epsilon V_T}p(w_n|w_1w_2...w_{n-1})*logq(w_n|w_1w_2...w_{n-1})
    但是实际中求的时候使用的是
    p(w_1w_2...w_{n-1}w_{n}) = \frac{c(w_1w_2...w_n)}{N^T}
    \begin{equation} \begin{aligned} H(X,q) &= -\sum_{w_1w_2w_3...w_n\epsilon V_T}p(w_1w_2...w_{n-1}w_{n})*logq(w_n|w_1w_2...w_{n-1})\\ &=-\frac{1}{N^T}\sum_{w_1w_2w_3...w_n\epsilon V_T}c(w_1w_2...w_{n-1}w_{n})*logq(w_n|w_1w_2...w_{n-1})\\ &=-\frac{1}{N^T}\sum_{w_1w_2w_3...w_n\epsilon T}logq(w_n|w_1w_2...w_{n-1})\\ &=-\frac{1}{N^T}logq(T)\\ \end{aligned} \end{equation}
    个人认为可以的原因是对于每个项都只差一个常数级别。

    相关文章

      网友评论

          本文标题:n元模型

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