二值RBM与实值RBM理论及代码解读

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)=ijWijvihjiaivijbjhj
联合概率分布中的分母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,hE(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=1v)=1+exp(bjiWijvi)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(hv)采样以及P(v∣h)P(\mathbf{v|h})P(vh)
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=1h)=1+exp(aijWijhj)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=1v)对隐层采样和使用P(vi=1∣h)P(v_i=1|\mathbf h)P(vi=1h)对可见层采样,交错采样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)=1v)=s(bH+WTv)(j)P(V(i)=1h)=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提供的代码结构分析如下:

  1. 可见层→\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=1v)=1+exp(bjiWijvi)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);
  1. 隐藏层→\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=1h)=1+exp(aijWijhj)1

    negdata = 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); 
    
  2. 更新模型参数

Δ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)=i2σi2(viai)2ij(Wijσivihj)jbjhj
在文献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=1m2σ2(viai)2j=1ni=1m(Wijσvihj)j=1nbjhj
在文献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,hW,bv,bh,{σi2})=i2σi2(bivvi)2i,jσi21Wijvihjjbjhhj
其中aia_iai是可见单元的偏置,bjb_jbj是隐单元的偏置,σ\sigmaσ是可见单元的高斯噪声的标准差2^22,对称权重WijW_{ij}Wij连接可见曾和隐藏层。在Hinton在Coursera上的课程中提到了这个方差使得RBM的采样出现了问题

Guassian-Binary 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)=2v2vTbvhTbhvTWh

  • 在文献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)=21ivi2i,jvihjwijvibijhjcj

4.1.2 实值RBM的采样

采样方法依旧是使用k次吉布斯采样,依据是一层的一个单元关于另一层所有单元的条件概率分布函数。需要注意的是,由于我们采用的是实值RBM,可见层单元服从零均值、单位方差的分布,所以依据隐层采样可见层不再是P(vi=1∣h)P(v_i=1|\mathbf h)P(vi=1h),而是利用隐单元对可见单元的均值做一个线性贡献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(vih)P(hj=1v)=N(ai+σijWijhj,σi2)=1+exp(bjiWijσ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(jwijhj+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=1v)P(vih)=f(bj+iviwij)=N(ci+jhjwij,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=1v),然后使用随机阈值激活为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=1v)=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=σ2i(vibi)<h>data=h{0,1}

 %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=1v)=sigmoid(wdata+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=1v)σdata<v>data=σ2i(vibi)<h>data=jP(hj=1v)
就我个人来说,写代码的时候,经常采用的是使用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(vih)的计算方法很简单
P(vi∣h)=σ∗h{0,1}∗w+biP(v_i|\mathbf{h})=\sigma*h_{\{0,1\}}*w+b_i P(vih)=σ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(vih)得到新的隐状态激活概率,然后
<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σhjvi<v>recon=iσ2vibi

  • 代码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(vih)=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(vih)=N(ai+σijWijhj,σ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(vih)P(hj=1v)=σh{0,1}w+ai=1+exp(bjiWijσ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=σ2i(vibi)=jhj
隐层→\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σhjvi=iσ2vibi=jhj
参数更新方法
Δ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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【caffe-Windows】添加工程-以classification为例

前言 兴趣所向&#xff0c;研究一下如何在caffe工程之外建立一个属于自己的工程&#xff0c;这里以分类为例&#xff0c;将classification.cpp提取出来&#xff0c;然后调用相应的三方库和libcaffe.lib进行编译。这里比较建议有一丢丢C功底的同志参考学习&#xff0c;主要涉及…

MKL学习——数学运算库安装调试

前言 最近要用C折腾一些东西&#xff0c;涉及到矩阵运算&#xff0c;看了一下网上推荐的数学库&#xff0c;貌似MKL还是蛮不错滴&#xff0c;放到VS2013里面试试 国际惯例&#xff0c;来波地址 blas, cblas, openblas, atlas, lapack, mkl性能对比 Compiling and Linking I…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

【caffe-Windows】识别率批量输出——matlab实现

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码&#xff0c;发现都有关于摄像机参数的求解&#xff0c;查找了相关资料&#xff0c;做一下笔记。 国际惯例&#xff0c;来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中&#xff0c;希望算法或者网络收敛更快&#xff0c;有些是对数据预处理&#xff0c;尤其是Batch Normalization&#xff0c;有些是采用不同的激活函数&#xff0c;尤其是Relu激活函数取得了巨大的成功&#xff0c;还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址&#xff1a;如何选择深度学习优化器 作者&#xff1a;不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://w…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题&#xff1a;多标签分类&#xff0c;进行初步探索&#xff0c;此篇博客针对caffe官网的多分类进行配置&#xff0c;只不过是Python接口的&#xff0c;不过官网在开头说明可以使用HDF5或者LMDB进行操作&#xff0c;只不过Python更加方便罢了 国…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型&#xff0c;也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数&#xff0c;类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言&#xff0c;包含梯度、偏置、参数更新&#xff0c;而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算&#xff0c;这一章节就是看看…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了&#xff0c;但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作&#xff0c;最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求&#xff0c;这么神奇的网络是时候分析一波了&#xff0c;我个人的学习方法调试代码&#xff0c;然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上&#xff1f; 卷积小知识 三大特性&#xff1a;局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

【theano-windows】学习笔记十四——堆叠去噪自编码器

前言 前面已经学习了softmax,多层感知器,CNN&#xff0c;AE&#xff0c;dAE&#xff0c;接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例&#xff0c;参考文献&#xff1a; Stacked Denoising Autoencoders (SdA) Greedy Layer-Wise Training of Deep Networks 理…

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…