根据Keras示例这里和这里,如果要使用超参数在深度学习模型中定义层数和每个层的单元,则执行如下操作:
for i in range(hp.Int('num_layers', 1, 10)):
model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))然而,正如其他人所注意到的,这里和这里在甲骨文看到一个带有num_layers = 10的模型之后,它总是通过unit_9将一个值分配给unit_0,即使num_layers小于10。
例如,在num_layers = 1的情况下,将只使用unit_0来构建模型。但是,unit_1通过unit_9将被定义为active中的超参数。
甲骨文“知道”unit_1通过unit_9并没有真正用于构建模型(因此忽略了它们与影响试验结果的相关性)吗?
或者,它是否假设使用unit_1通过unit_9是因为已经定义了它们(例如,调用hp.get('unit_9')将返回一个值)?
在后一种情况下,使用错误信息来驱动调优过程。因此,将需要更长的时间来收敛(最好),而将错误地收敛到解决方案,这是因为将关联分配给未使用的超参数(最坏的情况)。
是否应该像这样使用条件范围来定义模型呢?
num_layers = hp.Int('num_layers', 1, 10)
for i in range(num_layers):
with hp.conditional_scope('num_layers', list(range(i + 1, 10 + 1))):
model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))在像这样定义模型时,如果是num_layers < 10,调用hp.get('unit_9')将像预期的那样返回一个ValueError: Conditional parameter unit_10 is not currently active。
发布于 2020-07-27 14:42:17
使用条件作用域是最好的,因为它正确地识别活动参数。如果不使用条件作用域,至少目前不可能让调谐器知道实际使用的参数。
但是,当使用RandomSearch时,使用更简单的方法(允许不活动的参数存在),结果应该完全相同。当启动一个新的尝试时,调谐器将遍历所有的可能性,但在实际开始试用之前将拒绝无效的。
对于现有的调谐器,我认为只有贝叶斯受此影响很大。对于Hyperband的情况,我不是百分之百肯定;但是对于RandomSearch,这两种方法是完全相同的(除了显示令人困惑的非活动参数)。
https://stackoverflow.com/questions/63100699
复制相似问题