Neural Network and DeepLearning (3.3)改进神经网络的学习方法

权重初始化(Weight initialization)

之前的方式是根据独立高斯随机变量来选择权重和偏置,其被归一化为均值为0,标准差为1。

我们可以比使用归一化的高斯分布做的更好。假设我们已经使用归一化的高斯分布初始化了连接第一个隐藏层的权重。现在我将注意力集中在这一层的连接权重上,忽略网络其他部分:

为了简化,假设我们使用训练输入x,其中一半的输入神经元值为1,另一半为0。我们考虑隐藏神经元输入的带权和。其中500个项小区了,因为对应的输入xj为0.所以z是遍历总共501个归一化的高斯随机变量的和,包含500个权重项和一个偏置项。一次z本身是一个均值为0标准差为501½≈22.4的高斯分布。z其实是一个非常宽的高斯分布,完全不是非常尖的形状:

我们从这幅图中可以看出|z|会变得非常的大,即z»1或者z«-1。如果这样的话,隐藏神经元的输出σ(z)就会接近1或者0.也就表示我们的隐藏神经元会饱和。所以当出现这样的情况是,在权重中进行微小的调整仅仅会给隐藏神经元的激活值带来极其微弱的改变。结果就是这些权重在我们进行梯度下降算法时会学习的非常缓慢

这其实和我们在前面讨论的问题差不多,前面的情况是输出神经元在错误的值上饱和导致学习的下降。我们之前通过代价函数解决了这个问题。不幸的是,尽管那种方式在输出神经元上有效,但对于隐藏神经元的饱和却一点作用都没有。

更好的初始化,避免这种类型的饱和,最终避免学习速度的下降

使用均值为0标准差为的高斯随机分布初始化这些权重(也就是说我们会向下挤压高斯分布,让我们的神经元更不可能饱和)。而对于偏置我们会继续使用均值为0标准差为1的高斯分布来初始化。

有了这些设定带权和仍然是一个均值为0不过有尖锐峰值的高斯分布。假设我们有500和值为0的输入和500个值为1的输入。那么很容易证明z是从均值为0标准差为(3/2)½=1.222...的高斯分布。这要比以前有更尖锐的峰值:

这样的一个神经元更不可能饱和,因此不大可能遇到学习速度下降的问题。

基于一些实验,看起来提升的权重初始化仅仅会加快训练,不会改变网络的最终性能。然而在一些例子里面使用权重初始化的长期运行的结果要显著更优。因此不仅仅能够带来训练速度的加快,有时候在最终性能上也有很大的提升。

