电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>PyTorch教程19.2之超参数优化API

PyTorch教程19.2之超参数优化API

2023-06-05 | pdf | 0.26 MB | 次下载 | 免费

资料介绍

在我们深入研究该方法之前,我们将首先讨论一个基本的代码结构,它使我们能够有效地实现各种 HPO 算法一般来说,这里考虑的所有 HPO 算法都需要实现两个决策原语,即搜索调度首先,他们需要对新的超参数配置进行采样,这通常涉及对配置空间的某种搜索。其次,对于每个配置,HPO 算法需要安排其评估并决定为其分配多少资源。一旦我们开始评估配置,我们就会将其称为试用我们将这些决定映射到两个类,HPOSearcherHPOScheduler除此之外,我们还提供HPOTuner执行优化过程的类。

这种调度器和搜索器的概念也在流行的 HPO 库中实现,例如 Syne Tune Salinas等人,2022 年、Ray Tune Liaw等人,2018 年或 Optuna Akiba等人,2019 年

import time
from scipy import stats
from d2l import torch as d2l

19.2.1。搜寻器

下面我们定义一个搜索器的基类,通过函数提供一个新的候选配置sample_configuration实现此功能的一种简单方法是随机对配置进行统一采样,就像我们在 第 19.1 节中对随机搜索所做的那样。更复杂的算法,例如贝叶斯优化,将根据先前试验的表现做出这些决定。因此,随着时间的推移,这些算法能够对更有希望的候选人进行抽样。我们添加该update 功能是为了更新以前试验的历史,然后可以利用它来改进我们的抽样分布。

class HPOSearcher(d2l.HyperParameters): #@save
  def sample_configuration() -> dict:
    raise NotImplementedError

  def update(self, config: dict, error: float, additional_info=None):
    pass

以下代码显示了如何在此 API 中实现我们上一节中的随机搜索优化器。作为一个轻微的扩展,我们允许用户通过 指定要评估的第一个配置 initial_config,而随后的配置是随机抽取的。

class RandomSearcher(HPOSearcher): #@save
  def __init__(self, config_space: dict, initial_config=None):
    self.save_hyperparameters()

  def sample_configuration(self) -> dict:
    if self.initial_config is not None:
      result = self.initial_config
      self.initial_config = None
    else:
      result = {
        name: domain.rvs()
        for name, domain in self.config_space.items()
      }
    return result

19.2.2。调度程序

除了新试验的采样配置外,我们还需要决定何时进行试验以及进行多长时间。实际上,所有这些决定都是由 完成的HPOScheduler,它将新配置的选择委托给HPOSearcher. suggest只要某些训练资源可用,就会调用该方法。除了调用sample_configuration搜索器之外,它还可以决定诸如max_epochs(即训练模型的时间)之类的参数update每当试验返回新观察时调用该方法。

class HPOScheduler(d2l.HyperParameters): #@save
  def suggest(self) -> dict:
    raise NotImplementedError

  def update(self, config: dict, error: float, info=None):
    raise NotImplementedError

要实现随机搜索以及其他 HPO 算法,我们只需要一个基本的调度程序,它可以在每次新资源可用时调度新的配置。

class BasicScheduler(HPOScheduler): #@save
  def __init__(self, searcher: HPOSearcher):
    self.save_hyperparameters()

  def suggest(self) -> dict:
    return self.searcher.sample_configuration()

  def update(self, config: dict, error: float, info=None):
    self.searcher.update(config, error, additional_info=info)

19.2.3。调谐器

最后,我们需要一个组件来运行调度器/搜索器并对结果进行一些簿记。下面的代码实现了 HPO 试验的顺序执行,在下一个训练作业之后评估一个训练作业,并将作为一个基本示例。我们稍后将使用 Syne Tune来处理更具可扩展性的分布式 HPO 案例。

class HPOTuner(d2l.HyperParameters): #@save
  def __init__(self, scheduler: HPOScheduler, objective: callable):
    self.save_hyperparameters()
    # Bookeeping results for plotting
    self.incumbent = None
    self.incumbent_error = None
    self.incumbent_trajectory = []
    self.cumulative_runtime = []
    self.current_runtime = 0
    self.records = []

  def run(self, number_of_trials):
    for i in range(number_of_trials):
      start_time = time.time()
      config = self.scheduler.suggest()
      print(f"Trial {i}: config = {config}")
      error = self.objective(**config)
      error = float(error.cpu().detach().numpy())
      self.scheduler.update(config, error)
      runtime = time.time() - start_time
      self.bookkeeping(config, error, runtime)
      print(f"  error = {error}, runtime = {runtime}")

