用神经网络来训练语言模型的思想最早由百度 IDL (深度学习研究院)的徐伟提出[1],NNLM(Nerual Network Language
Model)是这方面的一个经典模型,具体内容可参考 Bengio 2003年发表在JMLR上的论文。原文地址:
http://jmlr.org/papers/volume3/bengio03a/bengio03a.pdf
<http://jmlr.org/papers/volume3/bengio03a/bengio03a.pdf>

与传统的估算p(wt∣wt−(n−1),...wt−1)p(w_t|w_{t-(n-1)},...w_{t-1})p(wt​∣wt−(n−1)​,...wt−
1​)不同,NNLM模型直接通过一个神经网络结构对n元条件概率进行评估,NNLM模型的基本结构如下:


<>1. 模型原理

<>1.1 模型输入:

首先从语料库中搜集一系列长度为n的文本序列(wt,wt−1...wt−(n−1))(w_t,w_{t-1}...w_{t-(n-1)})(wt​,wt−1​.
..wt−(n−1)​)
,然后组成训练集D,我这里的理解是语料库就是我们在特定领域搜集的文本语料,同时还要有一个词典。有了训练数据和词典,下面就来看下模型是怎样进行前向传播的。

这里先对单个语句序列进行计算,也可以说是单个样本,比如:w1…wTw_1 …w_Tw1​…wT​ 其中wt∈Vw_t∈Vwt​∈V,这里的VVV
是所有单词的集合(即词典),ViV_iVi​表示词典中的第 i 个单词。

<>1.2 模型参数:

NNLM的目标是训练如下模型:
f(wt,wt−1,...,wt−n+2,wt−n+1)=p(wt∣w1t−1)
f(w_t,w_{t−1},...,w_{t−n+2},w_{t−n+1})=p(w_t|w_1^{t−1})f(wt​,wt−1​,...,wt−n+2​,w
t−n+1​)=p(wt​∣w1t−1​)
其中wtw_twt​表示词序列中第t个单词,w1t−1w_1^{t−1}w1t−1​表示从第1个词到第t个词组成的子序列。模型需要满足的约束条件是:

* f(wt,wt−1,...,wt−n+2,wt−n+1)>0f(w_t,w_{t−1},...,w_{t−n+2},w_{t−n+1})>0
f(wt​,wt−1​,...,wt−n+2​,wt−n+1​)>0
* ∑i∣V∣f(wt,wt−1,...,wt−n+2,wt−n+1)=1\sum ^{|V|}_i
f(w_t,w_{t−1},...,w_{t−n+2},w_{t−n+1})=1∑i∣V∣​f(wt​,wt−1​,...,wt−n+2​,wt−n+1​)=1
上面模型的意思是当给定一段序列时,由其前面的(t-1)个词预测第n个词的概率。
限制条件一:即是通过网络得到的每个概率值都要大于0。

而对于第二个限制条件:因为我们的神经网络模型最终得到的输出是针对每t-1个词的输入来预测下一个,也即是第t个词是什么。因此模型的实际输出是一个向量,该向量的每一个分量依次对应下一个词为词典中某个词的概率。所以|v|维的概率值中必定有一个最大的概率,而其他的概率较小。

上面是模型的输入和输出,下面说下前向传播的过程:该模型可分为特征映射和计算条件概率分布两部分

*
特征映射:通过映射矩阵 C∈R∣V∣×mC \in R^{|V|×m}C∈R∣V∣×m将输入的每个词映射为一个特征向量,C(i)∈RmC(i) \in R^m
C(i)∈Rm表示词典中第 i 个词对应的特征向量,其中 m 表示特征向量的维度。这里的映射可以是one-hot。然后将通过特征映射得到C(wt−n+1),..
.,C(wt−1)C(w_{t−n+1}),...,C(w_{t−1})C(wt−n+1​),...,C(wt−1​)合并成一个 (n−1)m(n−1)m(n−
1)m维的向量(C(wt−n+1),...,C(wt−1))(C(w_{t−n+1}),...,C(w_{t−1}))(C(wt−n+1​),...,C(wt−
1​)),因为每一个词是m维的,总共有n-1个词,所以总共有(n−1)m(n−1)m(n−1)m维。
也可以说是:一个从词汇表V到实数向量空间的映射C。通过这个映射得到每个单词的向量表示。

