本文是博主的学习笔记,因为对玻尔兹曼机的研究不够深入,因此文章主要是根据学习资料和自己的理解浅显的叙述一遍从玻尔兹曼机到受限玻尔兹曼机,再到对比散度算法,最后到深度信念网络的过程,如有不妥的地方,还望批评改正。
玻尔兹曼机
在Hopfield神经网络中,如果发生串扰和陷入局部最优解,网络将不能正确回忆模式,而玻尔兹曼机的出现避免了局部最优解。 玻尔兹曼机网络的结构和Hopfield一样,如下图所示:
各神经单元之间相互连接,两单元之间的权重是对称的,即
w
i
j
=
w
j
i
w_{ij}=w_{ji}
wij=wji,且没有到自身的连接,即
w
i
i
=
0
w_{ii}=0
wii=0,同时,每个神经单元的状态只能是0/1(也可用1/-1表示)。
玻尔兹曼机和Hopfield神经网络最大的区别是前者的输出是按照某种概率分布确定的,概率分布公式如下:
{
p
(
x
i
=
1
∣
u
i
)
=
e
x
p
(
x
K
T
)
1
+
e
x
p
(
x
K
T
p
(
x
i
=
0
∣
u
i
)
=
1
1
+
e
x
p
(
x
K
T
(
1
)
\begin{cases} p(x_i=1|u_i) = \frac{exp(\frac x{KT})}{1+exp(\frac x{KT}} \\ p(x_i=0|u_i) = \frac{1}{1+exp(\frac x{KT}} \end{cases} \quad \quad(1)
{p(xi=1∣ui)=1+exp(KTxexp(KTx)p(xi=0∣ui)=1+exp(KTx1(1)
如何训练玻尔兹曼机
训练步骤如下:
- 初始化连接权重 w i j w_{ij} wij和阈值 b i b_i bi;
- 选取一个神经单元 i i i,计算 u i u_i ui;
- 根据 u i u_i ui计算输出 x i x_i xi;
- 按照同样的步骤计算出 x j x_j xj,根据输出 x i x_i xi和 x j x_j xj的值,调整连接权重 w i j w_{ij} wij和阈值 b i b_i bi。
重复上述2-4步骤。
步骤中 u i u_i ui的计算与Hopfield神经网络一样, x i x_i xi的值也同Hopfield,即当 u i u_i ui>0时 x i = 1 x_i=1 xi=1,当 u i < 0 u_i<0 ui<0时 x i = 0 x_i=0 xi=0,当 u i = 0 u_i=0 ui=0时 x i = x i x_i=x_i xi=xi。然后根据 x i x_i xi的值,利用公式(1)计算出 x i x_i xi取值为1或0的概率,然后调整 x i x_i xi的值,以同样的步骤计算 x j x_j xj,如果 x i x_i xi和 x j x_j xj均为1,那么增大 w i j w_{ij} wij,网络中其它的神经单元按找同样的方法处理。
然后再向网络输入任意的模式,按照同样的步骤计算 x i x_i xi和 x j x_j xj,这次如果 x i x_i xi和 x j x_j xj均为1,那么降低 w i j w_{ij} wij,网络中其余的神经单元按照同样的方法进行处理。这种先增大权重再减小的处理方式叫做模拟退火算法。
那么,权重 w i j w_{ij} wij和偏置 b i b_i bi的调整值如何调整?
这里使用似然函数导出:
L
(
θ
)
=
∏
n
=
1
N
p
(
x
n
∣
θ
)
(
2
)
L(\theta)=\prod_{n=1}^Np(x_n|\theta) \quad \quad (2)
L(θ)=n=1∏Np(xn∣θ)(2)
这里,
θ
\theta
θ是表示所有的权重和偏差,其中概率分布
p
(
x
n
∣
θ
)
p(x_n|\theta)
p(xn∣θ)的定义如下:
p
(
x
n
∣
θ
)
=
1
Z
(
θ
)
e
x
p
{
−
E
(
x
,
θ
)
}
(
3
)
p(x_n|\theta)=\frac 1{Z(\theta)}exp\{-E(x,\theta)\} \quad\quad(3)
p(xn∣θ)=Z(θ)1exp{−E(x,θ)}(3)
这个概率分布成为玻尔兹曼机,
E
E
E表示能量函数,
Z
(
θ
)
Z(\theta)
Z(θ)是一个归一化常数,能保证所有概率分布总和为1,
Z
(
θ
)
=
∑
x
e
x
p
{
−
E
(
x
,
θ
)
}
(
4
)
Z(\theta)=\sum_xexp\{-E(x,\theta)\} \quad \quad (4)
Z(θ)=x∑exp{−E(x,θ)}(4)
为了便于运算,式(2)转换为对数函数,如下:
l
o
g
L
(
θ
)
=
∑
n
=
1
N
l
o
g
p
(
x
n
∣
θ
)
(
5
)
logL(\theta)=\sum_{n=1}^Nlogp(x_n|\theta) \quad \quad (5)
logL(θ)=n=1∑Nlogp(xn∣θ)(5)
其实通过式(5)调整权重和偏置的过程就是求式(5)的梯度的过程,但目前由于计算量过大,不能快速实时计算,因此人们又提出了一种对比散度算法,这将在之后就行说明。
受限玻尔兹曼机
除了上面所说的玻尔兹曼机的网络结构之外,还有一种网络结构是将一部分神经单元隐藏起来,那么整个网络变成由可见单元与隐藏单元组成,但这使得似然函数的计算更加困难,为了解决这个问题,辛顿等人在玻尔兹曼机中加入了"层内单元之间无连接"的限制,这被成为受限玻尔兹曼机(RBM)。我们把可见变量记作
v
v
v,隐藏变量记作
h
h
h,那么受限玻尔兹曼机的能量函数表示如下:
E
(
v
,
h
,
θ
)
=
−
∑
i
=
1
n
b
i
v
i
−
∑
j
=
1
m
c
j
h
j
−
∑
i
=
1
n
∑
j
=
1
m
w
i
j
v
i
h
j
E(v,h,\theta)=-\sum_{i=1}^nb_iv_i-\sum_{j=1}^mc_jh_j-\sum_{i=1}^n\sum_{j=1}^mw_{ij}v_ih_j
E(v,h,θ)=−i=1∑nbivi−j=1∑mcjhj−i=1∑nj=1∑mwijvihj
这里,
θ
\theta
θ是表示所有权重和偏置,
b
i
b_i
bi表示第
i
i
i个可见神经单元的偏置,
c
j
c_j
cj表示第
j
j
j个隐藏神经单元的偏置。
在受限玻尔兹曼机中,状态
(
v
,
h
)
(v,h)
(v,h)的联合概率分布为:
p
(
v
,
h
∣
θ
)
=
1
Z
e
x
p
{
−
E
(
v
,
h
,
θ
)
}
Z
=
∑
v
,
h
e
x
p
{
−
E
(
v
,
h
,
θ
)
}
p(v,h|\theta)=\frac 1Zexp\{-E(v,h,\theta)\}\\ Z=\sum_{v,h}exp\{-E(v,h,\theta)\}
p(v,h∣θ)=Z1exp{−E(v,h,θ)}Z=v,h∑exp{−E(v,h,θ)}
如何训练?
受限玻尔兹曼机的结构可以表示如下:
和玻尔兹曼机一样,训练过程中对权重
w
i
j
w_{ij}
wij和偏置
b
i
,
c
j
b_i,c_j
bi,cj的调整也需要使用对数似然函数,表示如下:
l
o
g
L
(
θ
∣
v
)
=
l
o
g
1
Z
∑
h
e
x
p
{
−
E
(
v
,
h
,
θ
)
}
logL(\theta|v)=log\frac 1 Z \sum_hexp\{-E(v,h,\theta)\}
logL(θ∣v)=logZ1h∑exp{−E(v,h,θ)}
对各参数的调整使用的是误差反向传播算法,分别计算各参数的偏导得:
∂
l
o
g
L
(
θ
∣
h
)
∂
w
i
j
=
p
(
H
j
=
1
∣
v
)
v
i
−
∑
v
p
(
v
)
p
(
H
j
=
1
∣
v
)
v
i
∂
l
o
g
L
(
θ
∣
h
)
∂
b
i
=
v
i
−
∑
v
p
(
v
)
v
i
∂
l
o
g
L
(
θ
∣
h
)
∂
c
j
=
p
(
H
j
=
1
∣
v
)
−
∑
v
p
(
v
)
p
(
H
j
=
1
∣
v
)
\frac{\partial logL(\theta|h)}{\partial w_{ij}}=p(H_j=1|v)v_i-\sum_vp(v)p(H_j=1|v)v_i \\ \frac{\partial logL(\theta|h)}{\partial b_{i}}=v_i-\sum_v p(v)v_i \\ \frac{\partial logL(\theta|h)}{\partial c_{j}}=p(H_j=1|v)-\sum_v p(v)p(H_j=1|v)
∂wij∂logL(θ∣h)=p(Hj=1∣v)vi−v∑p(v)p(Hj=1∣v)vi∂bi∂logL(θ∣h)=vi−v∑p(v)vi∂cj∂logL(θ∣h)=p(Hj=1∣v)−v∑p(v)p(Hj=1∣v)
然后,各参数得更新如下:
w
i
j
←
w
i
j
−
∂
l
o
g
L
(
θ
∣
h
)
∂
w
i
j
b
i
←
b
i
−
∂
l
o
g
L
(
θ
∣
h
)
∂
b
i
c
j
←
c
j
−
∂
l
o
g
L
(
θ
∣
h
)
∂
c
j
w_{ij} \leftarrow w_{ij}-\frac{\partial logL(\theta|h)}{\partial w_{ij}} \\ b_i \leftarrow b_i -\frac{\partial logL(\theta|h)}{\partial b_{i}} \\ c_j \leftarrow c_j -\frac{\partial logL(\theta|h)}{\partial c_{j}}
wij←wij−∂wij∂logL(θ∣h)bi←bi−∂bi∂logL(θ∣h)cj←cj−∂cj∂logL(θ∣h)
但是上式中得
∑
v
p
(
v
)
\sum_vp(v)
∑vp(v)表示所有输入模式得总和,这使得整个公式得计算量大大增加,同样的,为了解决这个问题可以使用对比散度算法。
对比散度算法
算法训练过程
- 使用随机数初始化权重和偏置;
- 在可见层 v ( 0 ) v^{(0)} v(0)设置输入模式;
- 根据概率分布公式调整隐藏层中 h ( 0 ) h^{(0)} h(0)的值;
- 根据输出 x i x_i xi和 x j x_j xj的值,调整连接权重 w i j w_{ij} wij、偏置 b i b_i bi和 c j c_j cj。
最后,重复步骤2-4。
这里,步骤2-3描述的过程的计算公式为(以通过初始可见层计算隐藏层的值为例):
p
(
h
j
(
0
)
=
1
∣
v
(
0
)
)
=
σ
(
∑
i
=
1
n
w
i
j
v
i
(
0
)
+
c
j
)
p(h^{(0)}_j=1|v^{(0)})=\sigma \left( \sum_{i=1}^nw_{ij} v^{(0)}_i +c_j \right)
p(hj(0)=1∣v(0))=σ(i=1∑nwijvi(0)+cj)
那么接下来:
p
(
v
i
(
1
)
=
1
∣
h
(
0
)
)
=
σ
(
∑
j
=
1
m
w
i
j
h
j
(
0
)
+
b
i
)
p(v^{(1)}_i=1|h^{(0)})=\sigma \left( \sum_{j=1}^mw_{ij} h^{(0)}_j +b_i \right)
p(vi(1)=1∣h(0))=σ(j=1∑mwijhj(0)+bi)
这里
σ
\sigma
σ表示sigmoid激活函数,为:
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac 1 {1+e^{-x}}
f(x)=1+e−x1
按照同样的规律迭代步骤2-3。一般在对比散度算法中,只迭代一次足够。
最终,连接权重
w
i
j
w_{ij}
wij、偏置
b
i
b_i
bi和
c
j
c_j
cj的调整值变为了:
w
i
j
←
w
i
j
+
η
(
p
(
h
j
(
0
)
=
1
∣
v
(
0
)
)
v
i
(
0
)
−
p
(
h
j
(
1
)
=
1
∣
v
(
1
)
)
v
i
(
1
)
)
b
i
←
b
i
+
η
(
v
i
(
0
)
−
v
i
(
1
)
)
c
j
←
c
j
+
η
(
p
(
h
j
(
0
)
=
1
∣
v
(
0
)
)
−
p
(
h
j
(
1
)
=
1
∣
v
(
1
)
)
)
w_{ij} \leftarrow w_{ij}+\eta(p(h^{(0)}_j=1|v^{(0)})v^{(0)}_i-p(h^{(1)}_j=1|v^{(1)})v^{(1)}_i) \\ b_i \leftarrow b_i +\eta (v^{(0)}_i-v^{(1)}_i) \\ c_j \leftarrow c_j +\eta (p(h^{(0)}_j=1|v^{(0)})-p(h^{(1)}_j=1|v^{(1)}))
wij←wij+η(p(hj(0)=1∣v(0))vi(0)−p(hj(1)=1∣v(1))vi(1))bi←bi+η(vi(0)−vi(1))cj←cj+η(p(hj(0)=1∣v(0))−p(hj(1)=1∣v(1)))
这里,
η
\eta
η和神经网络一样,表示学习率。此时我们根据上式计算所有训练样本的参数,最后取平均值就是网络最后的参数。
深度信念网络
深度信念网络的结构不像受限玻尔兹曼机一样只有两层,而是由一层可见层和多层隐藏层组成,训练时使用对比散度算法先训练可见层与第一层隐藏层之间的参数,然后将这些参数作为下一层隐藏层的输入,计算第二层隐藏层,如此循环下去,直到训练到最后一层。
各层的条件概率分布如下:
p
(
h
(
l
)
∣
h
(
l
−
1
)
)
=
(
∏
i
f
(
b
i
(
l
)
)
+
∑
j
w
i
j
(
l
−
1
)
h
j
(
l
−
1
)
)
p(h^{(l)}|h^{(l-1)})=(\prod_i f(b_i^{(l)})+\sum_{j}w_{ij}^{(l-1)}h_j^{(l-1)}) \\
p(h(l)∣h(l−1))=(i∏f(bi(l))+j∑wij(l−1)hj(l−1))
计算第二层隐藏层,如此循环下去,直到训练到最后一层。
各层的条件概率分布如下:
p
(
h
(
l
)
∣
h
(
l
−
1
)
)
=
(
∏
i
f
(
b
i
(
l
)
)
+
∑
j
w
i
j
(
l
−
1
)
h
j
(
l
−
1
)
)
p(h^{(l)}|h^{(l-1)})=(\prod_i f(b_i^{(l)})+\sum_{j}w_{ij}^{(l-1)}h_j^{(l-1)}) \\
p(h(l)∣h(l−1))=(i∏f(bi(l))+j∑wij(l−1)hj(l−1))