在使用Keras Tuner设置模型时,层中的单位数量是否需要在条件范围内定义?

7
根据Keras Tuner示例这里这里,如果你想使用超参数定义深度学习模型中的层数和每一层的单元数,你可以像这样操作:
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的模型后,即使num_layers小于10,oracle仍然会为unit_0unit_9分配值。

例如,当num_layers = 1时,只有unit_0用于构建模型。但是,unit_1unit_9将被定义并且处于活动状态

oracle是否“知道”没有实际使用unit_1unit_9来构建模型(因此忽略了它们对影响试验结果的相关性)?

还是它假设unit_1unit_9正在使用,因为它们已经被定义(例如调用hp.get('unit_9')将返回一个值)?

在后一种情况下,oracle使用错误信息推动调整过程。结果是收敛时间更长(在最好的情况下),以及由于分配了未使用的超参数的相关性而错误地收敛到解决方案(在最坏的情况下)。

是否应该实际使用条件作用域来定义模型,就像这样?

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,这是预期的结果。

1个回答

5
使用条件作用域是最好的选择,因为它能正确识别活动参数。如果不使用条件作用域,目前至少无法让调整器知道哪些参数实际被使用。
然而,当使用 RandomSearch 的更简单的方式时(即允许存在非活动参数),结果应该是完全相同的。在开始新试验时,调整器将浏览所有可能性,但会在实际开始试验之前拒绝无效的可能性。
对于现有的调整器,我认为只有贝叶斯调整器受到了严重影响。我并不确定 Hyperband 的情况;但对于 RandomSearch,这两种方法是完全相同的(除了显示使人困惑的非活动参数)。

有意义的是随机性不受负面影响。Hyperband允许存在非活动参数,但不确定它对算法性能的影响有多大。待办事项(给我几天时间):使用.search()进行贝叶斯/Hyperband搜索,带/不带条件范围,然后比较运行时间、最终参数选择和测试集性能。 - Ian Zurutuza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接