*
计算条件概率分布:通过一个函数 g(g是前馈或递归神经网络)将输入的词向量序列(C(wt−n+1),...,C(wt−1))
(C(w_{t−n+1}),...,C(w_{t−1}))(C(wt−n+1​),...,C(wt−1​))转化为一个概率分布 y∈R∣V∣y∈R^{|V|}y
∈R∣V∣,所以这里的输出是|v|维的,和词典的维度是相同的。y中第 i 位表示词序列中第 n 个词是 Vi的概率,即:f(i,wt−1,...,wt−n+2,
wt−n+1)=g(i,C(wt−n+1),...,C(wt−1))
f(i,w_{t−1},...,w_{t−n+2},w_{t−n+1})=g(i,C(w_{t−n+1}),...,C(w_{t−1}))f(i,wt−1​,.
..,wt−n+2​,wt−n+1​)=g(i,C(wt−n+1​),...,C(wt−1​))

下面详细介绍下神经网络的结构,网络输出层采用的是softmax函数,如下式所示:
p(wt∣wt−1,...,wt−n+2,wt−n+1)=eywt∑ieyi
p(w_t|w_{t−1},...,w_{t−n+2},w_{t−n+1})=\frac{e^{y_{w_t}}}{∑_ie^{y_i}}p(wt​∣wt−1​
,...,wt−n+2​,wt−n+1​)=∑i​eyi​eywt​​​

其中y=b+Wx+Utanh(d+Hx)y=b+Wx+Utanh(d+Hx)y=b+Wx+Utanh(d+Hx),模型的参数 θ=(b,d,W,U,H,C)
\theta=(b,d,W,U,H,C)θ=(b,d,W,U,H,C)。x=(C(wt−n+1),...,C(wt−1))
x=(C(w_{t−n+1}),...,C(w_{t−1}))x=(C(wt−n+1​),...,C(wt−1​))是神经网络的输入。W∈R∣V∣×(n−1)m
W \in R^{|V|×(n−1)m}W∈R∣V∣×(n−1)m是可选参数,如果输入层与输出层没有直接相连(如图中绿色虚线所示),则可令W=0。

当输入层和输出层没有直接相连时:
H∈Rh×(n−1)mH \in R^{h×(n−1)m}H∈Rh×(n−1)m是输入层到隐含层的权重矩阵,其中h表示隐含层神经元的数目。此时隐藏层运算:h×
(n−1)mh×(n−1)mh×(n−1)m和(n−1)m×1(n-1)m ×1(n−1)m×1 相乘得到h×1h×1h×1
U∈R∣V∣×hU∈R^{|V|×h}U∈R∣V∣×h是隐含层到输出层的权重矩阵。d∈Rhd\in R^hd∈Rh和 b∈R∣V∣b \in R^{|V|}b
∈R∣V∣分别是隐含层和输出层的偏置参数。这时的输出层运算:∣V∣×h|V|×h∣V∣×h和h×1h×1h×1相乘得到∣V∣×1|V|×1∣V∣×1。

以上就是前向传播的过程。

<>1.3 模型训练

模型的训练目标是最大化以下似然函数:
L=1T∑tlogf(wt,wt−1,...,wt−n+2,wt−n+1;θ)+R(θ)L=\frac{1}{T} \sum_t
logf(w_t,w_{t−1},...,w_{t−n+2},w_{t−n+1};θ)+R(θ)L=T1​∑t​logf(wt​,wt−1​,...,wt−n+
2​,wt−n+1​;θ)+R(θ),其中θ\thetaθ为模型的所有参数,R(θ)R(\theta)R(θ)为正则化项。

使用梯度下降算法更新参数的过程如下:
θ←θ+λ∂logp(wt∣wt−1,...,wt−n+2,wt−n+1)∂θ\theta←\theta+ \lambda
\frac{∂logp(wt|wt−1,...,wt−n+2,wt−n+1)}{∂θ}θ←θ+λ∂θ∂logp(wt∣wt−1,...,wt−n+2,wt−n+
1)​,其中λ\lambdaλ为步长。


总结:由于NNLM模型使用了低维紧凑的词向量对上文进行表示,这解决了词袋模型带来的数据稀疏、语义鸿沟等问题。显然nnlm是一种更好的n元语言模型;另一方面在相似的上下文语境中,nnlm模型可以预测出相似的目标词,而传统模型无法做到这一点。

参考:
https://blog.csdn.net/u010089444/article/details/52624964?ref=myread
<https://blog.csdn.net/u010089444/article/details/52624964?ref=myread>
https://www.zhihu.com/question/32275069
<https://www.zhihu.com/question/32275069>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信