这一部分是个坑,应该对绝大多数菜鸡晕头转向的部分,由于有来自物理学界的问候。html
[Bayes] runif: Inversion Sampling网络
[Bayes] dchisq: Metropolis-Hastings Algorithmdom
[Bayes] Metroplis Algorithm --> Gibbs Sampling函数
纵观大部分介绍RBM的paper,都会提到能量函数。所以有必要先了解下能量函数的概念。参考网页http://202.197.191.225:8080/30/text/chapter06/6_2t24.htm关于能量函数的介绍:tornado
一个事物有相应的稳态,如在一个碗内的小球会停留在碗底,即便受到扰动偏离了碗底,在扰动消失后,它会回到碗底。学过物理的人都知道,稳态是它势能最低的状态。所以稳态对应与某一种能量的最低状态。post
将这种概念引用到Hopfield网络中去,Hopfield构造了一种能量函数的定义。这是他所做的一大贡献。引进能量函数概念能够进一步加深对这一类动力系统性质的认识,能够把求稳态变成一个求极值与优化的问题,从而为Hopfield网络找到一个解优化问题的应用。学习
1) 联合几率为:测试
RBM模型的能量函数:字体
Z是归一化因子,其值为:
2) 边缘分布为:
【这里为了习惯,把输入v改为函数的自变量x】
令一个中间变量F(x)为:
边缘分布为从新写为:
这时候它的偏导函数取负,变为:
从上面能量函数的抽象介绍中能够看出,若是要使系统(这里即指RBM网络)达到稳定,则应该是:
系统的能量值E最小 --> F(x)最小 --> P(x)最大 --> 损失函数 as -P(x)
上述就是基本原理,但问题在于计算繁复,例如Z的计算O(2m+n),因此须要下面的CD算法。
受限波尔兹曼机RBM的基本模型
如何理解 p(v,h|theta) ? 注意下面的式子的Wi,j,以及ai, bj的意义。
基于对比散度的RBM快速学习算法
似然函数以下:
注意最后的结论:
第一项,v是具体的观察样本,故好求;
第二项,Z的计算O(2m+n),故很差求;
可是能够经过gibbs采样获取近似值,原理参见:[Bayes] Metroplis Algorithm --> Gibbs Sampling
From: 限制Boltzmann机(Restricted Boltzmann Machine)
问题在于没有标签,没有偏差,没法训练W,因此没法训练出P(v)的几率分布。
因此早期的RBM采用从h重构v'来计算偏差。重构v',说的好像挺简单,可是须要知道P(v,h)的联合几率分布,用这几率分布去生成v'。
上图是一条波动的链,v0->h0普通的正向传播,忽略不计。
从h0,正式开始Gibbs采样,一个step过程为,hn->vn+1->hn+1,即hvh过程。
当t→∞时,有vt=v'
如何利用”重构“来更新theta = {a, b, w}的问题。
算法以下,hvh过程。可见咱们有了”计算偏差“的方式。
可见,rbm也是一个相似于autoencoder的过程,hidden layer提取出了样本特征。
准确来讲,AutoEncoder是RBM的简化衍生物。
绕了个弯子的选择重构
神经网络的本质是训练岀可以模拟输入的W,这样,在测试的时候,遇到近似的输入,W可以作出漂亮的响应。
RBM选择几率,是由于有几率论的公式支持。这样优化网络,可以达到上述目标。
只是原始目标很差优化,Hinton才提出对比训练的方法,即绕了个弯子的选择重构。
二者近似等价
能量函数使得W朝更大几率方向优化。可是,正如线性回归有最小二乘法和高斯分布(贝叶斯线性回归)两种解释同样。
其实,W的训练大可没必要拘泥于几率,AutoEncoder则绕过了这点,直接选择了加权重构,因此cost函数简单。
【相对于rbm,AutoEncoder是两套参数W,且不同】
能够这么说,重构的数学理论基础就是RBM的原始目标函数。而几率重构启发了直接重构,二者近似等价。
梯度法的一次重构效果出奇好
从马尔可夫链上看,AutoEncoder可看做是链长为1的特殊形式,即一次重构,而RBM是屡次重构。
能使用直接重构的另外一个缘由是,Hinton在实验中发现,梯度法的一次重构效果出奇好。
因此AutoEncoder中摒弃了麻烦的Gibbs采样过程。
从GPU计算来看,k=1状况下,AutoEncoer的GPU利用率高(70%),RBM利用率低(30%),一开始实现的时候吓了一跳。
CUDA执行马尔可夫链效率并不高,目测二项分布随机重构是由CPU执行的。
尤为在把batch_size设为600以后,RBM的GPU利用率竟然只有(10%), 因此官方教程把batch_size设为了20,来减少几率生成的计算压力。
固然k=15时,GPU加速以后仍然十分缓慢。RBM不愧是硬件杀手。
(本图来自MSI Afterburner,GTX 765M,OC(847/2512/913))
抛出一个问题:VAE又是怎么一回事?具备哪些优点?
Goto: [Bayesian] “我是bayesian我怕谁”系列 - Variational Autoencoders
用NN(神经网络)来对数据进行大量的降维是从2006开始的,这起源于2006年science上的一篇文章:reducing the dimensionality of data with neural networks,做者就是鼎鼎有名的Hinton,这篇文章也标志着deep learning进入火热的时代。
所以优化问题是多层NN没有大规模应用的缘由,而autoencoder深度网络确可以较快的找到比较好的全局最优势,
它是用无监督的方法(这里是RBM)
这种方法被认为是对PCA的一个非线性泛化方法。
DBM由多个RBM叠加起来
由上图能够看到,当网络的预训练过程完成后,咱们须要把解码部分从新拿回来展开构成整个网络,而后用真实的数据做为样本标签来微调网络的参数。
当网络的输入数据是连续值时,只需将可视层的二进制值改成服从方差为1的高斯分布便可,而第一个隐含层的输出仍然为二进制变量。
文章中包含了多个实验部分,有手写数字体的识别,人脸图像的压缩,新闻主题的提取等。在这些实验的分层训练过程当中,其第一个RBM网络的输入层都是其对应的真实数据,且将值归一化到了(0,1).而其它RBM的输入层都是上一个RBM网络输出层的几率值;可是在实际的网络结构中,除了最底层的输入层和最顶层RBM的隐含层是连续值外,其它全部层都是一个二值随机变量。此时最顶层RBM的隐含层是一个高斯分布的随机变量,其均值由该RBM的输入值决定,方差为1。
实验结果1:
这3副图中每幅图的最上面一层是原图,其后面跟着的是用NN重构的图,以及PCA重构的图(能够选取主成分数量不一样的PCA和logicPCA或者标准PCA的组合,本人对这logicPCA没有仔细去研究过)。其中左上角那副图是用NN将一个784维的数据直接降到6维!
做者经过实验还发现:若是网络的深度浅到只有1个隐含层时,这时候能够不用对网络进行预训练也一样能够达到很好的效果,可是对网络用RBM进行预训练能够节省后面用BP训练的时间。另外,当网络中参数的个数是相同时,深层网络比浅层网络在测试数据上的重构偏差更小,但仅限于二者参数个数相同时。做者在MINIST手写数字识别库中,用的是4个隐含层的网络结构,维数依次为784-500-500-2000-10,其识别偏差率减少至1.2%。预训时练获得的网络权值占最终识别率的主要部分,由于预训练中已经隐含了数据的内部结构,而微调时用的标签数据只对参数起到稍许的做用。
MINST降维实验:
本次是训练4个隐含层的autoencoder深度网络结构,输入层维度为784维,4个隐含层维度分别为1000,500,250,30。整个网络权值的得到流程梳理以下: