使用HParams仪表板进行超参数调优
在构建机器学习模型时,需要选择各种超参数,比如一层的dropout rate或者learning rate。这些决策影响模型度量,例如准确性。因此,机器学习工作流程中的一个重要步骤是为你的问题确定最佳超参数,这通常涉及实验。这个过程被称为“超参数优化”或“超参数调优”。
TensorBoard中的HParams仪表板提供了几个工具来帮助确定最佳实验或最有希望的超参数集的过程。
本教程将重点关注以下步骤:
- 实验设置和HParams总结
- 适应TensorFlow运行日志超参数和指标
- Start运行并将它们全部记录在一个父目录下
- 在TensorBoard的HParams仪表板中可视化结果
请注意HParams汇总api和仪表板UI还在预览阶段,会随着时间的推移而改变。
导入TensorFlow和TensorBoard HParams插件:
下载FashionMNIST数据集并缩放:
fashion_mnist < -dataset_fashion_mnist()fashion_mnist$火车$x < -fashion_mnist$火车$x/255fashion_mnist$测验$x < -fashion_mnist$测验$x/255
实验设置和HParams实验总结
对模型中的三个超参数进行实验:
- 第一密集层的单元数
- Dropout层的Dropout速率
- 优化器
列出要尝试的值,并将实验配置记录到TensorBoard。这个步骤是可选的:您可以提供域信息,以便在UI中更精确地过滤超参数,并且您可以指定应该显示哪些指标。
如果你选择跳过这一步,你可以使用一个字符串字面值,否则你会使用HParam值:例如,hparams(“辍学”)
或美元hparams辍学
而不是hparams [HP_DROPOUT]
.
HP_NUM_UNITS =惠普$HParam(“num_units”,惠普$离散(列表(16,32)))HP_DROPOUT =惠普$HParam(“辍学”,惠普$RealInterval(0.1,0.2))HP_OPTIMIZER =惠普$HParam(“优化”,惠普$离散(列表(“亚当”,“sgd”)))METRIC_ACCURACY =“准确性”与(特遣部队$总结$create_file_writer(“日志/ hparam_tuning”)$as_default() {惠普$hparams_config(hparams =列表(HP_DROPOUT HP_NUM_UNITS HP_OPTIMIZER),指标=列表(惠普$度规(METRIC_ACCURACYdisplay_name =“准确性”)))})
适应TensorFlow运行日志超参数和指标
模型将非常简单:两个密集的层之间有一个dropout层。训练代码看起来很熟悉,尽管超参数不再是硬编码的。相反,超参数在hparams字典中提供,并在整个训练函数中使用:
train_test_model < -函数(hparams) {模型< -keras_model_sequential()% > %layer_flatten()% > %layer_dense(py_to_r(hparams [HP_NUM_UNITS]),激活=“relu”)% > %layer_dropout(py_to_r(hparams [HP_DROPOUT]))% > %layer_dense(单位=10,激活=“softmax”)模型% > %编译(优化器=py_to_r(hparams [HP_OPTIMIZER]),损失=“sparse_categorical_crossentropy”,指标=“准确性”)模型% > %适合(x =fashion_mnist$火车$x,y =fashion_mnist$火车$y,时代=1)为了演示目的,使用1个epoch来加快速度结果< -模型% > %评估(x =fashion_mnist$测验$x,y =fashion_mnist$测验$y,verbose =0)结果$精度}
对于每次运行,记录带有超参数和最终精度的hparams摘要:
运行< -函数(run_dir hparams) {与(特遣部队$总结$create_file_writer(run_dir)$as_default() {惠普$hparams(hparams)#记录本次试验中使用的值精度< -train_test_model(hparams)特遣部队$总结$标量(METRIC_ACCURACY、准确性,一步=as.integer(1))})}
当训练Keras模型时,你可以使用回调,而不是直接编写这些:
模型% > %适合(…,回调函数=列表(callback_tensorboard(logdir),#日志指标惠普$KerasCallback(logdir hparams),#日志hparams),)
Start运行并将它们全部记录在一个父目录下
现在可以尝试多个实验,用一组不同的超参数对每个实验进行训练。
为了简单起见,使用网格搜索:尝试离散参数的所有组合,只尝试实值参数的上界和下界。对于更复杂的场景,随机选择每个超参数值可能更有效(这称为随机搜索)。还有更先进的方法可以使用。
运行几个实验,这将花费几分钟:
session_num < -0为(num_units在HP_NUM_UNITS$域$值){为(dropout_rate在c(HP_DROPOUT$域$min_value, HP_DROPOUT$域$max_value)) {为(优化器在HP_OPTIMIZER$域$值){hparams < -dict(HP_NUM_UNITS =num_units,HP_DROPOUT =dropout_rate,HP_OPTIMIZER =优化器)run_name < -sprintf(“快跑- % 04 d”session_num)打印(sprintf(——开始试用:%s', run_name))# purrr::我(hparams ~打印(粘贴。Y, .x, sep = ": "))运行(paste0(“日志/ hparam_tuning /”run_name) hparams)session_num < -session_num+1}}}
在TensorBoard的HParams插件中可视化结果
tensorboard(“日志/ hparam_tuning /”)
仪表板的左窗格提供了跨HParams仪表板中所有视图的活动过滤功能:
- 筛选仪表板中显示的超参数/指标
- 筛选仪表板中显示的超参数/指标值
- 筛选运行状态(运行,成功,…)
- 在表视图中按超参数/度量排序
- 要显示的会话组数量(在有很多实验时对性能有用)
HParams仪表板有三个不同的视图,包含各种有用的信息:
- 表视图列出运行、它们的超参数和度量。
- 平行坐标视图将每一次运行显示为一条穿过每个超参数和度量的轴的直线。在任意轴上单击并拖动鼠标,以标记一个区域,该区域将只突出显示通过它的运行。这对于确定哪组超参数是最重要的非常有用。坐标轴本身可以通过拖动来重新排序。
- 散点图视图显示了将每个超参数/度量与每个度量进行比较的图。这可以帮助识别相关性。单击并拖动可选择特定绘图中的某个区域,并在其他绘图中突出显示这些会话。
可以单击表格行、平行坐标线和散点图市场,查看作为该会话训练步骤函数的指标图(尽管在本教程中每次运行只使用一个步骤)。