当前位置:   article > 正文

RBM受限玻尔兹曼机的公式推导及代码实现(matlab)_玻尔兹曼分布与matlab实现

玻尔兹曼分布与matlab实现

  考虑一组具有 m m m个样本的数据集 X = { x ( 1 ) , … , x ( m ) } \mathbb{X}=\{x^{(1)},\dots,x^{(m)}\} X={x(1),,x(m)},独立地由真实数据生成分布 p d a t a ( x ) p_{data}(x) pdata(x)生成。令 p m o d e l ( x ; θ ) p_{model}(x;\theta) pmodel(x;θ)是一族由 θ \theta θ确定在相同空间上的概率分布,换言之, p m o d e l ( x ; θ ) p_{model}(x;\theta) pmodel(x;θ)将任意输入 x x x映射到实数来估计真实概率 p d a t a ( x ) p_{data}(x) pdata(x)。对 θ \theta θ的最大似然估计被定义为
θ M L = a r g m a x θ p m o d e l ( X ; θ ) = a r g m a x θ ∏ i = 1 m p m o d e l ( x ( i ) ; θ ) (1) \theta_{ML}=argmax_\theta p_{model}(\mathbb{X};\theta)=argmax_\theta\prod_{i=1}^m p_ {model}(x^{(i)};\theta) \tag{1} θML=argmaxθpmodel(X;θ)=argmaxθi=1mpmodel(x(i);θ)(1)
  因为多个概率的乘积不便于计算,便转为求和形式
θ M L = a r g m a x θ ∑ i = 1 m l o g p m o d e l ( x ( i ) ; θ ) (2) \theta_{ML}=argmax_\theta\sum_{i=1}^mlogp_{model}(x^{(i)};\theta)\tag{2} θML=argmaxθi=1mlogpmodel(x(i);θ)(2)
  重新缩放代价函数时,对优化结果没有影响,可以除以 m m m,从而以训练数据经验分布 p ^ d a t a \hat{p}_{data} p^data的期望作为准则
θ M L = a r g m a x θ E x ∼ p ^ d a t a l o g p m o d e l ( x ; θ ) (3) \theta_{ML}=argmax_\theta\mathbb{E}_{x\sim\hat{p}_{data}}logp_{model}(x;\theta) \tag{3} θML=argmaxθExp^datalogpmodel(x;θ)(3)
  一种关于最大似然估计的观点是看作最小化训练集上的经验分布 p ^ d a t a \hat{p}_{data} p^data和模型分布 p m o d e l p_{model} pmodel之间的差异,差异可以通过 K L KL KL散度定义为
D K L ( p ^ d a t a ∣ ∣ p m o d e l ) = E x ∼ p ^ d a t a [ l o g p ^ d a t a ( x ) − l o g p m o d e l ( x ) ] (4) D_{KL}(\hat{p}_{data}||p_{model})=\mathbb{E}_{x\sim\hat{p}_{data}}[log\hat{p}_{data}(x)-logp_{model}(x)] \tag{4} DKL(p^datapmodel)=Exp^data[logp^data(x)logpmodel(x)](4)
左边仅涉及数据生成过程,和模型无关,所以只需要最小化
θ M L = a r g m i n θ − E x ∼ p ^ d a t a l o g p m o d e l ( x ; θ ) (5) \theta_{ML}=argmin_\theta-\mathbb{E}_{x\sim\hat{p}_{data}}logp_{model}(x;\theta) \tag{5} θML=argminθExp^datalogpmodel(x;θ)(5)
我们可以将最大似然看作使模型分布尽可能和经验分布 p ^ d a t a \hat{p}_{data} p^data相匹配,理想情况下能够匹配真实分布 p d a t a p_{data} pdata,但我们无法直接知道这个真实分布。
  考虑用受限玻尔兹曼机RBM来对 p m o d e l p_{model} pmodel进行建模,RBM有两层,分别称为可见层(visible layer)和隐藏层(hidden layer),可见层为可观察变量 v v v,隐藏层为潜变量 h h h。层内无连接,层间全连接,是一个二分网络结构,所以当给定可见层神经元状态时,隐藏层各神经元条件独立,反之亦然。可见层神经单元用来描述观察数据,隐藏层神经单元可以看作特征提取层。
RBM结构
  就像普通的玻尔兹曼机,受限玻尔兹曼机也是基于能量的模型,其联合概率分布由能量函数指定(能量函数的概念最早来自于统计热力学家研究磁体的易辛模型,后来被Hinton借鉴发展为RBM模型)
P θ ( v = v , h = h ) = 1 Z e x p ( − E ( v , h ) ) = 1 Z ( θ ) e x p ( ∑ i = 1 D ∑ j = 1 F W i j v i h j + ∑ i = 1 D v i b i + ∑ j = 1 F h j a j ) (6) P_\theta(\mathtt{v}=v,\mathtt{h}=h)=\frac{1}{Z}exp(-E(v,h)) \\ =\frac{1}{Z(\theta)}exp(\sum_{i=1}^D\sum_{j=1}^FW_{ij}v_ih_j+\sum_{i=1}^Dv_ib_i+\sum_{j=1}^Fh_ja_j)\tag{6} Pθ(v=v,h=h)=Z1exp(E(v,h))=Z(θ)1exp(i=1Dj=1FWijvihj+i=1Dvibi+j=1Fhjaj)(6)
P θ ( v = v ) = 1 Z ( θ ) ∑ h e x p ( v T W h + c T h + b T v ) (7) P_\theta(\mathtt{v}=v)=\frac{1}{Z(\theta)}\sum_h exp(v^TWh+c^Th+b^Tv) \tag{7} Pθ(v=v)=Z(θ)1hexp(vTWh+cTh+bTv)(7)
RBM的能量函数由下给出
E ( v , h ) = − b T v − c T h − v T W h (8) E(v,h)=-b^Tv-c^Th-v^TWh \tag{8} E(v,h)=bTvcThvTWh(8)
我们通过最大似然估计来确定RBM的参数
θ = a r g m a x θ L ( θ ) = a r g m a x θ 1 N ∑ i = 1 m l o g P θ ( v ( i ) ) (9) \theta=argmax_\theta L(\theta)=argmax_\theta\frac{1}{N}\sum_{i=1}^mlogP_\theta(v^{(i)})\tag{9} θ=argmaxθL(θ)=argmaxθN1i=1mlogPθ(v(i))(9)
可以通过随机梯度下降 确定参数,首先要求 L ( θ ) L(\theta) L(θ) W W W的导数
∂ L ( θ ) ∂ W i j = 1 N ∑ n = 1 N ∂ ∂ W i j l o g ( ∑ h e x p [ v ( n ) T W h + c T h + b T v ( n ) ] ) − ∂ ∂ W i j l o g Z ( θ ) = E P d a t a [ v i h j ] − E P θ [ v i h j ] = 1 N ∑ n = 1 N [ P ( h j = 1 ∣ v ( n ) ) v i ( n ) − ∑ v P ( v ) P ( h j = 1 ∣ v ) v i ] (10) \frac{\partial L(\theta)}{\partial W_{ij}}=\frac{1}{N}\sum_{n=1}^N \frac{\partial}{\partial W_{ij}}log(\sum_hexp[v^{(n)T}Wh+c^Th+b^Tv^{(n)}])-\frac{\partial}{\partial W_{ij}}logZ(\theta)\\ =E_{P_{data}}[v_ih_j]-E_{P_\theta}[v_ih_j] \\ =\frac{1}{N}\sum_{n=1}^N[P(h_j=1|v^{(n)})v_i^{(n)}-\sum_vP(v)P(h_j=1|v)v_i] \tag{10} WijL(θ)=N1n=1NWijlog(hexp[v(n)TWh+cTh+bTv(n)])WijlogZ(θ)=EPdata[vihj]EPθ[vihj]=N1n=1N[P(hj=1v(n))vi(n)vP(v)P(hj=1v)vi](10)
∂ L ( θ ) ∂ b i = E P d a t a [ v i ] − E P θ [ v i ] = ∑ n = 1 N [ v i n − ∑ v P ( v ) v i ] (11) \frac{\partial L(\theta)}{\partial b_{i}}=\mathbb{E}_{P_{data}}[v_i]-\mathbb{E}_{P_\theta}[v_i] \\ =\sum_{n=1}^N[v_i^{n}-\sum_vP(v)v_i] \tag{11} biL(θ)=EPdata[vi]EPθ[vi]=n=1N[vinvP(v)vi](11)
∂ L ( θ ) ∂ c j = E P d a t a [ h j ] − E P θ [ h j ] = ∑ n = 1 N [ P ( h j = 1 ∣ v ( n ) ) − ∑ v P ( v ) P ( h i = 1 ∣ v ) ] (12) \frac{\partial L(\theta)}{\partial c_{j}}=\mathbb{E}_{P_{data}}[h_j]-\mathbb{E}_{P_\theta}[h_j] \\ =\sum_{n=1}^N[P(h_j=1|v^{(n)})-\sum_vP(v)P(h_i=1|v)] \tag{12} cjL(θ)=EPdata[hj]EPθ[hj]=n=1N[P(hj=1v(n))vP(v)P(hi=1v)](12)

配分函数

  上式的前一项在全部数据集上求平均值即可,后一项等于 ∑ v , h v i h j P θ ( v , h ) \sum_{\mathtt{v},\mathtt{h}}v_ih_jP_\theta(\mathtt{v},\mathtt{h}) v,hvihjPθ(v,h),其中 Z Z Z是被称为配分函数的归一化常数
