深度学习-->NLP-->语言模型

从本篇博文开始总结 NLP 相关知识。

概率语言模型 (Statistical Language Model)

p(sentence)=p(w1,w2,..,wn)

sentenceLp(sentence)=1 (相加之和为1,非常重要)

例如:

  • 输入法: P (隔壁老王) > P (隔壁老张)
  • 机器翻译:
    I have a dream
    P (我有个梦想) > P (我有只梦想)
  • 语音识别:
    P (我向你汇报) > P (我象你汇报)

核心:所以语言模型一般指的是概率语言模型,通过分数来告诉机器怎么说人话。

N-gram 语言模型

Ngram 模型是语言模型里面最经典的模型之一。

计算 p(w1,w2,...,wn)
利用链式法则:

p(A,B,C)=p(A)p(B|A)p(C|A,B)

可得:

p(w1,w2,...,wn)=p(w1)p(w2|w1)...p(wn|w1,w2,...,wn1)

马尔可夫 (Markov) 假设:

  • “无记忆性”: 未来的事件,只取决于有限的历史。

基于马尔科夫假设计算 p(w5|w4,w3,w2,w1) ,有三种版本的结果。

unigram p(w5)

bigram p(w5|w4)

trigram p(w5|w4,w3)

我们以 bigram 为例,计算 p(w1,w2,...,wn)=p(w1|start)p(w2|w1)...p(wn|wn1)p(EOS|wn)

显然引入马尔科夫假设,会使得模型变得简单,参数个数减少。

这里写图片描述

语言模型的评价

Perplexity

测试集的能力
语言模型 ⬆-> P(test set) ⬆ -> Perplexity(test set)

Wtest={w1,w2,...,wn;wiV}

Perplexity(Wtest)=21nNi=1log2q(wi)

q(wi) 表示模型对每个词的预测概率。

理解 Perplexity

这里写图片描述

  • log2p(vi) :如果用概率 p 来编码 vi ,需要多少比特。

  • |V|i=1p̂ (vi)log2q(vi) :表示 vi 服从 p q 来编码 vi 比特数的期望。

  • 21nNi=1log2q(wi) Wtest 的等效状态数目。

Perplexity 越小表示预测正确的概率越大。

OOV(Out of Vocab)

Trigram Model 为例:

p(wi|wi1,wi2)=count(wi2,wi1,wi)count(wi2,wi1)

这里写图片描述

那么有人可能要问:为什么上面公式成立?

这里写图片描述

下面我们以上面这个训练集为例,利用最大似然估计 的方法来证明上式成立。

max log(L(DTrain))=log(ip(wi|wi1,wi2))=ilog(p(wi|wi1,wi2))

=3log(p(|,))+log(p(|))+3log(p(|,))+log(p(|,))+log(p(|))+log(p(|))
+log(p(|))+log(p(|))

我们以首字符举例

约束条件:

p(|,)+p(|,)=1

由拉格朗日乘子法:

L=3log(p(|,))+log(p(|,))+lambda(p(|,)+p(|,)1)

L对参数的导数等于零:

dLd(p(|,))=0dLd(p(|,))=0dLd(lambda)=0

得:

3/p(|,)+lambda=0;

1/p(|,)+lambda=0;

p(|,)+p(|,)1=0

可计算得出:

P(|,)=33+1=count(,,)count(,,)+count(,,)

假设我们现在由训练集得出一个模型 p ,现在由模型给测试集中的”我 喜欢 王者荣耀”打分。

P (王者荣耀|我 喜欢) = 0 ( Training 中来没有出现的词)--> OOV(Out of Vocabulary)

按照上面的计算公式 P (王者荣耀|我 喜欢) = 0,显然不合理,训练集中没出现”王者荣耀”并不能代表就不喜欢?

同理:
P (编程|我 喜欢) = 0 ( Training 中没有出现的 trigram )–>Smoothing

那么如何解决 OOV 问题呢?

  1. 假设 Training Set 中出现了 |V| 个不同的词汇,那么我们根据词频选择词频最高的 |V| 个词汇作为我们的词汇集 V

  2. Training Testing 中,将不属于 V 的词汇都替换成特殊词汇 UNK

这里写图片描述

V= {我 喜欢 开车 上网 篮球 编程}
V= {我 喜欢 开车 上网 编程 }

P(耀|)=P(UNK|)=count(UNK)/count()=1/3=0.333

平滑方法

Training 中没有出现的 trigram ,就是在训练集中没出现这种组合。

共有以下几种方法解决:

  • +1 平滑
  • Backoff 回退法
  • Interpolate 插值法
  • Absolute Discount
  • KneserNey Smoothing
  • Modified KneserNey Smoothing (最优的方法)

+1 平滑

这里写图片描述

该平滑方法在别的分类问题中可能有用,但是在语言模型中表现一般,基本上不用。

Backoff 回退法

这里写图片描述

Count (我 喜欢 编程) = 0,但是 count (喜欢 编程) > 0

使用 Trigram 如果 count(trigram) 不满足条件,则使用 Bigram ;再否则使用 Unigram ;

因为之前已经解决了 OOV 问题,所以 Unigram 不可能为0。

Interpolate 插值法

Trigram,Bigram,Unigram 线性组合起来:

这里写图片描述

这里面的参数如何得出?同理使用极大似然估计得:

这里写图片描述

log 里面只有几个参数的和求导之后,各个参数耦合在一起。EM 算法 来解决。

更进一步:

这里写图片描述

根据不同的上下文,选择不同的参数。显然这样处理 Perplexity 变小, 

Absolute Discounting “绝对折扣”

这里写图片描述

wi1in+1 表示 win+1 wi1 n_gram 。显然由公式可知在这种平滑方法中,计算结果和 Pabs(wi|wi1in+2) 有很大关系。

Kneser-Ney Smoothing

这里写图片描述

有钱的,每个人固定的税 D, 建立一个基金;没钱的,根据 n1_gram 的“交际广泛”的程度来分了这个基金。

Modified Kneser-Ney Smoothing

这里写图片描述

有钱的,每个人根据自己的收入交不同的税D, 类似于阶梯税,建立一个基金;没钱的,根据 n1_gram “交际广泛”的程度来分了这个基金。

总结

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mr_tyting/article/details/78218096