A Practical Guide to Training Restricted Boltzmann Machines 中文翻译

目录

1 导论

受限玻尔兹曼机能作为生成模型,被用于有标签或无标签的图片数据(Hinton et al., 2006a),代表语音的梅尔频率倒谱系数窗口(Mohamed et al., 2009),表示文档的词袋(Salakhutdinov and Hinton, 2009),和电影评分(Salakhutdinov et al., 2007)。在特定条件下,它能处理像视频,运动中的数据(Taylor et al., 2006),或者语音之类的高维序列数据。它最成功的应用便是在深度信念网络中作为学习的模块(Hinton et al., 2006a)。

一般地,我们会使用对比散度学习程序来训练受限玻尔兹曼机(Hinton, 2002)。这就要求较为稳定的操作经验来设置诸如学习率,动力系数,权值损失,稀疏目标,权值初始值,隐藏节点数量,每一批量的大小等超参数。同时,还要决定使用什么类型的节点,是随机更新他们的状态还是确定的更新他们的状态?对每个训练样例要更新多少次隐藏节点的状态?是用数据向量来启动每个序列的状态还是用其他的呢?此外,如何检测学习的进程以及何时停止训练也是非常有用的。

对于任何的实际应用,代码必须要给出这些超参数的详尽规范。但它并不能解释为什么要这么选择,或者微小的改变如何影响模型训练的?更为糟糕的是,在新的应用场景下如何选择超参数?它也没有为新手提供任何指导。这就要求有敏感的启发思考和觉察导致学习失败相关联的超参数。

在过去的几年里,多伦多大学的机器学习小组在训练受限玻尔兹曼机上已经取得了相当多经验,这个指南就是分享他们以及其他机器学习研究者的经验的一次尝试。我们仍然处于学习曲线的陡峭上升期,所以这个指南是一个动态的文档,我们会时不时地更新它,所以它的版本会越来越多。

2 受限玻尔兹曼机与对比散度概览

如果你已经了解了受限玻尔兹曼机,你就可以跳过这一部分了。

考虑一个二维向量的训练集,出于目的的考虑,我们假设它是二维图片。训练集能被用到只有两层神经网络的受限玻尔兹曼机模型(Smolensky, 1986; Freund and Haussler, 1992; Hinton, 2002),在模型中,二维像素是随机的,二维特征检测器则对称加权连接。像素对应受限玻尔兹曼机的可见节点,因为它是可以被观测到的;特征检测器对应隐藏节点。一次重构,可见层与隐藏层 ( v , h ) 的能量定义为:

E ( v , h ) = i v i s i b l e a i v i j h i d d e n b j h j i , j v i h j w i j
这里的 v i . h j 是可见节点i与隐藏节点j的两种状态, a i , b j 是它们的偏差, w i j 是它们之间的权重参数。通过以下这个能量函数:
p ( v , h ) = 1 Z e E ( v , h )
,网络给每一对可见节点和隐藏节点分配了一个概率分布,这里的分母Z是每一个可见节点与每一个隐藏节点组合形成的总和,向量表示如下:
Z = v , h e E ( v , h )
网络分配给可见向量 v 的概率分布可以通过对隐藏向量的所有可能加和得到:
p ( v ) = 1 Z h e E ( v , h )
网络分配给训练图片的能量可以通过调整权值和偏差来降低图片的能量,或者提高其他图片的能量,尤其是那些有着很低能量的图片,因此,这几个公式在其中起着举足轻重的作用。对 p ( v ) 取log,并对它的参数 w i j 求偏导,可得训练的向量为:
  l o g   p ( v ) w i j =< v i , h j > d a t a < v i , h j > m o d e l
这里的尖括号表示在下标对应的分布确定时的期望。在训练数据的概率分布中,它为形成随机陡峭的学习曲线提高了学习的规则,表示如下:
w i j = ϵ ( < v i , h j > d a t a < v i , h j > m o d e l )
这里的 ϵ 是学习率。

在受限玻尔兹曼机的隐藏层之间的节点是没有连接的,所以得到一个没有偏差的分布 v i h j d a t a 便异常容易。给定一张随机选择的训练图片 v ,隐藏节点 j ,二维状态 h j = 1 的概率为:

p ( h j = 1 | v ) = σ ( b j + i v i w i j )
这里的 σ ( x ) 是sigmoid 函数: 1 1 + e x p ( x ) , v i h j 是无偏样本。

在可见层的节点之间也没有连接,因而在可见节点中很容易得到没有偏差的概率分布,给定隐藏向量,有

p ( v i = 1 | h ) = σ ( a i + j h j w i j )

然而,要获得无偏的关于模型输出分布 v i h j m o d e l 则更为困难。它能通过随机初始化可见节点和Gibbs采样得到。在一次迭代中,Gibbs采样由两部分组成,第一部分是通过公式7同步更新所有的隐藏节点,第二部分是通过公式8同步更新所有的可见节点。

