第七章 超参数调试、Batch 正则化和程序框架

1.调试处理

        神经网络会涉及很多不同超参数的设置,超参数调试过程有一些技巧。

图7.1 超参数

        如图7.1,超参数有学习率α、momentum的β、Adam的ε、神经网络层数#layers、不同层的隐藏单元数#hidden units、学习率衰减参数learning rate decay、mini-batch大小mini-batch size等。

其中学习率α是最重要的超参数,其次是momentum的β、不同层的隐藏单元数#hidden units和mini-batch大小mini-batch size,最后是神经网络层数#layers和学习率衰减参数learning rate decay。对于Adam的ε一般都是使用=0.9、=0.999、ε=。

超参数重要次序可能仁者见仁,不一定是按这个次序。

图7.2 选择超参数的方法

        如图7.2,对于超参数的选取调试不要以网格方式选取调试(左图),而是要使用随机方式选取调试(右图),比如有两个超参数,要调试25次的话,网格方式每个超参数只能五个值,而随机方式每个超参数可以是25个值或者更大范围,从25*25或者更大范围里选择25对超参数进行调试。

如果能知道超参数的重要程度,则可以对不同超参数设定不同调试范围,比如α和ε,ε可以固定值,然后给α选定一个较大范围调试。

对于两个超参数则使用二维随机选取,三个超参数则使用三维随机选取,多个超参数则使用高维随机选取。

图7.3 由粗糙到精细选择超参数

        如图7.3,超参数的选择还要从粗糙到精细,如果发现某个点效果很好,该点附近的点效果也很好,则应在该点附近做更精细的随机方式调试。

2.为超参数选择合适的范围

图7.4 随机均匀取值例子

        超参数的调试随机取值可以提升你的搜索效率,但随机取值并不一定是在有效值范围内的随机均匀取值,而是要选择合适的标尺。

有些超参数可以随机均匀取值。如图7.4,比如隐藏单元的数量,假设取值范围是从 50 到 100,这种情况下可以随机在其上取点;比如神经网络的层数#layers,假设取值范围是从2到4,这种情况下可以随机在其上取点。

图7.5 不能随机均匀取值例子

        有些超参数不能随机均匀取值,要选择合适的标尺。如图7.5,比如学习率α,假如取值范围是0.0001到1,如果随机均匀取值,90%的数值将会落在0.1到1之间,需要0.0001到1分成0.0001到0.001、0.001到0.01、0.01到0.1、0.1到1尺度一致四段,再进行随机均匀取值。在Python中,可以令r = -4 * np.random.rand(),则r取值范围为[-4,0),转换成学习率α=,只需要对r∈[-4,0) 随机均匀取值即是对学习率α随机取值。

图7.6 指数加权平均超参数的随机取值

        如图7.6,超参数β也不能随机均匀取值。假设β取值范围是 0.9 到 0.999,取 0.9 约等于1/(1-β)=10个值中计算平均值,而取0.999 约等于1/(1-β)=1000个值中取平均值,β越接近 1 时,1/(1-β)变化越明显,随机取值需要选择合适的标尺。类似于学习率α,先在[-3,-1] 里随机均匀地取r值,然后β=1-。

3.超参数训练的实践:Pandas VS Caviar

图7.7 定时更新超参数

        超参数会受很多因素影响,比如训练数据更新了等,所以建议每隔几个月至少一次重新测试或评估你的超参数。

图7.8 搜索超参数的方法

        关于搜索超参数问题,大概分为两种思想流派。一种是熊猫方式(熊猫一次只能生一个仔),这种方法在计算资源不足时使用,即一次只调试一个模型,然后根据训练结果不断修改超参数。另外种是鱼子酱方式(鱼一次可以生很多仔),即一次调试很多个模型,不同模型超参数不同,最终选择表现最好的模型。

4.归一化网络的激活函数

Batch归一化由Sergey Ioffe和Christian Szegedy两位研究者创造,Batch归一化可以使搜索超参数变得更容易,使神经网络对超参数的选择更加稳定,超参数的选择范围更大工作效果也很好,也使神经网络哪怕是深层神经网络训练更容易。

图7.9 深层神经网络中使用归一化

        在logistic回归中,可以归一化输入加快训练。在更深的模型中,也可以归一化隐藏层的输入。对于该问题,在深度学习文献中,有的认为归一化激活函数前的z值,有的认为归一化激活函数后的a值。在这里只介绍归一化激活函数前的z值,也是推荐的默认选择。

图7.10 归一化的实现

        如图7.10,假设在l层有, ,…, ,

        先计算平均值μ=(1/m) * ,

        然后计算方差=(1/m) * ,

        接着归一化=( -μ)/√(+ε), ε是防止分母为零,

        但并不想像归一化输入一样平均数总是0,方差总是1,也许在隐藏层不同分布会有不同意义,于是: = γ + β,γ和β和权重一样在梯度下降中进行训练。

5.将Batch Norm拟合神经网络

图7.11 神经网络加入BN

        如图7.11,神经网络加入BN后,计算步骤为:

        计算第一个隐藏层,先计算出,紧接着计算,然后用γ和β控制方差和平均数得到,最后计算=(),将传递给下一隐藏层进行同样的计算。此时的神经网络在梯度下降中多了γ和β参数,这个β跟Momentum中的β没什么关系。

