语言模型是计算一个句子符合语法语义的概率的模型,属于无监督学习方法。如下例子中第一个是正确的句子,而第二个却不是。
1、自然语言处理是人工智能技术中的一个领域: 合法句子概率:0.99
2、子然预言出礼的人工智能技术方面一个: 合法句子概率:0.01
语言模型分类主要有两种:其一是基于专家语法规则的语言模型,比如形容词后面接名词,副词后面接动词等等;其二是基于概率统计学的语言模型;使用概率论表示为: P ( s ) = P ( w 1 , w 2 , . . . w n ) P(s)=P(w_{1},w_{2},...w_{n}) P(s)=P(w1,w2,...wn) 表示由 n n n 个单词组成的句子 s s s 符合语法语义的概率。根据下面公式可得,句子正确的概率等于从句子第一个单词开始依次计算第一个单词 w 1 w_{1} w1 的概率 P ( w 1 ) P(w_{1}) P(w1)、 w 1 w_{1} w1 条件下 w 2 w_{2} w2 的概率 P ( w 2 ∣ P ( w 1 ) ) P(w_{2}|P(w_{1})) P(w2∣P(w1)) 、以及前 n − 1 n-1 n−1 个词确定条件下第 n n n 个词的概率 P ( w n ∣ w 1 w 2 w 3 . . . w n − 1 ) P(w_{n}|w_{1}w_{2}w_{3}...w_{n-1}) P(wn∣w1w2w3...wn−1),最后句子的概率为上述各个概率之积。
P ( s ) = P ( w 1 , w 2 , . . . w n ) = P ( w 1 ) ⋅ P ( w 2 ∣ P ( w 1 ) ) ⋅ P ( w 3 ∣ w 1 w 2 ) . . . P ( w n ∣ w 1 w 2 w 3 . . . w n − 1 ) (1) P(s)=P(w_{1},w_{2},...w_{n})=P(w_{1}){}\cdot P(w_{2}|P(w_{1}))\cdot P(w_{3}|w_{1}w_{2}) ... P(w_{n}|w_{1}w_{2}w_{3}...w_{n-1}) \tag{1} P(s)=P(w1,w2,...wn)=P(w1)⋅P(w2∣P(w1))⋅P(w3∣w1w2)...P(wn∣w1w2w3...wn−1)(1)
那么问题来了,上面的各种概率与条件概率该如何求解呢。根据频率学派的思想,只需要从给定的语料中分别求各个单词的出现频数,假设频次等于概率。公式如下,其中 N N N 表示总单词数(不去重,就是将所有句子分词后统计数量)。
P ( w i ) = c o u n t ( w i ) N P ( w i − 1 , w i ) = c o u n t ( w i − 1 , w i ) N P ( A ∣ B ) = P ( A B ) P ( B ) = > P ( w i ∣ w i − 1 ) = c o u n t ( w i − 1 , w i ) c o u n t ( w i − 1 ) (2) P(w_{i})=\frac{count(w_{i})}{N}\\ P(w_{i-1},w_{i})=\frac{count(w_{i-1},w_{i})}{N}\\ P(A|B)=\frac{P(AB)}{P(B)}\\ => P(w_{i}|w_{i-1})=\frac{count(w_{i-1},w_{i})}{count(w_{i-1})} \tag{2} P(wi)=Ncount(wi)P(wi−1,wi)=Ncount(wi−1,wi)P(A∣B)=P(B)P(AB)=>P(wi∣wi−1)=count(wi−1)count(wi−1,wi)(2)
使用下面的句子举例,句子的概率表示如下:
自然语言处理很有趣
P ( 自 然 语 言 处 理 很 有 趣 ) = P ( 自 然 ) ⋅ P ( 语 言 ∣ 自 然 ) ⋅ P ( 处 理 ∣ 自 然 , 语 言 ) ⋅ P ( 很 ∣ 自 然 , 语 言 , 处 理 ) ⋅ P ( 有 趣 ∣ 自 然 , 语 言 , 处 理 , 很 ) (3) P(自然语言处理很有趣)=P(自然)\cdot P(语言|自然)\cdot P(处理|自然,语言)\cdot P(很|自然,语言,处理)\cdot P(有趣|自然,语言,处理,很) \tag{3} P(自然语言处理很有趣)=P(自然)⋅P(语言∣自然)⋅P(处理∣自然,语言)⋅P(很∣自然,语言,处理)⋅P(有趣∣自然,语言,处理,很)(3)
使用统计语言模型计算概率存在一个致命问题,就是当语料库不够庞大时,很多词之间没有任何联系,即会出现 P ( w i ∣ w i − 1 ) = 0 P(w_{i}|w_{i-1})=0 P(wi∣wi−1)=0 的情况。但是语料中不存在不代表两个词真没有关系,所以为了避免这类情况发生,需要对统计语言模型的概率进行平滑操作。
此外,计算一个句子的概率模型时所需参数为得到所有单词的概率和所有单词的条件概率,假设一个语料库的句子平均由 n n n 个单词组成,一共有 v v v 个单词,那么概率数量为: v 1 + v 2 + . . . + v n v^{1}+v^{2}+...+v^{n} v1+v2+...+vn,这么巨量的参数计算起来十分费力。为了降低计算量,在计算性能与准确率之间取得平衡(trade off),使用k-gram的方案。
即很多词之间的概率均为零,只有少部分概率参数是具有数值的。
为了避免计算量与参数过大,语言模型提出马尔科夫假设:当前词仅与前面几个词有关系,而不是与前面的全部词有关。根据依赖词的数量主要分为一下集中 K-Gram方案:
如下公式所以,其中 N N N 表示句子中的单词量,句子概率越大、困惑度越小、语言模型越好。
P P ( s ) = P ( w 1 , w 2 , . . . w N ) − 1 N = 1 P ( w 1 , w 2 , . . . w n ) N (4) PP(s)=P(w_{1},w_{2},...w_{N})^{-\frac{1}{N}}=\sqrt[N]{\frac{1}{P(w_{1},w_{2},...w_{n})}} \tag{4} PP(s)=P(w1,w2,...wN)−N1=NP(w1,w2,...wn)1(4)
NNLM指的是基于前馈神经网络的语言模型,使用了马尔可夫假设,也就是说放弃了一部分信息。是2003年Bengio教授提出的语言训练模型,论文名:A Neural Probabilistic Language Model,地址:https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf;其使用 w o r d 2 i d word2id word2id 和 i d 2 w o r d id2word id2word 两个字典实现字与索引序号之间的相互查找。模型如下图所示:
如上图所示,模型主要由输入层、隐藏层、输出层三部分组成。三层具体结构如下:
损失函数设置如下:
L = − 1 N ∑ i = 1 N l o g P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) (5) L=-\frac{1}{N}\sum_{i=1}^{N}{logP(w_{i}|w_{i-n+1},...,w_{i-1})} \tag{5} L=−N1i=1∑NlogP(wi∣wi−n+1,...,wi−1)(5)
损失函数与上述的困惑度的数学关系为: P P ( s ) = e L PP(s)=e^{L} PP(s)=eL,具体推导如下:
l o g ( P P ( s ) ) = l o g P ( w 1 , w 2 , . . . w N ) − 1 N = − 1 N l o g ( P ( w 1 ) ⋅ P ( w 2 ∣ w 1 ) . . . P ( w N ∣ w N − n + 1 , . . . , w N − 1 ) ) = − 1 N ∑ i = 1 N l o g P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) = L = > P P ( s ) = e L (6) log(PP(s))=log P(w_{1},w_{2},...w_{N})^{-\frac{1}{N}}\\ =-\frac{1}{N}log(P(w_{1})\cdot P(w_{2}|w_{1})...P(w_{N}|w_{N-n+1},...,w_{N-1}))\\ =-\frac{1}{N}\sum_{i=1}^{N}{logP(w_{i}|w_{i-n+1},...,w_{i-1})}\\ =L\\ =>PP(s)=e^{L} \tag{6} log(PP(s))=logP(w1,w2,...wN)−N1=−N1log(P(w1)⋅P(w2∣w1)...P(wN∣wN−n+1,...,wN−1))=−N1i=1∑NlogP(wi∣wi−n+1,...,wi−1)=L=>PP(s)=eL(6)
RNNLM模型指的是循环神经网络语言模型,其没有使用马尔可夫假设。整个输出结构如下图所示,其中
总公式结构如下: y ( t ) = i d 2 w o r d ( s o f t m a x ( t a n h ( ( w o r d 2 i d ( x ( t ) ) ⋅ W + s ( t − 1 ) ) ⋅ U ) ⋅ V ) ) y(t)=id2word(softmax(tanh((word2id(x(t))\cdot W+s(t-1))\cdot U) \cdot V)) y(t)=id2word(softmax(tanh((word2id(x(t))⋅W+s(t−1))⋅U)⋅V))
第一章讲述的语言模型的基本思想是:句子中下一个词的出现和前面的词是有关系的,所以可以使用前面的词预测下一个词, 又根据是否加入马尔科夫假设分为NNLM和RNNLM两种模型。
和语言模型不同的是,word2vec模型的基本思想是:句子中相近的词之间是有联系的,使用相近词的方式主要有两种,其中skip-gram是使用中心词来预测周围词,cbow是使用周围词来预测中心词。两种模型训练方法如下图所示:
skip-gram模型主要思路是使用中心词预测周围的词,主要逻辑如下图:其中主要参数矩阵有两个,分别为
1、训练过程:skip-gram训练方法的数据生成需要设置超参数窗口大小 n n n,根据窗口大小将一个中心词变为 2 n 2n 2n 条训练数据,举例如训练:
自然语言处理很有趣
假设中心词为:“处理”,窗口大小 n = 2 n=2 n=2 ,则样本制备成四条,分别是:
[[input="处理",label=“语言”],
[input="处理",label=“很”],
[input="处理",label=“自然”],
[input="处理",label=“有趣”]]
2、模型使用:训练目标是获取每个单词的词向量,这里可以直接使用矩阵 W W W 的每一行进行表示,也可以使用矩阵 W W W 的每一行加上矩阵 W ′ W^{'} W′ 的每一列再除以2得到。
3、损失函数:已知 l a b e l label label值是一个 o n e − h o t one-hot one−hot 向量矩阵,上图中最后输出的 1 × N 1×N 1×N 的矩阵经过 s o f t m a x softmax softmax 变换后可以得到输出值,我们将输出值与label值两个向量做交叉熵处理便而得到一次训练的损失函数,即 l o g P ( w t + j ∣ w t ) logP(w_{t+j}|w_{t}) logP(wt+j∣wt),那么总的损失函数便是对所有损失求和即可,为:
L ( θ ) = − 1 N ∑ t = 1 N ∑ − m < = j < = m , j ! = 0 l o g P ( w t + j ∣ w t ) (7) L(\theta)=-\frac{1}{N}\sum_{t=1}^{N}{\sum_{-m<=j<=m,j!=0}{logP(w_{t+j}|w_{t})}} \tag{7} L(θ)=−N1t=1∑N−m<=j<=m,j!=0∑logP(wt+j∣wt)(7)
CBOW的模型全名为 Continuous Bag-Of-Words,表示其使用了词袋模型,即不考虑单词的位置信息。主要思想是使用周围词来预测中心词的方式训练模型。主要训练过程如下图,其中也包含了两个矩阵参数。
1、训练过程:与上述skip-gram训练方法不同的是,CBOW方法生成训练数据时每个中心词只能生成一条数据。上图中窗口设置为 n = 2 n=2 n=2,上下文单词经过矩阵 W ′ W^{'} W′ 后为了维度不变,采取相加的方法。
2、模型使用:训练目标是获取每个单词的词向量,这里可以直接使用矩阵 W W W 的每一行进行表示,也可以使用矩阵 W W W 的每一行加上矩阵 W ′ W^{'} W′ 的每一列再除以2得到。
3、损失函数:和skip-gram的损失函数相同,设窗口n=2:
L ( θ ) = − 1 N ∑ t = 1 N l o g P ( w t ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) (8) L(\theta)=-\frac{1}{N}\sum_{t=1}^{N}{logP(w_{t}|w_{t-2},w_{t-1},w_{t+1},w_{t+2})} \tag{8} L(θ)=−N1t=1∑NlogP(wt∣wt−2,wt−1,wt+1,wt+2)(8)
层次 softmax 使用霍夫曼编码的二叉树进行展开,霍夫曼树即带权重的路径最短二叉树。可以简单理解成在语料库中出现频率大的词放在靠近根节点的叶子上,以便被快速找到。总结如下:
1、解决的问题:层次化softmax是为了解决用普通softmax进行 N N N分类时( N N N是词典大小),由于词典巨大导致计算目标词的似然概率的低效问题。
2、应用场景:层次化softmax通常和CBOW模型一起讲,但它作为一种优化手段,也可以用于skip-gram的优化。
3、主要结构:层次化softmax改变了原来的模型结构,主要如下:
负采样的思想主要是舍弃多分类,提升分类速度。把多分类变成二分类。二分类需要正样本和负样本,正样本是根据真实的周围词构建,负样本则是从词汇表中随机选择一个单词进行匹配,负样本一般随机5~10个左右。例如语料有【自然语言处理很有趣】,中心词假设为【处理】,那么
此外词汇表的单词存在重要的单词出现的频率较小,而语义不重要的单词出现的频率较多的问题,为了提高在负采样时重要的词被选中的概率,对各单词的词频做如下修改:其中 P ( w i ) P(w_{i}) P(wi) 表示修改后的各单词被选中的概率, f ( w i ) f(w_{i}) f(wi) 表示每个单词的词频,是小数。
P ( w i ) = f ( w i ) 3 / 4 ∑ j = 1 N f ( w j ) 3 / 4 (9) P(w_{i})=\frac{f(w_{i})^{3/4}}{\sum_{j=1}^{N}f(w_{j})^{3/4}} \tag{9} P(wi)=∑j=1Nf(wj)3/4f(wi)3/4(9)
自然语言处理的共识是:数据集中出现频率高的词往往携带的信息较少,而出现频率低的词往往携带信息多。使用重采样的原因如下:
重采样的方法如下,其中 f ( w i ) f(w_{i}) f(wi) 为词 w i w_{i} wi 在数据集中出现的频率,为小数;文中 t t t 为超参数,一般选择 t = 1 0 − 5 t=10^{-5} t=10−5,训练集中的词 w i w_{i} wi 会以 P ( w i ) P(w_{i}) P(wi) 的概率被删除。最后达到的效果即是:低频词训练的机会变大,高频词训练机会降低。
P ( w i ) = m a x ( 0 , 1 − t f ( w i ) ) (10) P(w_{i})=max(0,1-\sqrt{\frac{t}{f(w_{i})}}) \tag{10} P(wi)=max(0,1−f(wi)t)(10)
1、https://www.cnblogs.com/aaronhoo/p/14506346.html
2、http://building-babylon.net/2017/08/01/hierarchical-softmax/
3、https://www.bilibili.com/video/BV1A7411u7zh?from=search&seid=12557501094395741059&spm_id_from=333.337.0.0