Boltzmann machines and energy-based models
EBM
EBMs简单的说,就是用一个标量——energy 来描述某个变量配置的好坏。在统计力学中,一般认为低能量值的状态比高能量值的状态发生的概率高,所以一般也会认为在EBMs中,真实的样本对应着低能量值,也对应着高的概率值。
P
(
x
)
=
e
−
E
(
x
)
Z
P(x)=\frac{e^{-E(x)}}{Z}
P(x)=Ze−E(x)
其中
Z
=
∫
x
e
−
E
(
x
)
d
x
Z=\int_x e^{-E(x)}dx
Z=∫xe−E(x)dx。如果我们想描述一个联合概率分布,比如
(
x
,
y
)
(x,y)
(x,y),那么同样可以用EBMs来描述:
P
(
x
,
y
)
=
e
−
E
(
x
,
y
)
Z
P(x,y)=\frac{e^{-E(x,y)}}{Z}
P(x,y)=Ze−E(x,y),其中
Z
=
∫
x
,
y
e
−
E
(
x
,
y
)
d
x
d
y
Z=\int_{x,y}e^{-E(x,y)}dxdy
Z=∫x,ye−E(x,y)dxdy。显然,这是一个生成模型,可以学习数据的分布,我们知道,生成模型往往也可以用于定义一个判别模型,通过
P
(
y
∣
x
)
=
P
(
x
,
y
)
P
(
x
)
P(y|x)=\frac{P(x,y)}{P(x)}
P(y∣x)=P(x)P(x,y),那么我们可以将上面的
P
(
x
,
y
)
P(x,y)
P(x,y)改写,
P
(
y
∣
x
)
=
e
−
E
(
x
,
y
)
Z
′
P(y|x)=\frac{e^{-E(x,y)}}{Z'}
P(y∣x)=Z′e−E(x,y),其中
Z
′
=
∫
x
e
−
E
(
x
,
y
)
d
x
Z'=\int_x e^{-E(x,y)}dx
Z′=∫xe−E(x,y)dx。
Z
Z
Z存在的目的是使得对于变量的所有配置的概率值sum是1(在
P
(
y
∣
x
)
=
e
−
E
(
x
,
y
)
Z
′
P(y|x)=\frac{e^{-E(x,y)}}{Z'}
P(y∣x)=Z′e−E(x,y)中就是使得所有可能y值对应的概率值之和为1),且所有概率值控制在(0,1]之间。
EBM with hidden units
很多时候,不是所有的变量都是可观测的,但我们仍然要在基于观测变量的数据集上给出观测变量的分布:
P
(
x
)
=
∫
h
P
(
x
,
h
)
=
∫
h
e
−
E
(
x
,
h
)
Z
P(x)=\int_h P(x,h)=\int_h \frac{e^{-E(x,h)}}{Z}
P(x)=∫hP(x,h)=∫hZe−E(x,h)
当
h
h
h是离散变量时
P
(
x
)
=
∑
h
e
−
E
(
x
,
h
)
Z
P(x)=\sum_h \frac{e^{-E(x,h)}}{Z}
P(x)=∑hZe−E(x,h),而这进一步可以化成最初的EBM的形式:
P
(
x
)
=
e
−
l
o
g
∑
h
E
(
x
,
h
)
Z
P(x)=\frac{e^{-log\sum_h E(x,h)}}{Z}
P(x)=Ze−log∑hE(x,h)
这时分子可以称为Free energy,即
F
(
x
)
=
−
l
o
g
∑
h
E
(
x
,
h
)
F(x)=-log\sum_h E(x,h)
F(x)=−log∑hE(x,h)。
How to train EBMs
这里只介绍一下基础的基于梯度下降的方式的训练方式,还有Score Matching以及Noise Contrastive Estimation暂且不介绍。
当我们用一个EBM来描述数据的概率分布时,我们自然希望与真实的数据分布很接近,这就用到了MLE(最大似然估计),MLE可以简单地理解为,希望真实的数据发生在模型描述的概率分布下的可能性越大越好。
所以我们可以用 L = − 1 N ∑ i N l o g P θ ( x i ) L=-\frac{1}{N}\sum_i^N log P_\theta(x_i) L=−N1∑iNlogPθ(xi)来计算损失。假设数据真实的分布是 P d P_{d} Pd,这个计算损失函数的过程可以描述成:每次从 P d P_d Pd采集 n n n(以下假设 n = 1 n=1 n=1)个样本,我们需要计算这个样本在 P θ P_\theta Pθ概率分布下的概率密度,损失函数取该密度的负数,每次向使得该损失值小的方向更新参数 θ \theta θ。
如果我们计算损失函数关于
θ
\theta
θ的梯度,每次只需要计算
−
l
o
g
P
θ
(
x
)
-log P_\theta(x)
−logPθ(x)关于
θ
\theta
θ的参数即可。
∂
θ
l
o
g
θ
(
x
)
=
−
∂
θ
E
θ
(
x
)
−
∂
θ
l
o
g
Z
θ
=
−
∂
θ
E
θ
(
x
)
−
∂
θ
l
o
g
∫
e
−
E
(
x
)
d
x
=
−
∂
θ
E
θ
(
x
)
−
(
∫
e
−
E
θ
(
x
)
d
x
)
−
1
∂
θ
∫
e
−
E
(
x
)
d
x
=
−
∂
θ
E
θ
(
x
)
−
(
∫
e
−
E
θ
(
x
)
d
x
)
−
1
∫
∂
θ
e
−
E
(
x
)
d
x
=
−
∂
θ
E
θ
(
x
)
+
(
Z
)
−
1
∫
e
−
E
θ
(
x
)
∂
θ
E
θ
(
x
)
d
x
s
=
−
∂
θ
E
θ
(
x
)
+
(
Z
)
−
1
∫
P
θ
(
x
)
Z
∂
θ
E
θ
(
x
)
d
x
=
−
∂
θ
E
θ
(
x
)
+
∫
P
θ
(
x
)
∂
θ
E
θ
(
x
)
d
x
=
−
∂
θ
E
θ
(
x
)
+
E
x
∼
P
θ
(
x
)
∂
θ
E
θ
(
x
)
\partial_\theta log_\theta(x)=-\partial_\theta E_\theta(x)-\partial_\theta log Z_\theta\\ =-\partial_\theta E_\theta(x)-\partial_\theta log\int e^{-E(x)}dx\\ =-\partial_\theta E_\theta(x)-(\int e^{-E_\theta(x)}dx)^{-1}\partial_\theta \int e^{-E(x)}dx\\ =-\partial_\theta E_\theta(x)-(\int e^{-E_\theta(x)}dx)^{-1} \int\partial_\theta e^{-E(x)}dx\\ =-\partial_\theta E_\theta(x)+(Z)^{-1} \int e^{-E_\theta(x)}\partial_\theta E_\theta(x)dxs\\ =-\partial_\theta E_\theta(x)+(Z)^{-1} \int P_\theta(x)Z\partial_\theta E_\theta(x)dx\\ =-\partial_\theta E_\theta(x)+ \int P_\theta(x)\partial_\theta E_\theta(x)dx\\ =-\partial_\theta E_\theta(x)+ E_{x\sim P_\theta(x)}\partial_\theta E_\theta(x)\\
∂θlogθ(x)=−∂θEθ(x)−∂θlogZθ=−∂θEθ(x)−∂θlog∫e−E(x)dx=−∂θEθ(x)−(∫e−Eθ(x)dx)−1∂θ∫e−E(x)dx=−∂θEθ(x)−(∫e−Eθ(x)dx)−1∫∂θe−E(x)dx=−∂θEθ(x)+(Z)−1∫e−Eθ(x)∂θEθ(x)dxs=−∂θEθ(x)+(Z)−1∫Pθ(x)Z∂θEθ(x)dx=−∂θEθ(x)+∫Pθ(x)∂θEθ(x)dx=−∂θEθ(x)+Ex∼Pθ(x)∂θEθ(x)
因而,对
−
l
o
g
P
θ
(
x
)
-log P_\theta(x)
−logPθ(x)求梯度,可以用如下操作:每次从数据集(真实分布)中取出某个正样本,然后从
P
θ
P_\theta
Pθ中取出某个负样本,然后计算这两个样本的的能量值关于参数
θ
\theta
θ的导数。随着损失函数的减小,真实样本的能量值将会减小,而从
P
θ
P_\theta
Pθ中采样的负样本的能量值将会增大。从而使得这个
E
θ
E_\theta
Eθ能够很好地描述真实样本的分布。
Boltzmann Machines
玻尔兹曼机是一种对称连接的网络,是一个完全图,任意两个单元之间互相连接。一般来说,每个单元只有激活和非激活两种状态(有些模型中也可能是非二进制状态)。包含一个隐藏层和可见层,由此可知,这可以用带隐变量的EBM来建模。
用
v
i
v_i
vi和
h
j
h_j
hj分别表示可见单元
i
i
i和隐藏单元
j
j
j,
v
v
v和
h
h
h的联合概率分布为:
P
(
v
,
h
)
=
1
Z
e
−
E
(
v
,
h
)
P(v,h)=\frac{1}{Z}e^{-E(v,h)}
P(v,h)=Z1e−E(v,h)
其中,
Z
=
∑
v
,
h
e
−
E
(
v
,
h
)
Z=\sum_{v,h}e^{-E(v,h)}
Z=∑v,he−E(v,h)。其中
E
(
v
,
h
)
=
−
h
T
W
v
−
c
T
v
−
b
T
h
−
v
T
U
v
−
h
T
V
h
E(v,h)=-h^TWv-c^Tv-b^Th-v^TUv-h^TVh
E(v,h)=−hTWv−cTv−bTh−vTUv−hTVh。
玻尔兹曼机的问题在于,每个单元的概率都与所有其他单元之间有边连接,也就是每个单元必须是其他单元的线性可分函数,这样的训练可能比较困难(还不太清楚为什么困难)。Restricted Boltzmann Machine是对玻尔兹曼机的一种简化。
Restricted Boltzmann Machine
相对于玻尔兹曼机,简化在哪:隐藏层的单元之间没有节点相连接,可见层的单元之间也没有节点相连接,因而能量函数 E ( v , h ) = − h T W v − c T v − b T h E(v,h)=-h^TWv-c^Tv-b^Th E(v,h)=−hTWv−cTv−bTh。
由于所有单元只有激活和非激活两种状态,所以我们可以用二项分布来建模每个单元的概率分布。
从概率图的角度理解RBM
- 基于RBM有哪些问题:一般来说,对于概率图模型,会有两种问题:Learning 和Inference,前者是在给定数据的情况下,学习模型的参数或结构,后者是给定模型的参数和结构,由已知变量的值推断出未知变量的值,放在RBM中,Learning便是学习模型的参数,即 W 、 c 、 b W、c、b W、c、b,而Inference可以是给定了 W ′ 、 c ′ 、 b ′ W'、c'、b' W′、c′、b′,以及观测单元的值,我们去推断此时隐藏单元的值。
- RBM的本质:RBM是一种概率无向图模型,它是一种生成模型,也就是说它可以用于建模数据的分布。怎么建模:可以从自编码器的角度理解,可见层相当于输入,隐藏层每个单元的取值构成隐藏编码,当给定一个训练样本时,我们计算出隐藏层各个单元的分布,得到隐藏编码,我们希望这个编码能够尽可能的描述可见层的信息(可能可以理解成降维),然后由隐藏层,我们可以得到可见层的每个单元的分布,从而生成一个样本。
计算条件概率
- 当可见层给定时,怎么求第 j j j个隐藏层单元的分布:
在给定可见层单元的值时,只与可见层
v
v
v相关的项可以认为已知,由
E
(
v
,
h
)
=
−
h
T
W
v
−
c
T
v
−
b
T
h
−
v
T
U
v
−
h
T
V
h
E(v,h)=-h^TWv-c^Tv-b^Th-v^TUv-h^TVh
E(v,h)=−hTWv−cTv−bTh−vTUv−hTVh且
P
(
v
,
h
)
=
1
Z
e
−
E
(
v
,
h
)
P(v,h)=\frac{1}{Z}e^{-E(v,h)}
P(v,h)=Z1e−E(v,h)得到:
P
(
h
∣
v
)
=
P
(
h
,
v
)
P
(
v
)
=
1
Z
′
e
h
T
W
v
+
b
T
h
=
1
Z
′
e
∑
j
h
j
T
W
:
,
j
v
j
+
b
j
T
h
j
=
1
Z
′
∏
j
e
h
j
T
W
:
,
j
v
j
+
b
j
T
h
j
P(h|v)=\frac{P(h,v)}{P(v)}\\ =\frac{1}{Z'}e^{h^TWv+b^Th}\\ =\frac{1}{Z'}e^{\sum_j h_j^TW_:,jv_j+b^T_jh_j}\\ =\frac{1}{Z'}\prod_je^{h_j^TW_:,jv_j+b^T_jh_j}
P(h∣v)=P(v)P(h,v)=Z′1ehTWv+bTh=Z′1e∑jhjTW:,jvj+bjThj=Z′1j∏ehjTW:,jvj+bjThj
P ( h j = 1 ∣ v ) = P ( h j = 1 ∣ v ) P ( h j = 1 ∣ v ) + P ( h j = 0 ∣ v ) = e W : , j v j + b j T e W : , j v j + b j T + 1 = s i g m o i d ( W : , j v j + b j T ) P(h_j=1|v)=\frac{P(h_j=1|v)}{P(h_j=1|v)+P(h_j=0|v)}\\ =\frac{e^{W_{:,j}v_j+b_j^T}}{e^{W_{:,j}v_j+b_j^T}+1}\\ =sigmoid(W_{:,j}v_j+b_j^T) P(hj=1∣v)=P(hj=1∣v)+P(hj=0∣v)P(hj=1∣v)=eW:,jvj+bjT+1eW:,jvj+bjT=sigmoid(W:,jvj+bjT)
由于隐藏单元符合二项分布,所以有了 P ( h j = 1 ∣ v ) P(h_j=1|v) P(hj=1∣v),便能够给出第 j j j个隐藏层的分布。
- 当隐藏层给定时,怎么求第 j j j个可见层单元的分布:
P ( v j ∣ h ) = s i g m o i d ( W : , j h j + a j ) P(v_j|h)=sigmoid(W_{:,j}h_j+a_j) P(vj∣h)=sigmoid(W:,jhj+aj)
因而,我们可以再次借助采样方法,根据求得的分布来得到隐藏层或者是可见层的样本。这便完成了概率图的Inference。
How to train RBM
关于概率图的Learning工作,损失函数和前面介绍基于能量的模型的训练方式相同,是负对数似然。参考博客中也有给出,具体做法是,损失函数对 W 、 c 、 b W、c、b W、c、b求偏导,然后向着损失函数减小的方向更新参数。
但是,我们仍然能够看到,这个RBM其实就是对EBM的能量函数进行了修改,将 θ \theta θ具体地分成了三个参数 W 、 c 、 b W、c、b W、c、b,我们将 − l o g P θ ( v , h ) -log P_\theta(v,h) −logPθ(v,h)对每个参数分别求导,仍然会得到 ∂ θ E θ ( v , h ) − E ( v , h ) ∼ P θ ( v , h ) ∂ θ E θ ( v , h ) \partial_\theta E_\theta(v,h)- E_{(v,h)\sim P_\theta(v,h)}\partial_\theta E_\theta(v,h) ∂θEθ(v,h)−E(v,h)∼Pθ(v,h)∂θEθ(v,h),所以这里我们更新参数的方法:以 c c c的更新为例,取一个真实样本(可见层的输入) ( v , h ) (v,h) (v,h),计算能量函数对 c c c偏导,然后用某一个采样方式得到RBM模型对应的分布的某个负样本 ( v ′ , h ′ ) (v',h') (v′,h′),计算 E θ ( v ′ , h ′ ) E_\theta(v',h') Eθ(v′,h′)对 c c c的偏导,相减即可得到损失函数对 c c c的偏导,然后 c c c向着这个值的负方向进行移动即可。
由于 h h h是隐藏单元,不可能直接提供一个真实的值,所以这里需要借助Gibbs采样,前面提到了如何从可见层的值,得到每个隐藏单元的分布,所以这里的 h j ∼ B ( 1 , P ( h j = 1 ∣ v ) ) h_j\sim B(1,P(h_j=1|v)) hj∼B(1,P(hj=1∣v)),而 h j ′ ∼ B ( 1 , P ( h j ′ = 1 ∣ v ′ ) ) h'_j\sim B(1,P(h_j'=1|v')) hj′∼B(1,P(hj′=1∣v′))。
采样
在前面关于EBM的Learning问题中,都遇到了采样的问题,这可以依赖MCMC,Langevin Dynamic Sampling等等。
参考:
https://blog.csdn.net/chlele0105/article/details/17309491
https://blog.csdn.net/qq_39388410/article/details/78306190