Z = ∑ v ∑ h e x p ( − E ( v , h ) ) (13) Z=\sum_v\sum_hexp(-E(v,h)) \tag{13} Z=vhexp(E(v,h))(13)
计算配分函数 Z Z Z的朴素方法是对所有状态进行穷举求和,计算上是难以处理的,Long and Servedio(2010)正式证明配分函数 Z Z Z是难解的 。但是RBM的二分网络结构具有特定性质,因为可见层和隐藏层内部各神经元是条件独立的,所以条件分布 p ( h ∣ v ) p(\mathtt{h}|\mathtt{v}) p(hv) p ( v ∣ h ) p(\mathtt{v}|\mathtt{h}) p(vh)是因子的,并且计算和采样相对简单。
P ( h ∣ v ) = P ( h , v ) P ( v ) = 1 P ( v ) 1 Z e x p { b T v + c T h + v T W h } = 1 Z ′ e x p { c T h + v T W h } = 1 Z ′ e x p { ∑ j = 1 n h c j T h j + ∑ n h j = 1 v T W : , j h j } = 1 Z ′ ∏ j = 1 n h e x p { c j T h j + v T W : , j h j } (14) P(h|v)=\frac{P(h,v)}{P(v)} \\ = \frac{1}{P(v)}\frac{1}{Z}exp\{b^Tv+c^Th+v^TWh\} \\ = \frac{1}{Z'}exp\{c^Th+v^TWh\} \\ = \frac{1}{Z'}exp\{\sum_{j=1}^{n_h}c_j^Th_j+\sum_{n_h}^{j=1}v^TW_{:,j}h_j\} \\ = \frac{1}{Z'}\prod_{j=1}^{n_h}exp\{c_j^Th_j+v^TW_{:,j}h_j\} \tag{14} P(hv)=P(v)P(h,v)=P(v)1Z1exp{bTv+cTh+vTWh}=Z1exp{cTh+vTWh}=Z1exp{j=1nhcjThj+nhj=1vTW:,jhj}=Z1j=1nhexp{cjThj+vTW:,jhj}(14)
  在基于可见单元 v v v计算条件概率 P ( h ∣ v ) P(h|v) P(hv)时,可以将其视为常数,因为 P ( h ∣ v ) P(h|v) P(hv)的性质,我们可以将向量 h h h上的联合概率写成单独元素 h j h_j hj(未归一化)上分布的乘积。
P ( h j = 1 ∣ v ) = P ~ ( h j = 1 ∣ v ) P ~ ( h j = 0 ∣ v ) + P ~ ( h j = 1 ∣ v ) = e x p { c j + v T W : , j } e x p { 0 } + e x p { c j + v T W : , j } = 1 1 + e x p { − c j − ∑ i v i W i j } = σ ( c j + v T W : , j ) (15) P(h_j=1|v)=\frac{\tilde{P}(h_j=1|v)}{\tilde{P}(h_j=0|v)+\tilde{P}(h_j=1|v)} \\ =\frac{exp\{c_j+v^TW_{:,j}\}}{exp\{0\}+exp\{c_j+v^TW_{:,j}\}} \\ =\frac{1}{1+exp\{-c_j-\sum_iv_iW_{ij}\}} \\ =\sigma(c_j+v^TW_{:,j}) \tag{15} P(hj=1v)=P~(hj=0v)+P~(hj=1v)P~(hj=1v)=exp{0}+exp{cj+vTW:,j}exp{cj+vTW:,j}=1+exp{cjiviWij}1=σ(cj+vTW:,j)(15)
其中 σ ( x ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{1}{1+exp(-x)} σ(x)=1+exp(x)1,现在我们可以将关于隐藏层的完全条件分布表达为因子形式
P ( h ∣ v ) = ∏ j = 1 n h σ ( ( 2 h − 1 ) ⊙ ( c + W T v ) ) j (16) P(h|v)=\prod_{j=1}^{n_h}\sigma((2h-1)\odot(c+W^Tv))_j \tag{16} P(hv)=j=1nhσ((2h1)(c+WTv))j(16)
类似地, P ( v ∣ h ) P(v|h) P(vh)也是因子形式的分布
P ( v ∣ h ) = ∏ i = 1 n v σ ( ( 2 v − 1 ) ⊙ ( b + W h ) ) i (17) P(v|h)=\prod_{i=1}^{n_v}\sigma((2v-1)\odot(b+Wh))_i \tag{17} P(vh)=i=1nvσ((2v1)(b+Wh))i(17)
  因为RBM允许高效计算 P ~ ( v ) \tilde{P}(v) P~(v)的估计和微分,并且还允许高效地进行MCMC采样(块吉布斯采样),所以可以使用训练难以计算配分函数的模型的技术来训练RBM,如CD、SML(PCD)、比率匹配等。与深度学习中使用的其它无向模型相比,RBM可以以闭解形式计算 P ( h ∣ v ) P(h|v) P(hv),所以可以相对直接地训练,其它深度模型如深度玻尔兹曼机等,同时具备难处理的配分函数和难以推断的问题。
  许多概率模型(通常是无向图模型)由一个未归一化的概率分布 p ~ ( x ; θ ) \tilde{p}(x;\theta) p~(x;θ)定义,必须通过除以配分函数 Z ( θ ) Z(\theta) Z(θ)来归一化 p ~ \tilde{p} p~,以获取一个有效的概率分布
p ( x ; θ ) = 1 Z ( θ ) p ~ ( x ; θ ) (18) p(x;\theta)=\frac{1}{Z(\theta)}\tilde{p}(x;\theta) \tag{18} p(x;θ)=Z(θ)1p~(x;θ)(18)
配分函数 Z ( θ ) Z(\theta) Z(θ)是未归一化概率所有状态的积分(或求和)
Z = ∫ p ~ ( x ) d x = ∑ x p ~ ( x ) (19) Z=\int\tilde{p}(x)dx=\sum_x\tilde{p}(x) \tag{19} Z=p~(x)dx=xp~(x)(19)
  通过最大似然学习无向模型的困难之处在于配分函数依赖于参数,对数似然相对于参数的梯度具有一项对应于配分函数的梯度
∇ θ l o g p ( x ; θ ) = ∇ θ l o g p ~ ( x ; θ ) − ∇ θ l o g Z ( θ ) (20) \nabla_\theta logp(x;\theta)=\nabla_\theta log\tilde{p}(x;\theta)-\nabla_\theta logZ(\theta) \tag{20} θlogp(x;θ)=θlogp~(x;θ)θlogZ(θ)(20)
上式是机器学习中的正相和负相的分解,对于大多数无向模型而言,负相是困难的,没有潜变量或潜变量之间很少相互作用的模型通常会有一个易于计算的正相。RBM的隐藏单元在给定可见单元的情况下彼此条件独立,是一个典型的具有简单正相和困难负相的模型。对于 l o g Z logZ logZ的梯度有
∇ θ l o g Z = ∇ θ Z Z = ∇ θ ∑ x p ~ ( x ) Z = ∑ x ∇ θ p ~ ( x ) Z (21) \nabla_\theta logZ=\frac{\nabla_\theta Z}{Z}=\frac{\nabla_\theta\sum_x\tilde{p}(x)}{Z}=\frac{\sum_x\nabla_\theta\tilde{p}(x)}{Z} \tag{21} θlogZ=ZθZ=Zθxp~(x)=Zxθp~(x)(21)
上式是对离散的 x x x进行求和,对连续的 x x x进行积分也有类似的结果,若
  (1)对任一 θ \theta θ p ~ \tilde{p} p~ x x x的勒贝格可积函数;
  (2)对所有 θ \theta θ和几乎所有的 x x x,梯度 ∇ θ p ~ ( x ) \nabla_\theta\tilde{p}(x) θp~(x)存在;
  (3)对所有 θ \theta θ和几乎所有的 x x x,都存在一个可积函数 R ( x ) R(x) R(x),使 m a x i ∣ ∂ ∂ θ i p ~ ( x ) ∣ ≤ R ( x ) max_i|\frac{\partial}{\partial\theta_i}\tilde{p}(x)|\leq R(x) maxiθip~(x)R(x)成立,
则由莱布尼兹法则有
∇ θ ∫ p ~ ( x ) d x = ∫ ∇ θ p ~ ( x ) d x \nabla_\theta\int\tilde{p}(x)dx=\int\nabla_\theta\tilde{p}(x)dx θp~(x)dx=θp~(x)dx
  若对于任意 x x x p ( x ) > 0 p(x)>0 p(x)>0,则无妨用 e x p ( l o g p ~ ( x ) ) exp(log\tilde{p}(x)) exp(logp~(x))代替 p ~ ( x ) \tilde{p}(x) p~(x)
∑ x ∇ θ e x p ( l o g p ~ ( x ) ) Z = ∑ x e x p ( l o g p ~ ( x ) ) ∇ θ l o g p ~ ( x ) Z = ∑ x p ~ ( x ) ∇ θ l o g p ~ ( x ) Z = ∑ x p ( x ) ∇ θ l o g p ~ ( x ) = E x ∼ p ( x ) ∇ θ l o g p ~ ( x ) (22) \frac{\sum_x\nabla_\theta exp(log\tilde{p}(x))}{Z}=\frac{\sum_x exp(log\tilde{p}(x))\nabla_\theta log\tilde{p}(x)}{Z}=\frac{\sum_x\tilde{p}(x)\nabla_\theta log\tilde{p}(x)}{Z} \\ =\sum_x p(x)\nabla_\theta log\tilde{p}(x) =\mathbb{E}_{x\sim p(x)}\nabla_\theta log\tilde{p}(x) \tag{22} Zxθexp(logp~(x))=Zxexp(logp~(x))θlogp~(x)=Zxp~(x)θlogp~(x)=xp(x)θlogp~(x)=Exp(x)θlogp~(x)(22)
  等式
∇ θ l o g Z = E x ∼ p ( x ) ∇ θ l o g p ~ ( x ) (23) \nabla_\theta logZ=\mathbb{E}_{x\sim p(x)}\nabla_\theta log\tilde{p}(x) \tag{23} θlogZ=Exp(x)θlogp~(x)(23)
是使用各种蒙特卡罗方法近似最大化(难计算配分函数模型)似然的基础。


对比散度算法(CD)
设步长 ϵ > 0 \epsilon>0 ϵ>0,吉布斯步数 k k k大到足以让从 p d a t a p_{data} pdata初始化并从 p ( x ; θ ) p(x;\theta) p(x;θ)采样的马尔科夫链混合,在小图像集上训练一个RBM大致为 1 ∼ 20 1\sim 20 120
w h i l e while while 不收敛 d o do do
 从训练集采样 m m m个样本 { x ( 1 ) , … , x ( m ) } \{x^{(1)},\dots,x^{(m)}\} {x(1),,x(m)}
g ← 1 m ∑ i = 1 m ∇ θ l o g p ~ ( x ( i ) ; θ ) g\leftarrow\frac{1}{m}\sum_{i=1}^m\nabla_\theta log\tilde{p}(x^{(i)};\theta) gm1i=1mθlogp~(x(i);θ)
f o r   i = 1   t o   m   d o for \ i=1 \ to \ m \ do for i=1 to m do
   x ~ ( i ) ← x ( i ) \tilde{x}^{(i)}\leftarrow x^{(i)} x~(i)x(i)
e n d   f o r end \ for end for
f o r   i = 1   t o   k   d o for \ i=1 \ to \ k \ do for i=1 to k do
   f o r   j = 1   t o   m   d o for \ j=1 \ to \ m \ do for j=1 to m do
    x ~ ( j ) ← g i b b s _ u p d a t e ( x ~ ( j ) ) \tilde{x}^{(j)}\leftarrow gibbs\_update(\tilde{x}^{(j)}) x~(j)gibbs_update(x~(j))
   e n d   f o r end \ for end for
e n d   f o r end \ for end for
g ← g − 1 m ∑ i = 1 m ∇ θ l o g p ~ ( x ~ ( i ) ; θ ) g\leftarrow g-\frac{1}{m}\sum_{i=1}^m\nabla_\theta log\tilde{p}(\tilde{x}^{(i)};\theta) ggm1i=1mθlogp~(x~(i);θ)
θ ← θ + ϵ g \theta\leftarrow\theta+\epsilon g θθ+ϵg
e n d   w h i l e end \ while end while


采样

  从类似于RBM的基于能量的无向模型中采样是困难的,考虑一个有两个变量的EBM例子,记 p ( a , b ) p(a,b) p(a,b)是其分布,为了采 a a a,必须先从 p ( a ∣ b ) p(a|b) p(ab)采样,为了采 b b b,又必须先从 p ( b ∣ a ) p(b|a) p(ba)采样。而有向模型避免了这一问题,因为图结构是有向无环的,为了完成原始采样,在给定每个变量的所有父结点的条件下,根据拓扑顺序采样每一个变量,这时原始采样定义了一种高效的、单遍的方法来抽取一个样本。
  马尔科夫链的核心思想是从任意值的状态 x x x出发,随时间推移,随机地反复更新状态 x x x,最终 x x x接近成为一个从 p ( x ) p(x) p(x)中抽出的样本。设 π \pi π为马尔科夫链上的状态分布, P P P为转移矩阵,则
π ( t ) = P π ( t − 1 ) (24) \pi^{(t)}=P\pi^{(t-1)} \tag{24} π(t)=Pπ(t1)(24)
重复使用马尔科夫链更新,相当于重复与矩阵 P P P相乘,则这一过程是关于 P P P的幂乘
π ( t ) = P t π ( 0 ) (25) \pi^{(t)}=P^{t}\pi^{(0)} \tag{25} π(t)=Ptπ(0)(25)
矩阵 P P P的每一列代表一个概率分布,如果对于任意状态到任意其它状态,都存在一个 t t t使转移概率不为 0 0 0,那么Perron-Frobenius定理保证这个矩阵的最大特征值为1,而所有特征值随时间步而指数变化
π ( t ) = ( V d i a g ( λ ) V − 1 ) v ( 0 ) = V d i a g ( λ ) t V − 1 π ( 0 ) (26) \pi^{(t)}=(Vdiag(\lambda)V^{-1})v^{(0)}=Vdiag(\lambda)^tV^{-1}\pi^{(0)} \tag{26} π(t)=(Vdiag(λ)V1)v(0)=Vdiag(λ)tV1π(0)(26)
所有小于 1 1 1的特征值都会帅见到 0 0 0,如果 A A A只有一个对应特征值为 1 1 1的特征向量,那么这个过程收敛到平稳分布
π = P π \pi=P\pi π=Pπ通常在一些宽松条件下,一个带有转移算子 P P P的马尔科夫链都会收敛到一个不动点
π ′ ( x ′ ) = E x ∼ π P ( x ′ ∣ x ) (27) \pi'(x')=\mathbb{E}_{x\sim \pi}P(x'|x) \tag{27} π(x)=ExπP(xx)(27)
运行马尔科夫链直到达到平稳分布的过程通常称为马尔科夫链的磨合过程,收敛之后可以从平稳分布中抽取一个无限多数量的样本序列,这些样本服从统一分布,但是连续的样本之间会高度相关,一种解决方法是每隔 n n n个样本返回一个样本。如果我们正确的选择了转移算子 P P P,那么最终的平稳分布 π ( x ) \pi(x) π(x)将会等于我们所希望采样的分布 p m o d e l ( x ) p_{model}(x) pmodel(x)
  如果非周期马尔科夫链的转移矩阵 P P P和分布 π ( x ) \pi(x) π(x)满足
π ( i ) P i j = π ( j ) P j i (28) \pi(i)P_{ij}=\pi(j)P_{ji} \tag{28} π(i)Pij=π(j)Pji(28)
π ( x ) \pi(x) π(x)是马尔科夫链的平稳分布,上式被称为细致平稳条件。其物理含义是对于任何两个状态 i i i j j j,从 i i i转移到 j j j而丢失的概率质量,等于从 j j j转移回 i i i的概率质量。由细致平稳条件有
∑ i = 1 ∞ π ( i ) P i j = ∑ i = 1 ∞ π ( j ) P j i = π ( j ) ∑ i = 1 ∞ P j i = π ( j ) (29) \sum_{i=1}^\infty \pi(i)P_{ij}=\sum_{i=1}^\infty\pi(j)P_{ji}=\pi(j)\sum_{i=1}^\infty P_{ji}=\pi(j) \tag{29} i=1π(i)Pij=i=1π(j)Pji=π(j)i=1Pji=π(j)(29)
所以 π P = π \pi P=\pi πP=π,此时 π \pi π是平稳分布。
  如何正确选择转移算子 P P P,才能使平稳分布 π ( x ) \pi(x) π(x)恰好就是我们想要的分布 p m o d e l ( x ) p_{model}(x) pmodel(x)。假设有一转移矩阵 Q Q Q
p ( i ) Q i j ≠ p ( j ) Q j i (30) p(i)Q_{ij}\neq p(j)Q_{ji} \tag{30} p(i)Qij=p(j)Qji(30)
此时细致平稳条件不成立, p ( x ) p(x) p(x)可能就不是平稳分布,引入 α ( i , j ) \alpha(i,j) α(i,j)使细致平稳条件成立,
p ( i ) Q i j α ( i , j ) = p ( j ) Q j i α ( j , i ) (31) p(i)Q_{ij}\alpha(i,j)=p(j)Q_{ji}\alpha(j,i) \tag{31} p(i)Qijα(i,j)=p(j)Qjiα(j,i)(31)
此时,只需令 α ( i , j ) = p ( j ) Q j i \alpha(i,j)=p(j)Q_{ji} α(i,j)=p(j)Qji α ( j , i ) = p ( i ) Q i j \alpha(j,i)=p(i)Q_{ij} α(j,i)=p(i)Qij即可。引入的 α ( i , j ) \alpha(i,j) α(i,j)称为接受率,可以认为是在原来的马尔科夫链上从状态 i i i Q i j Q_{ij} Qij的概率跳转到 j j j的时候,以 α ( i , j ) \alpha(i,j) α(i,j)的概率接受这个跳转。不过马尔科夫链 Q Q Q转移的时候,接受率 α ( i , j ) \alpha(i,j) α(i,j)可能偏小,这样可能会拒绝大量跳转,收敛速度太慢,可以把 α ( i , j ) \alpha(i,j) α(i,j) α ( j , i ) \alpha(j,i) α(j,i)同比例放大,使两者中较大的放大到 1 1 1,这样就提高了跳转接受率
α ( i , j ) = m i n { p ( j ) Q j i p ( i ) Q i j , 1 } (32) \alpha(i,j)=min\{\frac{p(j)Q_{ji}}{p(i)Q_{ij}},1\} \tag{32} α(i,j)=min{p(i)Qijp(j)Qji,1}(32)


M e t r o p o l i s − H a s t i n g s Metropolis-Hastings MetropolisHastings算法
1.初始化马尔科夫链状态 x 0 x_0 x0
2.对 t = 0 , 1 , 2 … t=0,1,2\dots t=0,1,2循环以下过程采样

  • t t t个时刻马尔科夫链状态为 x t x_t xt,采样 y ∼ q ( x ∣ x t ) y\sim q(x|x_t) yq(xxt)
  • 从均匀分布中采样 u ∼ U n i f o r m [ 0 , 1 ] u\sim Uniform[0,1] uUniform[0,1]
  • u < α ( x t , y ) = m i n { p ( y ) Q y , x t p ( x t ) Q x t , y , 1 } u<\alpha(x_t,y)=min\{\frac{p(y)Q_{y,x_t}}{p(x_t)Q_{x_t,y}},1\} u<α(xt,y)=min{p(xt)Qxt,yp(y)Qy,xt,1},则接受跳转 x t → y x_t\rightarrow y xty x t + 1 = y x_{t+1}=y xt+1=y
  • 否则不接受跳转, x t + 1 = x t x_{t+1}=x_t xt+1=xt

  对于高维的情形,由于接受率 α ( α ≤ 1 ) \alpha(\alpha\leq 1) α(α1)的存在,以上 M e t r o p o l i s − H a s t i n g s Metropolis-Hastings MetropolisHastings算法的效率不高,能否找到一个转移矩阵 Q Q Q使接受率 α = 1 \alpha=1 α=1。先观察二维的情形,假设有一概率分布 p ( x , y ) p(x,y) p(x,y),考察 x x x坐标相同的两个点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1) A ( x 1 , y 2 ) A(x_1,y_2) A(x1,y2),我们发现
p ( x 1 , y 1 ) p ( y 2 ∣ x 1 ) = p ( x 1 ) p ( y 1 ∣ x 1 ) p ( y 2 ∣ x 1 ) p ( x 1 , y 2 ) p ( y 1 ∣ x 1 ) = p ( x 1 ) p ( y 2 ∣ x 1 ) p ( y 1 ∣ x 1 ) (33) p(x_1,y_1)p(y_2|x_1)=p(x_1)p(y_1|x_1)p(y_2|x_1) \\ p(x_1,y_2)p(y_1|x_1)=p(x_1)p(y_2|x_1)p(y_1|x_1) \tag{33} p(x1,y1)p(y2x1)=p(x1)p(y1x1)p(y2x1)p(x1,y2)p(y1x1)=p(x1)p(y2x1)p(y1x1)(33)
所以 p ( x 1 , y 1 ) p ( y 2 ∣ x 1 ) = p ( x 1 , y 2 ) p ( y 1 ∣ x 1 ) p(x_1,y_1)p(y_2|x_1)=p(x_1,y_2)p(y_1|x_1) p(x1,y1)p(y2x1)=p(x1,y2)p(y1x1),即 p ( A ) p ( y 2 ∣ x 1 ) = p ( B ) p ( y 1 ∣ x 1 ) p(A)p(y_2|x_1)=p(B)p(y_1|x_1) p(A)p(y2x1)=p(B)p(y1x1),在 x = x 1 x=x_1 x=x1这条平行于 y y y轴的直线上,如果使用条件分布 p ( y ∣ x 1 ) p(y|x_1) p(yx1)作为任何两点之间的转移概率,那么任何两点之间的转移满足细致平稳条件。同样,如果我们在 y = y 1 y=y_1 y=y1这条直线上任意两点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1) C ( x 2 , y 1 ) C(x_2,y_1) C(x2,y1)也有 p ( A ) p ( x 2 ∣ y 1 ) = p ( C ) p ( x 1 ∣ y 1 ) p(A)p(x_2|y_1)=p(C)p(x_1|y_1) p(A)p(x2y1)=p(C)p(x1y1)。于是可以构造平面上任意两点之间的转移概率矩阵 Q Q Q
Q ( A → B ) = p ( y B ∣ x 1 )    若 x A = x B = x 1 Q ( A → C ) = p ( x C ∣ y 1 )    若 y A = y C = y 1 Q ( A → D ) = 0    其 它 (34) Q(A\rightarrow B)=p(y_B|x_1) \ \ 若x_A=x_B=x_1 \\ Q(A\rightarrow C)=p(x_C|y_1) \ \ 若y_A=y_C=y_1 \\ Q(A\rightarrow D)=0 \ \ 其它 \tag{34} Q(AB)=p(yBx1)  xA=xB=x1Q(AC)=p(xCy1)  yA=yC=y1Q(AD)=0  (34)
在这里插入图片描述
  有了以上转移矩阵Q,则平面上任意两点 X , Y X,Y X,Y,满足细致平稳条件 p ( X ) Q ( X → Y ) = p ( Y ) Q ( Y → X ) p(X)Q(X\rightarrow Y)=p(Y)Q(Y\rightarrow X) p(X)Q(XY)=p(Y)Q(YX),于是这个马尔科夫链会收敛到平稳分布 p ( x , y ) p(x,y) p(x,y)


