神经网络不仅仅可以处理图像,同样也可以处理文本。由于处理图像讲起来比较形象,更容易理解,所以基本是以图像处理为例讲解的。











这里说的前n-1个词不一定是从一句话的开始计算,从一句话的任意一个位置开始都是可以的,总之当前词前面的n-1个词就可以,而不管当前词具体在哪个位置。如果前面不足n-1个词,则有几个算几个。比如当前词在第t个位置,则其前面n-1个词为
w
t
−
n
+
1
w
t
−
n
+
2
⋯
w
t
−
2
w
t
−
1
w_{t-n+1}w_{t-n+2}\cdots w_{t-2} w_{t-1}
wt−n+1wt−n+2⋯wt−2wt−1 ,这n-1个词称作
w
t
{w_t}
wt 的“上下文”,用
c
o
n
t
e
x
t
(
w
t
)
context(w_t)
context(wt) 表示,其中
w
i
w_i
wi 表示词,n被称作窗口的大小,表示只考虑窗口内的n个词。

下图给出了一个最常见的用全连接神经网络实现的神经网络语言模型示意图。

图示的语言模型就是一个全连接神经网络,与普通的全连接网络不同的是,输入层分成了(n-1)组,每组m个输入,共(n-1)m个输入。每组输入共m个数值组成一个向量,对应 w t w_t wt 的上下文的一个词,该向量用 C ( w t − l ) ( l = 1 , 2 , . . . , n − 1 ) C(w_{t-l})(l=1,2,...,n-1) C(wt−l)(l=1,2,...,n−1) 表示。所有的 C ( w t − l ) C(w_{t-l}) C(wt−l) 拼接在一起组成一个长度为(n-1)m的向量,用 x = [ x 1 , x 2 , . . . , x ( n − 1 ) m ] x=[x_1,x_2, ..., x_{(n-1)m}] x=[x1,x2,...,x(n−1)m] 表示。如果不考虑分组的话,与普通全连接神经网络的输入层是一样的,也就是x是输入。
为什么要对输入分组呢?
长度为m的向量如何得到暂时不着急,现在只需知道一个词对应一个向量就可以了,后面再说如何得到这个向量。
接下来看图的隐含层,这一层没啥特殊性,就是普通的隐含层,共H个神经元,每个神经元都与输入层的神经元有连接,权重为
u
h
,
j
u_{h,j}
uh,j ,表示输入层第j个输入到隐含层第h个神经元的连接权重。隐含层的每个神经元连接一个双曲正切激活函数(tanh)作为该神经元的输出。隐含层所有神经元的输出组成向量
z
=
z
1
,
z
2
,
.
.
.
,
z
H
z = z_1,z_2,...,z_H
z=z1,z2,...,zH ,第h个神经元的输出用公式表示如下:
z
h
=
t
a
n
h
(
u
h
,
1
x
1
+
u
h
,
2
x
2
+
⋯
+
u
h
,
(
n
−
1
)
m
x
(
n
−
1
)
m
+
p
h
)
z_h = tanh(u_{h,1}x_1 + u_{h,2}x_2 + \cdots + u_{h,(n-1)m}x_{(n-1)m} + p_h)
zh=tanh(uh,1x1+uh,2x2+⋯+uh,(n−1)mx(n−1)m+ph)
其中 p h p_h ph 为第h个神经元的偏置。
输出层神经元的个数与词表的大小一致,一个神经元对应一个词,神经元连接softmax激活函数得到输出结果,每个神经元的输出值表示在当前上下文下, w n w_n wn 为该神经元对应的词时的概率。例如:假定输出层的第3个神经元对应“技术”一词,第5个神经元对应“工程”一词,当上下文为“清华大学 计算机 科学 与”时,则输出层第3个神经元的输出值就表示“清华大学 计算机 科学 与”之后连接“技术”一词的概率,而第5个神经元的输出值表示“清华大学 计算机 科学 与”之后连接“工程”一词的概率。
从隐含层到输出层也是全连接,每个输出层的神经元都与隐含层的神经元有连接,权重为
v
k
,
h
v_{k,h}
vk,h ,表示隐含层第h个神经元到输出层第k个神经元的连接权重。为了在输出层得到一个概率输出,最后加一个softmax激活函数。假设输出层所有神经元在连接激活函数前的输出组成向量
y
=
y
1
,
y
2
,
⋯
,
y
K
y = y_1,y_2,\cdots, y_K
y=y1,y2,⋯,yK ,其中K为词表长度,则第k个神经元的输出用公式表示如下:
y
k
=
v
k
,
1
z
1
+
v
k
,
2
z
2
+
⋯
+
v
k
,
H
z
H
+
q
k
y_k = v_{k,1}z_1 + v_{k,2}z_2 + \cdots + v_{k,H}z_H + q_k
yk=vk,1z1+vk,2z2+⋯+vk,HzH+qk
其中 q k q_k qk 为输出层第k个神经元的偏置。
加上softmax激活函数后,输出层第k个神经元的输出为:
p
(
w
=
k
∣
c
o
n
t
e
x
t
(
w
)
)
=
e
y
k
∑
i
=
1
K
e
y
i
p(w=k | context(w)) = \frac{e^{y_k}}{\sum_{i=1}^Ke^{y_i}}
p(w=k∣context(w))=∑i=1Keyieyk
表示的是输出层第k个神经元所对应的单词w出现在当前上下文后面的概率。
如何确定输出层哪个神经元对应哪个词呢?
那么这个神经网络语言模型如何训练呢?