在2002年,Hinton提出了一种更加快速的学习算法。它首先设置可见层的训练数据的状态,然后通过公式7同步计算所有隐藏节点的二维状态。一旦二维状态被隐藏层选择,重构的形成了,它是通过公式8给每一个 v i = 1 设定了概率。权值的更新定义如下:

i j = ϵ ( < v i h j > d a t a < v i h j > r e c o n )

这种学习规则还有一种更为简单的形式,对于偏差,它能用单个节点的状态代替双重的输出。

在训练数据中,很难逼近取log的概率分布的梯度,但学习过程依然很好。这个学习规则能近似得逼近另一个名为对比散度函数的梯度,对比散度和KL散度略有不同,它忽略了函数的复杂性,使得它不用跟随梯度。事实上,Sutskever and Tieleman已经证明它在任何函数下都是不跟随梯度的(Sutskever and Tieleman, 2010)。尽管如此,它也能在许多的实际应用中取得非常好的效果。

在学习规则中,收集负样本统计数据前交替进行几步Gibbs采样,受限玻尔兹曼机是更好的学习模型。 C D n 交替进行n步Gibbs采样能用来标记学习过程。

3 使用对比散度时,如何收集统计数据

开始时,我们假设所有的可见节点和隐藏节点由两部分组成,其他部分节点将在13节讨论。我们也假设学习的目的是针对训练数据集,生成一个好的学习模型。当使用受限玻尔兹曼机学习深度信念网络时,能通过反向传播算法进行微调,且生成模型也不是我们的最终目标,我们有可能通过欠拟合来节省时间。

3.1 更新隐藏节点

假设有两个使用 C D 1 的隐藏节点,当他们被数据驱动时,会有两种随机的状态。将总输入代入逻辑函数: σ ( x ) = 1 / ( 1 + e x p ( x ) ) ,可以得到隐藏节点j的打开的概率为:

p ( h j = 1 ) = σ ( b j + i ( v i w i j ) )
如果这个概率大于均匀分布0到1之间的随机数,则隐藏节点开启。

将这些隐藏状态二值化,而不是使用概率则是非常重要的。如果使用概率,在重构过程中,隐藏节点能以实值与可见节点连接。通过创造一个隐藏节点来运输1比特信息,能严重地干扰信息瓶颈。这个信息瓶颈能极大地影响正则化。

对于最后一次更新的隐藏节点,使用随机二值化状态是不明智的,因为没有任何东西是依靠被选择的状态的。因而,使用概率能避免不必要的样本噪声。当使用 C D n 时,只有最后一次更新隐藏节点时才应该使用概率。

3.2 更新可见节点

假设可见节点只有两个,重构后,更新可见节点状态的正确方法是将总输入代入sigmoid函数生成概率:

p i = p ( v i = 1 ) = σ ( a i + j h j w i j )
来随机选择是0还是1。然而,使用概率 p i 而不是抽两个值,是更为平常的。对于数据驱动的隐藏状态,这几乎不像使用数据驱动隐藏状态的概率那样有问题,并且它减少了采样噪声,从而允许更快的学习。证据表明,这会得到更为糟糕的密集模型。为了使用深度信念网络而提前训练一层隐藏特征可能没什么作用。

3.3 收集训练所需的统计数据

假设可见节点使用实值概率而不是两个随机的两个值,有两种有效的方法收集可见节点i和隐藏节点j间连接的正样本数据:

< p i h j > d a t a < p i p j > d a t a
这里的 p j 是一种状态, h j 是概率为 p j ,取值为1时的一种状态。使用 h j 与受限玻尔兹曼机的数学模型相似,但使用 p j 有更少的样本噪声,使得学习的速度更快。

3.4 一份为 C D 1 取得学习信号的指南

当隐藏节点被数据驱动时,会使用随机的二进制状态。当他们通过重构驱动时,则经常使用概率而不是抽样。

假设可见节点使用sigmoid函数,在数据和重构上都使用实值概率。

当为权重参数收集成对的数据或者为偏差收集单个数据时,使用概率而不是二进制状态,能打破对称性,确保权重随机初始化。

4 小批量的大小

在优化单个样本的梯度之后更新权重也是有可能的,但把样本切分成小批量的,比如10-100样本为一批来训练可能会更高效。在GPU或者matal中进行矩阵的乘法是非常有优势的。

当批量的大小改变时,为了避免更改学习率,根据每一批的样本数量来计算该批次的梯度是比较有帮助。所以,在谈到学习率时,我们说的是平均的学习率;但说到梯度时,我们计算的是一个批次的平均梯度,不是该批次的总梯度。

4.1 一份将训练集拆分为小批次的指南

对于类别相对均衡的数据集,每一批次的样本数量经常和类别数量一致,且当从每一批次中估计整个样本集的梯度时,最好每个批次都应包含每个类别中的一个样本,以降低样本的误差。对于其他的训练集,可以先从每批10个样本开始,随机试一下。

5 监测学习过程

