Optuna单trial返回最后epoch值而非最优中间值的问题咨询
现象原因
Optuna的默认运行逻辑中,单个trial的最终取值仅取决于目标函数(objective)末尾return的结果,你通过trial.report()上报的所有中间值仅会被用于剪枝判断、结果存储,不会自动覆盖trial的最终结果。你当前返回的是最后一轮epoch的数值25,因此Optuna会直接将25判定为该trial的最终值,不会主动从上报的中间值中筛选最优值。
解决方法
根据你的场景可以选择以下两种实现方案:
方案1:编写目标函数时手动追踪最优值,最终直接返回最优值
在目标函数内部新增变量保存当前的最优中间值,每个epoch计算完结果后同步更新该变量,函数最终返回这个最优值即可,适配还未开始跑实验的场景。
参考代码:
import optuna def objective(trial): # 最小化任务初始化为正无穷,最大化任务初始化为负无穷 best_value = float("inf") epoch_values = [18, 32, 14, 28, 25] for epoch in range(5): current_value = epoch_values[epoch] # 上报中间值,需要使用剪枝功能时必须保留该调用 trial.report(current_value, epoch) # 更新最优值 if current_value < best_value: best_value = current_value # 直接返回最优值,而非最后一轮的数值 return best_value
方案2:已跑完实验的场景下,从trial对象中提取历史最优中间值
如果实验已经跑完不想重跑,可以直接从已生成的trial对象中提取所有中间值再筛选最优值。
参考代码:
# 替换为你自己获取到的对应单个trial对象 trial = study.get_trials()[0] # 最小化任务取min,最大化任务取max best_intermediate_value = min(trial.intermediate_values.values())
内容的提问来源于stack exchange,提问作者Zahra
相关产品推荐
相关产品推荐

