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

前端之家收集整理的这篇文章主要介绍了DeepLearing学习笔记-改善深层神经网络(第三周- 超参数调试、正则化)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

背景:

介绍超参数调试和处理

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

当有L个隐藏层时,隐藏单元分别是 z[1].@H_884_1404@....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~ 的平均值。如果 @H_404_2362@γ=σ2+ϵ@H_73_2403@−β=μ 那么 γz(i)@H_630_2502@norm+β 会精确转化方程: z~(i)=z(i)
通过对 γ β 的合理设定,实现归一化的时候,可以构造含有其他均值和方差的隐藏单元值。
z~(i)z(i) 做后续的运算。

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

猜你在找的正则表达式相关文章