p
(
“计算机科学”,“计算机科学”,“计算机工程”)的导数
p(“计算机科学”,“计算机科学”,“计算机工程”)的导数
p(“计算机科学”,“计算机科学”,“计算机工程”)的导数
=
p
(
科学
∣
计算机
)
2
(
1
−
p
(
科学
∣
计算机
)
)
的导数
= p(科学 | 计算机)^2(1-p(科学|计算机)) 的导数
=p(科学∣计算机)2(1−p(科学∣计算机))的导数
=
2
p
(
科学
∣
计算机
)
3
p
(
(
科学
∣
计算机
)
)
2
= 2p(科学 | 计算机)3p((科学|计算机))^2
=2p(科学∣计算机)3p((科学∣计算机))2
令
2
p
(
科学
∣
计算机
)
3
p
(
(
科学
∣
计算机
)
)
2
=
0
,有
令 2p(科学 | 计算机)3p((科学|计算机))^2 = 0,有
令2p(科学∣计算机)3p((科学∣计算机))2=0,有
2
−
3
p
(
科学
∣
计算机
)
=
0
2-3p(科学 | 计算机) = 0
2−3p(科学∣计算机)=0


其中 θ \theta θ 表示神经网络的所有参数,C表示语料库,符号“ Π \Pi Π ”表示连乘的意思。式子 Π w ϵ C p ( w = k ∣ c o n t e x t ( w ) , θ ) \underset {w\epsilon C}\Pi p(w=k|context(w), \theta) wϵCΠp(w=k∣context(w),θ) 称为似然函数。所以,我们的目标就是训练神经网络语言模型,确定参数 θ \theta θ ,使得似然函数在给定的训练集上最大。
训练神经网络一般是用BP算法求损失函数最小,这里是要求最大,所以需要通过一个变换就可以将最大化问题转化为最小化问题。为了计算方便,我们首先通过对似然函数做对数运算,将连乘变换为连加,因为经过对数运算后,原来的连乘就变换为连加了。
m a x θ Π w ϵ C p ( w = k ∣ c o n t e x t ( w ) , θ ) \underset {\theta}{max} \underset {w\epsilon C}\Pi p(w=k|context(w), \theta) θmaxwϵCΠp(w=k∣context(w),θ)
