深度学习-->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),有三种版本的结果。

unigramp(w5)

bigramp(w5|w4)

trigramp(w5|w4,w3)

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

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

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

语言模型的评价

Perplexity

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

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

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

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

理解Perplexity

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

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

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

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

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

OOV(Out of Vocab)

Trigram Model 为例:

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

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

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

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

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

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. TrainingTesting 中,将不属于V 的词汇都替换成特殊词汇UNK

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

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 平滑

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

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

Backoff 回退法

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

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

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

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

Interpolate 插值法

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

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

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

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

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

更进一步:

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

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

Absolute Discounting “绝对折扣”

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

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

Kneser-Ney Smoothing

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

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

Modified Kneser-Ney Smoothing

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

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

总结

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