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

生成无重复随机参数序列用于超参数调优的实现求助

解决超参数调优中避免重复参数序列的方案

核心思路

用集合存储已生成的参数序列(集合的成员查询时间复杂度为O(1),效率远高于列表),每次生成新序列后先校验是否已存在:

  • 若不存在,就使用该序列并加入集合;
  • 若存在,重新生成直到得到新序列;
  • 额外添加保护逻辑,当所有可能的参数组合都已生成时,提前终止循环,避免死循环。

修改后的代码示例

import random

num_evals = 2500
parameters = {
    'n_parameter_1': range(2, 100),
    'n_parameter_2': range(1, 20),
    'n_parameter_3': range(2, 150),
}

# 计算所有可能的参数组合总数,避免死循环
total_possible = len(parameters['n_parameter_1']) * len(parameters['n_parameter_2']) * len(parameters['n_parameter_3'])
if num_evals > total_possible:
    print(f"警告:请求的评估次数{num_evals}超过了所有可能的参数组合数{total_possible},将调整为{total_possible}次")
    num_evals = total_possible

# 存储已使用的参数序列,用元组(不可变类型)作为集合元素
used_params = set()

for i in range(num_evals):
    while True:
        # 生成一组参数
        param_1 = random.choice(parameters['n_parameter_1'])
        param_2 = random.choice(parameters['n_parameter_2'])
        param_3 = random.choice(parameters['n_parameter_3'])
        # 把参数转成元组,因为列表不能存入集合
        param_tuple = (param_1, param_2, param_3)
        
        if param_tuple not in used_params:
            used_params.add(param_tuple)
            # 这里替换为你的业务逻辑:调用目标函数、保存结果等
            print(f"第{i+1}次评估使用参数:n_parameter_1={param_1}, n_parameter_2={param_2}, n_parameter_3={param_3}")
            break

# 可选:持久化已用参数到文件,跨运行会话避免重复
# import pickle
# with open('used_params.pkl', 'wb') as f:
#     pickle.dump(used_params, f)
# 下次运行时加载:
# with open('used_params.pkl', 'rb') as f:
#     used_params = pickle.load(f)

关键细节说明

  • 使用元组作为集合元素:列表是可变类型无法被哈希,元组不可变,符合集合元素的要求。
  • 提前计算总组合数:防止请求的评估次数超过所有可能的组合,导致程序无限循环。
  • 跨会话去重:如果需要多次运行脚本都避免重复,可以用pickle将已用参数集合保存到文件,下次启动时加载。

内容的提问来源于stack exchange,提问作者Edd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:43:17