感谢你的提问。澄清术语和参数:
- “s” - 对应于算法可以评估潜在终止运行的括号总数
- “eta”对应于在每个括号中丢弃的运行的反比例。
- “min_iter”是每个配置应运行的最小迭代次数。
- “max_iter”是每个配置可以运行的最大迭代次数。
默认情况下,eta 设置为 3。在您将 max_iter 设置为 9 的情况下,可以在第 3 个时期评估 early_termination。 (9/3)
注意:提前终止可以在完成之前终止现有运行。然而,最终算法的筛选标准是由原始搜索策略决定的。要执行有限搜索,您可以使用具有离散空间的网格搜索(随机搜索和贝叶斯搜索将连续对搜索空间进行采样)。您还可以在扫描配置中提供 run_cap。最后,您还可以在代理级别指定 count 参数。
对于示例代码:
import numpy as np
import random
import wandb
import time
def train_one_epoch(epoch, lr, bs):
acc = 0.25 + ((epoch/30) + (random.random()/10))
loss = 0.2 + (1 - ((epoch-1)/10 + random.random()/5))
return acc, loss
def evaluate_one_epoch(epoch):
acc = 0.1 + ((epoch/20) + (random.random()/10))
loss = 0.25 + (1 - ((epoch-1)/10 + random.random()/6))
return acc, loss
def main():
run = wandb.init()
lr = wandb.config.lr
bs = wandb.config.batch_size
for epoch in range(10):
# Sleep a sufficient amount of time each epoch for early stopping to terminate an ongoing run
time.sleep(35)
train_acc, train_loss = train_one_epoch(epoch, lr, bs)
val_acc, val_loss = evaluate_one_epoch(epoch)
wandb.log({
'train_acc': train_acc,
'train_loss': train_loss,
'val_acc': val_acc,
'val_loss': val_loss
})
# ? Step 2: Define sweep config
sweep_configuration = {
'method': 'random',
'name': 'hyperband_sweep_test',
'metric': {'goal': 'maximize', 'name': 'val_acc'},
'parameters':
{
'batch_size': {'values': [16, 32, 64]},
'lr': {'max': 0.1, 'min': 0.0001}
},
"early_terminate": {
"type": "hyperband",
"eta": 2,
"min_iter":2
}
}
# run once to obtain a sweep ID
# sweep_id = wandb.sweep(sweep=sweep_configuration, project='hyperband_example_project2')
# ? Step 4: Call to `wandb.agent` to start a sweep
wandb.agent('<entity>/<project>/<sweep_id>', function=main)
您将希望同时使用多个代理运行它以观察提前停止。 eta 设置为 2,min_iter 设置为 2。因此括号点将位于 2、4、8 个纪元。在每个支架上,可以停止一半的配置。 (1/埃塔)