美文网首页
第七章 超参数调试、Batch 正则化和程序框架

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

作者: 一叶知否 | 来源:发表于2019-09-29 20:58 被阅读0次

    1.调试处理

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

    图7.1 超参数

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

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

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

    图7.2 选择超参数的方法

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

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

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

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

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

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

    图7.4 随机均匀取值例子

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

    有些超参数可以随机均匀取值。如图7.4,比如隐藏单元的数量n^{[l]},假设取值范围是从 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),转换成学习率α=10^r,只需要对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-10^r

    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层有z^{(1)}, z^{(2)},…, z^{(m)},

            先计算平均值μ=(1/m) * \sum_{i}z^{(i)},

            然后计算方差σ^2=(1/m) * \sum_{i}(z^{(i)}-u)^2,

            接着归一化z^{(i)}_{norm}=( z^{(i)}-μ)/√(σ^2+ε), ε是防止分母为零,

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

    5.将Batch Norm拟合神经网络

    图7.11 神经网络加入BN

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

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

    图7.12 BN应用于mini-batches

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

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

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

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

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

    先前向计算出z ̃^{[1]}替换z^{[1]}

    接着反向计算出dw^{[l]},db^{[l]},dβ^{[l]},dγ^{[l]},(dβ^{[l]}可以去除),

    然后更新参数w^{[l]}= w^{[l]} - αdw^{[l]}β^{[l]}= β^{[l] }- αdβ^{[l]}γ^{[l]}= γ^{[l] }- αdγ^{[l]}

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

    6.Batch Norm为什么奏效

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

    另外个原因如下:

    图7.14 covariate shift问题

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

    图7.15 解决covariate shift问题

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

    图7.16 BN的正则化效果

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

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

    7.测试时的Batch Norm

    图7.17 测试时的BN

            在验证集、测试集或实际应用中,计算μ和σ^2只有一个样本,显然这样没有意义,所以μ和σ^2要从训练集中获取。Mini-batch每个子样本在每一层训练完都会产生一个μ和一个σ^2,这时可以使用指数加权平均根据每个子样本在当前层的μ和σ^2计算得到最终在该层的μ和σ^2,然后计算z_{norm}和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层先计算z^{[L]}=w^{[L]}a^{[L-1]}+b^{[L]},维度为(4,1),

            接着令t=e^{(z^{[L]})},维度为(4,1),则a^{[L]}=t_i \sum_{i=1}^4t_i ,维度为(4,1),这就是softmax层激活函数。

    图7.20 softmax例子

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

    9.训练一个Softmax 分类器

    图7.21 理解softmax

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

    图7.22 softmax损失函数

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

    图7.23 softmax梯度下降

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

    10.深度学习框架

    图7.24 深度学习的软件框架

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

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

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

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

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

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

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

    11.TensorFlow

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

    相关文章

      网友评论

          本文标题:第七章 超参数调试、Batch 正则化和程序框架

          本文链接:https://www.haomeiwen.com/subject/bmeeyctx.html