一、调试超参数时的重要程度(偏主观)
最重要:学习率
α
\alpha
α
次重要:动量梯度下降中的
β
\beta
β、隐藏单元数、Mini-batch数量
次次重要:网络层数、学习衰减率
不那么重要:Adam算法中的
β
1
、
β
2
、
ε
\beta_1、\beta_2、\varepsilon
β1、β2、ε
一个重要的原则就是不要用网格取值来搜索超参数取值,要尽可能搜索随机取值,特别是在超参数非常多,搜索维度特别大的时候。搜索的过程是从粗到细的,找到几个比较好的取值后,缩小搜索范围进一步精化范围。
二、为超参数选择合适的范围
适当的搜索标尺
如果是为隐藏单元个数或网络层数选值,很好办,在考虑范围内随机取值对比即可。那么学习率呢?学习率最小可以取0.0001,最大可以取1,在这个范围内测试的话,90%的搜索资源用在了0.1到1之间,对吧,这样看上去似乎不合理,如图。
不采用这种线性坐标轴呢,我们采用对数标尺坐标轴,也就是每10倍在坐标轴标记一次,这样搜索的几率更平等了,如图。
其实这一点大家很容易想到,在该课程中用更科学的表述讲述了这个道理。
在Python中是怎么样实现这种随机数的?
r = -4 * np.random.rand()
alpha = 10 ** r
第一行代码中
r
∈
[
−
4
,
0
]
r\in [-4,0]
r∈[−4,0],
第二行代码中
a
l
p
h
a
∈
[
1
0
−
4
,
1
]
.
alpha\in [10^{-4},1].
alpha∈[10−4,1].
指数加权平均参数的搜索
对于
β
\beta
β,并不是那么好对付。我们期望从0.9到0.999中选取最佳值,应该怎么做?当然不能线性划分(其实也不是那么“当然”,不能用线性轴的原因是当取值接近1的时候,结果的敏感度会很高,和前部分的敏感度是不同的,所以不能用线性轴搜索),那么借助上一例中的0.001到0.1可以解决问题。
r
∈
[
−
3
,
−
1
]
r\in [-3,-1]
r∈[−3,−1]
β
=
1
−
1
0
r
\beta=1-10^r
β=1−10r
关于结果敏感度的问题,有如下说明:
β
\beta
β从0.9000到0.9005,平均的样本数从10个变到10.05个;从0.9990到0.9995,平均的样本数从1000个变到2000个。由此可见,是不是不应该使用线性轴,而是应该使用更合理的标尺。
三、超参数训练实践:Pandas VS Caviar
需要每隔一段时间Re-test重新测试你的超参数。
两种调参的模式
- Pandas 熊猫模式 Babysitting专一照顾一个孩子
- Caviar 鱼类模式 同时哺育大量孩子
基于不同程度的运算能力,可以选择这两种模式调参,Pandas是运算能力较弱时,花费大量时间对单个模型逐个参数调优。而Caviar则时同时对大量模型(包含不同的超参数)进行训练,在一段时间后同时得到结果,进行对比。