使用 keras tuner 设置模型时,是否需要在条件范围内定义层中的单元数?

Do the number of units in a layer need to be defined within a conditional scope when using keras tuner to setup a model?

根据 Keras Tuner 示例 here and here,如果您想使用超参数定义深度学习模型中的层数和每一层的单元,您可以这样做:

for i in range(hp.Int('num_layers', 1, 10)):
    model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))

然而,正如其他人所指出的 and here 在 oracle 看到带有 num_layers = 10 的模型后,它总是会为 unit_0unit_9 分配一个值,即使num_layers 小于 10.

num_layers = 1为例,只有unit_0会被用来构建模型。但是,unit_1unit_9 将被定义,并且 active 在超参数中。

预言机是否“知道”unit_1unit_9 实际上并未用于构建模型(因此忽略了它们对影响试验结果的相关性)?

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

在后一种情况下 Oracle 使用错误信息来驱动调整过程。结果,收敛(最多)需要更长的时间,并且不正确地收敛解决方案,因为将相关性分配给未使用的超参数(在最坏的情况下)。

模型真的应该像这样使用 conditional scopes 定义吗?

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') 将 return 一个 ValueError: Conditional parameter unit_10 is not currently active,正如预期的那样。

最好使用条件作用域,因为它可以正确识别活动参数。如果不使用条件范围,至少在目前,不可能让调谐器知道实际使用了哪些参数。

但是,当以更简单的方式(允许存在非活动参数)使用 RandomSearch 时,结果应该完全相同。当开始新的试用时,调谐器将检查所有可能性,但会在实际开始试用之前拒绝无效的。

对于现有的调谐器,我认为只有贝叶斯受此影响很大。我不是 100% 确定 Hyperband 的情况;但对于 RandomSearch,这两种方法完全相同(除了显示让人困惑的非活动参数)。