文章目录
0、结构
1、语言模型基础
1.1、概念
语言模型是计算一个句子符合语法语义的概率的模型,属于无监督学习方法。如下例子中第一个是正确的句子,而第二个却不是。
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)
1.2、缺陷
- 概率为零
使用统计语言模型计算概率存在一个致命问题,就是当语料库不够庞大时,很多词之间没有任何联系,即会出现 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的方案。
- 数据稀疏严重
即很多词之间的概率均为零,只有少部分概率参数是具有数值的。
1.3、K-Gram语言模型
为了避免计算量与参数过大,语言模型提出马尔科夫假设:当前词仅与前面几个词有关系,而不是与前面的全部词有关。根据依赖词的数量主要分为一下集中 K-Gram方案:
- uni-gram: P ( s ) = P ( w 1 ) ⋅ P ( w 2 ) . . . P ( w n ) P(s)=P(w_{1})\cdot P(w_{2})...P(w_{n}) P(s)=P(w1)⋅P(w2)...P(wn);
- big-gram: P ( s ) = P ( w 1 ) ⋅ P ( w 2 ∣ w 1 ) . . . P ( w n ∣ w n − 1 ) P(s)=P(w_{1})\cdot P(w_{2}|w_{1})...P(w_{n}|w_{n-1}) P(s)=P(w1)⋅P(w2∣w1)...P(wn∣wn−1);
- Tri-gram: P ( s ) = 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(s)=P(w_{1})\cdot P(w_{2}|w_{1})\cdot P(w_{3}|w_{1},w_{2})...P(w_{n}|w_{n-2},w_{n-1}) P(s)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1,w2)...P(wn∣wn−2,wn−1);
- k-gram: P ( s ) = P ( w 1 ) ⋅ P ( w 2 ∣ w 1 ) ⋅ P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w n − k + 1 . . . w n − 1 ) P(s)=P(w_{1})\cdot P(w_{2}|w_{1})\cdot P(w_{3}|w_{1},w_{2})...P(w_{n}|w_{n-k+1}...w_{n-1}) P(s)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1,w2)...P(wn∣wn−k+1...wn−1);
1.4、评价指标:困惑度
如下公式所以,其中
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)
2、NNLM与RNNLM模型
2.1、NNLM
2.1.1、结构
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 两个字典实现字与索引序号之间的相互查找。模型如下图所示:
如上图所示,模型主要由输入层、隐藏层、输出层三部分组成。三层具体结构如下:
- 输入层:输入维度为前 n n n 个单词窗口进行拼接之后的总向量长度,如训练句子为:“自然语言处理是人工智能技术中的一个方面”。以字进行分词,窗口 n n n 设置为 3,则输入为 [“自”, “然”, “语”] 时预测输出的 l a b e l label label 为 ”言“ 对应的 o n e − h o t one-hot one−hot 向量。上图绿色方块表示使用 w o r d 2 i d word2id word2id 字典查找的 index 索引序号或转换之后的 o n e − h o t one-hot one−hot 向量,矩阵 C C C 表示所有单词或字的词向量(初始时随机产生),具体查找过程如下图所示:
- 隐藏层:一个以 t a n h tanh tanh 为激活函数的全连接层, o u t p u t = t a n h ( d + U x ) output = tanh(d+Ux) output=tanh(d+Ux)。
- 输出层:一个以 s o f t m a x softmax softmax 为激活函数的概率分布输出。输出维度为 1 × N 1 × N 1×N 的向量,取向量中的最大值为1,其他为0后将其转换为 o n e − h o t one-hot one−hot 向量,再使用 i d 2 w o r d id2word id2word 字典进行单词或字的输出。
2.1.2、损失函数
损失函数设置如下:
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)
2.1.3、存在问题
- 存在一词多义问题;
- s o f t m a x softmax softmax 输出维度过大,导致训练较慢; w o r d 2 v e c word2vec word2vec 模型使用层次 s o f t m a x softmax softmax 与负采样等方式解决
- 需加入先验知识,如词性等。
2.2、RNNLM
RNNLM模型指的是循环神经网络语言模型,其没有使用马尔可夫假设。整个输出结构如下图所示,其中
- o ( t ) o(t) o(t) 为根据 w o r d 2 i d word2id word2id 字典计算得出的 o n e − h o t one-hot one−hot 向量,维度为 1 × N 1×N 1×N,其中 N N N 表示所有单词或字的数量;
- 矩阵 W W W 为单词或字的词向量表示(随机初始化),维度为 N × D N×D N×D;其中 D D D 表示词向量输出维度,是人为设置的超参数;
- w ( t ) w(t) w(t) 表示 t t t 时刻输入单词的词向量,维度为 1 × D 1×D 1×D;
- 矩阵 U U U 表示所有单词或字的向量库(随机初始化),维度为: ( D + H ) × H (D+H)×H (D+H)×H; 其中 H H H 表示隐藏层输出维度,是人为设置的超参数;
- s ( t − 1 ) s(t-1) s(t−1) 与 s ( t ) s(t) s(t) 分别表示前 t − 1 t-1 t−1 时刻和 t t t 时刻所有输入的汇总输出,维度为 1 × D 1×D 1×D;
- 矩阵 V V V 是从隐藏层到输出层之间的映射矩阵(随机初始化),维度为 H × N H×N H×N。
- m ( t ) m(t) m(t) 表示 t t t 时刻网络输出值,维度为 1 × N 1×N 1×N;
- 上述 x ( t ) x(t) x(t) 与 y ( t ) y(t) y(t) 分别表示 t t t 时刻输入单词与预测输出的单词。
总公式结构如下: 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))
3、Word2Vec模型
第一章讲述的语言模型的基本思想是:句子中下一个词的出现和前面的词是有关系的,所以可以使用前面的词预测下一个词, 又根据是否加入马尔科夫假设分为NNLM和RNNLM两种模型。
和语言模型不同的是,word2vec模型的基本思想是:句子中相近的词之间是有联系的,使用相近词的方式主要有两种,其中skip-gram是使用中心词来预测周围词,cbow是使用周围词来预测中心词。两种模型训练方法如下图所示:
3.1、模型结构
3.1.1、skip-gram
skip-gram模型主要思路是使用中心词预测周围的词,主要逻辑如下图:其中主要参数矩阵有两个,分别为
- 矩阵 W W W :表示的是中心词向量表,维度为 N × D N×D N×D;其中 N N N 是总单词量, D D D 是认为设置的词向量维度。每一行表示一个单词的词向量;
- 矩阵 W ′ W^{'} W′ :表示的是周围词向量表,维度为 D × N D×N D×N;每一列表示一个单词的词向量。
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)
3.1.2、CBOW
CBOW的模型全名为 Continuous Bag-Of-Words,表示其使用了词袋模型,即不考虑单词的位置信息。主要思想是使用周围词来预测中心词的方式训练模型。主要训练过程如下图,其中也包含了两个矩阵参数。
- 矩阵 W W W :表示的是中心词向量表,维度为 N × D N×D N×D;其中 N N N 是总单词量, D D D 是认为设置的词向量维度。每一行表示一个单词的词向量;
- 矩阵 W ′ W^{'} W′ :表示的是周围词向量表,维度为 D × N D×N D×N;每一列表示一个单词的词向量。
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)
3.2、优化技术
3.2.1、hierarchical softmax
层次 softmax 使用霍夫曼编码的二叉树进行展开,霍夫曼树即带权重的路径最短二叉树。可以简单理解成在语料库中出现频率大的词放在靠近根节点的叶子上,以便被快速找到。总结如下:
1、解决的问题:层次化softmax是为了解决用普通softmax进行 N N N分类时( N N N是词典大小),由于词典巨大导致计算目标词的似然概率的低效问题。
2、应用场景:层次化softmax通常和CBOW模型一起讲,但它作为一种优化手段,也可以用于skip-gram的优化。
3、主要结构:层次化softmax改变了原来的模型结构,主要如下:
- 原来过程为输入是 1 ∗ N 1*N 1∗N 的one-hot向量,经过 N ∗ D N*D N∗D 的矩阵(input-embedding) ,再经过 D ∗ N D*N D∗N 矩阵(output-embedding),即一系列矩阵乘法$ (1,N)(N,D)(D,N)=(1,N)$。其中的第一次乘法,一般用查表的方式直接读取,不用相乘。最后再softmax,得到目标词是词典中每个词的概率。
- 使用层次化softmax时,output-embedding 部分的 D ∗ N D*N D∗N 矩阵被取消了,只有输入的 N ∗ D N*D N∗D 矩阵。查表后直接用 1 ∗ D 1*D 1∗D 的向量与二叉树的每个中间路径节点对应的一个向量 γ n γ_{n} γn(形状为 D ∗ 1 D*1 D∗1 ) 进行相乘,得到一个 s c a l a r scalar scalar 标量,再经过 s i g m o i d sigmoid sigmoid,转为一个0到1之间的小数。此数就是从树(树是二叉树,树的每个叶子节点都对应一个单词)的根节点到某个叶子节点的路径上每次在中间节点选择向左(也可定为向右)走的概率。其中霍夫曼树的叶子节点是根据语料库中各单词的出现频率实现构建完的。路径上每条边的概率进行连乘,就是从根节点到叶子节点的总的概率,也就是模型的预测值为该叶子节点(目标单词)的概率。层次化softmax的目标函数就是最大化目标词的路径概率,换句话说,我们只需要关注目标词的路径概率即可,而目标词是已知的,完全不需要计算其他的词的路径概率。这点是后续优化措施的关键。
- 层次化softmax的树是二叉树,路径长度也就是树的高度,假设是满二叉树,则树高 = l o g 2 N =log_{2}N =log2N,远远小于N,节省了很多计算过程。
- 且构建哈夫曼树时,比较节点的权重大小是依据该节点(也就是单词)的词频,词频大的放在离根节点近的地方,词频小的远离根节点。如此词频大的词只需要很少的比较次数,路径就结束了,计算次数比较少。
- 由于是根据词频来构建哈夫曼树,所以一开始这课树的结构就是已经确定的,每个叶子节点对应的单词也是已知的,换言之根节点到目标节点的路径包括中间节点、向左还是向右也是已知的,后续优化时只需要更新中间节点对应的向量、词向量即可。
3.2.2、负采样
负采样的思想主要是舍弃多分类,提升分类速度。把多分类变成二分类。二分类需要正样本和负样本,正样本是根据真实的周围词构建,负样本则是从词汇表中随机选择一个单词进行匹配,负样本一般随机5~10个左右。例如语料有【自然语言处理很有趣】,中心词假设为【处理】,那么
- 对于 skip-gram 方法来说构建正样本为 [input=“处理”,label=”很“],构建负样本为 [input=“处理”,label=“生活”]。
- 对于CBOW 模型构建正样本为 [input=(“语言”,“很”),label=”处理“],负样本为 [input=(“语言”,“很”),label=”生活“]
此外词汇表的单词存在重要的单词出现的频率较小,而语义不重要的单词出现的频率较多的问题,为了提高在负采样时重要的词被选中的概率,对各单词的词频做如下修改:其中
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)
3.2.3、重采样
自然语言处理的共识是:数据集中出现频率高的词往往携带的信息较少,而出现频率低的词往往携带信息多。使用重采样的原因如下:
- 想更多得训练重要的词对
- 高频词很快就训练好了,但低频次需要更多的训练
重采样的方法如下,其中
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)
4、参考文献
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