最近一直在使用各种Embedding的方法,于是好奇的看到了NNLM,总结一下自己的理解。
Forward
首先,我们假设一句话由w=(w1,w2,...,wt)w=(w_1,w_2,...,w_t)w=(w1,w2,...,wt)组成(wiw_iwi为单词),在语言模型中计算一句话的概率,我们用w1,w2,...,wtw_1,w_2,...,w_tw1,w2,...,wt的联合概率来表示一句话的概率。如下:
p(w)=p=(w1,w2,...,wt)(1)\bm{p(w)=p=(w_1,w_2,...,w_t)}\tag1p(w)=p=(w1,w2,...,wt)(1)
也可以来判断一句话是否通顺,都是一个意思,通过条件概率得到如下变形:
P(w1,w2,…,wt)=P(wt∣wt−1,…,w2,w1)∗P(wt−1,…,w2,w1)=p(w1)∗p(w2∣w1)∗p(w3∣w1,w2)∗......∗p(wn∣w1,......,wn−1)(2)\begin{array}{ll}
P(w_1, w_2, … , w_t)& = P(w_t | w_{t-1}, … , w_2, w_1) * P(w_{t-1}, … , w_2, w_1)\tag2 \\\\
& = p(w_1)*p(w_2|w_1)*p(w_3|w_1,w_2)*......*p(w_n|w_1,......,w_{n-1})
\end{array}P(w1,w2,…,wt)=P(wt∣wt−1,…,w2,w1)∗P(wt−1,…,w2,w1)=p(w1)∗p(w2∣w1)∗p(w3∣w1,w2)∗......∗p(wn∣w1,......,wn−1)(2)
根据马尔可夫假设,我们可以类似的认为离t最近n-1个词和它相关,从而可以得到:
P(wt∣wt−1,…,w2,w1)=P(wt∣wt−1,wt−2,…,wt−n+1)(3)\bm{P(w_t | w_{t-1}, … , w_2, w_1)=P(w_t | w_{t-1}, w_{t-2}, … , w_{t-n+1})\tag3}P(wt∣wt−1,…,w2,w1)=P(wt∣wt−1,wt−2,…,wt−n+1)(3)
另外,插一点题外话,若我们这里认为只和最近的1个词相关,便成了2-gram
,同时我们可以把公式(2)变形如下:
P(w1,w2,…,wt)=P(wt∣wt−1,…,w2,w1)∗P(wt−1,…,w2,w1)=p(w1)∗p(w2∣w1)∗p(w3∣w1,w2)∗......∗p(wn∣w1,......,wn−1)=p(w1)∗p(w2∣w1)∗p(w3∣w2)∗......∗p(wn∣wn−1)(2*)\begin{array}{ll}
P(w_1, w_2, … , w_t)& = P(w_t | w_{t-1}, … , w_2, w_1) * P(w_{t-1}, … , w_2, w_1)\tag{2*} \\\\
& = p(w_1)*p(w_2|w_1)*p(w_3|w_1,w_2)*......*p(w_n|w_1,......,w_{n-1})\\\\
& = p(w_1)*p(w_2|w_1)*p(w_3|w_2)*......*p(w_n|w_{n-1})
\end{array}P(w1,w2,…,wt)=P(wt∣wt−1,…,w2,w1)∗P(wt−1,…,w2,w1)=p(w1)∗p(w2∣w1)∗p(w3∣w1,w2)∗......∗p(wn∣w1,......,wn−1)=p(w1)∗p(w2∣w1)∗p(w3∣w2)∗......∗p(wn∣wn−1)(2*)
回归正题,我们这里假设词典为10000个词。分别对语料中的词进行one-hot编码(词典为语料中不重复的单词)。
一般来说,这个n是一个比较小的值。我们这里假设n=6,那么n-1=5.那么,我们可以认为输入是5个one-hot向量,我们把这个向量拼成一个[5 * 10000]的矩阵,由于向量的维度通常比较高,我们进行降维处理:右乘一个[10000 *100]的权重矩阵得到一个[5 * 100]的矩阵(这里不一定是100,只是举个例子)。
上面的这一段在原文里面其实是没有的,这样讲解是为了更好的理解,论文里面是通过index在C中进行一个查表操作。其实道理是一样的。
这个过程我们也可以理解为从one-hot到distributed representation的转化过程。
这样就得到了特征向量。根据论文 Nerual Network Language Model写道:
a function g maps an input sequence of feature vectors for words in context,(C(wt−n+1),⋅⋅⋅,C(wt−1))(C(w_{t−n+1}),··· ,C(w_{t−1}))(C(wt−n+1),⋅⋅⋅,C(wt−1)), to a conditional probability distribution over words in V for the next word wtw_twt
上面的(C(wt−n+1),⋅⋅⋅,C(wt−1))(C(w_{t−n+1}),··· ,C(w_{t−1}))(C(wt−n+1),⋅⋅⋅,C(wt−1))就是我们得到的特征向量,作者通过一个映射g来得到对wtw_twt.的预测,
这个映射的设计结构如下图:
先是将特征向量进行拼接,也就是5*100的矩阵,拼接成一个500维的向量(xxx),然后将这个向量(xxx)
经过 (4) 线性变换之后,再经过tanh处理得到一个100维的向量,如(5):
y1=Utanh(d+Hx)(4)\bm{y_1=U tanh(d+Hx)}\tag4y1=Utanh(d+Hx)(4)
[100∗500]∗[500∗1]=[100∗1](5)\bm{[100*500]*[500*1]=[100*1]}\tag5[100∗500]∗[500∗1]=[100∗1](5)
然后左乘U得到 一个10000维的向量 y1y_1y1,如(6):
[10000∗100]∗[100∗1]=[10000∗1](6)\bm{[10000*100]*[100*1]=[10000*1]\tag6}[10000∗100]∗[100∗1]=[10000∗1](6)
接下来是对输入特征向量(xxx)的处理 ,(xxx)左乘一个[10000 * 500]的矩阵得到一个[10000 * 1]的向量:
y2=b+Wx(7)\bm{y_2 = b+Wx\tag7}y2=b+Wx(7)
[10000∗500]∗[500∗1]=[10000∗1](8)\bm{[10000*500]*[500*1]=[10000*1]\tag8}[10000∗500]∗[500∗1]=[10000∗1](8)
将上面y1和y2y_1和y_2y1和y2相加就得到了最终的向量
y=y1+y2(9)\bm{y=y_1+y_2\tag9}y=y1+y2(9)
y=b+Wx+Utanh(d+Hx)(10)\bm{y = b+Wx+U tanh(d+Hx)\tag{10}}y=b+Wx+Utanh(d+Hx)(10)
yyy是一个10000的向量,这里的x为特征向量,W,U,H都为权重,b,d为biasW,U, H都为权重,b, d为biasW,U,H都为权重,b,d为bias。然后通过softmax得到对wtw_twt的预测:
P(wt∣wt−1,⋅⋅⋅wt−n+1)=eyw,i∑iNeyw,i(11)\bm{P(w _t |w_{t−1} ,···w_{t−n+1} ) =\frac{e ^{y{_w}{_,}{_i}}}{∑_ i^N e ^{y_w{_,}_i}}\tag{11}}P(wt∣wt−1,⋅⋅⋅wt−n+1)=∑iNeyw,ieyw,i(11)
也就是当上下文为content(www)时,wtw_twt为字典中第i个词的概率。
Back propagation
损失函数: L=∑w∈clogp(w∣context(w))(12)\bm{L =∑_{w \in c}log p(w|context(w))\tag{12}}L=w∈c∑logp(w∣context(w))(12)
接下来对目标函数进行梯度上升求解即可。