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

如何用Optuna优化长度可变的列表型超参数?

解决Optuna中可变长度编码器神经元列表的超参数优化问题

你的核心问题是:生成编码器/解码器神经元列表时,所有隐藏层的神经元参数使用了同一个名称(encoder_neuron/decoder_neuron),Optuna会将其视为单一超参数,导致所有隐藏层神经元取值相同,且无法记录每层的独立数值。

修改方案

给每个隐藏层的神经元参数设置唯一名称,结合层数索引区分不同层的参数,确保Optuna能独立优化每层的神经元数量。

修改后的完整代码

def objective(trial):
    LATENT_DIM = trial.suggest_int("latent_dim", 1, 5)
    HIDDEN_ACTIVATION = trial.suggest_categorical("hidden_activation", ["relu", "sigmoid", "tanh"])
    EPOCHS = trial.suggest_int("epochs", 1, 100)
    BATCH_SIZE = trial.suggest_int("batch_size", 32, 256, 32)
    DROPOUT_RATE = trial.suggest_float("dropout_rate", 0, 0.6)
    L2_REGULARIZER = trial.suggest_float("l2_regularizer", 0, 0.6)
    
    # 构建编码器神经元列表:固定input_dim开头,后续每层神经元独立采样
    num_encoder_layers = trial.suggest_int('num_hidden_layers_encoder', 1, 5)
    encoder_hidden = []
    for layer_idx in range(num_encoder_layers):
        # 用层索引生成唯一参数名,避免参数冲突
        neuron_num = trial.suggest_int(f'encoder_neuron_layer_{layer_idx}', 7, 256)
        encoder_hidden.append(neuron_num)
    ENCODER_NEURONS = [input_dim] + encoder_hidden
    
    # 构建解码器神经元列表:每层神经元独立采样,结尾固定input_dim
    num_decoder_layers = trial.suggest_int('num_hidden_layers_decoder', 1, 5)
    decoder_hidden = []
    for layer_idx in range(num_decoder_layers):
        neuron_num = trial.suggest_int(f'decoder_neuron_layer_{layer_idx}', 7, 256)
        decoder_hidden.append(neuron_num)
    DECODER_NEURONS = decoder_hidden + [input_dim]
    
    model = VAE(
        encoder_neurons=ENCODER_NEURONS,
        decoder_neurons=DECODER_NEURONS,
        latent_dim=LATENT_DIM,
        hidden_activation=HIDDEN_ACTIVATION,
        epochs=EPOCHS,
        batch_size=BATCH_SIZE,
        dropout_rate=DROPOUT_RATE,
        l2_regularizer=L2_REGULARIZER,
        contamination=CONTAMINATION,
        random_state=RANDOM_STATE
    )
    model.fit(x_train_scaled)
    y_pred = model.predict(x_test_scaled)
    score = fbeta_score(y_test, y_pred, beta=2)
    return score

关键修改说明

  • 先单独获取隐藏层数量,再通过循环为每层生成带索引的唯一参数名(如encoder_neuron_layer_0、encoder_neuron_layer_1),确保每层神经元数是独立的超参数
  • 这样Optuna会记录每层的神经元取值,最终能生成符合需求的可变长度列表,比如[7,16,32]或[7,32]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:48