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 ,其结构如下:
图 1 Bengio Yoshua提出的神经网络结构
上图中,输出层为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]神经网络语言模型
本站文章若无特别说明,皆为原创,转载请注明来源:火光摇曳,谢谢!^^