如何选择神经网络中的超参数(How to choose a neural network's hyper-parameters?)

宽的策略:

在使用神经网络解决新的问题时,一个挑战就是获得任何一种非寻常的学习,也就是说,达到比随机的情况更好的结果。

假设,当我们第一次遇到mnist分类问题。

1.可以将问题简化:

丢开训练和验证集合中的那些除了0和1的图像。然后试着训练一个网络来区分0和1。

这样不仅仅问题比10个分类的情况简化了,同时也会减少80%的训练数据,这样就给出了5倍的加速。这样可以保证更快的实验,也能给予你关于如何构建好网络更快的洞察。2.通过简化网络来加速实验进行更有意义的学习:如果你相信[784,10]的网络更可能比随机有更加好的分类效果,那么么就从这个网络开始试验。这会比训练一个[784,30,10]的网络更快。3.可以通过提高监控的频率来在试验中获得另一个加速:我们可以通过更加频繁的监控验证准确率来获得反馈。当我们得到反馈的时间变得很短,也就意味着可以更加快速的实验其他的超参数,或者甚至近同步的进行不同参数组合的评比。例如,可以修改λ,猜测学习速率η是要增加还是减小。4.逐个调整每个参数,慢慢提升性能:一旦我们找到一种提升性能的η的值,我们就可以尝试寻找更好的值。然后按照一个更加复杂的网络架构进行试验,假设是一个有10个隐藏元的网络。然后继续调整ηλ。接着调整成20个隐藏元。然后其他的超参数调整再调整。如此进行,在每一步使用我们hold out验证数据集来评价性能,使用这些度量来找到越来越好的超参数。我们这么做的时候,一般都需要花费很多时间来发现由于超参数改变带来的影响,这样就可以一步步减少监控的频率。

备注:实际上,很容易会遇到神经网络学习不到任何知识的情况。所以在前期你应该从试验中尽可能早的获得快速反馈。直觉上看,简化问题和架构仅仅会降低你的效率。实际上,这样能够将进度加快,因为你能够更快的找到传达出有意义的信号的网络。一旦你获得这些信号,你可以尝尝通过微调超参数获得快速的性能提升。

具体的设置超参数的推荐(包括学习率η,L2泛化参数λ,和minibatch大小)

学习速率:

假设我们运行了三个不同学习速率(η=0.025、η=0.25、η=2.5),其他超参数都相同。进行30个回合,minibatch大小为10,λ=5.0,用整个5,000幅训练图像。下面是一副展示了训练代价的变化情况图:

震荡产生的原因:随机梯度下降是期望我们能逐渐的抵达代价函数的谷底,然而,如果η太大的话,步长也会变大可能会使算法在接近最小值时候又越过了谷底。这在η=2.5时非常可能发生。当我们选择η=0.25时,初始几步将我们带到了谷底附近,但一旦达到了谷底,又容易跨过去。而在我们选择η=0.025时,在前30个回合的训练中不再受到这个情况的影响了。一种更好的策略是,在开始时使用η=0.25,随着越来越接近谷底,就换成η=0.025。这是一种可变学习速率的方法。

设置η:1.选择在训练数据上的代价立即开始下降而非震荡或者增加时作为η阈值的估计,比如说从η=0.01开始;2.如果代价在训练的前面若干回合就开始下降,就可以逐步尝试η=0.1,1.0...,直到找到一个η的值使得在开始若干回合代价就开始震荡或增加;3.如果代价在η=0.01时就开始震荡或增加,那就尝试η=0.001,0.0001,...直到你找到代价在开始回合就下降的设定;4.按照这样的方法,我们可以掌握学习速率的阈值的量级的估计。

η的值选择策略最好遵循阈值的一半这样的选择,这样能够允许你训练更多的回合,也不会减慢学习速率。

使用Early stopping来确定训练的迭代期数量:

分类准确率在整体趋势下降的时候仍旧会抖动或者震荡。如果我们在准确度刚开始下降的时候就停止,那么肯定会错过更好的选择。

一种解决方案:如果分类准确率在一段时间内不再提升的时候终止。

然而,网络有时候会在很长的一段时间内对于一个特定的分类准确率附近形成平缓的局面,然后才会有所提升。如果你尝试获得相当好的性能,这个规则可能就会太激进了---停止的太草率。所以可以仅仅在初始阶段使用10个回合不断提升规则,然后逐步的选择更久的回合,比如说20个回合不提升就终止,30个回合不提升就终止。

 学习速率的调整:

学习的前期,权重可能非常糟糕。所以最好是使用一个较大的学习速率让权重变化的更快越往后我们可以降低学习速率,这样可以做出更加精良的调整如何设置学习速率?使用提前终止的想法。就是保持学习速率为一个常量直到验证准确率开始变差。然后按照某个量下降学习速率,比如说按照10或者2.我们重复此过程若干次,知道学习速率是初始值的1/1024(或者1/1000)。那时就终止。

规范化参数:

开始时不包含规范化(λ=0.0)确定η的值。使用确定出来的η,可以使用验证数据选择好的λ。从尝试λ=1.0开始,然后根据验证机上的性能按照因子10增加或减少其值。一旦我已经找到一个好的量级,你可以改进λ的值。这里搞定后,你就可以返回再重新优化η

小批量数据大小:

选择minibatch大小也是一种折衷。太小了你不会用上好的矩阵库的快速计算。太大,你是不能够足够频繁的更新权重的。你所需要的是选择一个折衷的值,可以最大化学习速度。幸运的是,minibatch大小的选择其实是相对独立的一个超参数(网络整体架构外的超参数),所以你不需要优化那些参数来寻找好的minibatch的大小。因此可选择的方式就是使用某些可以接受的值(不需要是最优的)作为其他参数的选择然后进行不同的minibatch的尝试,调整η。画出验证准确率的值随时间变化的图,选择那个得到最快性能提升的minibatch的大小。得到了minibatch的大小,也就可以对其他超参数进行优化了。

自动技术:

网格搜索(grid search):可以系统化的对差参数的参数空间的网格进行搜索。2012年使用贝叶斯观点自动优化超参数,代码.

 

posted @ 2017-03-15 18:37  zhoulixue  阅读(300)  评论(0编辑  收藏  举报