19.2.4。簿记 HPO 算法的性能

对于任何 HPO 算法,我们最感兴趣的是性能最佳的配置(称为incumbent)及其在给定挂钟时间后的验证错误。这就是我们跟踪runtime每次迭代的原因,其中包括运行评估的时间(调用 objective)和做出决策的时间(调用 scheduler.suggest)。在续集中,我们将绘制 cumulative_runtimeagainstincumbent_trajectory以可视化根据( 和) 定义的 HPO 算法的任何时间性能这使我们不仅可以量化优化器找到的配置的工作情况,还可以量化优化器找到它的速度。schedulersearcher

@d2l.add_to_class(HPOTuner) #@save
def bookkeeping(self, config: dict, error: float, runtime: float):
  self.records.append({"config": config, "error": error, "runtime": runtime})
  # Check if the last hyperparameter configuration performs better
  # than the incumbent
  if self.incumbent is None or self.incumbent_error > error:
    self.incumbent = config
    self.incumbent_error = error
  # Add current best observed performance to the optimization trajectory
  self.incumbent_trajectory.append(self.incumbent_error)
  # Update runtime
  self.current_runtime += runtime
  self.cumulative_runtime.append(self.current_runtime)

19.2.5。示例:优化卷积神经网络的超参数

我们现在使用随机搜索的新实现来优化 第 7.6 节中卷积神经网络批量大小学习率我们通过定义目标函数,这将再次成为验证错误。LeNet

def hpo_objective_lenet(learning_rate, batch_size, max_epochs=10): #@save
  model = d2l.LeNet(lr=learning_rate, num_classes=10)
  trainer = d2l.HPOTrainer(max_epochs=max_epochs, num_gpus=1)
  data = d2l.FashionMNIST(batch_size=batch_size)
  model.apply_init([next(iter(data.get_dataloader(True)))[0]], d2l.init_cnn)
  trainer.fit(model=model, data=data)
  validation_error = trainer.validation_error()
  return validation_error

我们还需要定义配置空间。此外,要评估的第一个配置是 第 7.6 节中使用的默认设置。

config_space = {
  "learning_rate": stats.loguniform(1e-2, 1),
  "batch_size": stats.randint(32, 256),
}
initial_config = {
  "learning_rate": 0.1,
  "batch_size": 128,
}

现在我们可以开始随机搜索了:

searcher = RandomSearcher(config_space, initial_config=initial_config)
scheduler = BasicScheduler(searcher=searcher)
tuner = HPOTuner(scheduler=scheduler, objective=hpo_objective_lenet)
tuner.run(number_of_trials=5)
  error = 0.17130666971206665, runtime = 125.33143877983093
https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PVuAO21vAAF9e-RRQjc464.svg
https://file.elecfans.com/web2/M00/A9/CE/poYBAGR9PV2ARgCBAAF-SCs89bw491.svg
https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PV-AcPXNAAF_kYZ_xQw068.svg
https://file.elecfans.com/web2/M00/A9/CE/poYBAGR9PWGAWTGGAAF_K5I3kmI689.svg
https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PWSAQ2zDAAFzyB-zwLc643.svg

下面我们绘制了现任者的优化轨迹,以获得随机搜索的任何时间性能:

board = d2l.ProgressBoard(xlabel="time", ylabel="error")
for time_stamp, error in zip(
  tuner.cumulative_runtime, tuner.incumbent_trajectory
):
  board.draw(time_stamp, error, "random search", every_n=1)
https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PWaAXsTGAAD-6d95H6c198.svg

19.2.6. 比较 HPO 算法

正如训练算法或模型架构一样,了解如何最好地比较不同的 HPO 算法非常重要。每次 HPO 运行取决于随机性的两个主要来源:训练过程的随机效应,例如随机权重初始化或小批量排序,以及 HPO 算法本身的内在随机性,例如随机搜索的随机抽样。因此,在比较不同的算法时,至关重要的是多次运行每个实验并报告基于随机数生成器的不同种子的算法多次重复的总体统计数据,例如平均值或中值。

为了说明这一点,我们比较随机搜索(参见第 19.1.2 节)和贝叶斯优化Snoek等人,2012 年在调整前馈神经网络的超参数方面的作用。每个算法都经过评估

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费