我正在做我的第一个 ML-with-optuna 项目。我的问题是如何为多个 NN 初始化探测一组超参数,在一次试验中的每次运行仍然需要修剪?
我假设初始化有相当大的影响,我不想因为运气不好而剔除好的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。目标函数是基于迭代求和计算结果;它使用修剪。遗憾的是,由于随机偏移,目标函数是嘈杂的。这是作为训练 NN 的隐喻。迭代是训练循环,x 是超参数,偏移量是网络的随机初始化。
由噪声引起的问题是您无法确定超参数的质量,因为结果可能由随机偏移量支配。这可能会导致选择次优的 x。如果我是对的,那么增加试验次数以消除随机性可能不起作用,因为 optuna 可能会建议基于旧超参数的新超参数。所以不幸的观察会阻碍进一步的进展。
因此,我认为最好对同一组 hyperpramters 多次评估目标,并且只记住最好的“运行”。
所以我的问题是如何最好地消除噪音?我的假设是否正确,即仅增加试验次数不是最佳方法,您将如何实施重复评估?