DeepLearing学习笔记-改善深层神经网络(第三周- 超参数调试、正则化)

来源:互联网 发布:java泛型坑 编辑:程序博客网 时间:2024/05/29 13:22

背景:

介绍超参数调试和处理

1-超参数调试

相比于早期那种参数较少的情况,可以用网格状的数值划分来做数值的遍历,来获取最优参数。但是在深度学习领域,我们一般是采用随机化的方式进行参数的尝试。
这里写图片描述
如上图的网格状选取参数其实只能分别在固定在5个值范围内,在我们尚未知晓哪个参数更为重要的前提下是不明智的。此时,我们如果采用右图的随机取值方式,在取值都是25个的情况下,我们获取的是25个的参数1和25个的参数2。比如其中一个参数是学习率α,另一个是ϵ,左图仅仅尝试了5个α,而右图尝试了25个α值,更能找到最合适的α
对于多更多的超参数,其参数的搜索空间是高纬度的,同理也是采用随机取值的方式,进而提高搜索效率。

另外一种方式是先粗糙再精细的搜索方式。在上述的随机取值后,我们会发现某些区域的取值效果更好,那么我们在这个区域进行细化取值,更加密集地取值。
这里写图片描述

2-选择合适范围的超参数

之前说的随机取值,并不是在有效值范围内的随机均匀取值,而是选择合适的标尺之后的均匀取值。
对于神经网络中某层中的神经元个数,我们可以在一定范围内,比如20~40进行均匀搜索;再或者对于神经网络的层数,我们同样可以在一定范围内,如2~5内进行均匀搜索。但是对于有些参数则不适用。
比如学习率α,假设我们设置其最小值0.0001,其最大值是1,即搜索范围(0.0001,1)。如果真的沿着这个轴向范围内的随机取值的化,那么其实有90%概率,这个值也是在(0.1,1)之间的,而在(0.0001, 0.1)之间只占用了10%的搜索资源。此时采用对数标尺搜索超参数会更加合理。分别在轴上设置点0.0001,0.001,0.01,0.1和1作,在对数轴上再均匀取点。

这里写图片描述

Python实现:

r=-4 * np.random.rand()#此时r取值范围是[-4,0]alpha=np.power(10,r)#即alpha=10^r,所以alpha取值范围是[10^-4,10^0]

如果在10^a和10^b之间取值,对于上述例子,此时的a=log10(0.0001)=4b=log10(1)=0。那么我们就可以在[a,b]之间随机均匀取地给r取值,进而获得α=10r。我们是将在10a10b区间的取值转为对数轴上a和b之间的随意均匀取r值。

对于计算指数加权平均值时用到的超参数β值,我们假设β在[0.9,0.999]之间,此时可以通过1β进行转化,1β的值域在[0.001, 0.1],就可以用上述的方式,转为在[-3,1]之间的随机均匀取r值问题。在通过1β=10r取出β值。

β接近1时,所得结果的敏感度会变化,即使β变化很微小。比如,β从0.9000变化为0.9005,那么其实结果上不会有什么变化,但是如果β是从0.999变成0.9995,则将对算法产生巨大影响。按照指数加权平均值的理解,前者是根据大概10个值的平均,后者则是从大概1000个值(相对于0.999)的平均,变化到大概2000个值(相对于0.9995)的平均。所依据的公式是1/(1-β)。所以,当β接近1,其结果值变化就很敏感。所以,在β接近1的时候,需要更加密集地取值。对于1β则是接近0的时候敏感,同理。

3 Batch归一化

Batch归一化是为了使参数的搜索简单化而提出的。
对于逻辑回归模型,我们对输入进行归一化处理:
μ=1mmi=1x(i)
X=Xμ
σ2=1mmi=1x(i)2
X=X/σ2
对于多层的神经网络的化:
除了输入层,还有每层的激活值a[i]。我们希望在前层输入到下一层,作为输入时候,能够做一次归一化处理,使得下层的参数W和b训练更有意义。所以,我们要做的是归一化隐藏层的a[i]。究竟是选择归一化z[i]还是归一化a[i],在学界是有讨论的。但是在实际使用过程中,我们一般是归一化z[i],而不是a[i]

当有L个隐藏层时,隐藏单元分别是z[1].....z[L],以z[l](i)表示l层的激活值。对于l层,我们简写为z(1).....z(i),不再标注层号。
归一化方法:
μ=1mmi=1z(i)
σ2=1mmi=1(z(i)μ)2
z(i)norm=z(i)μσ2+ϵ
为了使数值稳定,一般分母常常加一个ϵ,防止σ=0的情况。
归一化的结果是均值0,标准单位方差,所以z的每个分量均值是0,方差是1。
但是我们不想隐藏单元都是总是均值是0,方差是1,也许隐藏单元有了不同分布,会有意义。所以,我们计算:
z~(i)=γz(i)norm+β
这里的γβ是模型的学习参数,所以在使用梯度下降的过程或者其他算法更新参数的时候,需要对γβ进行更新。由于γβ的作用,我们可以随意设置z~的平均值。如果γ=σ2+ϵβ=μ那么γz(i)norm+β会精确转化方程:z~(i)=z(i)
通过对γβ的合理设定,实现归一化的时候,可以构造含有其他均值和方差的隐藏单元值。
z~(i)z(i)做后续的运算。

batch归一化仅仅适用于输入层还适用于隐藏层。输入层和隐藏层的归一化区别是,对于隐藏层,我们不想其均值一定是0,方差是1。比如对于激活函数是sigmoid,我们不想值都集中在某个局部,而是希望它有更大的方差或者不是0的均值,以便更好地使用非线性的sigmoid函数。否则,0均值和1方差,则值都集中在sigmoid函数的线性部分。γβ控制之后,就可以不用是0均值和1方差了。
这里写图片描述

阅读全文
1 0
原创粉丝点击