遗传算法在机器学习超参数优化中的应用

机器学习领域,模型的训练效果很大程度上取决于超参数的设置。超参数是控制模型学习过程的参数,不同于模型内部的权重和偏置,它们需要在训练之前设定。传统的网格搜索方法由于搜索空间的高维度、维度间的未知相关性以及评估每个点的适应度成本高昂,往往变得不切实际。因此,遗传算法(Genetic Algorithm, GA)成为了超参数搜索的一个合适选择。

在开始之前,需要在Python环境(版本至少为3.8.0)中安装YOLOv5和PyTorch(版本至少为1.8)。可以通过克隆代码库并安装requirements.txt来实现。模型和数据集将自动从最新的YOLOv5发布版本中下载。

git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

YOLOv5模型包含约30个用于不同训练设置的超参数,这些参数在/data/hyps目录下的*.yaml文件中定义。正确的初始猜测将产生更好的最终结果,因此在进化之前正确初始化这些值非常重要。如果不确定,可以使用为YOLOv5 COCO训练从头开始优化的默认值。

适应度是试图最大化的值。在YOLOv5中,定义了一个默认的适应度函数,作为指标的加权组合:mAP@0.5贡献了10%的权重,mAP@0.5:0.95贡献了剩余的90%,而精度P和召回率R不包括在内。可以根据需要调整这些权重,或者使用utils/metrics.py中的默认适应度定义(推荐)。

def fitness(x): """Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]." w = [0.0, 0.0, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.5:0.95] return (x[:, :4] * w).sum(1)

进化是围绕一个基础情景进行的,试图改善这个基础情景。在这个例子中,基础情景是使用预训练的YOLOv5s微调COCO128,训练10个周期。要针对这个特定情景进化超参数,从第1部分定义的初始值开始,并最大化第2部分定义的适应度,可以追加--evolve参数。

默认的进化设置将运行基础情景300次,即300代。可以通过--evolve参数修改代数,例如python train.py --evolve 1000。

主要的遗传算子是交叉和变异。在这项工作中,使用了变异,有80%的概率和0.04的方差,基于所有先前代中最好的父母创建新的后代。结果记录在runs/evolve/exp/evolve.csv中,并且每一代最高适应度的后代被保存为runs/evolve/hyp_evolved.yaml:

建议至少进行300代的进化以获得最佳结果。请注意,进化通常是昂贵且耗时的,因为基础情景被训练了数百次,可能需要数百或数千个GPU小时。

进化完成后,可以通过utils.plots.plot_evolve()将evolve.csv绘制为evolve.png,每个超参数都有一个子图,显示适应度(y轴)与超参数值(x轴)。黄色表示高浓度。垂直分布表明一个参数已被禁用并且不会变异。这可以在train.py中的meta字典中由用户选择,并且对于固定参数并防止其进化很有用。

Ultralytics提供了一系列预安装了CUDA、CUDNN、Python和PyTorch等基本依赖的即用型环境,以快速启动项目。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485