深层神经网络参数调优(五)
——超参数调试、batch归一化、softmax回归
(原创内容,转载请注明来源,谢谢)
一、超参数调试
1、超参数
超参数是不直接参与优化的参数,例如学习速率α、adam算法的β1、β2等,这些参数主要是影响学习的速率。
根据视频中ng的工作经验,超参数有其重要性,按照重要性分类,如下:
1)最重要
学习速率α
2)次重要
动量梯度下降的β、mini-batch的批次大小、神经网络中隐藏层的神经元数量
3)再次
神经网络层数、α衰减涉及的衰减率与衰减公式
4)基本不用改变
adam算法的β1=0.9,β2=0.999,ε=10-8等。
2、超参数调试方式
下图左边是普通神经网络的调试,一般会用网格形,然后逐个去尝试。但是对于神经网络来说,建议用你右边的随机的方式,这样每个点,其中涉及的若干维的超参数,会用到不同的值去尝试。
经过上面的尝试,接着会发现在某一片的区域内,效果比较好。此时,可以收缩范围,在一个小范围内,再随机取一些超参数的取值,进行尝试。
3、超参数是随机
1)普通随机
如果是一些取值范围的数量级相似的参数,例如隐藏层神经元个数一般取50~100个,层数取2~4层,这种就就可以直接随机取。
2)分段随机
对于取值范围不完全是一个数量级的,例如α,其取值范围在0.0001~1之间。如果此时直接用随机取,那么会出现一个问题,90%概率会落在0.1~1之间,这个不是我们要的随机的结果。
因此,可以按照数量级进行分段,分为0.0001~0.001~0.01~0.1~1,这4段内,每段都随机取一些数,进行随机取值。
实际做法,可以为: r =-4 * np.random.randn() , α = np.power(10,r)。这样r的取值会在-4~0之间,而α则是10的-4~0之间,即可以取到不同的数量级。这时可以给α再乘以一个1~9的随机数,就可以获取到对应的随机值了。
对于动量梯度下降的β,也可以这样做。其需要的值是在0.9~0.999,可以反向随机,随机出0.001~0.1的数,再用1减去这个数,即可得到所需的结果。
对于需要这样取值的原因,拿β举例,其从0.9变成0.9005,根据公式,影响范围是等于1/(1-β),实际上影响的随机数的范围是从10个变成20个;而如果从0.999变成0.9995,则影响范围从1000个变成2000个,有很明显的不一样。
4、训练模式
有两种模式,一种类似照顾一个婴儿,则会对模型悉心照料,经常去更改参数,以期训练出更好的结果;另一种类似鱼子模式,一次性对一个模型拿一堆的超参数去尝试,让其自己跑,最终最好的那个则作为最佳选择。
二、Batch归一化
1、概述
归一化的概念,机器学习的时候已经提到过,主要是对于样本特征值之间,如果数量级差距太大,可以用这种方式,保证样本维持在一个数量级。
深度学习中,不止一个层次,因此,就引入了batch归一化,其不止对输入样本进行归一化,还对中间的每个隐藏层的输出进行归一化,并且还可以自定均值和方差。
这里要说明的是,每层的输出是a,但是更常见的是,在计算出z的时候,就对其进行初始化,而不是激励函数之后进行初始化。
2、公式
计算方式,和普通的归一化是一样的,区别在于:
1)均值和方差是可以控制的,即最终返回的并不是归一化的结果,而是归一化后的值乘以方差超参数,再加上均值超参数的结果。
2)这个是每一层都用到的。
3)ε是防止出现除以0,是一个很小的数字。
4)当r和β的值正好等于归一化算出来的均值和方差,则此时的z和batch归一化之前的z的值是一样的。
5)这里的β,和adam、动量、RMS中的β,没有任何关系。
3、前向传播与反向传播
根据上面的说明,batch即加在z和a之间,即a的激励函数g(z)中的z,是用batch归一化后的值。
需要特别说明的是,由于batch归一化,用参数重置了均值,因此之前一直用到的wx+b中的b,在带有batch归一化的神经网络中,可以忽略,因为其值被包含在β中,计算b是没有意义的,可以省略。
如果batch用于mini-batch,则对于每个样本子集,都运行一遍,实际过程是一样的。
梯度下降的过程,实际上也是一样的,但是由于新引入的r和β,以及去掉了b,因此所需要计算的参数有所不同,但是过程是一样的。
下面的算法,是用普通的梯度下降算法。实际上,也可以用adam或者其他算法,来更新w、β、r。
4、batch归一化起作用的原因
1)普通训练存在的问题
假设现在已经训练好关于样本集X的分类器,可以分类出y。当样本集的数值分布有所变化时,如果不用batch,则需要调整算法。
实际应用中,可以认为已经训练好判别图片是否是猫,但是样本中只有黑猫。现在要考虑其他颜色的猫,则原来的分类器不好实现。
下图中第一个数据分布和第二个数据分布,实际上根据第一个数据分布,分类出绿色的线的可能是很低的,因此对于第二个分布,则原来训练的东西可能没法用。
2)解决
batch有效解决样本数据分布散乱的问题。考虑神经网络的某一层,现在假设前面的层是黑盒,仅提供输出的a,对于本层,做了batch后,相当于让之前的输出更加平缓,则样本分布不均的事情也被这样给减少了影响。
再考虑到每层都用了batch,则样本分布不均的影响会被逐渐消除。
3)其他优点
对于mini-batch,如果用上batch归一化,其还可以优化mini中每次只取一部分值,导致的波动太大的问题。batch让mini的数值也都趋向于设定的均值和方差。
5、batch的测试方式
由于batch,每次的计算都需要用到所有数据的均值和方差,但是测试的时候,每次只有1条数据,故没法独立计算均值和方差。
解决方案是,在训练的时候,就存好每层的均值和方差,在测试的时候直接使用。
另外,为了速度更快,通常计算均值和方差,都是用指数加权平均。
三、sfotmax归一化
1、概述
softmax归一化,就是解决多分类的问题,相当于是对logistic回归的一种扩种。假设分类结果的数量是C,则最终输出层的神经元个数就是C,且每个神经元的输出,表示的是结果是该神经元表示的值的概率。
因此,输出层所有输出结果的和,为1。
2、计算方式
具体计算方式,即在最后一层,对于输出,进行了一个计算,具体公式见下图,可以看到如果某个神经元对应的值比较大,则用softmax计算后,其概率也是比较接近1的。
3、分类效果
softmax类似logistic,是一种线性分类器,因此多分类结果类似下图:
4、softmax和hardmax
与softmax对应,有一种称为hardmax,其是将结果的若干值,取最大值对于的元素,将其设定为1,其他元素设定为0,比较简单粗暴,故称为hardmax。
而softmax相对来说缓和一些,不会直接返回0和1,而是返回对应的概率。
5、损失函数与代价函数
损失函数,还是类似logistic的方式,但是根据正确分类结果y,可以看出,正确结果是一种hardmax的结果,因此只有1个1,其他都是0,这就造成计算损失函数的时候,求和实际上变成仅仅对预计需要的那个元素的log计算。
这也比较好理解,为了让代价函数小,就是要那个预计结果对应的元素尽量大,尽量接近1。由于所有的输出的和是1,一个元素增大,其他元素自然就减小了。
代价函数还是损失函数的和,即所有样本对应损失函数的和(对于mini-batch即样本子集)。
四、简单tensorfow代码
ng这一章中,还说到了tf,但是没有详细讲,这个后面我会详细其学习,这里就不展开来说。
对于tf,只需要定义代价函数、定义梯度下降的方式,保证能够顺利实现前向传播,而框架会自己其求导和计算反向传播,非常方便。
五、总结
针对神经网络的各个部分,总结如下:
1)输入层
输入层,可以做归一化处理,就会用到batch归一化。
2)过拟合
预防过拟合,可以用到正则化、dropout(随机失活)。
3)验证效果
验证学习效果,可以用到梯度检验。
4)数据集的使用
为了在深度学习中优化更快,可以将数据集拆分成子集,这就有了随机梯度下降算法和mini-batch算法。
5)加快学习速度
为了让优化可以直接朝着最优值进行,而避免了分散,则可以用到动量梯度下降、RMSprop、Adam算法,其中Adam最常用。
6)减少解决最优值的抖动
为了减少在接近最优值区域内的抖动,可以用到学习速率衰减。
7)超参数的选择
超参数的选择,需要在一个指定的范围,为了避免随机过程不符合要求,可以分段随机。
8)多分类结果
对于超过2个分类结果的算法,则可以用到多分类算法softmax来取代logistic。
上述每点内部只能选一个(有的在不同的层还可以有不同的选择),但是每点之间可以组合使用,例如可以是batch归一化+正则化+mini-batch+softmax+adam等,根据实际需要可以结合起来效果更好。
——written by linhxx 2018.02.08