deep-learning - 使用 Optuna 和剪枝对每个超参数进行多次训练/多次神经网络初始化

标签 deep-learning hyperparameters optuna

我正在做我的第一个 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/

相关文章:

machine-learning - 全卷积网络中上采样层的 "learning multiple"应该是多少?

python - "accuracy"的 Caffe 自定义 python 层

python - 随机搜索获取参数未实现

MATLAB 中与算法无关的超参数网格搜索

python - 如何修复错误 "' _BaseUniformDistribution' 对象没有属性 'to_internal_repr'“- optuna 中的奇怪行为

matlab - 使用 cnn 的非图像数据 [Matlab 专用]

python-2.7 - Theano导入错误

python - 对整个数据集进行超参数调整?

python - 有没有办法将参数传递给 optuna 中的多个工作?