深度学习笔记(11) 超参数调试
1. 选择合适的范围
关于训练深度最难的事情之一是要处理的参数的数量
学习速率 a 到 Momentum(动量梯度下降法)的参数 β
如果使用Momentum或Adam优化算法的参数,β1,β2和ε
还得选择层数
也许还得选择不同层中隐藏单元的数量
也许还想使用学习率衰减
使用的不是单一的学习率a,可能还需要选择mini-batch的大小
最为广泛的学习应用是a,学习速率是需要调试的最重要的超参数
例如Momentum参数β,0.9就是个很好的默认值
当应用Adam算法时,一般从不调试β1,β2和ε,总是选定其分别为0.9,0.999和10 -8
还会调试mini-batch的大小,以确保最优算法运行有效
当给超参数取值时
- 采用由粗糙到精细的策略
通过试验超参数的不同取值,可以选择对训练集目标而言的最优值或对于开发集而言的最优值,或在超参搜索过程中最想优化的东西 - 随机取值可以提升搜索效率
随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺
假设要选取隐藏单元的数量n[l]
假设选取的取值范围是从50到100中某点
这种情况下,在从50-100的数轴上可以随机在其取点
这是一个搜索特定超参数的很直观的方式
如果要选取神经网络的层数L
也许会选择层数为2到4中的某个值,顺着2,3,4随机均匀取样才比较合理
这是在几个在考虑范围内随机均匀取值的例子,这些取值还蛮合理的
但对某些超参数而言不适用
假设在搜索超参数a(学习速率),假设怀疑其值最小是0.0001或最大是1
如果画一条从0.0001到1的数轴,沿其随机均匀取值
那90%的数值将会落在0.1到1之间
反而,用对数标尺搜索超参数的方式会更合理
因此这里不使用线性轴
分别依次取0.0001,0.001,0.01,0.1,1,在对数轴上均匀随机取点
在Python中,可以这样做,使
那么a∈[10-4,100]import numpy as np import math r = -4 * np.random.rand() a = math.pow( 10, r )
另一个棘手的例子是给β 取值,用于计算指数的加权平均值
假设认为β是0.9到0.999之间的某个值,当计算指数的加权平均值时
取0.9就像在10个值中计算平均值
有点类似于计算10天的温度平均值
而取0.999就是在1000个值中取平均
不要随机均匀在此区间取值
所以最好的方法就是,探究1-β,此值在0.1到0.001区间内
设定了1-β=10r,β=1-10r
在这里颠倒了大小,左边的是最大值,右边的是最小值
所以要做的就是在[-3,-1]里随机均匀的给 r 取值
2. 超参数调试实践
如果拥有足够的计算机去平行试验许多模型:
那绝对采用鱼子酱方式,尝试许多不同的超参数
如果没有许多计算资源或足够的CPU和GPU下:
采用熊猫方式,在小批量的训练过程中,耐心地调试学习率等
参考:
相关推荐:
深度学习笔记(10) 优化算法(二)
深度学习笔记(9) 优化算法(一)
深度学习笔记(8) 实践层面(三)
深度学习笔记(7) 实践层面(二)
深度学习笔记(6) 实践层面(一)
谢谢!