我正在做我的第一个 ML-with-optuna 项目。 我的问题是如何探测一组超参数以进行多个神经网络初始化,其中一次试验中的每次运行仍需进行修剪?
我假设初始化有相当大的影响,我不想因为运气不好而打掉好的HP。
据我所知,每次试炼都代表一套HP。因此,如果我想评估它们的多次初始化,我会在每次试验中执行多次训练。但在一次试验中,我只能为每个时间戳报告一个值。
我是否必须在没有 optuna 的情况下实现此操作?我是否应该采用一种方法,让 optuna 首先建议一组 HP,然后修复它以供下一次试验?或者您知道使用 optuna 实现此目的的一些好方法吗?
非常感谢!
编辑1;添加最小代码示例:
from random import randrange
import optuna
def objective(trial):
"""
return x * 20 + random_offset
multiplication calculated iteratively to enable pruning
"""
x = trial.suggest_float("x", 0, 10)
random_offset = randrange(0, 1000)
temp = 1
res_temp = None
for i in range(20):
temp += x
res_temp = temp + random_offset
trial.report(res_temp, i)
if trial.should_prune():
raise optuna.TrialPruned()
return res_temp
if __name__ == '__main__':
study = optuna.create_study(pruner=optuna.pruners.MedianPruner())
study.optimize(objective, n_trials=20)
print("best params:", study.best_params)
print("best value:", study.best_value)
此示例尝试在 0 到 10 的范围内查找“x”,从而最小化“x * 20”。显而易见的答案是0。目标函数是通过迭代求和来计算结果;它使用修剪。遗憾的是,由于随机偏移,目标函数充满了噪音。这是训练神经网络的比喻。迭代是训练循环,x是超参数,偏移量是网络的随机初始化。
由噪声引起的问题是您无法确定超参数的质量,因为结果可能由随机偏移决定。这可能会导致选择次优的 x。 如果我是对的,那么增加试验次数来消除随机性可能行不通,因为 optuna 可能会根据旧参数建议新的超参数。因此,不幸的观察将阻碍进一步的进展。
所以我认为最好对同一组超参数多次评估目标,并且只记住最好的“运行”。
所以我的问题是如何最好地消除噪音?我的假设是否正确,即仅增加试验次数并不是最好的方法?您将如何实现重复评估?
最佳答案
实现此目的的一种方法是围绕目标定义一个包装器。这是有效的,因为这个包装器将在新的试验中被调用一次,但在包装器内部我们多次调用原始目标。
玩具示例:
import optuna
import random
def objective(trial, seed=0):
random.seed(seed)
a = trial.suggest_float('test', 0, 1)
return a
def objective_wrapper(trial, nrseeds):
res = []
for ii in range(nrseeds):
rr = objective(trial, seed=ii)
res.append(rr)
# add the individual results as an attribute to the trial if you want
trial.set_user_attr("individual_seed_results", res)
# let's print just to visualize the individual runs
print('=====')
print(res)
return sum(res)/len(res) #could be some other aggregation
study = optuna.create_study(
study_name='tst',
)
study.optimize(
lambda trial: objective_wrapper(trial, 3),
n_trials=5,
)
如果你运行这个,那么在这种情况下,包装器将打印如下内容:
=====
[0.9422219634474698, 0.9422219634474698, 0.9422219634474698]
=====
[0.3789947506000524, 0.3789947506000524, 0.3789947506000524]
=====
[0.25406979924952877, 0.25406979924952877, 0.25406979924952877]
=====
[0.6927210276975587, 0.6927210276975587, 0.6927210276975587]
=====
[0.3583263556988684, 0.3583263556988684, 0.3583263556988684]
关于deep-learning - 使用 Optuna 和剪枝对每个超参数进行多次训练/多次神经网络初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70835824/