本篇介绍Tune中trial调度算法。主要介绍了Population Based Training (PBT)、Asynchronous HyperBand、 HyperBand及实现、Median Stopping Rule四种试验调度。
默认情况下,Tune使用FIFOSchscheduler类按顺序安排试验。不过,您还可以指定一个自定义调度算法,该算法可以提前停止试验或干扰参数。
tune.run( ... , scheduler=AsyncHyperBandScheduler())
Tune包括早期停止算法的分布式实现,例如中值停止规则,HyperBand和HyperBand的异步版本。这些算法具有很高的资源效率,在很多情况下都优于贝叶斯优化方法。目前,所有调度程序都采用一个度量标准metric
,该度量标准是您的Trainable的结果字典中返回的值,并且根据模式mode
而最大化或最小化。(老版本中是所有调度程序都接受一个reward_attr
,即目标参数标准,该值假定为最大化。)。由于此篇写的比较早,故后边的例子主要是按照老版本进行说明的。
目前可用的试验调度程序:
- Population Based Training (PBT)
- Asynchronous HyperBand
- HyperBand--------HyperBand Implementation Details
- Median Stopping Rule
下面介绍这四种调度算法。
1.Population Based Training (PBT)
Population Based Training (PBT)的分布式实现。这可以通过设置tune.run
的scheduler
参数来启动,例如:
pbt_scheduler = PopulationBasedTraining(
time_attr='time_total_s',
reward_attr='mean_accuracy',
perturbation_interval=600.0,
hyperparam_mutations={
"lr": [1e-3, 5e-4, 1e-4, 5e-5, 1e-5],
"alpha": lambda: random.uniform(0.0, 1.0),
...
})
tune.run( ... , scheduler=pbt_scheduler)
启用PBT调度程序后,每个试验变体都将被视为总体的成员。 定期检查性能最佳试验(这需要Trainable支持检查点,故用此调度的训练使用基于函数API时需要在函数中加上检查点相关代码)。 低性能的试验克隆了表现最佳者的试验的参数并添加配置,以期发现更好的参数变体。
可以通过运行一个小 PBT 例子了解PBT的工作。当在PBT模型下进行训练时,单个试验可能会在其生命周期中看到许多不同的超参数,并将其记录在result.json
文件。单个实验过程中优化LR调度的PBT生成了下图:
class ray.tune.schedulers.PopulationBasedTraining(time_attr='time_total_s',
reward_attr='episode_reward_mean', perturbation_interval=60.0,
hyperparam_mutations={}, resample_probability=0.25, custom_explore_fn=None)
PopulationBasedTraining源码,PBT论文
PBT并行地训练一组模型(或代理)。性能较差的模型会周期性地克隆性能最好的模型的状态(