You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:27:00