本文参考Hinton发表于2007年的一篇论文,链接在此
但玻尔兹曼机实际上是1985年就被Hinton和Terry Sejnowski发明了。
本渣英语自认并不是特别烂,但最近发现看长篇的英文文献总是看的时候很明白,但眼睛拿开就特别容易忘记···所以很多重点我翻译过来,变成中文一下爽多了。并不是完全不看英文哈,毕竟地道和专业的文献写作技术还是需要不断打磨的,而且很多时候只看单一语言不容易懂,偶尔你只看中文会很迷惑,看看原英文就一下明白了,因为翻译毕竟不能传神,有时候只看英文也会很迷惑,需要借助翻译工具搭配中文一起看才明白本意。
本文长篇大论预警,但讲的系统详尽,看不进去的自动撤离。。。
(一)简介
-
玻尔兹曼机是一种对称连接的网络,其实它就是图论中的完全图,任意单元都相互连接,像神经元一样的单元会对是否开启或关闭做出随机的决策。最开始BM只是用来描述只有二值变量的模型,但现在的很多模型如均值-协方差RBM也含有实值变量。
-
BM有一个简单的学习算法,是Hinton等人1983年提出的,这个学习算法可以发现训练数据中很有趣的可以表示复杂规律的特征。
但这个算法在有很多层特征检测器的网络中很慢,但在RBM受限玻尔兹曼机中很快,RBM只有一个隐层,也就是只有一层特征检测器,特征检测器就是隐层中像人脑神经元一样的单元们。
多个隐层的学习可以通过组合RBM高效地实现,即用一个RBM的特征激活程度(feature activations)作为下一个RBM的训练数据。这种组合就像是堆叠,很多描述DBN的文献也常用stack一词.
- BM常被用于解决两种不同的计算问题。
- 一是搜索问题(a search problem),这种问题中,连接的权值们是固定的,它们一起表示了一个代价函数。BM的随机动态性就允许它去采样出一个代价函数取值低的二元状态向量。 实际上这在DBN的训练中就是权重固定对隐层单元采样的操作。
- 二是学习问题(a learning problem),这时候,我们会给BM一组二元状态向量作为输入,二元状态向量就是一个元素要么取0要么取1的向量,BM要努力去学习以很高的概率生成这些向量,这一句话就说明了BM学习的目的,就是以高概率去重现自己接收到的所有输入数据,学习到的参数就是连接的权重和每个隐层单元的偏置。
具体怎么实现以高概率生成训练数据呢?还是要建立一个代价函数cost function去量化问题,努力训练找到使代价函数最小化的权重和偏置。学习问题中,需要多次更新权重,每次更新很小,且每次更新都要解决多个搜索问题,就是在DBN或者RBM的学习训练中需要对隐层和显层单元反复采样的,所以学习问题中也需要执行搜索问题。
(二)BM的随机动力学
stochastic dynamics 不清楚译为随机动力学还是随机动态性比较好,可见我还没明白精髓。
- 一个单元被激活的概率
-
当隐层单元i可以更新自己的二元状态时,它要先计算自己的总输入,由自己的偏置加上所有连接到它的神经元的激活程度乘以相应连接的权重得到。最终神经元i更新为1的概率用sigmoid计算,把总输入带进去算出来的概率就是单元i开启(取1)的概率。
2. 一个状态向量出现的概率 -
如果BM的所有单元以任意顺序先后更新自己的激活状态,那么网络最终将会到达一个玻尔兹曼分布(也叫做均衡点,平衡点equilibrium 或者平稳分布 stationary distribution)。
-
在玻尔兹曼分布下,一个状态向量v的概率完全由他自己的能量相对于所有可能的状态向量的总能量决定。
-
可见没有一个能量函数会使得任何状态变量的概率小于或等于0 ,所有变量的概率都是正的。
-
分母就是配分函数,它用来保证所有可能的v的概率总和是1,实际上就是个归一化常数。
-
玻尔兹曼分布就是玻尔兹曼机得名的原因。这个分布是物理学上给出粒子在各量子态的分布概率。它的数学建模就是上图公式那样,只要满足这个公式的任何分布都是玻尔兹曼分布的一个实例instance。详情可见
-
所以说BM是基于能量的模型,参考了统计力学的一个分布和其建模方式,其实概率的建模最初都是统计物理学家在研究的,所以会在机器学习的文献中常常见到能量,配分函数等物理学上的术语,其实很有趣,这体现了学科的交叉性,这么火热的机器学习模型实际上灵感来源于物理上的一种能量分布。实际上在实际应用中这个能量就是我们的代价函数,能量越小的状态向量被采样的概率就越大。
-
而且!!!由于BM的随机动态性,就可以使我们在寻找低代价的解时跳出比较差的局部最小( poor local optima)。 举个栗子:有时候 z i z_i zi即使是负的,即单元 i i i的总输入为负,他的能量当然就不足以激活啦,但按照sigmoid计算的概率虽然很小,但小概率事件也是有可能发生的,所以单元i可能被激活,使得系统的能量上升(激活的神经元越多能量越大),就可以跳出能量局部最小啦。
- 能量怎么计算
在Hopfield 网络中,一个二元状态向量的能量是这么计算的:
也可以写作矩阵形式:
E ( v ) = − v T W v − b T v E(\boldsymbol v)=-\boldsymbol v^T\boldsymbol W\boldsymbol v-\boldsymbol b^T\boldsymbol v E(v)=−vTWv−bTv
-
s i v s^v_i siv是状态向量v中单元i的状态,0或1
-
b i b_i bi是单元i的偏置
-
w i j w_{ij} wij是单元i和单元j连接的权重
-
可见状态向量的能量是开启/激活的单元们的总偏置加上所有两两相互连接的激活了的单元的权值和。所以,激活的单元越多,能量就越大。(这个负号是为了抵消p(v)计算中的负号)
-
搜索/采样高概率的状态向量的过程可以用模拟退火来改进,提高效率。它通过把系统温度T从一个大的初始值降低到小的最终值,可能受益于高温下的快速均衡使得最终仍有一个均衡分布,因此使得低代价的状态向量被采样出来的概率更大.(只有在均衡分布下才能使训练向量的概率比较高,所以我们要努力到达均衡分布再去采样)。
-
在温度降到0时,更新规则就变成确定deterministic的了,玻尔兹曼机网络也就完全变成了Hopfield网络 (一种循环神经网络,递归神经网络(RNN)是指神经元相互发送反馈信号的网络,这个概念就包含了大量的可能性,多种反馈形式,有的反馈有的不反馈···)。
(三)BM的学习
BM可以有潜变量,也可以没有。现在无潜变量的BM通常被称为马尔科夫随机场或者对数线性模型。而现在说BM一般都是指有隐变量的BM。
(1)无隐变量的学习
即所有的变量的状态都是可以被观察到的,也就是状态向量会描述所有单元的取值是0还是1。
给定训练数据集(一组二元状态向量)后,学习的目的就是要学到使得生成这些训练数据的概率最大的那些权重和偏置 。也就是说,
这些权重和偏置定义了一个让训练数据有高概率的玻尔兹曼分布。
先研究权重:
为了求出使v出现概率最大化的权重,则令p(v)对权重求导:
∂ l o g P ( v ) ∂ W i j = ∂ [ − E ( v ) − l o g ( ∑ u e − E ( u ) ) ] ∂ W i j = s i v s j v − 1 ∑ u e − E ( u ) ∂ [ e − E ( u 1 ) + e − E ( u 2 ) + ⋯ + e − E ( u n ) ] ∂ W i j \frac{\partial logP(v)}{\partial W_{ij}}=\frac{\partial [-E(v)-log(\sum_ue^{-E(u)})]}{\partial W_{ij}}=s_i^vs_j^v-\frac{1 }{\sum_ue^{-E(u)}}\frac{\partial [e^{-E(u_1)}+e^{-E(u_2)}+\cdots+e^{-E(u_n)}]}{\partial W_{ij}} ∂Wij∂logP(v)=∂Wij∂[−E(v)−log(∑ue−E(u))]=sivsjv−∑ue−E(u)1∂Wij∂[e−E(u