很容易就能计算出数据和重构后的平方误差,所以在训练的过程中就能把这个数打印出来。在开始刚学习时,在整个训练集上的重构误差会快速下降,然后慢慢地趋于平稳。因为在梯度优化中的噪声,重构误差经历一开始的快速下降之后,会在单个批次之间有小范围的波动。当使用高动力时,还有可能会有小范围摆动。

尽管很方便,在监测学习进程中,重构误差依然是一个比较糟糕的衡量标准。 C D n 学习没有近似优化的功能,尤其当n>>1时,它很容易就把两个在学习中要更新的数给混淆。首先就是训练数据的经验分布和受限玻尔兹曼机的均匀分布的差异性,其次就是交替Gibbs马尔可夫链的混合率。如果混合率非常低,即使数据分布和模型分布都非常不同,重构误差也会非常小。当权值提高,混合率下降,重构误差下降并不一定意味着模型正变得越来越好,相反,重构误差小范围提升也不一定意味着模型正变得越来越差。如果是非常大的提高,那就是一个坏信号了,除非那是暂时的,否则就是学习率,动力系数,权值系数等参数更改引起的。

5.1 一份使用重构误差的指南

可以使用,但别全信。如果你真的想知道在学习过程中发生了什么?就可以使用诸如矩形图等图形化描述出这个学习过程,这会在第15节讲述。你还可以考虑使用退火重要性抽样来优化剩余数据的密度。如果你正在训练关于有标签数据的联合密度模型,你还可以监测模型在训练数据和剩余的交叉验证集上的判别行为。

6 监测过拟合

当训练一个生成模型时,监测最明显的量就是当前模型分配给数据点的概率。当这个概率在验证数据上开始降低时,就可以停止训练了。不幸的是,对于大型的受限玻尔兹曼机,计算概率是非常困难的,因为它要求分式函数的知识。尽管如此,通过比较训练数据和剩余验证数据的自由能量,仍然有可能直接监测模型是否过拟合。在这样的比较中,分式函数就没有了。在一段时间内,自由能量的数据向量是能被计算的,且它在隐藏节点中是线性的。如果这个模型没有过拟合,在训练数据和验证数据上的平均自由能量应该是基本一样的。当模型开始过拟合,相对于训练数据上的平均自由能量,验证数据上的平均自由能量会慢慢提高,并且这个差距代表了过拟合的程度。

6.1 监测过拟合的清单

每隔几轮迭代后,都计算一下部分训练数据的平均自由能量,且和验证集的平均自由能量对比。如果它们的差距开始上升,尽管训练数据的概率增加地比这个差距还快,验证数据集上的概率也许还在改善,模型还是过拟合了。当计算你要比较的两个自由能量时,要确保它们都是使用相同的权重参数。

7 学习率

如果学习率太大,重构误差很可能会迅猛提升,且可能产生权重爆炸。

当神经网络被正常训练时,如果降低学习率,重构误差有可能下降地很快。这并不一定是好事。那是因为在随机更新权重的情况下,较小的噪声,从长远来看,一般会伴随着低水平的学习。然而,在学习结束时,通常会降低学习率。计算几次权重更新的平均值能降低来自最终权重的噪声,是可供选择的一种方法,

7.1 为权重和偏差设定学习率

一个好的设定权重的方法就是去看权重和权重更新的矩形图。每次更新都应该在权重的 10 3 左右。当有某一层的神经元个数大于下一层的神经元个数时,因为在同一纬度上许多非常小的改变能很容易的改变梯度的正负号,所以这个权重的更新是比较小的。相反的,偏差的更新会更大。

8 权重与偏差的初始值

权重一般会从均值为0,标准差为1的高斯分布初始化一个小的随机值。使用大的随机初始值能快速启动训练,但最后的模型可能会比较糟糕。还应该确保初始权值能避免可见层向量驱使隐藏层向量趋于1或0,因为这样会极大降低训练的速度。如果用于学习的统计量是随机的,则初始权重可以全部为零,因为统计数据中的噪声会使隐藏节点彼此变得不同,即使它们具有相同的连接性。

把可见节点i的偏差初始化为 l o g [ p i / ( 1 p i ) ] 是比较有帮助的,这里的 p i 是在节点i打开时的部分训练向量。如果不是这样的话,在训练的早起阶段将会使用使得隐藏节点i打开时的近似概率 p i

当使用稀疏目标的概率为t时,初始化隐藏偏差为: l o g [ t / ( 1 t ) ] 是合理的。此外,初始隐藏偏差为0也是可以的。作为一种非常粗暴的方法来缓解稀疏性,以一个相当大的负偏差,比如大于-4,来启动隐藏节点也是可以的。

8.1 为权值和偏差设定初始值

从均值为0,标准差为1的高斯分布中选择小的随机值作为权值。设定隐藏层偏差为0,可见层偏差为 l o g [ p i / ( 1 p i ) ] ,这里的 p i 是在节点i打开时的部分训练向量。观察隐藏节点的变化情况,它们并不总是开的或者关的。

猜你喜欢

转载自blog.csdn.net/qq_39422642/article/details/79644127