二维 G i b b s   S a m p l i n g Gibbs \ Sampling Gibbs Sampling算法
1.随机初始化 x 0 , y 0 x_0,y_0 x0,y0
2.对 t = 0 , 1 , 2 … t=0,1,2\dots t=0,1,2循环采样

  • y t + 1 ∼ p ( y ∣ x t ) y_{t+1}\sim p(y|x_t) yt+1p(yxt)
  • x t + 1 ∼ p ( x ∣ y t + 1 ) x_{t+1}\sim p(x|y_{t+1}) xt+1p(xyt+1)

以上采样过程中,只是沿着 x x x轴和 y y y轴做转移,于是有样本 ( x 0 , y 0 ) , ( x 0 , y 1 ) , ( x 1 , y 1 ) , ( x 1 , y 2 ) … (x_0,y_0),(x_0,y_1),(x_1,y_1),(x_1,y_2)\dots (x0,y0),(x0,y1),(x1,y1),(x1,y2),收敛后的最终样本就是 p ( x , y ) p(x,y) p(x,y)的样本。
   G i b b s   S a m p l e Gibbs \ Sample Gibbs Sample是一种概念简单而又有效的方法,它构造一个从 p m o d e l ( x ) p_{model}(x) pmodel(x)中采样的马尔科夫链,在基于能量的模型中从转移算子 Q ( x ′ ∣ x ) Q(x'|x) Q(xx)采样是通过选择一个变量 x i x_i xi,然后从 p m o d e l p_{model} pmodel中该点关于在无向图 G \mathcal{G} G中邻接点的条件分布中采样。只要一些变量在给定相邻变量时是条件独立的,那么这些变量就可以被同时采样,在一个联合分布为 p m o d e l ( v , h ) p_{model}(v,h) pmodel(v,h)的潜变量模型中,通常从 p m o d e l ( v ∣ h ) p_{model}(v|h) pmodel(vh) p m o d e l ( h ∣ v ) p_{model}(h|v) pmodel(hv)中采样,这便是块吉布斯采样。从快速混合的角度上考虑,我们更希望 p m o d e l ( h ∣ v ) p_{model}(h|v) pmodel(hv)有很大的熵,然而从学习一个 h h h的有用表示的角度上考虑,我们还是希望 h h h能够有 v v v的足够信息,从而能够完整重构它,这意味着 h h h v v v要有非常高的互信息,这两个目标是相互矛盾的。

Matlab代码实现

  以下是主程序,导入mnist手写数字数据集,调用RBM子程序并训练,最后给出重构结果图

%% 主程序
%% 导入mnist数据
N_sample = 1000;p = 784;
x = zeros(N_sample , p);
tic
for i = 1 : N_sample
    im = imread(['F:\MATLAB\mnist手写数字\trainimage\pic2\0\' num2str(i) '.bmp']);
    x(i , :) = double(reshape(im(: , : , 1) , 1 , p) > 10);
end
toc
%% 调用RBM
rbm = RBM(x , 50);%创建对象
% rbm = rbm.train;%训练
rbm = rbm.predict(x(randperm(N_sample , 100) , :));%预测
%% 绘制重构图像
Im = zeros(280 , 280);
for i = 1 : size(rbm.testData_x , 1)
    i0 = floor((i-1)/10);j0 = mod(i-1,10);
    Im(i0*28+1:(i0+1)*28,j0*28+1:(j0+1)*28) = reshape(rbm.testData_x(i , :) , 28 , 28);
end
imshow(Im)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  以下是RBM子程序,将计算过程封装为类,训练和重构是其中的两个方法,调用时创建RBM对象即可。

classdef RBM
    properties
        trainData_x;        %训练数据 x
        testData_x;         %测试重构数据
        testData_h;         %测试重构数据
        v;                  %可见层单元     v
        h;                  %隐藏层单元     h
        v_num;              %参数     v单元的个数
        h_num;              %参数     h单元的个数
        w;                  %权重     w
        b;                  %权重     b
        c;                  %权重     c
        N_sample;           %样本总数 N_sample
        iter_train;         %当前迭代次数
        IterMax;            %最大迭代次数
        batchSize;          %批次大小
        numIterOfTrain;     %训练时的吉布斯采样迭代次数
        numIterOfPredict;   %预测时的吉布斯采样迭代次数
    end
    methods
        function obj = RBM(v_num , h_num)
            if(nargin == 0)
                v_num = 1;
                h_num = 1;
            end
            obj.v_num = v_num;
            obj.h_num = h_num;
            obj.v = zeros(obj.v_num , 1);
            obj.h = zeros(obj.h_num , 1);
            obj.w = rand(obj.v_num , obj.h_num);
            obj.b = ones(obj.v_num , 1);
            obj.c = ones(obj.h_num , 1);
            obj.iter_train = 0;
            obj.IterMax = 3000;
            obj.batchSize = 100;
            obj.numIterOfTrain=15;
            obj.numIterOfPredict=50;
        end
        function obj = train(obj , trainData_x , Iter)            %梯度下降训练
            if(nargin == 2)
                Iter = obj.IterMax;
            end
            obj.trainData_x = trainData_x;
            obj.N_sample = size(obj.trainData_x,1);
            batch_size = obj.batchSize;
            alpha = .1 / batch_size;
%             gradient_w = rand(obj.v_num , obj.h_num);
            while obj.iter_train < Iter %sum(abs(gradient_w)) > 1e-18 
                obj.iter_train = obj.iter_train + 1;
                trainData_x_batch = obj.trainData_x(randperm(obj.N_sample , batch_size) , :);
                %数据集部分(正相)
                gradient_w = trainData_x_batch' * sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w);
                gradient_b = sum(trainData_x_batch)';
                gradient_c = sum(sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w))';
                %吉布斯采样部分(负相)
                k=obj.numIterOfTrain;
                for i = 1 : k
                    h_batch = double(rand(batch_size , obj.h_num) < sigmoid(repmat(obj.c' , batch_size , 1) +...
                        trainData_x_batch * obj.w));
                    trainData_x_batch = double(rand(batch_size , obj.v_num) < sigmoid(repmat(obj.b' , batch_size , 1) + ...
                        h_batch * obj.w'));
                end
                gradient_w = gradient_w - trainData_x_batch' * sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w);
                gradient_b = gradient_b - sum(trainData_x_batch)';
                gradient_c = gradient_c - sum(sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w))';
                %更新参数
                obj.w = obj.w + alpha * gradient_w;
                obj.b = obj.b + alpha * gradient_b;
                obj.c = obj.c + alpha * gradient_c;
                %在此绘制权重参数动态图
            end
        end
        function obj = predict(obj , num_batch , testData_h_batch)    %重构
            if(nargin == 3)
                testData_x_batch = double(rand(num_batch , obj.v_num) < sigmoid(repmat(obj.b' , num_batch , 1) + ...
                    testData_h_batch * obj.w'));
            else
                testData_x_batch = obj.trainData_x(randperm(obj.N_sample , num_batch) , :);
            end
            k=obj.numIterOfPredict;
            for i = 1 : k
                h_batch = double(rand(num_batch , obj.h_num) < sigmoid(repmat(obj.c' , num_batch , 1) +...
                    testData_x_batch * obj.w));
                testData_x_batch = double(rand(num_batch , obj.v_num) < sigmoid(repmat(obj.b' , num_batch , 1) + ...
                    h_batch * obj.w'));
            end
            obj.testData_x = testData_x_batch;
            obj.testData_h = h_batch;
        end
    end
end
function output = sigmoid(x)
output =1 ./ (1 + exp(-x));
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

  以下是重构时采样的数字图片结果

在这里插入图片描述

实值RBM

  虽然玻尔兹曼机最初是为二值数据而开发的,但是许多应用,例如图像和音频建模似乎需要表示实值上概率分布的能力。在一些情况下,我们可以将区间 [ 0 , 1 ] [0,1] [0,1]中的实值数据视为表示二值变量的期望。例如,Hinton(2000)将训练集中灰度图像的像素值视为定义 [ 0 , 1 ] [0,1] [0,1]间的概率值,每个像素定义二值变量为 1 1 1的概率,并且二值像素的采样都彼此独立。这是评估灰度图像数据集上二值模型的常见过程,然而这种方法理论上并不特别令人满意,并且以这种方式独立采样的二值图像具有噪声现象。

Gaussian-Bernoulli RBM

  最常见的是具有二值隐藏单元和实值可见单元的RBM,其中可见单元上的条件分布是高斯分布(均值为隐藏单元的函数),有许多方法可以参数化Gaussian-Bernoulli RBM,首先,可以选择协方差矩阵或精度矩阵来参数化高斯分布。这里介绍选择精度矩阵的情况,可以通过简单的修改获取协方差的形式。可见单元的条件分布为
p ( v ∣ h ) = N ( v ; W H , β − 1 ) (35) p(v|h)=\mathcal{N}(v;WH,\beta^{-1}) \tag{35} p(vh)=N(v;WH,β1)(35)
通过扩展未归一化的对数条件分布可以找到需要添加到能量函数中的项
l o g N ( v ; W h , β − 1 ) = − 1 2 ( v − W h ) T β ( v − W h ) + f ( β ) (36) log\mathcal{N}(v;Wh,\beta^{-1})=-\frac{1}{2}(v-Wh)^T\beta(v-Wh)+f(\beta) \tag{36} logN(v;Wh,β1)=21(vWh)Tβ(vWh)+f(β)(36)
此处 f f f封装所有的参数,但没有模型中的随机变量。因为 f f f的唯一作用是归一化分布,并且我们选择的任何可作为配分函数的能量函数都能起到这个作用,所以我们可以忽略 f f f
  上式中有一项 1 2 h T W T β W h \frac{1}{2}h^TW^T\beta Wh 21hTWTβWh,因为该项有 h i h j h_ih_j hihj,这对应于隐藏单元之间的边,会导致一个线性因子模型,而非受限玻尔兹曼机,所以不能添加进能量函数,同时省略这些项不改变条件分布 p ( v ∣ h ) p(v|h) p(vh),所以简单去掉即可。然而,我们依然可以选择是否添加仅涉及单个 h i h_i hi的项,若精度矩阵是对角的,则对于每个隐藏单元 h i h_i hi,有一项 1 2 ∑ j β j W j , i 2 \frac{1}{2}\sum_j\beta_jW_{j,i}^2 21jβjWj,i2(其中 h i 2 = h i h_i^2=h_i hi2=hi)。如果将此项添加进能量函数,则当该单元的权重较大且以高精度连接到可见单元时,偏置 h i h_i hi将自然被关闭。是否添加该偏置项不影响模型可以表示的分布族,但是会影响模型的学习动态,添加该项可以帮助隐藏单元保持合理激活。
  因此,Gaussian-Bernoulli RBM上定义能量函数的一种方式为
E ( v , h ) = 1 2 v T ( β ⊙ v ) − ( v ⊙ β ) T W h − b T h (37) E(v,h)=\frac{1}{2}v^T(\beta\odot v)-(v\odot\beta)^TWh-b^Th \tag{37} E(v,h)=21vT(βv)(vβ)TWhbTh(37)
但是我们还可以添加额外的项或者通过方差而不是精度参数化能量。在这里没有添加可见单元的偏置项,但是添加这样的偏置项是容易的。精度矩阵可以被固定为常数或学习出来,也可以是标量乘以单位矩阵,或者是一个对角矩阵。在此情况下,由于一些操作需要对矩阵求逆,我们通常不允许非对角的精度矩阵,因为高斯分布的一些操作需要对矩阵求逆,一个对角矩阵可以非常容易地求逆,其它形式的玻尔兹曼机,允许对协方差结构建模,并使用各种技术避免对精度矩阵求逆。

条件协方差的无向模型

  虽然高斯RBM已成为实值数据的标准能量模型,Ranzato e t   a l . ( 2010 a ) et \ al.(2010a) et al.(2010a)认为高斯RBM感应偏置不能很好地适合某些类型的实值数据中存在的统计变化,特别是自然图像。问题在于自然图像中的许多信息内容嵌入于像素之间的协方差而不是原始像素值中。换句话说,图像中的大多数有用信息在于像素之间的关系,而不是其绝对值。由于高斯RBM仅对给定隐藏单元的输入条件均值建模,所以不能捕获条件协方差信息。为了回应这些评论,已经有学者提出替代模型,能够更好地考虑实值数据的协方差,这些模型有,均值和协方差RBM(mean and covariance RBM,mcRBM)、学生 t t t分布均值乘积模型(mean product of Student t-distribution,mPoT)和尖峰和平板RBM(spike and slab RBM,ssRBM)。
  均值和协方差RBM。mcRBM使用隐藏单元独立地编码所有可观察单元的条件均值和协方差,mcRBM的隐藏单元分为两组单元,均值单元和协方差单元,建模条件均值的那组单元是简单的高斯RBM,另一半是协方差RBM。
  在二值均值单元 h ( m ) h^{(m)} h(m)和二值协方差单元 h ( c ) h^{(c)} h(c)的情况下,mcRBM模型被定义为两个能量函数的组合
E m c ( x , h ( m ) , h ( c ) ) = E m ( x , h ( m ) ) + E c ( x , h ( c ) ) (38) E_{mc}(x,h^{(m)},h^{(c)})=E_m(x,h^{(m)})+E_c(x,h^{(c)}) \tag{38} Emc(x,h(m),h(c))=Em(x,h(m))+Ec(x,h(c))(38)
其中 E M E_M EM为标准的Gaussian-Bernoulli RBM能量函数
E m ( x , h ( m ) ) = 1 2 x T x − ∑ j x T W : , j h j ( m ) − ∑ j b j ( m ) h j ( m ) (39) E_m(x,h^{(m)})=\frac{1}{2}x^Tx-\sum_jx^TW_{:,j}h_j^{(m)}-\sum_jb_j^{(m)}h_j^{(m)} \tag{39} Em(x,h(m))=21xTxjxTW:,jhj(m)jbj(m)hj(m)(39)
E c E_c Ec是cRBM建模条件协方差信息的能量函数
E c ( x , h ( c ) ) = 1 2 ∑ j h j ( c ) ( x T r ( j ) ) 2 − ∑ j b j ( c ) h j ( c ) (40) E_c(x,h^{(c)})=\frac{1}{2}\sum_jh_j^{(c)}(x^Tr^{(j)})^2-\sum_jb_j^{(c)}h_j^{(c)} \tag{40} Ec(x,h(c))=21jhj(c)(xTr(j))2jbj(c)hj(c)(40)
参数 r ( j ) r^{(j)} r(j) h j ( c ) h_j^{(c)} hj(c)关联的协方差权重向量对应, b ( c ) b^{(c)} b(c)是一个协方差偏置向量。组合后的能量函数定义联合分布
p m c ( x , h ( m ) , h ( c ) ) = 1 Z e x p { − E m c ( x , h ( m ) h ( c ) ) } (41) p_{mc}(x,h^{(m)},h^{(c)})=\frac{1}{Z}exp\{-E_{mc}(x,h^{(m)}h^{(c)})\} \tag{41} pmc(x,h(m),h(c))=Z1exp{Emc(x,h(m)h(c))}(41)
以及给定 h ( m ) h^{(m)} h(m) h ( c ) h^{(c)} h(c)后,关于观察数据相应的条件分布
p m c ( x ∣ h ( m ) , h ( c ) ) = N ( x ; C x ∣ h m c ( ∑ j W : , j h j ( m ) ) , C x ∣ h m c ) (42) p_{mc}(x|h^{(m)},h^{(c)})=\mathcal{N}(x;C_{x|h}^{mc}(\sum_jW_{:,j}h_j^{(m)}),C_{x|h}^{mc}) \tag{42} pmc(xh(m),h(c))=N(x;Cxhmc(jW:,jhj(m)),Cxhmc)(42)
协方差阵 C x ∣ h m c = ( ∑ j h j ( c ) r ( j ) r ( j ) T + I ) C_{x|h}^{mc}=(\sum_jh_j^{(c)}r^{(j)}r^{(j)T}+I) Cxhmc=(jhj(c)r(j)r(j)T+I)是非对角的,且 W W W是与建模条件均值的高斯RBM相关联的权重矩阵。由于非对角的条件协方差结构,难以通过对比散度或持续性对比散度来训练mcRBM。CD和PCD需要从 x x x h ( m ) h^{(m)} h(m) h ( c ) h^{(c)} h(c)的联合分布中采样,这在标准RBM中可以通过Gibbs采样在条件分布上实现。但是,在mcRBM中,从 p m c ( x ∣ h ( m ) , h ( c ) ) p_{mc}(x|h^{(m)},h^{(c)}) pmc(xh(m),h(c))中采样需要在学习的每个迭代计算 ( C m c ) − 1 (C^{mc})^{-1} (Cmc)1,这对于更大的观察数据可能是不切实际的计算负担。Ranzato and Hinton (2010)通过使用mcRBM自由能上的哈密尔顿(混合)蒙特卡罗(Neal,1993)直接从边缘分布 p ( x ) p(x) p(x)采样,避免了直接从条件分布 p m c ( x ∣ h ( m ) , h ( c ) ) p_{mc}(x|h^{(m)},h^{(c)}) pmc(xh(m),h(c))抽采样。
  学生 t t t分布均值乘积。学生 t t t分布均值乘积(mPoT)模型(Ranzato e t   a l . et \ al. et al.,2010b)以类似mcRBM扩展cRBM的方式扩展PoT模型(Welling e t   a l . et \ al. et al.,2003a),通过添加类似高斯RBM中隐藏单元的非零高斯均值来实现。与mcRBM一样,观察值上的PoT条件分布是多元高斯(具有非对角的协方差)分布。然而,不同于mcRBM,给定隐藏变量的条件分布是由条件独立的Gamma分布给出。Gamma分布 G ( k , θ ) \mathcal{G}(k,\theta) G(k,θ)是关于正实数且均值为 k θ k\theta kθ的概率分布,我们只需简单地了解Gamma分布就足以理解mPoT模型的基本思想。
  mPoT的能量函数为
E m P o T ( x , h ( m ) , h ( c ) ) = E m ( x , h ( m ) ) + ∑ j ( h j ( c ) ( 1 + 1 2 ( r ( j ) T x ) 2 ) + ( 1 − γ j ) l o g h j ( c ) ) (43) E_{mPoT}(x,h^{(m)},h^{(c)})=E_m(x,h^{(m)})+\sum_j(h_j^{(c)}(1+\frac{1}{2}(r^{(j)T}x)2)+(1-\gamma_j)logh_j^{(c)}) \tag{43} EmPoT(x,h(m),h(c))=Em(x,h(m))+j(hj(c)(1+21(r(j)Tx)2)+(1γj)loghj(c))(43)
其中 r ( j ) r^{(j)} r(j)是与单元 h j ( c ) h_j^{(c)} hj(c)相关联的协方差权重向量, E m ( x , h ( m ) ) E_m(x,h^{(m)}) Em(x,h(m))如式 ( 39 ) (39) (39)定义。
  正如mcRBM一样,mPoT模型能量函数指定一个多元高斯分布,其中关于 x x x的条件分布具有非对角的协方差。mPoT模型中的学习(类似mcRBM)由于无法从非对角高斯条件分布 p m P o T ( x ∣ h ( m ) , h ( c ) ) p_{mPoT}(x|h^{(m)},h^{(c)}) pmPoT(xh(m),h(c))采样而变的复杂,因此Ranzato e t   a l . et \ al. et al.(2010b)也倡导通过哈密尔顿(混合)蒙特卡罗(Neal,1993)直接采样 p ( x ) p(x) p(x)
  尖峰和平板RBM。尖峰和平板RBM(spike and slab RBM,ssRBM)(Courville e t   a l . et \ al. et al.,2011b)提供对实值数据的协方差结构建模的另一种方法。与mcRBM相比,ssRBM具有既不需要矩阵求逆也不需要哈密尔顿蒙特卡罗方法的优点,就像mcRBM和mPoT模型,ssRBM的二值隐藏单元通过使用辅助实值变量来编码跨像素的条件协方差。
  尖峰和平板RBM有两类隐藏单元:二值尖峰(spike)单元 h h h和实值平板(slab)单元 s s s,条件于隐藏单元的可见单元均值由 ( h ⊙ s ) W T (h\odot s)W^T (hs)WT给出。换句话说,每一列 W : , i W_{:,i} W:,i定义当 h i = 1 h_i=1 hi=1时可出现在输入中的分量,相应的尖峰变量 h i h_i hi确定该分量是否存在。如果存在的话,相应的平板变量 s i s_i si确定该分量的强度。当尖峰变量激活时,相应的平板变量将沿着 W : , i W_{:,i} W:,i定义的轴的输入增加方差,这允许我们对输入的协方差建模,幸运的是,使用Gibbs采样的对比散度和持续性对比散度仍然适用。
  形式上,ssRBM模型通过其能量函数定义
E s s ( x , s , h ) = − ∑ i x T W : , i s i h i + 1 2 x T ( Λ + ∑ i Φ i h i ) x + 1 2 ∑ i α i s i 2 − ∑ i α i μ i s i h i − ∑ i b i h i + ∑ i α i μ i 2 h i (44) E_{ss}(x,s,h)=-\sum_ix^TW_{:,i}s_ih_i+\frac{1}{2}x^T(\Lambda+\sum_i\Phi_ih_i)x+\frac{1}{2}\sum_i\alpha_is_i^2-\sum_i\alpha_i\mu_is_ih_i-\sum_ib_ih_i+\sum_i\alpha_i\mu_i^2h_i \tag{44} Ess(x,s,h)=ixTW:,isihi+21xT(Λ+iΦihi)x+21iαisi2iαiμisihiibihi+iαiμi2hi(44)
其中 b i b_i bi是尖峰 h i h_i hi的偏置, Λ \Lambda Λ是观测值 x x x上的对角精度矩阵。参数 α i > 0 \alpha_i>0 αi>0是实值平板变量 s i s_i si的标量精度参数,参数 Φ i \Phi_i Φi是定义 x x x上的 h h h调制二次惩罚的非负对角矩阵,每个 μ i \mu_i μi是平板变量 s i s_i si的均值参数。
  利用能量函数定义的联合分布,能相对容易地导出ssRBM条件分布,例如,通过边缘化平板变量 s s s,给定二值尖峰变量 h h h,关于观察量的条件分布由下式给出
p s s ( x ∣ h ) = 1 P ( h ) 1 Z ∫ e x p { − E ( x , s , h ) } d s = N ( x ; C x ∣ h s s ∑ i W : , i μ i h i , C x ∣ h s s ) (45) p_{ss}(x|h)=\frac{1}{P(h)}\frac{1}{Z}\int exp\{-E(x,s,h)\}ds=\mathcal{N}(x;C_{x|h}^{ss}\sum_iW_{:,i}\mu_ih_i,C_{x|h}^{ss}) \tag{45} pss(xh)=P(h)1Z1exp{E(x,s,h)}ds=N(x;CxhssiW:,iμihi,Cxhss)(45)
其中 C x ∣ h s s = ( Λ + ∑ i Φ i h i − ∑ i α i − 1 h i W : , i W : , i T ) − 1 C_{x|h}^{ss}=(\Lambda+\sum_i\Phi_ih_i-\sum_i\alpha_i^{-1}h_iW_{:,i}W_{:,i}^T)^{-1} Cxhss=(Λ+iΦihiiαi1hiW:,iW:,iT)1,最后的等式只有在协方差阵 C x ∣ h s s C_{x|h}^{ss} Cxhss正定时成立。
  尖峰变量选通意味着 h ⊙ s h\odot s hs上的真实边缘分布是稀疏的,这不同于稀疏编码,其中来自模型的样本在编码几乎没有零,并且需要MAP推断来强加稀疏性。
  相比mcRBM和mPoT模型,ssRBM以明显不同的方式参数化观察量的条件协方差,mcRBM和mPoT都通过 ( ∑ j h j ( c ) r ( j ) r ( j ) T + I ) − 1 (\sum_jh_j^{(c)}r^{(j)}r^{(j)T}+I)^{-1} (jhj(c)r(j)r(j)T+I)1建模观察量的协方差结构,使用 h j > 0 h_j>0 hj>0的隐藏单元的激活来对方向 r ( j ) r^{(j)} r(j)的条件协方差施加约束。相反,ssRBM使用隐藏尖峰激活 h i = 1 h_i=1 hi=1来指定观察结果的条件协方差,以沿着由相应权重向量指定的方向拟合精度矩阵。ssRBM条件协方差与另一个不同的模型类似,这就是概率主成分分析的乘积(PoPPCA)(WIlliams and Agakov,2002)。在过完备的设定下,ssRBM参数化的稀疏激活仅允许在稀疏激活 h i h_i hi的所选方向上有显著方差(高于由 Λ − 1 \Lambda^{-1} Λ1给出的近似方差)。在mcRBM或mPoT模型中,过完备的表示意味着,捕获观察空间中特定方向上变化需要在该方向上的正交投影下去除潜在的所有约束,这表明这些模型不太适合于过完备设定。
  尖峰和平板RBM的主要缺点是,参数的一些设置会对应于非正定协方差矩阵。这种协方差矩阵会在离均值更远的值上放置更大的未归一化概率,导致所有可能结果上的积分发散。通常这个问题可以通过简单启发式技巧来避免,理论上还没有任何令人满意的解决方法,可以使用约束优化来显式地避免概率未定义的区域,但是可能会阻止模型到达参数空间的高性能区域。
  定性地,ssRBM的卷积变体能产生自然图像的优秀样本。ssRBM允许几个扩展,如平板变量的高阶交互和平均池化(Courville e t   a l . et \ al. et al.,2014)使模型能够在标注数据稀缺时为分类器学习到出色的特征。向能量函数添加一项,能防止配分函数在稀疏编码模型下变的不确定,如尖峰和平板稀疏编码(Goodfellow e t   a l . et \ al. et al.,2013g),也称为S3C。

DBN

  DBN是具有若干潜变量层的生成模型,潜变量通常是二值的,而可见单元可以是二值或实数,每层的每个单元连接到相邻层的每个单元(没有层内连接),顶部两层之间的连接是无向的,而所有其它层之间的连接是有向的,箭头指向最接近数据的层。
  具有 l l l个隐藏层的DBN有 l l l个权重矩阵, W ( 1 ) , … , W ( l ) W^{(1)},\dots,W^{(l)} W(1),,W(l),同时也有 l + 1 l+1 l+1个偏置向量 b ( 0 ) , … , b ( l ) b^{(0)},\dots,b^{(l)} b(0),,b(l),其中 b ( 0 ) b^{(0)} b(0)是可见层的偏置,DBN表示的概率分布由下式给出
P ( h ( l ) , h ( l − 1 ) ) ∝ e x p ( b ( l ) T h ( l ) + b ( l − 1 ) T h ( l − 1 ) + h ( l − 1 ) T W ( l ) h ( l ) ) (46) P(h^{(l)},h^{(l-1)})\propto exp(b^{(l)T}h^{(l)}+b^{(l-1)T}h^{(l-1)}+h^{(l-1)T}W^{(l)}h^{(l)})\tag{46} P(h(l),h(l1))exp(b(l)Th(l)+b(l1)Th(l1)+h(l1)TW(l)h(l))(46)
P ( h i ( k ) = 1 ∣ h ( k + 1 ) ) = σ ( b i ( k ) + W : , i ( k + 1 ) T h ( k + 1 ) )   ∀ i , ∀ k ∈ 1 , … , l − 2 (47) P(h_i^{(k)}=1|h^{(k+1)})=\sigma(b_i^{(k)}+W_{:,i}^{(k+1)T}h^{(k+1)}) \ \forall i,\forall k\in 1,\dots,l-2 \tag{47} P(hi(k)=1h(k+1))=σ(bi(k)+W:,i(k+1)Th(k+1)) i,k1,,l2(47)
P ( v i = 1 ∣ h ( 1 ) ) = σ ( b i ( 0 ) + W : , i ( 1 ) T h ( 1 ) )   ∀ i (48) P(v_i=1|h^{(1)})=\sigma(b_i^{(0)}+W_{:,i}^{(1)T}h^{(1)}) \ \forall i \tag{48} P(vi=1h(1))=σ(bi(0)+W:,i(1)Th(1)) i(48)
上式是二值可见单元,在实值可见单元的情况下,替换
v ∼ N ( v ; b ( 0 ) + W ( 1 ) T h ( 1 ) , β − 1 ) (49) v\sim \mathcal{N}(v;b^{(0)}+W^{(1)T}h^{(1)},\beta^{-1}) \tag{49} vN(v;b(0)+W(1)Th(1),β1)(49)
为便于处理, β \beta β为对角形式,只有一个隐藏层的DBN只是一个RBM。
  为了从DBN中生成样本,我们现在顶部的两个隐藏层上运行几个Gibbs采样步骤,这个阶段主要从RBM(由顶部两个隐藏层定义)采一个样本,然后,我们可以对模型的其余部分使用单次原始采样,以从可见单元绘制样本。
  在深度学习中,通常我们有一系列可见变量 v v v和一系列潜变量 h h h,推断困难是指难以计算 p ( h ∣ v ) p(h|v) p(hv)或其期望,而这一步操作在一些诸如最大似然学习的任务中往往是必需的。许多仅有一个隐藏层的简单图模型会定义成易于计算 p ( h ∣ v ) p(h|v) p(hv)或其期望的形式,例如RBM和概率PCA。不幸的是,大多数具有多层隐藏变量的图模型的后验分布都很难处理,对于这些模型而言,精确推断算法需要指数级的运行时间,即使一些只有单层的模型如稀疏编码,也存在这样的问题。
在这里插入图片描述
  精确推断问题可以描述为一个优化问题,有许多方法正是由此解决了推断的困难,通过近似这样一个潜在的优化问题,我们一般可以推导出近似推断算法。假设有一个具有可见变量 v v v和潜变量 h h h的概率模型,我们希望计算观察数据的对数概率 l o g p ( v ; θ ) logp(v;\theta) logp(v;θ),有时候如果边缘化消去 h h h的操作很费时,会难以计算 l o g p ( v ; θ ) logp(v;\theta) logp(v;θ)。作为替代,我们可以计算一个 l o g p ( v ; θ ) logp(v;\theta) logp(v;θ)的下界 L ( v , θ , q ) \mathcal{L}(v,\theta,q) L(v,θ,q),这个下界被称为证据下界(ELBO),另一个名称是负变分自由能,其定义如下
L ( v , θ , q ) = l o g p ( v ; θ ) − D K L ( q ( h ∣ v ) ∣ ∣ p ( h ∣ v ; θ ) ) (50) \mathcal{L}(v,\theta,q)=logp(v;\theta)-D_{KL}(q(h|v)||p(h|v;\theta)) \tag{50} L(v,θ,q)=logp(v;θ)DKL(q(hv)p(hv;θ))(50)
其中 q q q是关于 h h h的一个任意概率分布。
  因为 l o g p ( v ) logp(v) logp(v) L ( v , θ , q ) \mathcal{L}(v,\theta,q) L(v,θ,q)之间的距离是由 K L KL KL散度来衡量的,且 K L KL KL散度总是非负的,我们可以发现 L \mathcal{L} L总是小于等于所求的对数概率,当且仅当分布 q q q完全等于 p ( h ∣ v ) p(h|v) p(hv)时取到等号。 L ( v , θ , q ) = l o g p ( v ; θ ) − D K L ( q ( h ∣ v ) ∣ ∣ p ( h ∣ v ; θ ) ) = l o g p ( v ; θ ) − E h ∼ q l o g q ( h ∣ v ) p ( h ∣ v ) = l o g p ( v ; θ ) − E h ∼ q l o g q ( h ∣ v ) p ( h , v ; θ ) p ( v ; θ ) = l o g p ( v ; θ ) − E h ∼ q [ l o g q ( h ∣ v ) − l o g p ( h , v ; θ ) + l o g p ( v ; θ ) ] = − E h ∼ q [ l o g q ( h ∣ v ) − l o g p ( h , v ; θ ) ] = E h ∼ q [ l o g p ( h , v ) ] + H ( q ) (51) \mathcal{L}(v,\theta,q)=logp(v;\theta)-D_{KL}(q(h|v)||p(h|v;\theta)) \\ =logp(v;\theta)-\mathbb{E}_{h\sim q}log\frac{q(h|v)}{p(h|v)} \\ =logp(v;\theta)-\mathbb{E}_{h\sim q}log\frac{q(h|v)}{\frac{p(h,v;\theta)}{p(v;\theta)}} \\ =logp(v;\theta)-\mathbb{E}_{h\sim q}[logq(h|v)-logp(h,v;\theta)+logp(v;\theta)] \\ =-\mathbb{E}_{h\sim q}[logq(h|v)-logp(h,v;\theta)] \\ =\mathbb{E}_{h\sim q}[logp(h,v)]+H(q) \tag{51} L(v,θ,q)=logp(v;θ)DKL(q(hv)p(hv;θ))=logp(v;θ)Ehqlogp(hv)q(hv)=logp(v;θ)Ehqlogp(v;θ)p(h,v;θ)q(hv)=logp(v;θ)Ehq[logq(hv)logp(h,v;θ)+logp(v;θ)]=Ehq[logq(hv)logp(h,v;θ)]=Ehq[logp(h,v)]+H(q)(51)
  对于一个合适选择的分布 q q q L \mathcal{L} L是容易计算的,对任意分布 q q q的选择来说, L \mathcal{L} L提供了似然函数的一个下界,我们可以将推断问题看作找一个分布 q q q使 L \mathcal{L} L最大的过程。
  DBN引发许多与有向模型和无向模型同时相关的问题。由于每个有向层内的相消解释效应,以及无向连接的两个隐藏层之间的相互作用,DBN中推断是难解的,评估或最大化对数似然的标准证据下界也是难以处理的,因为需要基于大小等于网络宽度的团的期望。评估或最大化对数似然,不仅需要面对边缘化潜变量时难以处理的推断问题,而且还需要处理顶部两层无向模型内难处理的配分函数问题。
  为训练深度信念网络,我们可以先使用对比散度或随机最大似然方法训练RBM以最大化 E v ∼ p d a t a l o g p ( v ) \mathbb{E}_{v\sim p_{data}}logp(v) Evpdatalogp(v),RBM的参数定义了DBN第一层的参数,然后第二个RBM训练为近似最大化
E v ∼ p d a t a E h ( 1 ) ∼ p ( 1 ) ( h ( 1 ) ∣ v ) l o g p ( 2 ) ( h ( 1 ) ) (52) \mathbb{E}_{v\sim p_{data}}\mathbb{E}_{h^{(1)}\sim p^{(1)}(h^{(1)}|v)}logp^{(2)}(h^{(1)}) \tag{52} EvpdataEh(1)p(1)(h(1)v)logp(2)(h(1))(52)
其中 p ( 1 ) p^{(1)} p(1)是第一个RBM表示的概率分布, p ( 2 ) p^{(2)} p(2)是第二个RBM表示的概率分布,换句话说,第二个RBM被训练为模拟由第一个RBM的隐藏单元采样定义的分布,而第一个RBM由数据驱动。这个过程能无限重复,从而向DBN添加任意多层,其中每个新的RBM对前一个RBM的样本建模。这个过程可以被视为提高数据在DBN下似然概率的变分下界。
  在大多数应用中,对DBN进行贪心逐层训练后,不需要再对其进行联合训练,然而使用醒眠算法对其进行生成精调是可能的。训练好的DBN可以直接用作生成模型,但是DBN的大多数兴趣来自它们改进分类模型的能力,我们可以从DBN获取权重,并使用它们定义MLP
h ( 1 ) = σ ( b ( 1 ) + v T W ( 1 ) ) (53) h^{(1)}=\sigma(b^{(1)}+v^TW^{(1)}) \tag{53} h(1)=σ(b(1)+vTW(1))(53)
h ( l ) = σ ( b i ( l ) + h ( l − 1 ) T W ( l ) )   ∀ l ∈ 2 , … , m (54) h^{(l)}=\sigma(b_i^{(l)}+h^{(l-1)T}W^{(l)}) \ \forall l\in2,\dots,m \tag{54} h(l)=σ(bi(l)+h(l1)TW(l)) l2,,m(54)
利用DBN的生成训练后的权重和偏置初始化该MLP之后,可以训练该MLP来执行分类任务。

Matlab代码实现
%% 主程序
%% 导入mnist数据
N_sample = 1000;p = 784;
x = zeros(N_sample , p);
tic
for i = 1 : N_sample
    im = imread(['F:\MATLAB\mnist手写数字\trainimage\pic2\0\' num2str(i) '.bmp']);
    x(i , :) = double(reshape(im(: , : , 1) , 1 , p) > 10);
end
toc
%% 调用RBM
model = DBN([p 300 100 50]);%创建对象
model = model.train(x , 3000);%训练
model2=model.predict(100);%重构
%% 绘制重构图像
Im = zeros(280 , 280);
for i = 1 : size(model.rbmList(1).testData_x , 1)
    i0 = floor((i-1)/10);j0 = mod(i-1,10);
    Im(i0*28+1:(i0+1)*28,j0*28+1:(j0+1)*28) = reshape(model.rbmList(1).testData_x(i , :) , 28 , 28);
end
imshow([Im(1:140,:) Im(141:280,:)]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
classdef DBN
    properties
        trainData_x;        %训练数据 x
        testData_x;         %测试重构数据
        v_num;              %参数     v单元的个数
        h_num;              %参数     每个隐藏层单元的个数
        N_layer;            %参数     隐藏层的个数
        N_sample;           %样本总数 N_sample
        rbmList;            %将各隐藏层封装成列表
        IterMax;            %最大迭代次数
    end
    methods
        function obj = DBN(h_num)
            obj.v_num = h_num(1);
            obj.N_sample = size(obj.trainData_x,1);
            obj.h_num=h_num;
            obj.N_layer=length(h_num);
            % 创建各隐藏层,num_layer为一个数组,分别确定0,1,2,...层的单元个数
            rbmList(1:obj.N_layer-1) = pfor(@RBM , h_num(1:end-1) , h_num(2:end));
            obj.rbmList = rbmList;
            obj.IterMax = 3000;
        end
        function obj = train(obj , trainData_x , Iter)            %梯度下降训练
            if(nargin == 2)
                Iter = obj.IterMax;
            end
            obj.trainData_x = trainData_x;
            obj.N_sample = size(obj.trainData_x,1);
            obj.rbmList(1) = obj.rbmList(1).train(trainData_x , Iter);
            obj.rbmList(1) = obj.rbmList(1).predict(obj.rbmList(1).N_sample);
            for i = 2 : obj.N_layer-1
                obj.rbmList(i) = obj.rbmList(i).train(obj.rbmList(i-1).testData_h , Iter);
                obj.rbmList(i) = obj.rbmList(i).predict(obj.rbmList(i).N_sample);
            end
        end
        function obj = predict(obj , num_batch)    %重构
            testData_x_batch = obj.rbmList(obj.N_layer-1).testData_x(randperm...
                (obj.rbmList(obj.N_layer-1).N_sample , num_batch) , :);
            for i = obj.N_layer-2 : -1 : 1
                obj.rbmList(i) = obj.rbmList(i).predict(num_batch , testData_x_batch);
                testData_x_batch = obj.rbmList(i).testData_x;
            end
            obj.testData_x = testData_x_batch;
        end
    end
end
function [output]=pfor(fun , varargin)
Iter = length(varargin{1});
nar = nargin(fun);
arginList = cell(Iter , nar);
for i = 1 : Iter
    for j = 1 : nar
        arginList{i , j} = varargin{j}(i);
    end
end
output(1 : Iter) = fun(arginList{i , :});
for i = 1 : Iter
    output(i) = fun(arginList{i , :});
end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
classdef RBM
    properties
        trainData_x;        %训练数据 x
        testData_x;         %测试重构数据
        testData_h;         %测试重构数据
        v;                  %可见层单元     v
        h;                  %隐藏层单元     h
        v_num;              %参数     v单元的个数
        h_num;              %参数     h单元的个数
        w;                  %权重     w
        b;                  %权重     b
        c;                  %权重     c
        N_sample;           %样本总数 N_sample
        iter_train;         %当前迭代次数
        IterMax;            %最大迭代次数
        batchSize;          %批次大小
        numIterOfTrain;     %训练时的吉布斯采样迭代次数
        numIterOfPredict;   %预测时的吉布斯采样迭代次数
    end
    methods
        function obj = RBM(v_num , h_num)
            if(nargin == 0)
                v_num = 1;
                h_num = 1;
            end
            obj.v_num = v_num;
            obj.h_num = h_num;
            obj.v = zeros(obj.v_num , 1);
            obj.h = zeros(obj.h_num , 1);
            obj.w = rand(obj.v_num , obj.h_num);
            obj.b = ones(obj.v_num , 1);
            obj.c = ones(obj.h_num , 1);
            obj.iter_train = 0;
            obj.IterMax = 3000;
            obj.batchSize = 100;
            obj.numIterOfTrain=15;
            obj.numIterOfPredict=50;
        end
        function obj = train(obj , trainData_x , Iter)            %梯度下降训练
            if(nargin == 2)
                Iter = obj.IterMax;
            end
            obj.trainData_x = trainData_x;
            obj.N_sample = size(obj.trainData_x,1);
            batch_size = obj.batchSize;
            alpha = .1 / batch_size;
%             gradient_w = rand(obj.v_num , obj.h_num);
            while obj.iter_train < Iter %sum(abs(gradient_w)) > 1e-18 
                obj.iter_train = obj.iter_train + 1;
                trainData_x_batch = obj.trainData_x(randperm(obj.N_sample , batch_size) , :);
                %数据集部分(正相)
                gradient_w = trainData_x_batch' * sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w);
                gradient_b = sum(trainData_x_batch)';
                gradient_c = sum(sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w))';
                %吉布斯采样部分(负相)
                k=obj.numIterOfTrain;
                for i = 1 : k
                    h_batch = double(rand(batch_size , obj.h_num) < sigmoid(repmat(obj.c' , batch_size , 1) +...
                        trainData_x_batch * obj.w));
                    trainData_x_batch = double(rand(batch_size , obj.v_num) < sigmoid(repmat(obj.b' , batch_size , 1) + ...
                        h_batch * obj.w'));
                end
                gradient_w = gradient_w - trainData_x_batch' * sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w);
                gradient_b = gradient_b - sum(trainData_x_batch)';
                gradient_c = gradient_c - sum(sigmoid(repmat(obj.c' , batch_size , 1) + ...
                    trainData_x_batch * obj.w))';
                %更新参数
                obj.w = obj.w + alpha * gradient_w;
                obj.b = obj.b + alpha * gradient_b;
                obj.c = obj.c + alpha * gradient_c;
                %在此绘制权重参数动态图
            end
        end
        function obj = predict(obj , num_batch , testData_h_batch)    %重构
            if(nargin == 3)
                testData_x_batch = double(rand(num_batch , obj.v_num) < sigmoid(repmat(obj.b' , num_batch , 1) + ...
                    testData_h_batch * obj.w'));
            else
                testData_x_batch = obj.trainData_x(randperm(obj.N_sample , num_batch) , :);
            end
            k=obj.numIterOfPredict;
            for i = 1 : k
                h_batch = double(rand(num_batch , obj.h_num) < sigmoid(repmat(obj.c' , num_batch , 1) +...
                    testData_x_batch * obj.w));
                testData_x_batch = double(rand(num_batch , obj.v_num) < sigmoid(repmat(obj.b' , num_batch , 1) + ...
                    h_batch * obj.w'));
            end
            obj.testData_x = testData_x_batch;
            obj.testData_h = h_batch;
        end
    end
end
function output = sigmoid(x)
output =1 ./ (1 + exp(-x));
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

  以下是DBN采样的数字图片结果
在这里插入图片描述

DBM

  DBM是另一种深度生成模型,与DBN不同的是,这是一个完全无向的模型,与RBM不同的是,DBM有几层潜变量。但是像RBM一样,每一层内的每个变量是相互独立的,并条件于相邻层中的变量。与RBM和DBN一样,DBM通常仅有二值单元,但很容易能扩展到实数可见单元。DBM是基于能量的模型,这意味着模型变量的联合概率分布由能量函数 E E E参数化,在一个DBM有一个可见层 v v v和三个隐藏层 h ( 1 ) h^{(1)} h(1) h ( 2 ) h^{(2)} h(2) h ( 3 ) h^{(3)} h(3)的情况下,联合概率由下式给出
P ( v , h ( 1 ) , h ( 2 ) , h ( 3 ) ) = 1 Z ( θ ) e x p ( − E ( v , h ( 1 ) , h ( 2 ) , h ( 3 ) ; θ ) ) (55) P(v,h^{(1)},h^{(2)},h^{(3)})=\frac{1}{Z(\theta)}exp(-E(v,h^{(1)},h^{(2)},h^{(3)};\theta)) \tag{55} P(v,h(1),h(2),h(3))=Z(θ)1exp(E(v,h(1),h(2),h(3);θ))(55)
DBM能量函数定义如下
E ( v , h ( 1 ) , h ( 2 ) , h ( 3 ) ; θ ) = − v T W ( 1 ) h ( 1 ) − h ( 1 ) T W ( 2 ) h ( 2 ) − h ( 2 ) T W ( 3 ) h ( 3 ) − b ( 0 ) T v − b ( 1 ) T h ( 1 ) − b ( 2 ) T h ( 2 ) − b ( 3 ) T h ( 3 ) (56) E(v,h^{(1)},h^{(2)},h^{(3)};\theta)=-v^TW^{(1)}h^{(1)}-h^{(1)T}W^{(2)}h^{(2)}-h^{(2)T}W^{(3)}h^{(3)} \\ -b^{(0)T}v-b^{(1)T}h^{(1)}-b^{(2)T}h^{(2)}-b^{(3)T}h^{(3)} \tag{56} E(v,h(1),h(2),h(3);θ)=vTW(1)h(1)h(1)TW(2)h(2)h(2)TW(3)h(3)b(0)Tvb(1)Th(1)b(2)Th(2)b(3)Th(3)(56)
  与全连接的玻尔兹曼机相比,DBM提供了类似于RBM的一些优点。DBM的层可以组织成一个二分图,其中奇数层在一侧,偶数层在另一侧,容易发现,当我们条件于偶数层中的变量时,奇数层中的变量条件独立,反之亦然。DBM的二分图结构意味着,我们可以应用之前用于RBM条件分布的相同式子来确定DBM中的条件分布。在给定相邻层值的情况下,层内的单元彼此条件独立,因此二值变量的分布可以由Bernoulli参数完全描述。在具有两个隐藏层的事例中,激活概率由下式给出
P ( v i = 1 ∣ h ( 1 ) ) = σ ( W i , : ( 1 ) h ( 1 ) ) (57) P(v_i=1|h^{(1)})=\sigma(W_{i,:}^{(1)}h^{(1)}) \tag{57} P(vi=1h(1))=σ(Wi,:(1)h(1))(57)
P ( h i ( 1 ) = 1 ∣ v , h ( 2 ) ) = σ ( v T W : , i ( 1 ) + W i , : ( 2 ) h ( 2 ) ) (58) P(h_i^{(1)}=1|v,h^{(2)})=\sigma(v^TW_{:,i}^{(1)}+W_{i,:}^{(2)}h^{(2)}) \tag{58} P(hi(1)=1v,h(2))=σ(vTW:,i(1)+Wi,:(2)h(2))(58)
P ( h k ( 2 ) = 1 ∣ h ( 1 ) ) = σ ( h ( 1 ) T W : , k ( 2 ) ) (59) P(h_k^{(2)}=1|h^{(1)})=\sigma(h^{(1)T}W_{:,k}^{(2)}) \tag{59} P(hk(2)=1h(1))=σ(h(1)TW:,k(2))(59)
  二分图结构使Gibbs采样能在深度玻尔兹曼机中高效采样,Gibbs采样可以将更新分成两个块,一块为所有偶数层,另一块为所有奇数层,这样可以仅在两次迭代中更新所有单元,高效采样对使用随机最大似然算法的训练尤其重要。
  DBM具有许多有趣的性质。DBM在DBN之后开发,与DBN相比,DBM的后验分布 P ( h ∣ v ) P(h|v) P(hv)更简单,有点违反直觉的是,这种后验分布的简单性允许更加丰富的后验近似。在DBN的情况下,我们使用启发式的近似推断过程进行分类,其中我们可以通过MLP(使用sigmoid激活函数并且权重与原始DBN相同)中的向上传播猜测隐藏单元合理的均匀场期望值。任何分布 Q ( h ) Q(h) Q(h)可用于获取对数似然的变分下界,因此这种启发式的过程让我们能够获取这种的下界。但是,该界没有以任何方式显式优化,所以该界可能是远远不紧的。特别地, Q Q Q的启发式估计忽略了相同层内隐藏单元之间的相互作用,以及更深层中隐藏单元对更接近输入的隐藏单元自顶向下的反馈影响。因为DBN中基于启发式MLP的推断过程不能考虑这些相互作用,所以获取的 Q Q Q远不是最优的。这种层内相互作用的缺失,使通过不动点方程优化变分下界,并找到真正最佳的均匀场期望变的可能。
  使用适当的均匀场允许DBM的近似推断过程捕获自顶向下反馈相互作用的影响,这从神经科学的角度来看是有趣的,因为根据已知,人脑使用许多自上而下的反馈连接。由于这个性质,DBM已被用作真实神经科学现象的计算模型。
  DBM一个不理想的特性是从中采样困难的。DBN只需要在其顶部的一对层中使用MCMC采样,其它层仅在采样过程末尾涉及,并且只需一个高效的原始采样过程。要从DBM生成样本,必须在所有层中使用MCMC,并且模型的每一层都参与每个马尔科夫链转移。

DBM均匀场推断

  训练的学习过程可以看做关于参数 θ \theta θ最大化证据下界 L \mathcal{L} L的过程,EM算法在给定了分布 q q q的条件下能够进行大学习步骤,而基于MAP推断的学习算法则是学习一个 P ( h ∣ v ) P(h|v) P(hv)的点估计而非推断整个完整的分布,这里介绍其它的方法。
  变分学习的核心思想是在一个关于 q q q的有约束的分布族上最大化 L \mathcal{L} L,选择这个分布族时应该考虑到计算 E q l o g P ( h , v ) E_qlogP(h,v) EqlogP(h,v)的难易度。一个典型的方法就是添加分布 q q q如何分解的假设,一般是加入一些限制使 q q q是一个因子分布
q ( h ∣ v ) = ∏ i q ( h i ∣ v ) (60) q(h|v)=\prod_iq(h_i|v) \tag{60} q(hv)=iq(hiv)(60)
这被称为均值场方法。更一般地说,我们可以通过选择分布 q q q的形式来选择任何图模型的结构,通过选择变量之间相互作用的多少灵活地决定近似程度的大小,这种图模型方法被称为结构化变分推断(structured variational inference)(Saul and Tordan,1996)。
  变分法的优点是,我们不需要为分布 q q q设定一个特定的参数形式。我们设定它如何分解,之后通过解决优化问题来找出在这些分解限制下最优的概率分布。对离散型潜变量来说,这意味着我们可以使用传统的优化技巧来优化描述分布 q q q的有限个变量。对连续型潜变量来说,这意味着我们使用一个被称为变分法的工具来解决函数空间上的优化问题,而且这时的变分法,不需要过多地人工选择模型,只需要设定分布 q q q如何分解,而不需要去猜测一个特定的能够精确近似原后验分布的 q q q
  因为 L ( v , θ , q ) = l o g p ( v ; θ ) − D K L ( q ( h ∣ v ) ∣ ∣ p ( h ∣ v ; θ ) ) \mathcal{L}(v,\theta,q)=logp(v;\theta)-D_{KL}(q(h|v)||p(h|v;\theta)) L(v,θ,q)=logp(v;θ)DKL(q(hv)p(hv;θ)),关于 q q q最大化 L \mathcal{L} L的问题等价于最小化 D K L ( q ( h ∣ v ) ∣ ∣ p ( h ∣ v ) ) D_{KL}(q(h|v)||p(h|v)) DKL(q(hv)p(hv)),这时要用 q q q来拟合 p p p。当我们使用最大似然估计来用模型拟合数据时,我们最小化 D K L ( p d a t a ∣ ∣ p m o d e l ) D_{KL}(p_{data}||p_{model}) DKL(pdatapmodel),这意味着最大似然鼓励模型在每一个数据达到高概率的地方达到高概率,而基于优化的推断则鼓励 q q q在每一个真实后验分布 p p p概率低的地方概率较小。这两种基于KL散度的方法都有各自的优点和缺点,选择哪一种方法取决于不同的应用更偏好哪种性质。
   给定相邻层,一个DBM层上的条件分布是因子的,在有两个隐藏层的DBM的示例中,这些分布是 P ( v ∣ h ( 1 ) ) P(v|h^{(1)}) P(vh(1)) P ( h ( 1 ) ∣ v , h ( 2 ) ) P(h^{(1)}|v,h^{(2)}) P(h(1)v,h(2)) P ( h ( 2 ) ∣ h ( 1 ) ) P(h^{(2)}|h^{(1)}) P(h(2)h(1)),因为层之间的相互作用,所有隐藏层上的分布通常不是因子的。
  与DBN一样,我们还是要找出近似DBM后验分布的方法,然而与DBN不同,DBM在其隐藏单元上的后验分布能用均匀场近似来求解。均匀场近似是变分推断的简单形式,其中我们将近似分布限制为完全因子的分布。在DBM的情况下,均匀场方程捕获层之间的双向相互作用。
  令 Q ( h ( 1 ) , h ( 2 ) ∣ v ) Q(h^{(1)},h^{(2)}|v) Q(h(1),h(2)v) P ( h ( 1 ) , h ( 2 ) ∣ v ) P(h^{(1)},h^{(2)}|v) P(h(1),h(2)v)的近似,均匀场假设意味着
Q ( h ( 1 ) , h ( 2 ) ∣ v ) = ∏ j Q ( h j ( 1 ) ∣ v ) ∏ k Q ( h k ( 2 ) ∣ v ) (61) Q(h^{(1)},h^{(2)}|v)=\prod_jQ(h_j^{(1)}|v)\prod_kQ(h_k^{(2)}|v) \tag{61} Q(h(1),h(2)v)=jQ(hj(1)v)kQ(hk(2)v)(61)
  均匀场近似试图找到这个分布族中最适合真实后验 P ( h ( 1 ) , h ( 2 ) ∣ v ) P(h^{(1)},h^{(2)}|v) P(h(1),h(2)v)的成员,而且,每次我们使用 v v v的新值时,必须再次运行推断过程以找到不同的分布 Q Q Q。可以设想很多方法来衡量 Q ( h ∣ v ) Q(h|v) Q(hv) P ( h ∣ v ) P(h|v) P(hv)的拟合程度,均匀场方法是最小化
K L ( Q ∣ ∣ P ) = ∑ h Q ( h ( 1 ) , h ( 2 ) ∣ v ) l o g ( Q ( h ( 1 ) , h ( 2 ) ∣ v ) P ( h ( 1 ) , h ( 2 ) ∣ v ) ) (62) KL(Q||P)=\sum_hQ(h^{(1)},h^{(2)}|v)log(\frac{Q(h^{(1)},h^{(2)}|v)}{P(h^{(1)},h^{(2)}|v)}) \tag{62} KL(QP)=hQ(h(1),h(2)v)log(P(h(1),h(2)v)Q(h(1),h(2)v))(62)
  一般来说,处理要保证独立性假设,我们不必提供参数形式的近似分布,变分近似通常能够恢复近似分布的函数形式,然而在这里对于隐藏单元的均匀场假设,设定模型的参数形式不损失一般性。将 Q Q Q作为Bernoulli分布的乘积进行参数化,将 h ( 1 ) h^{(1)} h(1)每个元素的概率与一个参数相关联,对于每个 j j j h ^ j ( 1 ) = Q ( h j ( 1 ) = 1 ∣ v ) \hat{h}_j^{(1)}=Q(h_j^{(1)}=1|v) h^j(1)=Q(hj(1)=1v),其中 h ^ j ( 1 ) ∈ [ 0 , 1 ] \hat{h}_j^{(1)}\in[0,1] h^j(1)[0,1],另外对于每个 k k k h ^ k ( 2 ) = Q ( h k ( 2 ) = 1 ∣ v ) \hat{h}_k^{(2)}=Q(h_k^{(2)}=1|v) h^k(2)=Q(hk(2)=1v),其中 h ^ k ( 2 ) ∈ [ 0 , 1 ] \hat{h}_k^{(2)}\in[0,1] h^k(2)[0,1]。则有以下近似后验
Q ( h ( 1 ) , h ( 2 ) ∣ v ) = ∏ j Q ( h j ( 1 ) ∣ v ) ∏ k Q ( h k ( 2 ) ∣ v ) = ∏ j ( h ^ j ( 1 ) ) h j ( 1 ) ( 1 − h ^ j ( 1 ) ) ( 1 − h j ( 1 ) ) × ∏ k ( h ^ k ( 2 ) ) h k ( 2 ) ( 1 − h ^ k ( 2 ) ) ( 1 − h k ( 2 ) ) (63) Q(h^{(1)},h^{(2)}|v)=\prod_jQ(h_j^{(1)}|v)\prod_kQ(h_k^{(2)}|v) \\ =\prod_j(\hat{h}_j^{(1)})^{h_j^{(1)}}(1-\hat{h}_j^{(1)})^{(1-h_j^{(1)})}\times\prod_k(\hat{h}_k^{(2)})^{h_k^{(2)}}(1-\hat{h}_k^{(2)})^{(1-h_k^{(2)})} \tag{63} Q(h(1),h(2)v)=jQ(hj(1)v)kQ(hk(2)v)=j(h^j(1))hj(1)(1h^j(1))(1hj(1))×k(h^k(2))hk(2)(1h^k(2))(1hk(2))(63)
现在已经指定了近似分布 Q Q Q的分布族,但仍需要指定用于选择该函数族中最适合 P P P的成员的过程,最直接的方法是,通过求解变分下界倒数为零的位置而导出
∂ ∂ h ^ L ( v , θ , h ^ ) = 0 (64) \frac{\partial}{\partial\hat{h}}\mathcal{L}(v,\theta,\hat{h})=0 \tag{64} h^L(v,θ,h^)=0(64)
我们有以下更新规则
h j ( 1 ) = σ ( ∑ i v i W i , j ( 1 ) + ∑ k ′ W j , k ′ ( 2 ) h ^ k ′ ( 2 ) ) ,   ∀ j (65) h_j^{(1)}=\sigma(\sum_iv_iW_{i,j}^{(1)}+\sum_{k'}W_{j,k'}^{(2)}\hat{h}_{k'}^{(2)}),\ \forall j \tag{65} hj(1)=σ(iviWi,j(1)+kWj,k(2)h^k(2)), j(65)
h ^ k ( 2 ) = σ ( ∑ j ′ W j ′ , k ( 2 ) h ^ j ′ ( 1 ) ) , ∀ k (66) \hat{h}_k^{(2)}=\sigma(\sum_{j'}W_{j',k}^{(2)}\hat{h}_{j'}^{(1)}),\forall k \tag{66} h^k(2)=σ(jWj,k(2)h^j(1)),k(66)
对于具有两个隐藏层的深度玻尔兹曼机 L \mathcal{L} L由下式给出
L ( Q , θ ) = ∑ i ∑ j ′ v i W i , j ′ ( 1 ) h ^ j ′ ( 1 ) + ∑ j ′ ∑ k ′ h ^ j ′ ( 1 ) W j ′ , k ′ ( 2 ) h k ′ ( 2 ) − l o g Z ( θ ) + H ( Q ) (67) \mathcal{L}(Q,\theta)=\sum_i\sum_{j'}v_iW_{i,j'}^{(1)}\hat{h}_{j'}^{(1)}+\sum_{j'}\sum_{k'}\hat{h}_{j'}^{(1)}W_{j',k'}^{(2)}h_{k'}^{(2)}-logZ(\theta)+\mathcal{H}(Q) \tag{67} L(Q,θ)=ijviWi,j(1)h^j(1)+jkh^j(1)Wj,k(2)hk(2)logZ(θ)+H(Q)(67)
该表达式仍然有对数配分函数 l o g Z ( θ ) logZ(\theta) logZ(θ),因此依然有配分函数和采样的困难,这意味着评估玻尔兹曼机的概率质量函数需要近似方法,训练模型需要近似对数配分函数的梯度。对比散度是缓慢的,因为它们不能在给定可见单元时对隐藏单元进行高效采样,每当需要心的负相样本时,对比散度将需要磨合一条马尔科夫链,DBM通常使用随机最大似然训练。不幸的是,随机初始化后使用随机最大似然训练的DBM通常导致直白,在一些情况下,模型不能学习如何充分地表示分布,在其它情况下,DBM可以很好地表示分布,但是没有比仅使用RBM获取更高的似然,除第一层外,所有层都具有非常小权重的DBM与RBM表示大致相同的分布,因此,目前开发了允许联合训练的各种技术。


用以训练两个隐藏层的DBM的变分随机最大似然算法
设步长 ϵ \epsilon ϵ为一个小的证书,设定吉布斯步数 k k k,达到足以让 p ( v , h ( 1 ) , h ( 2 ) ; θ + ϵ Δ θ ) p(v,h^{(1)},h^{(2)};\theta+\epsilon\Delta_\theta) p(v,h(1),h(2);θ+ϵΔθ)的马尔科夫链混合(从来自 p ( v , h ( 1 ) , h ( 2 ) ; θ ) p(v,h^{(1)},h^{(2)};\theta) p(v,h(1),h(2);θ)的样本开始)
初始化3个矩阵, V ~ \tilde{V} V~ H ~ ( 1 ) \tilde{H}^{(1)} H~(1) H ~ ( 2 ) \tilde{H}^{(2)} H~(2)每个都将 m m m行设为随机值
w h i l e while while 没有收敛(均匀场推断循环) d o do do
   H ^ ( 1 ) ← s i g m o i d ( V W ( 1 ) + H ^ ( 2 ) W ( 2 ) T ) \ \ \hat{H}^{(1)}\leftarrow sigmoid(VW^{(1)}+\hat{H}^{(2)}W^{(2)T})   H^(1)sigmoid(VW(1)+H^(2)W(2)T)
   H ^ ( 2 ) ← s i g m o i d ( H ^ ( 1 ) W ( 2 ) ) \ \ \hat{H}^{(2)}\leftarrow sigmoid(\hat{H}^{(1)}W^{(2)})   H^(2)sigmoid(H^(1)W(2))
e n d   w h i l e end \ while end while
Δ W ( 1 ) ← 1 m V T H ^ ( 1 ) \Delta_{W^{(1)}}\leftarrow\frac{1}{m}V^T\hat{H}^{(1)} ΔW(1)m1VTH^(1)
Δ W ( 2 ) ← 1 m H ^ ( 1 ) T H ^ ( 2 ) \Delta_{W^{(2)}}\leftarrow\frac{1}{m}\hat{H}^{(1)T}\hat{H}^{(2)} ΔW(2)m1H^(1)TH^(2)
f o r   l = 1   t o   k   ( G i b b s 采 样 )   d o for \ l=1 \ to \ k \ (Gibbs采样) \ do for l=1 to k (Gibbs) do
   G i b b s   b l o c k   1 : \ \ Gibbs \ block \ 1:   Gibbs block 1:
   ∀ i , j , V ~ i , j \ \ \forall i,j,\tilde{V}_{i,j}   i,j,V~i,j采自 P ( V ~ i , j = 1 ) = s i g m o i d ( W j , : ( 1 ) ( H ~ i , : ( 1 ) T ) ) P(\tilde{V}_{i,j}=1)=sigmoid(W_{j,:}^{(1)}(\tilde{H}_{i,:}^{(1)T})) P(V~i,j=1)=sigmoid(Wj,:(1)(H~i,:(1)T))
   ∀ i , j , H ~ i , j ( 2 ) \ \ \forall i,j,\tilde{H}_{i,j}^{(2)}   i,j,H~i,j(2)采自 P ( H ~ i , j ( 2 ) = 1 ) = s i g m o i d ( H ~ i , : ( 1 ) W : , j ( 2 ) ) P(\tilde{H}_{i,j}^{(2)}=1)=sigmoid(\tilde{H}_{i,:}^{(1)}W_{:,j}^{(2)}) P(H~i,j(2)=1)=sigmoid(H~i,:(1)W:,j(2))
   G i b b s   b l o c k   2 : \ \ Gibbs \ block \ 2:   Gibbs block 2:
   ∀ i , j , H ~ i , j ( 1 ) \ \ \forall i,j,\tilde{H}_{i,j}^{(1)}   i,j,H~i,j(1)采自 P ( H ~ i , j ( 1 ) = 1 ) = s i g m o i d ( V ~ i , : W : , j ( 1 ) + H ~ ( 2 ) W j , : ( 2 ) T ) P(\tilde{H}_{i,j}^{(1)}=1)=sigmoid(\tilde{V}_{i,:}W_{:,j}^{(1)}+\tilde{H}^{(2)}W_{j,:}^{(2)T}) P(H~i,j(1)=1)=sigmoid(V~i,:W:,j(1)+H~(2)Wj,:(2)T)
e n d   f o r end \ for end for
Δ W ( 1 ) ← Δ W ( 1 ) − 1 m V T H ~ ( 1 ) \Delta_{W^{(1)}}\leftarrow\Delta_{W^{(1)}}-\frac{1}{m}V^{T}\tilde{H}^{(1)} ΔW(1)ΔW(1)m1VTH~(1)
Δ W ( 2 ) ← Δ W ( 2 ) − 1 m H ~ ( 1 ) T H ~ ( 2 ) \Delta_{W^{(2)}}\leftarrow \Delta_{W^{(2)}}-\frac{1}{m}\tilde{H}^{(1)T}\tilde{H}^{(2)} ΔW(2)ΔW(2)m1H~(1)TH~(2)
W ( 1 ) ← W ( 1 ) + ϵ Δ W ( 1 ) W^{(1)}\leftarrow W^{(1)}+\epsilon\Delta_{W^{(1)}} W(1)W(1)+ϵΔW(1)
W ( 2 ) ← W ( 2 ) + ϵ Δ W ( 2 ) W^{(2)}\leftarrow W^{(2)}+\epsilon\Delta_{W^{(2)}} W(2)W(2)+ϵΔW(2)
e n d   w h i l e end \ while end while


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/944287
推荐阅读
相关标签
  

闽ICP备14008679号