使用 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_0
到 unit_9
分配一个值,即使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')
将 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,这两种方法完全相同(除了显示让人困惑的非活动参数)。
根据 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)))
然而,正如其他人所指出的 num_layers = 10
的模型后,它总是会为 unit_0
到 unit_9
分配一个值,即使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')
将 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,这两种方法完全相同(除了显示让人困惑的非活动参数)。