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

遗传算法训练时适应度始终为0无提升,求技术排查

核心问题排查与修复建议

1. 初始种群重复初始化导致进化断层

你的代码每次进入while循环时,都用全新的随机初始种群(torch_ga.population_weights)启动GA,完全没有继承上一轮训练的进化成果。这相当于每次增量训练都从零开始,自然不会有适应度提升。

修复方案:
将上一轮GA进化后的种群作为下一轮的初始种群,保留进化积累:

def trainModels(coin):
    global endSliceTraining, startSliceTraining

    torch_ga = pygad.torchga.TorchGA(model=NeuralNetworkModel, num_solutions=10)
    # 初始化后保存当前种群,后续迭代复用
    current_population = torch_ga.population_weights

    while endSliceTraining < len(trainingData):
        ga_instance = pygad.GA(num_generations=10,
                            num_parents_mating=2,
                            initial_population=current_population,  # 用上一轮种群
                            fitness_func=fitness_func,
                            parent_selection_type="sss", 
                            mutation_type="random",
                            mutation_by_replacement=True)
        
        ga_instance.run()

        solution, solution_fitness, solution_idx = ga_instance.best_solution()
        # 更新种群为当前轮进化后的结果
        current_population = ga_instance.population_weights
 
        startSliceTraining += 1
        endSliceTraining += 1

2. 适应度计算的关键验证点

即使你认为复杂逻辑没问题,仍需确认:

  • 适应度返回值是否真正反映了模型性能?比如是否在循环中累加了实际收益,而非始终返回0或固定值?
  • statsSlice的长度是否合理?由于start/endSliceTraining每次只+1,当前切片是单条数据,单步操作的收益是否为0,导致整体适应度无变化?
  • NeuralNetworks[currentCoinIndex]和torch_ga初始化时的NeuralNetworkModel是否结构完全一致?结构不匹配会导致预测失效,动作选择无意义。

3. GA参数的合理性调整

  • num_parents_mating=2:父母数量过少,遗传多样性不足,容易陷入0值死局,建议调整为4-6。
  • mutation_type="random":随机突变幅度可能过大,破坏有效权重,可尝试mutation_type="gaussian"并设置mutation_percent_genes=5(仅突变5%的基因),让突变更温和。
  • num_generations=10:每轮增量训练的进化代数太少,未等模型适应当前数据就切换,建议增加到20-50代。

4. 全局变量与冗余操作优化

  • 确认startSliceTraining和endSliceTraining未被其他代码意外修改,可改为函数内的非全局变量(比如通过类封装)降低风险。
  • fitness_func中每次将trainingData转为numpy数组是冗余操作,建议提前在外部转换完成,避免重复计算。

5. 模型预测正确性调试

在fitness_func中加入调试代码,验证预测输出是否合理:

prediction = pygad.torchga.predict(model=NeuralNetworks[currentCoinIndex], solution=solution, data=stats)
print(f"Prediction output: {prediction}")  # 查看是否为有效概率分布
move = torch.argmax(prediction).item()

如果预测始终输出相同结果(比如全0),说明模型权重传递或输入数据预处理存在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:25:33