图7.12 BN应用于mini-batches

        在mini-batch中,类似于批量梯度下降,每个子集都要进行独立的BN,即μ和独立计算不沿用上个子集。

        神经网络加入BN后,参数b可以去除,因为参数β可以代替参数b作用。

图7.13 神经网络加入BN后的梯度下降

如图7.12,神经网络加入BN后的梯度下降(假设是mini-batch梯度下降)过程为:

外层是t=1到batch数量的for循环,

先前向计算出替换,

接着反向计算出,,,,(可以去除),

然后更新参数= - α,= - α,= - α。

以上过程也适用于有momentum、RMSprop、Adam的等梯度下降法。

6.Batch Norm为什么奏效

        Batch Norm使训练变得更容易比较直观的原因是,归一化后的特征值或隐藏层值,使特征值或隐藏层值获得类似范围,可加速学习。

另外个原因如下:

图7.14 covariate shift问题

        如图7.14,假设有已经存在一个识别黑猫的神经网络效果很好,现在要加入彩色猫识别,或加入其它动物识别,这样数据分布不一致,神经网络效果就会不理想,这就是covariate shift。

图7.15 解决covariate shift问题

        如图7.15,拿神经网络第二层来说,加入BN之前,分布受输入层和第一层影响特别大,输入层和第一层数据分布一旦改变,分布也跟着变化;加入BN后,无论前面的层数据如何变化,分布都是固定的(即μ和是固定的),从而可以避免covariate shift问题。即每一层的参数相当于是独立训练,较少受到其它层的干扰,从而使训练变得更加容易。

图7.16 BN的正则化效果

        Batch归一化还有一个作用,就是有轻微的正则化效果,由于μ和是固定的,后面单元不会过分依赖任何一个隐藏单元,从而形成正则化效果。

        但是不要把Batch归一化当作正则化,因为其正则化效果很小,应把它当作将你归一化隐藏单元激活值并加速学习的方式,正则化是一个意想不到的作用。

7.测试时的Batch Norm

图7.17 测试时的BN

        在验证集、测试集或实际应用中,计算μ和只有一个样本,显然这样没有意义,所以μ和要从训练集中获取。Mini-batch每个子样本在每一层训练完都会产生一个μ和一个,这时可以使用指数加权平均根据每个子样本在当前层的μ和计算得到最终在该层的μ和,然后计算和z ̃步骤和训练集时一致。

8.Softmax 回归

        二分分类只有两种可能的标记,0或者1,比如这不是一只猫或这是一只猫。当有多个分类时,就需要用到softmax回归。

图7.18 多个分类

        如图7.18,是个四分类C=#classes=4,0其他、1猫、2狗、3鸡,输出层会有4个单元,每个单元代表着每种类别的概率是多少,概率加起来等于1。

图7.19 softmax回归过程

        如图7.19,softmax计算过程为:

        在softmax层先计算=+,维度为(4,1),

        接着令t=,维度为(4,1),则=/ ,维度为(4,1),这就是softmax层激活函数。

图7.20 softmax例子

        如图7.20,图中的分类数都是大于2,需要使用softmax回归,图中决策边界都是线性的,所以可以直接使用没有隐藏层的softmax回归进行学习。当然面对更复杂的决策边界,需要使用更深的网络进行学习。

9.训练一个Softmax 分类器

图7.21 理解softmax

        如图7.21,假设分类为C=4,计算出的中最大值称为”soft max”,对应标签中的1称为”hard max”。softmax将logistics回归的二类推广到了C类,当C=2,softmax变成了logistics回归,此时有两个值,我们可以只对一个值处理。

图7.22 softmax损失函数

        如图7.22,假设分类为C=4,softmax回归的损失函数为交叉熵L( ,y) = - log ,成本函数为J(w,b) = (1/m) * L( ,y) ,假设某一个样本标签第二个值为”hard max”,则第二个样本的L( ,y) = - log = - log ,所以为了使成本函数尽量小,则应使 尽量大,尽量接近1。

图7.23 softmax梯度下降

        softmax回归梯度下降和普通神经网络一样,都有前向过程和后向过程,然后更新参数。需要特别记忆的dJ/ = - y,但使用框架比如tensorflow去进行编码时,不需要手动反向计算,框架会自动计算。

10.深度学习框架

图7.24 深度学习的软件框架

        前面学习了使用Python和NumPy实现深度学习算法,但是这样从零开始全部靠自己实现并不现实。

        现在有很多好的深度学习软件框架,可以帮助实现这些模型,利用深度学习框架能让实现神经网络变得更简单,会使工作更加有效。

        现在深度学习框架有很多,可以根据以下标准选择:

        第一个重要的标准是便于编程,这既包括神经网络的开发和迭代,还包括为产品进行配置。

        第二个重要的标准是运行速度,特别是训练大数据集时,一些框架能让你更高效地运行和训练神经网络。

        第三个重要的标准是框架要真的开放,不仅需要开源,而且需要良好的管理。

        选择框架还要取决于个人喜欢Python,Java还是C++或者其它,还要取决于开发的应用等。

11.TensorFlow

        Tensorflow是一个很棒的深度学习的编程框架,请自行翻阅相关资料熟悉。

你可能感兴趣的:(第七章 超参数调试、Batch 正则化和程序框架)