二值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 基本线性代数子程序 BLACS : Basic Linear Algebra Communication Subprograms 基本线性代数通信子程序 LAPACK : Linear Algebra PACKage 线性代数包 ScaLAPACK : Scalable LAPACK PBLAS : Parallel Basic Linear Alg…

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…

MKL学习——矩阵向量操作

前言 前面介绍的BLAS Level 1是向量-向量的操作&#xff0c;而这里的BLAS Level 2主要还是对矩阵-向量之间的操作。命名规则与前面的一样&#xff0c;主要记住定义的是数据类型 s实数域&#xff0c;单精度c复数域&#xff0c;单精度d实数域&#xff0c;双精度z复数域&#xf…

MKL学习——矩阵矩阵操作

前言 前面介绍了BLAS Level 1中向量-向量操作&#xff0c;以及BLAS Level 2中矩阵-向量的操作&#xff0c;就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后&#xff0c;就进行常用参数分析&am…

MKL学习——线性代数概念相关

前言 回顾一下BLAS Level 1 2 3中的运算都有什么类型 BLAS Level 1 在BLAS Level 1中&#xff0c;进行的是向量-向量的操作。其中相关概念有 向量类型: 实数域&#xff0c;复数域&#xff0c;共轭运算操作: 元素求和&#xff0c;向量相加&#xff0c;向量拷贝&#xff0c;点乘…

MKL学习——基本操作C++实现

前言 前面介绍了各种向量-向量&#xff0c;矩阵-向量&#xff0c;矩阵-矩阵的函数简介。根据自身目前状况&#xff0c;主要使用实数域的操作&#xff0c;也就是说关注单精度float类型的s和双精度double类型的d。还有就是用的基本都是全矩阵&#xff0c;没有经过压缩&#xff0…

相机矩阵(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】以mnist为例的hdf5单标签处理——matlab实现

前言 主要是想尝试看一下多标签的caffe是如何进行输入输出的&#xff0c;但是目前还未找到基于原始caffe做多标签输入的代码&#xff0c;大部分都是基于源码做了一部分修改实现多标签分类&#xff0c;caffe官网倒是有一个多标签的Python程序&#xff0c;这个我慢慢研究研究&am…

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

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

【theano-windows】学习笔记一——theano中的变量

前言 因为目前需要搭建一些关于RBM或者其他之类的模型&#xff0c;感觉不太会折腾caffe&#xff0c;然而我发现了几个有趣网址&#xff0c;使用theano实现了各种各样的模型&#xff0c;所以&#xff0c;尝试学一下theano。主要以官方教程为主&#xff0c;所以博客会以译文的方…

【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中的条件语句

前言 按照官网教程&#xff0c;学习条件语句Switch和ifelse的使用 参考地址: conditions 性能对比 ifElse是将布尔变量和两个变量当做输入 Switch是将张量和两个变量当做输入. 因为Switch是元素级操作&#xff0c;所以比ifElse更具一般性 Switch需要对所有输出变量进行评…

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

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

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

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