遗传算法训练时适应度始终为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
相关产品推荐
相关产品推荐

