Deep Belief Network 学习笔记-RBM
By Placebo
(纯属个人笔记)
第一次知道deep learning,是上学期dengli博士来实验室的一次报告,他讲到,当神经网络的层数大于2时(即一个hidden层,一个输出层,不算输入层,之后皆采用这种表述法),经典的训练方法效果会很差,如果层数继续增多,则完全没法训练。当时对神经网络知之甚少,直到最近较认真的学了下机器学习,才明白。
什么是deep learning?我们知道(虽然不知道如何证明)2层神经网络的建模能力是非常强大的,但是要求隐节点个数足够多,多到难以接受。如果采用更深层的网络,比如3层网络,即两个hidden层,每层100个节点,则可以和hidden层有10000个节点的2层网络建模能力差不多,类似,4层网络,三个hidden层,每层100个节点,可以和hidden层有1000000个节点的2层网络建模能力差不多。这就是加深网络深度带来的好处。但是网络深了,针对3层网络的训练方法再用起来就会失败,因为参数的局部极小值太多了,很容易陷入到一个很烂的极值。
Hinton于XXXX年提出了一种方法,把RBM(Restricted Boltzmann Machines)堆叠在一起,训练出权值,把这个权值当成神经网络权值的初始值,再用经典的梯度法去训练网络,最后得到的结果会很好。也就是说通过选择好的参数初始值让结果更好。
但是RBM是种能量模型,他的权值是用来计算连接节点的能量值的,而神经网络的权值是种递进式的,为什么前者的权值直接给后者用也可以呢,我也不清楚,总是感觉不科学,因为调研的甚少,也没发现解释为什么的文章。
这里先讲下RBM是如何训练的。
先说Boltzmann Machines,这是一种无向图模型,有N个节点,节点是互相连接的(不一定要全连接),第i个节点和第j个节点间权值为wij,为简单起见,这里认为节点的取值是2值的,即只能取0或1。有些节点值是已知的,有些是未知的,我们把已知的和未知的分开,分成两层,已知的节点集记为V,未知的节点集合记为H。若是V内节点之间都不相连,H内节点之间也都不相连,这种模型叫Restricted Boltzmann Machines。
定义一个能量函数E(V,H)
则
\[{\rm{P}}\left( {
{\rm{v}},{\rm{h}}} \right) = \frac{ { { {\rm{e}}^{ - {\rm{E}}({\rm{v}},{\rm{h}})}}}}{ { \sum \nolimits_{ {\rm{u}},{\rm{g}}} { {\rm{e}}^{ - {\rm{E}}({\rm{u}},{\rm{g}})}}}}\]最大化P(V)的值,用梯度法,经过一系列推导可得权值的更新规则为
∆wij=<vihj>data - <vihj>model
这里的<>意思是求期望,data是指已知样本集时,vihj的期望值,这时vi是由样本确定的,hj是未知的。而第二项,是模型中vihj的期望值。这时vi,hj都是未知的。
直接求这两个期望不好求,可以用抽样的方法来估计。第一项,可以通过P(hj|v)抽样出hj,这里hj之和v有关,和hk无关,因为RBM假定H内的节点之间没有连接,这种限制简化了计算。
第二项也可以用抽样法算出,不过要反复抽样,用P(hj|v)抽出每个hj,再用p(vi|h)抽出每个vi,不断反复,最后这个抽样过程得到的抽样分布会收敛到模型的真实分布。但是这个过程太慢了,于是hinton提出一种估计的办法,用P(hj|v)抽出每个hj,再用p(vi|h)抽出每个vi,再用P(hj|v)抽出每个hj,∆w中的第二项直接用这时得到的v和h来计算。这种方法得到的解也是可接受的。
虽然说RBM用到了MRF相关的理论,但是即使对这些理论理解得很浅,也可以直接拿CD算法来用。机器学习里理论上的东西看起来都蛮复杂,比如收敛性证明,误差上界证明之类的,但是若是有了算法的菜谱版,配上便于做科学计算的编程工具,如matlab,numpy,r等,是很容易用的。可惜此领域很多文章并没有明显的给出菜谱式算法。