1. 前言
虽然推导过二值形式的RBM,但是对于可见层为实值的输入还是半知半解的。最近写个深度学习相关综述,看了一些关于RBM的文献,这里做一下对比总结。但是不倾向于对实值RBM的推导,而是相关代码的实现。
2. RBM回顾
RBM是具有特殊结构的玻尔兹曼机,可见单元到隐单元是全连接,但是层内是无连接的,也就是可见单元不会和可见单元连一起。RBM的这种二分结构保证了当给定可见单元的时候,隐藏层个单元是相互独立的,至于为什么,可以看我前面对概率图模型截图的两篇文章:概率无向图模型、概率有向图模型,这两篇文章不长,而且对理解RBM非常有帮助,毕竟RBM也属于概率无向能量图模型。
【笔者注】有句话要记住:“没有万能的模型,只有不断优化的理论和结构”。个人非常不建议这样的问题:“为什么我把XX结构用到XX数据上效果不好哇”,“XX这个结构用到XX上出现这个问题是什么情况”。多看论文,不都迎刃而解了么。
3. 二值RBM
3.1 参数更新理论
定义RBM的可见单元为viv_ivi,对应偏置为aia_iai,隐层单元为hjh_jhj,对应偏置为bjb_jbj,那么RBM的可见层与隐藏层的联合概率分布就是
P(v,h)=exp(−E(v,h))ZP(\mathbf{v,h})=\frac{exp(-E(\mathbf{v,h}))}{Z} P(v,h)=Zexp(−E(v,h))
其中E(v,h)E(\mathbf{v,h})E(v,h)称为能量函数。当可见单元和隐单元都是二值的时候(值为0或者1),能量函数定义为
E(v,h)=−∑ijWijvihj−∑iaivi−∑jbjhjE(\mathbf{v,h})=-\sum_{ij}W_{ij}v_ih_j-\sum_ia_iv_i-\sum_jb_jh_j E(v,h)=−ij∑Wijvihj−i∑aivi−j∑bjhj
联合概率分布中的分母ZZZ为配分函数(partition function),用于归一化,可以确保P(v,h)P(\mathbf{v,h})P(v,h)是一个有效的概率分布1^11,其实也就是保证了和为1。这一项很难计算,因为存在对(指数级)连接方式的求和2^22
Z=∑v′,h′E(v′,h′)Z=\sum_{\mathbf{v',h'}}E(\mathbf{v',h'}) Z=v′,h′∑E(v′,h′)
随后对联合概率分布求解边缘分布,并且求解极大似然函数,便能够得到权重的更新方法
ΔWij∝<vihj>data−<vihj>model\Delta W_{ij}\propto <v_ih_j>_{data}-<v_ih_j>_{model} ΔWij∝<vihj>data−<vihj>model
其中<⋅>data<\cdot>_{data}<⋅>data代表对数据分布的期望,<⋅>model<\cdot>_{model}<⋅>model代表RBM能量模型的平衡分布 ,通过将训练集中的一个向量输入到可见单元,可以得到<vihj><v_ih_j><vihj>的一个无偏样本,可以并行计算隐单元
P(hj=1∣v)=11+exp(−bj−∑iWijvi)P(h_j=1|v)=\frac{1}{1+exp(-b_j-\sum_iW_{ij}v_i)} P(hj=1∣v)=1+exp(−bj−∑iWijvi)1
对于从整个训练数据中的提取的’小批量’数据的每一个向量都要使用这个式子,主要是为了得到<vihj>data<v_ih_j>_{data}<vihj>data的经验估计(empirical estimate)。为了计算<vihj><v_ih_j><vihj>,我们需要从联合概率分布p(v,h)p(\mathbf{v,h})p(v,h)中获取无偏样本,方法就是吉布斯采样,通过迭代执行P(h∣v)P(\mathbf{h|v})P(h∣v)采样以及P(v∣h)P(\mathbf{v|h})P(v∣h)
P(vi=1∣h)=11+exp(−ai−∑jWijhj)P(v_i=1|\mathbf{h})=\frac{1}{1+exp(-a_i-\sum_jW_{ij}h_j)} P(vi=1∣h)=1+exp(−ai−∑jWijhj)1
但是,在高维空间中执行吉布斯采样,需要很久的时间才能收敛。所以使用下式代替上面更新权重的式子
ΔWij∝<vihj>data−<vihj>recon\Delta W_{ij}\propto <v_ih_j>_{data}-<v_ih_j>_{recon} ΔWij∝<vihj>data−<vihj>recon
式中的第二项对应"重构"数据的分布。重构数据是通过从可见层上的一个数据向量开始,不断使用P(hj=1∣v)P(h_j=1|\mathbf{v})P(hj=1∣v)对隐层采样和使用P(vi=1∣h)P(v_i=1|\mathbf h)P(vi=1∣h)对可见层采样,交错采样K次即可,偏置的学习方法为
Δai∝<vi>data−<vj>reconΔbj∝<hj>data−<hj>recon\begin{aligned} \Delta a_i & \propto <v_i>_{data}-<v_j>_{recon}\\ \Delta b_j & \propto <h_j>_{data}-<h_j>_{recon} \end{aligned} ΔaiΔbj∝<vi>data−<vj>recon∝<hj>data−<hj>recon
这个步骤不是极大似然学习法,因为极大似然学习很慢;如果我们近似地沿着另一个函数(对比散度)的梯度,学习效果依旧很好2^225^55,其实就是交错进行K次完整步骤的吉布斯采样。
用向量的方法写RBM的联合概率分布,迭代采样中的条件概率分布如下1^11:
P(v,h)=exp(vTbv+hTbh+vTWh)/ZP(H(j)=1∣v)=s(bH+WTv)(j)P(V(i)=1∣h)=s(bV+Wh)(i)\begin{aligned} &P\mathbf{(v,h)}=exp(v^Tb_v+h^Tb_h+v^TWh)/Z\\ &P(H^{(j)}=1|v)=s(b_H+W^Tv)^{(j)}\\ &P(V^{(i)}=1|h)=s(b_V+Wh)^{(i)} \end{aligned} P(v,h)=exp(vTbv+hTbh+vTWh)/ZP(H(j)=1∣v)=s(bH+WTv)(j)P(V(i)=1∣h)=s(bV+Wh)(i)
其中s(x)(j)=(1+exp(−x(j)))−1s(x)^{(j)}=(1+exp(-x^{(j)}))^{-1}s(x)(j)=(1+exp(−x(j)))−1是logistic函数,x(j)x^{(j)}x(j)是向量xxx的第jjj个成分。
3.2 参数更新代码
找代码的目的主要是为了看理论和代码的一致性,Hinton提供的代码结构分析如下:
-
可见层→\to→ 隐藏层
利用可见层对隐层采样
P(hj=1∣v)=11+exp(−bj−∑iWijvi)P(h_j=1|v)=\frac{1}{1+exp(-b_j-\sum_iW_{ij}v_i)} P(hj=1∣v)=1+exp(−bj−∑iWijvi)1
data = batchdata(:,:,batch);poshidprobs = 1./(1 + exp(-data*vishid - repmat(hidbiases,numcases,1))); batchposhidprobs(:,:,batch)=poshidprobs;
当然,由于隐层是二值形式,所以采用随机阈值激活方法
poshidstates = poshidprobs > rand(numcases,numhid);
记录<vihj>data;<vi>data;<hj>data<v_ih_j>_{data};\quad <v_i>_{data};\quad <h_j>_{data}<vihj>data;<vi>data;<hj>data
posprods = data' * poshidprobs;poshidact = sum(poshidprobs);posvisact = sum(data);
-
隐藏层→\to→可见层
利用隐层二值状态
poshidstates
对可见层重构
P(vi=1∣h)=11+exp(−ai−∑jWijhj)P(v_i=1|\mathbf{h})=\frac{1}{1+exp(-a_i-\sum_jW_{ij}h_j)} P(vi=1∣h)=1+exp(−ai−∑jWijhj)1negdata = 1./(1 + exp(-poshidstates*vishid' - repmat(visbiases,numcases,1)));
记录<vihj>recon;<vi>recon;<hj>recon<v_ih_j>_{recon};\quad<v_i> _{recon};\quad <h_j>_{recon}<vihj>recon;<vi>recon;<hj>recon
neghidprobs = 1./(1 + exp(-negdata*vishid - repmat(hidbiases,numcases,1))); negprods = negdata'*neghidprobs;neghidact = sum(neghidprobs);negvisact = sum(negdata);
-
更新模型参数
ΔWij∝<vihj>data−<vihj>reconΔai∝<vi>data−<vj>reconΔbj∝<hj>data−<hj>recon\begin{aligned} \Delta W_{ij}&\propto <v_ih_j>_{data}-<v_ih_j>_{recon}\\ \Delta a_i & \propto <v_i>_{data}-<v_j>_{recon}\\ \Delta b_j & \propto <h_j>_{data}-<h_j>_{recon} \end{aligned} ΔWijΔaiΔbj∝<vihj>data−<vihj>recon∝<vi>data−<vj>recon∝<hj>data−<hj>recon
vishidinc = momentum*vishidinc + ...epsilonw*( (posprods-negprods)/numcases - weightcost*vishid);visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*(posvisact-negvisact);hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*(poshidact-neghidact);vishid = vishid + vishidinc;visbiases = visbiases + visbiasinc;hidbiases = hidbiases + hidbiasinc;
代码中多出的项分别为动量项momentum
,学习率epsilon
,权重衰减weightcost
由此可见,上述理论和代码可以作为二值RBM的标准写法。
4. 实值RBM
很多情况RBM的输入向量是实值形式的,比如手写数字的处理中,先对数据进行归一化,然后使用二值可见单元的实值概率取代激活情况。注意下面讨论的是可见单元为实值,隐单元为二值的RBM的情况,关于实值-实值的情况以后再讨论,其实有人说,实值-实值的RBM已经退化成PCA了,后续继续研究。
4.1 参数更新理论
4.1.1 实值RBM的能量函数
在Hinton的课程和文献2^22中书写方式为
E(v,h)=∑i(vi−ai)22σi2−∑ij(Wij⋅viσi⋅hj)−∑jbjhjE(\mathbf{v,h})=\sum_i\frac{(v_i-a_i)^2}{2\sigma_i^2}-\sum_{ij}(W_{ij}\cdot\frac{v_i}{\sigma_i}\cdot h_j)-\sum_j{b_jh_j} E(v,h)=i∑2σi2(vi−ai)2−ij∑(Wij⋅σivi⋅hj)−j∑bjhj
在文献4^44中带范围的书写方式为
E(v,h)=∑i=1m(vi−ai)22σ2−∑j=1n∑i=1m(Wij⋅viσ⋅hj)−∑j=1nbjhjE(\mathbf{v,h})=\sum_{i=1}^m\frac{(v_i-a_i)^2}{2\sigma^2}-\sum_{j=1}^n\sum_{i=1}^m(W_{ij}\cdot\frac{v_i}{\sigma}\cdot h_j)-\sum_{j=1}^n{b_jh_j} E(v,h)=i=1∑m2σ2(vi−ai)2−j=1∑ni=1∑m(Wij⋅σvi⋅hj)−j=1∑nbjhj
在文献6^66中使用平方的写法为
ERBM(v,h∣W,bv,bh,{σi2})=∑i(biv−vi)22σi2−∑i,j1σi2Wijvihj−∑jbjhhjE_{RBM}(\mathbf{v,h|W,b^v,b^h,\{\sigma_i^2}\})=\sum_i \frac{(b_i^v-v_i)^2}{2\sigma_i^2}-\sum_{i,j}\frac{1}{\sigma_i^2}W_{ij}v_ih_j-\sum_jb_j^hh_j ERBM(v,h∣W,bv,bh,{σi2})=i∑2σi2(biv−vi)2−i,j∑σi21Wijvihj−j∑bjhhj
其中aia_iai是可见单元的偏置,bjb_jbj是隐单元的偏置,σ\sigmaσ是可见单元的高斯噪声的标准差2^22,对称权重WijW_{ij}Wij连接可见曾和隐藏层。在Hinton在Coursera上的课程中提到了这个方差使得RBM的采样出现了问题
所以在实际中,经常让σ=1\sigma=1σ=1,而且在文献5^55中也提到了: 实际中,我们经常把我们的数据缩放到零均值和单位方差,固定式中方差σi\sigma_iσi为1能够学习地更好,即使我们期望模型能够达到更高的精度,因而这就出现了后来的
- 在文献1^11中写出了向量表示的形式
E(v,h)=∣∣v∣∣22−vTbv−hTbh−vTWhE\mathbf{(v,h)}=\frac{||v||^2}{2}-v^Tb_v-h^Tb_h-v^TWh E(v,h)=2∣∣v∣∣2−vTbv−hTbh−vTWh
- 在文献3^33中的提出的能量函数写法
E(v,h)=12∑ivi2−∑i,jvihjwij−∑vibi−∑jhjcjE(\mathbf{v,h})=\frac{1}{2}\sum_iv_i^2-\sum_{i,j}v_ih_jw_{ij}-\sum v_ib_i-\sum_j h_jc_j E(v,h)=21i∑vi2−i,j∑vihjwij−∑vibi−j∑hjcj
4.1.2 实值RBM的采样
采样方法依旧是使用k次吉布斯采样,依据是一层的一个单元关于另一层所有单元的条件概率分布函数。需要注意的是,由于我们采用的是实值RBM,可见层单元服从零均值、单位方差的分布,所以依据隐层采样可见层不再是P(vi=1∣h)P(v_i=1|\mathbf h)P(vi=1∣h),而是利用隐单元对可见单元的均值做一个线性贡献2^226^66,在高斯分布中进行采样得到的,而高斯分布的参数也是由下式给出的
P(vi∣h)=N(ai+σi∑jWijhj,σi2)P(hj=1∣v)=11+exp(−bj−∑iWijviσ)\begin{aligned} P(v_i|\mathbf{h})&=N(a_i+\sigma_i\sum_jW_{ij}h_j,\sigma_i^2)\\ P(h_j=1|\mathbf{v})&=\frac{1}{1+exp(-b_j-\sum_iW_{ij}\frac{v_i}{\sigma})} \end{aligned} P(vi∣h)P(hj=1∣v)=N(ai+σij∑Wijhj,σi2)=1+exp(−bj−∑iWijσvi)1
其中N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)代表均值为μ\muμ,方差为σ\sigmaσ的正太分布(normal distribution)
因为方差σ=1\sigma=1σ=1,所以出现了下面两种写法
- 文献3^33中的,在假设可见单元具有N(0,1)N(0,1)N(0,1)分布下,第iii个可见单元可以从下式采样
N(∑jwijhj+bi,1)N(\sum_j w_{ij}h_j+b_i,1) N(j∑wijhj+bi,1)
- 文献5^55中提到的,假设σi=1\sigma_i=1σi=1,那么条件分布就是
p(hj=1∣v)=f(bj+∑iviwij)P(vi∣h)=N(ci+∑jhjwij,1)\begin{aligned} p(h_j=1|\mathbf{v})&=f(b_j+\sum_iv_iw_{ij})\\ P(v_i|\mathbf{h})&=N(c_i+\sum_j h_jw_{ij},1) \end{aligned} p(hj=1∣v)P(vi∣h)=f(bj+i∑viwij)=N(ci+j∑hjwij,1)
其中f(⋅)f(\cdot)f(⋅)是logistic函数(对数函数),N(μ,V)N(\mu,V)N(μ,V)是高斯分布。
权重和偏置的更新方法如下
4.2参数更新代码
保险起见,对于实值RBM,分析的代码应该不止一个,而且读者没必要具体分析代码的各个变量,只需要关注更新的大概方法即可。代码公布下载戳此处:代码1、代码2、代码3 .
4.2.1 positive阶段
关于实值RBM训练阶段的positive过程(可见层→\to→隐层)就直接贴了,和二值形式一样,先计算条件概率P(hj=1∣v)P(h_j=1|\mathbf v)P(hj=1∣v),然后使用随机阈值激活为01二值状态。
- 代码1来自5^55 ,虽然代码有时序关系存在,多了几项,但是依旧可以看出端倪
eta = w*(data(:,:,1)./gsd)' + ... %bottom-up connectionsrepmat(bj, 1, numcases) + ... %static biases on unitbjstar; %dynamic biaseshposteriors = 1./(1 + exp(-eta)); %logistic%Activate the hidden units hidstates = double(hposteriors' > rand(numcases,numhid)); %Calculate positive gradients (note w.r.t. neg energy)wgrad = hidstates'*(data(:,:,1)./gsd);bigrad = sum(data(:,:,1)' - ...repmat(bi,1,numcases) - bistar,2)./gsd^2;bjgrad = sum(hidstates,1)';
可以发现此代码保留了σ\sigmaσ,由可见层得到隐层状态的公式为
P(hj=1∣v)=sigmoid(w∗dataσ+bj)P(h_j=1|\mathbf{v})=sigmoid(w*\frac{data}{\sigma}+b_j) P(hj=1∣v)=sigmoid(w∗σdata+bj)
还有一点需要注意的是,从能量函数可以看出,方差项在权重www和可见层偏置bib_ibi都出现过,说明这两项的更新方法与σ\sigmaσ有关
<v,h>data=h{0,1}∗dataσ<v>data=∑i(vi−bi)σ2<h>data=∑h{0,1}<v,h>_{data}=h_{\{0,1\}}*\frac{data}{\sigma}\\ <v>_{data}=\frac{\sum_i (v_i-b_i)}{\sigma^2}\\ <h>_{data}=\sum h_{\{0,1\}} <v,h>data=h{0,1}∗σdata<v>data=σ2∑i(vi−bi)<h>data=∑h{0,1}
- 代码2来自7^77
%pass 3-way term + gated biases + hidbiases through sigmoid poshidprobs = 1./(1 + exp(-yvisfeat*hidfac' ...-ypastfeatB*hidfacB' - repmat(hidbiases,numcases,1)));%-data*vishid - repmat(hidbiases,numcases,1))); %Activate the hidden units hidstates = single(poshidprobs > rand(numcases,numhid));
此代码未保留σ\sigmaσ即σ=1\sigma=1σ=1,那么更新形式就较为简单
P(hj=1∣v)=sigmoid(w∗data+bj)P(h_j=1|\mathbf{v})=sigmoid(w*data+b_j) P(hj=1∣v)=sigmoid(w∗data+bj)
- 代码3摘自8^88,非完整摘取,只有与隐层状态计算相关的关键部分
%Term calculated by summing over hiddens
hidinp = data*vishid + effhidbias;
exphidinp = exp(hidinp); %cache this computation
poshidprobsall(:,:,cc) = exphidinp./(1+exphidinp);
poshidprobs(idx,:) = poshidprobsall(idx,:,cc);
posprods(:,:,cc) = (data(idx,:)./gsd)'*poshidprobs(idx,:); %smoothed: probs, not binary
poshidact(cc,:) = sum(poshidprobs(idx,:),1); %col vector; again smoothed
posvisact(cc,:) = sum(data(idx,:),1)./gsd^2; %row vector
这里的激活函数依旧是sigmoid函数,只不过变了一个形式
sigmoid(x)=11+e(−x)=ex1+exsigmoid(x)=\frac{1}{1+e^{(-x)}}=\frac{e^x}{1+e^x} sigmoid(x)=1+e(−x)1=1+exex
但是有一个小疑问就是,偏置的更新变了,在上述代码5中利用的是h{0,1}h_{\{0,1\}}h{0,1}更新,但是此代码使用 KaTeX parse error: Expected 'EOF', got '}' at position 10: P(h_i=1|v}̲ 更新
<v,h>data=P(h=1∣v)∗dataσ<v>data=∑i(vi−bi)σ2<h>data=∑jP(hj=1∣v)<v,h>_{data}=P(h=1|v)*\frac{data}{\sigma}\\ <v>_{data}=\frac{\sum_i (v_i-b_i)}{\sigma^2}\\ <h>_{data}=\sum_j P(h_j=1|v) <v,h>data=P(h=1∣v)∗σdata<v>data=σ2∑i(vi−bi)<h>data=j∑P(hj=1∣v)
就我个人来说,写代码的时候,经常采用的是使用smooth version 即概率 $P(h=1|v) 进行更新,这样就可以发现可见层进行更新,这样就可以发现可见层进行更新,这样就可以发现可见层\to$隐层单元的更新,与二值形式是一样的
4.2.2 negative阶段
反向阶段比较模糊的从N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)中采样的具体写法,其实比较建议先看我关于吉布斯采样翻译和matlab实现的那一部分代码,基本就知道如何根据均值和方差采样了,而且也有效果展示,可以明白为什么使用这个代码能够得到符合次分布的采样点。
- 看看代码1的保留σ\sigmaσ的写法
topdown = gsd.*(hidstates*w);%This is the mean of the Gaussian %Instead of properly sampling, negdata is just the mean%If we want to sample from the Gaussian, we would add in%gsd.*randn(numcases,numdims);negdata = topdown + ... %top down connectionsrepmat(bi',numcases,1) + ... %static biasesbistar'; %dynamic biases
可以发现P(vi∣h)P(v_i|\mathbf{h})P(vi∣h)的计算方法很简单
P(vi∣h)=σ∗h{0,1}∗w+biP(v_i|\mathbf{h})=\sigma*h_{\{0,1\}}*w+b_i P(vi∣h)=σ∗h{0,1}∗w+bi
对于偏置的更新代码:
eta = w*(negdata./gsd)' + ... %bottom-up connectionsrepmat(bj, 1, numcases) + ... %static biases on unit (no change)bjstar; %dynamic biases (no change)hposteriors = 1./(1 + exp(-eta)); %logistic%Calculate negative gradientsnegwgrad = hposteriors*(negdata./gsd); %not using activationsnegbigrad = sum( negdata' - ...repmat(bi,1,numcases) - bistar,2)./gsd^2;negbjgrad = sum(hposteriors,2);
可以发现是先利用一次P(vi∣h)P(v_i|\mathbf h)P(vi∣h)得到新的隐状态激活概率,然后
<v,h>recon=∑ijhj∗viσ<v>recon=∑ivi−biσ2<v,h>_{recon}=\sum_{ij}\frac{h_j*v_i}{\sigma}\\ <v>_{recon}=\sum_i\frac{v_i-b_i}{\sigma^2} <v,h>recon=ij∑σhj∗vi<v>recon=i∑σ2vi−bi
- 代码2中,设置σ=1\sigma=1σ=1
negdata = (yfeat.*yhid)*visfac' + ...(yfeatpastA)*visfacA' + ...repmat(visbiases,numcases,1);
由于采用三通道,所以会多出几项,但是也很容易看出一般情况的更新方法
P(vi∣h)=h{0,1}∗w+biP(v_i|\mathbf{h})=h_{\{0,1\}}*w+b_i P(vi∣h)=h{0,1}∗w+bi
- 代码3中,依旧保留了σ\sigmaσ
negdata(idx,:) = gsd.*(hidstates(idx,:)*vishid(:,:,cc)') + ...effvisbiases(idx,:,cc);
同样符合上式。结合三个代码可以发现,从高斯分布中采样的方法为
P(vi∣h)=N(ai+σi∑jWijhj,σi2)=σ∗h{0,1}∗w+ai\begin{aligned} P(v_i|\mathbf{h})&=N(a_i+\sigma_i\sum_jW_{ij}h_j,\sigma_i^2)\\ &=\sigma*h_{\{0,1\}}*w+a_i \end{aligned} P(vi∣h)=N(ai+σij∑Wijhj,σi2)=σ∗h{0,1}∗w+ai
4.3 实值RBM总结
综合上述理论及代码,我们可以得到RBM的条件分布采样方法以及参数更新公式
P(vi∣h)=σ∗h{0,1}∗w+aiP(hj=1∣v)=11+exp(−bj−∑iWijviσ)\begin{aligned} P(v_i|\mathbf{h})&=\sigma*h_{\{0,1\}}*w+a_i\\ P(h_j=1|\mathbf{v})&=\frac{1}{1+exp(-b_j-\sum_iW_{ij}\frac{v_i}{\sigma})}\\ \end{aligned} P(vi∣h)P(hj=1∣v)=σ∗h{0,1}∗w+ai=1+exp(−bj−∑iWijσvi)1
可见层→\to→隐层时候
<v,h>data=h{0,1}∗dataσ<v>data=∑i(vi−bi)σ2<h>data=∑jhj\begin{aligned} <v,h>_{data}&=h_{\{0,1\}}*\frac{data}{\sigma}\\ <v>_{data}&=\frac{\sum_i (v_i-b_i)}{\sigma^2}\\ <h>_{data}&=\sum_j{h_j} \end{aligned} <v,h>data<v>data<h>data=h{0,1}∗σdata=σ2∑i(vi−bi)=j∑hj
隐层→\to→可见层时候
<v,h>recon=∑ijhj∗viσ<v>recon=∑ivi−biσ2<h>recon=∑jhj\begin{aligned} <v,h>_{recon}&=\sum_{ij}\frac{h_j*v_i}{\sigma}\\ <v>_{recon}&=\sum_i\frac{v_i-b_i}{\sigma^2}\\ <h>_{recon}&=\sum_j{h_j}\\ \end{aligned} <v,h>recon<v>recon<h>recon=ij∑σhj∗vi=i∑σ2vi−bi=j∑hj
参数更新方法
Δai∝<v>data−<v>reconΔbj∝<h>data−<h>reconΔWij∝<vh>data−<vh>model\begin{aligned} \Delta a_i & \propto <v>_{data}-<v>_{recon}\\ \Delta b_j & \propto <h>_{data}-<h>_{recon}\\ \Delta W_{ij}&\propto <vh>_{data}-<vh>_{model} \end{aligned} ΔaiΔbjΔWij∝<v>data−<v>recon∝<h>data−<h>recon∝<vh>data−<vh>model
Reference
[1] The Recurrent Temporal Restricted Boltzmann Machine
[2] Two Distributed-State Models For Generating High-Dimensional Time Series
[3] Robust Generation of Dynamical Patterns in Human Motion by a Deep Belief Nets
[4] Modeling Human-Skeleton Motion Patterns Using Conditional Deep Boltzmann Machine
[5] Modeling Human Motion Using Binary Latent Variables
[6] Temporal Autoencoding Improves Generative Models of Time Series
[7] Factored Conditional Restricted Boltzmann Machines for Modeling Motion Style
[8] Implicit mixtures of Conditional Restricted Boltzmann Machines