1 简介
语言模型是自然语言处理领域的基础问题,其在词性标注、句法分析、机器翻译、信息检索等任务中起到了重要作用。简而言之,统计语言模型表示为:在词序列中,给定一个词
wt
和上下文中所有词
wt−1
,这个序列出现的概率,如下式,
P^(wT1)=∏t=1TP^(wt|wt−11)(1)
其中,
wt
是序列
wji
中第
t
词,
wji=(wi,wi+1,…,wj)
,
P^(wt|wt−11)
可以使用
P^(wt|wt−n+1t−1)
近似,这就是n-gram语言模型,详细请阅读[我们是这样理解语言的-2]统计语言模型。随着深度学习的发展,神经网络相关研究越来越深入,神经网络语言模型(Neural Network Language Model,NNLM)越来越受到学术界和工业界的关注,本文将系统介绍下 NNLM 的建模及其应用。
2 神经网络语言模型
NNLM 最早由Bengio系统化提出并进行了深入研究[Bengio, 2000, 2003]。当然分开来看,(1) distributed representation最早由Hinton提出(1985), (2)利用神经网络建模语言模型由Miikkulainen and Dyer,Xu and Rudnicky分别在1991和2000提出。
NNLM 依赖的一个核心概念就是词向量(Word Embedding)。词向量源于Hinton在Learning distributed representations of concepts提出的Distributed Representation,Bengio将其引入到语言模型建模中,提出了NNLM。那么,我们不禁要问,什么是词向量呢?
2.1 词向量
简而言之,词向量是用一个向量来表示一个词,一定程度上可以用来刻画词之间的语义距离。
a、词表中的词
i
表示为一个词向量
C(i),C(i)∈Rm
,其维度
m
一般取值为
30,50,60,100
等值。
b、词向量为神经网络的一类参数,可以通过训练得到,同时基于词向量可以表示词序列 wt1 的联合分布。
为了得到词向量,我们需要在给定训练数据集情况下,训练得到目标模型
f(wt,….,wt−n+1)=P^(wt|wt−n+1t)
。而模型需要满足的约束,即对于任意的
wt−11,∑|V|i=1f(wi,wt−1,…,wt−n+1)=1,f>0
,表示
wt
与上下文
wt−1,…,wt−n+1
所有可能的组合的概率和为1。 如此,我们可以将
f(wt,….,wt−n+1)
分解成两部分:
a、词表中任意单词
wi
表示为词向量,由此构建了一个
m×|V|
的矩阵
C
。
b、词的概率分布可以通过矩阵
C
进行变换得到。函数
g
是组合上下文中词向量
(C(wt−n+1),C(wt−n),…C(wt−1))
构建一个词
wt
的条件概率分布,即函数
g
的输出为一个向量,其第
i
个分量表示当前词
wt
等于词表中第
i
个词
Vi
的条件概率,
P^(wt=Vi|wt−11)
,函数
f
组合了
C
和
g
得到最终的输出结果。
2.2求解目标
一般而言,神经网络语言模型的优化目标是最大化带正则化项的Log-Likelihood,其中参数集合为
θ =(C,ω),ω
为神经网络的参数。
L=1T∑tlogf(wt,wt−1,…wt−n+1;θ)+R(θ)(2)
3 Bengio NIPS’03 Model
3.1 模型结构
Bengio使用前馈神经网络(FFNN,Feed Forward Neural Network)表示 f ,其结构如下:
上图中,输出层为Softmax,保证满足概率分布的约束:
P^(wt|wt−1,…,wt−n+1)=eywt∑ieywi(3)
其中,
ywi
是每个词非正规化的
log
概率值,
y
的值是通过下式计算得到,参数分别为
b,W,U,d,H
:
y=b+Wx+Utanh(d+Hx)(4)
W
通常设置为0,即输出层和输入层不存在直接联系,输入向量
x
为上下文环境对应的词向量的拼接组合。在模型中,令
θ=(b,U,d,H,C)
,其中,
d
是输入层到隐藏层的偏置(长度为
|V|
),
U
为隐藏层到输出层的参数(大小为
|V|×h
),
H
为输入层到隐藏层的参数,
b
为隐藏层到输出层的偏置(长度为
|h|
),
C
是词向量矩阵(大小为
|V|×m
),总共的参数为
|V|(1+nm+h)+h(1+(n−1)m)
。
模型求解方式采用随机梯度上升(SGA,Stochastic Gradient Ascent),SGA类似于SGD,仅目标函数存在min和max的区别。
θ←θ+ϵ∂logP^(wt|wt−11)∂θ(5)
3.2发展方向
Bengio在论文的Feature Work部分提出了神经网络语言模型的可能改进方向,在后续研究者(包括他本人)的工作中多有所体现。
a、将神经网络分解成为小的子网络,比如利用词的聚类等。
b、加速SoftMax中的正则项Z的快速求导
c、仅对一部分输出进行梯度传播。
d、引入先验知识,比如语义信息(WordNet),语法信息(low-level: POS, high level:句法结构)等。
e、词向量可解释性。
f、解决一词多义问题(Polysemous)。
4 Hierarchical Neural Language Model
基于前述工作,Bengio又提出了层次结构的神经网络语言模型,用于加速模型的训练和推断过程。
4.1 模型结构
Hierarchical Neural Language Model的表达式如下:
f(wt,wt−1,wt−2,…,wt−n+1)=e−g(wt,wt−1,wt−2,…,wt−n+1)∑ve−g(v,wt−1,wt−2,…,wt−n+1)(6)
其中
g(wt,wt−1,wt−2,…,wt−n+1)
可以看作能量函数。
同上文一致,令
C
为词向量矩阵(word embedding matrix),
Ci
为词
i
对应的向量,上述能量函数可以表示为,
g(wt,wt−1,wt−2,…,wt−n+1)=aTtanh(c+Wx+UCTv)(7)
上式中,
xT
为
x
的转置,
a,b,c,W,U
为对应的参数向量和矩阵,
x
是通过拼接词
wt
的上下文中词向量得到。
令
h
为模型中隐藏层的单元数,我们可以计算得到整个模型的参数个数为
(n–1)hd+|V|h(d+1)
。假定
h
为100,词表
|V|
的大小20,000,Context的大小
n
为5,可知第一部分为12,000,第二部分为6,000,000,计算量依然很大。
4.2 参数求解
模型求解参考了Goodman加速最大熵的语言模型训练过程中的工作,将词表中的词进行一个预处理(按类层级划分),这样可以达到不错的加速比,
O(Vlog2V√)
。这样在计算式(2)时,可以转换为,
P(wt|wt−1,wt−2,…,wt−n+1)=∏j=1L(wt)−1P(bj(wt)|b1(wt),…,bj−1(wt),wt−1,wt−2,…,wt−n+1)(8)
其中,
L(wt)
为树的深度,
bj(wt)
是
wt
属于类别
j
的指示变量。按照上述形式,计算
log(wt|wt−1,wt−2,…,wt−n+1)
和
▽log(wt|wt−1,wt−2,…,wt−n+1)
的复杂度和
L(wt)
成正比(相比
V
,要小很多)。
5 Log Bi-Linear
Hinton在研究RBM时,结合神经网络语言模型提出了三种基于RBM的语言模型,FRBM(Factored RBM)、Temporal FRBM、Log-Bilinear Language Model,其中Log Bi-Linear为前两者的简化版本,本文中仅介绍Log-BiLinear Language Model。
5.1 模型结构
类似于Log-Linear模型,Log Bi-Linear模型在能量函数部分(EXP上面那个部分的相反数)加入了一个双线性项,注意这里的R是词向量构成的矩阵,C代表此之前的连接权值。
E(wn;w1:n−1)=−(∑i=1n−1viRCi)RTvn–bTrRTvn–bTvvn(9)
其中,
Ci
表示
wi
和
wn
之间的连接关系的参数,
R
表示字典中词向量的矩阵,第
i
行表示第
i
个单词的词向量,
vi
表示一个和字典长度相同的指示向量,即词
i
对应词向量可以表示为
viR
;
br,bv
表示对应的偏置。从上述能量函数可以看出,它是一个双线性函数,需要注意的是这里的能量函数是RBM的幂数部分,其对应的语言模型形式为,
P(wn|w1:n−1)=1Zcexp(−E(wn;w1:n−1))(10)
其中,
Zc=∑wnexp(−E(wn;w1:n−1))
。
Log Bi-Linear的模型结构见下图,
图2 Log Bi-Linear模型结构
上图表示,每个词 vi 在词向量矩阵中找到对应的词向量表示,然后通过链接矩阵和当前词(图中 v3 )关联,其中关联关系是使用能量函数表示。
5.2 参数求解
套用RBM的求解框架,Log Bi-Linear可以采用Contrast Divergence Learning求解,其参数
(Ci,R)
的梯度表达式,
对于
Ci
,
∂∂CilogP(wn|w1:n−1)=<RTviR>D−<RTvivTnR>M(11)
对于
R
,
∂∂RlogP(wn|w1:n−1)=<∑i=1n=1(vnvTiRCi+vivTnRCTi)+vnbTr>D–<∑i=1n–1(vnvTiRCi+vivTnRCTi+vnbTr>M(12)
这里
<.>D
表示data distribution
P^
,
<.>
表示model distribution
P
。
6 Hierarchical LBL
Hinton将Bengio的Hierarchical NNLM和Log Bi-Linear思想结合,提出了Hierarchical Log Bi-Linear Language Model。
6.1 模型结构
Hierarchical LBL是将Hierarchical NNLM和Log Bi-Linear结合起来,对应的语言模型形式,
Log Bi-Linear部分可以简要表示为,
r^=∑i=t–1t−n+1Cirwi(13)
P(wt=w|wt−1:t−n+1)=exp(r^Trw+bw)∑jexp(r^Trj+bj)(14)
其中,
b
为对应的偏置项(bias),
r^
是上下文中的词向量加权,权值为当前词t和上下文中词的关系权值
C
,
rw
为词w对应的词向量。
由以上,可以推出HLBL的模型为,
P(wn|w1:n–1)=∏iP(di|qi,w1:n−1)(15)
P(di=1|qi,w1:n−1)=σ(r^Tqi+bi)(16)
其中,
di
词
w
的在层次(树)结构的编码,
qi
是编码路径中第
i
个节点的向量,
σ
为Logistic方程。
这里可以允许存在多种层次结构,即每个词对应多种编码,
P(wn|w1:n–1)
可以将词的所有编码方式求和,即
P(wn|w1:n–1)=∑d∈D(w)∏iP(di|qi,w1:n−1)(17)
其中, D(w) 为词w的编码集合,这词采用多种编码方式能够更好刻画词的不同形式和“语义”,这种思路在后续的SENNA中也有体现。
6.2 参数求解
该模型参数求解可以直接套用Log Bi-Linear和Hierarchical NNLM的方式,其中不同之处,Hinton提出了一种新的简单的构建层次结构的方法:通过递归的使用二维的高斯混合模型(GMM,Gaussian Mixture Model)进行聚类,直到每个cluster中仅包含两个词,这样所有的结果就构成一个二叉树。
7 SENNA
SENNA中不仅仅提出了word embedding的构建方法,同时还从神经网络语言模型角度系统去解决自然语言处理任务(POS,Chunking,NER,SRL)。SENNA中,每个词可以直接从Lookup Table中直接查找到对应的向量。
LTW(w)=<W>1w(18)
其中,
dwrd
是词向量的维度,
W∈Rdwrd×|D|
为词向量的矩阵,
<W>1w
表示取矩阵
W
的第
w
列。SENNA中,表示句子或者词序列仅将对应的词向量拼接起来得到对应的向量。
SENNA中采用HLBL中同一个词存在不同的词向量,用于刻画不同的语义和语法用途,一个词的词向量最终由各种形态下的词向量组合起来,比如,一个词可以有word stemming的向量,本身的向量(这些向量可能来自不同的Lookup table)等,需要将这些向量结合起来表示这个词。SENNA直接将这些向量拼接起来,构成了一个维度为
dTwrd=∑kdkwrd
。
7.1 模型结构
SENNA包含两种网络构建方式(1)window approach(图3)(2)sentence approach(图4)。
(1)window approach
window approach是一个前馈神经网络,包含线性层、HardTanh层。window approach的输入是包含当前词在内的窗口大小
ksz
的序列,拼接所有词的向量得到的表示向量,维度
dwrd×ksz
,
图3 window approach
f1θ=<LTw([w]T1)>dwint=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪<W>1[w]t−dwin/2…<W>1[w]t…<W>1[w]t−dwin/2⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(19)
从图3可知,
f1θ
输入下一层或者几层线性层,记为
flθ
。
flθ=Wlfl−1θ+bl(20)
其中,
Wl∈Rnlhu×nl−1h,bl∈Rnlhu
为待训练参数,
nlhu
为第
l
层隐藏单元数。
SENNA中包含了一个特殊的层,HardTanh层,它的输入是前一个线性层。HardTanh层是一个非线性层,形式如下,
[flθ]=HardTanh([fl−1θ]i)(21)
其中,
HardTanh(x)=⎧⎩⎨−1x1ifx≤ −1if−1≥x≤1ifx>1(22)
SENNA的输出层为输入序列对应的得分,大小具体任务有关。
(2) sentence approach
window approach能够完成绝大部分自然语言处理任务,但是在SRL上表现不佳。因此,SENNA提出了sentence approach用于适应SRL。sentence approach采用的卷积网络结构,除了线性层和HardTanh层外,还有一个卷积层和一个Max层。
<flθ>1t=Wl<fl−1θ>dwint+bl ∀t(23)
[flθ]i=maxt[fl−1θ]i,t1≤i≥nl−1hu(24)
7.2 参数估计
上述神经网络的参数均通过MLE + SGD得到,我们将参数记为
θ
,训练数据记为
T
, 则参数估计记为,
θ←∑(x,y)∈Tlogp(y|x,θ)(25)
其中,
x
为输入的句子或词序列(window approach)对应的表示向量,
y
表示具体任务(POS,NER,Chunking,SRL)的tag,
p(.)
为神经网络的输出结果,箭头右边为data log likelihood。
SENNA求解方式分为两种,word-level log-likelihood,sentence-level log-likelihood。
(1)word-level log-likelihood
在给定输入
x
的情况下,神经网络输出一个得分
[fθ(x)]i
,这里
i
为输出的tag编号。这个得分不满足概率的约束,需要对它进行归一化,这里采用了softmax方程,
p(i|x,θ)=e[fθ]i∑je[fθ]j(26)
为方便运算,对上述等式取log值,记分母部分为
logaddj[fθ]j=log(∑je[fθ]j)
,得到的形式带入data log likelihood中,最终形式为交叉熵(cross entropy)。但是,由于在句子中当前词和相邻的词的tag存在关联性,上述方案并非最好的求解方式,所以SENNA提出了sentence-level log-likelihood。
(2)sentence-level log-likelihood
在输入的句子中,有些tag不能在某些tag之后。从序列的角度看,tag和tag之间的转换是有条件的,这种转换是需要满足约束的。记,
[fθ]
为句子
[x]T1
的网络输出得分,
[fθ]i,t
为输入序列中第
t
个词,输出为第
i
个tag的得分。基于上述考虑,SENNA引如一个转换矩阵
[A]
用于保存tag和tag之间的转换关系,
[A]i,j
表示从tag i到tag j的得分,转换得分需要通过从数据中训练得到,故参数为
θ^=θ⋃{[A]i,j,∀i,j}
。按照上述处理,序列的得分是神经网络得分加上转换得分,
s([x]T1,[i]T1,θ^)=∑t=1T([A][i]t−1,[i]t+[fθ][i]t,t)(27)
类似于word-level的处理,最终输出需要满足概率分布的约束,sentence level仅对所有可能的tag路径进行softmax归一化,我们定义这个结果比值为tag路径条件概率。对条件概率取log后,
logp([y]T1|[x]T1,θ^)=s([x]T1,[i]T1,θ^)–logadd∀[j]T1s([x]T1,[j]T1,θ^)(28)
上式中,logadd操作拥有特殊的性质可以递归的求解,可以方便的得到递推公式,
终止条件为,
logadds([x]T1,[f]T1,θ^)=logaddiδT(i)(29)
上述过程理解可以参照HMM的前向算法。在训练时,对所有的样本
([x]T1,[y]T1)
最大化data log likelihood,注意其中
p(.)
为tag路径条件概率。
SENNA的推断部分采用的是Viterbi算法,推断过程理解可以参照HMM的推断过程,形式为,
argmax[j]T1s([x]T1,[f]T1,θ^)(30)
类似于HMM中,也需要按照参数求解过程进行递归处理,但是每步需要用max操作替代logadd操作,然后回溯得到解。viterbi的过程理解可以参照动态规划问题,找出状态转移方程即可。
本文链接:[我们是这样理解语言的-3]神经网络语言模型
本站文章若无特别说明,皆为原创,转载请注明来源:火光摇曳,谢谢!^^