TensorFlow 的超参数调整

Posted

技术标签:

【中文标题】TensorFlow 的超参数调整【英文标题】:Hyperparameter tune for Tensorflow 【发布时间】:2017-10-26 03:55:14 【问题描述】:

我正在为直接用 Tensorflow(不是 Keras 或 Tflearn)编写的代码搜索超参数调整包。你能提点建议吗?

【问题讨论】:

github.com/cerlymarco/keras-hypetune 【参考方案1】:

您可以试用 Ray Tune,这是一个用于缩放超参数搜索的简单库。我主要将它用于 Tensorflow 模型训练,但它与框架无关 - 可与 PyTorch、Keras 等无缝协作。这是文档页面 - ray.readthedocs.io/en/latest/tune.html

您可以使用它在大约 10 行代码中运行最先进算法的分布式版本,例如 HyperBand 或贝叶斯优化。

以一次运行 4 次并行评估为例:

import ray
import ray.tune as tune
from ray.tune.hyperband import HyperBandScheduler


def train_model(config, reporter):  # add the reporter parameter
    model = build_tf_model(config["alpha"], config["beta"])
    loss = some_loss_function(model)
    optimizer = tf.AdamOptimizer(loss)

    for i in range(20):
        optimizer.step()
        stats = get_statistics()
        reporter(timesteps_total=i, 
                 mean_accuracy=stats["accuracy"])

ray.init(num_cpus=4)
tune.run(train_model,
    name="my_experiment",
    stop="mean_accuracy": 100, 
    config= 
        "alpha": tune.grid_search([0.2, 0.4, 0.6]), 
        "beta": tune.grid_search([1, 2]) 
    ,
    scheduler=HyperBandScheduler(reward_attr="mean_accuracy"))

如果您想在集群上运行此脚本,也无需更改代码。

免责声明:我从事这个项目 - 如果您有任何反馈,请告诉我!

【讨论】:

通过查看 Ray Tune 示例我无法弄清楚的一件事:在调用 tune.run_experiments(...) 之后,我如何获得经过训练的 model 对象? 使用analysis = tune.run(...)。然后analysis.get_best_config.【参考方案2】:

您可以使用变分推理(贝叶斯)作为优化空间上的点云;超参数调整会好得多。张量流概率将是一种方法。

【讨论】:

【参考方案3】:

我发现 sci-kit optimize 用于超参数的贝叶斯优化非常简单,它适用于任何 tensorflow API(估计器、自定义估计器、核心、keras 等)

https://***.com/a/53582472/2218905

【讨论】:

【参考方案4】:

我不确定这是否也是您想要的参数,但您提到了 TensorFlow 超参数,所以我想我可以提出一些建议。

尝试克隆此存储库以获得所需的脚本;

git 克隆https://github.com/googlecodelabs/tensorflow-for-poets-2

在 Master 文件夹中,调用您的命令提示符并运行此行;

python -m scripts.retrain -h

获取可选参数列表。

来源:https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#6

【讨论】:

【参考方案5】:

我想在@jdehesa 的列表中再添加一个库,我已将其应用到我的研究中,尤其是 tensorflow。它是hyper-engine,获得 Apache 2.0 许可。

它还实现了高斯过程贝叶斯优化和其他一些技术,如学习曲线预测,可以节省大量时间。

【讨论】:

【参考方案6】:

通常您不需要将超参数优化逻辑与优化模型相结合(除非您的超参数优化逻辑特定于您正在训练的模型类型,在这种情况下,您需要告诉我们更多信息)。有几个工具和包可用于该任务。 Here 是一篇关于该主题的好论文,here 是一篇更实用的博文,并附有示例。

hyperopt 实现随机搜索和 parzen 估计树优化。 Scikit-Optimize 实现了其他一些功能,包括高斯过程贝叶斯优化。 SigOpt 是一项用于超参数优化的便捷服务(付费,尽管有免费层级和额外津贴给学生和研究人员)。它基于 Yelp 的 MOE,它是开源的(尽管已发布的版本似乎没有太多更新),理论上可以单独使用,尽管需要一些额外的努力。 Spearmint 也是一个常用的软件包,也是开源的,但不能免费用于商业目的(尽管您可以退回到 less restrictive older version)。它看起来不错,但不是很活跃,并且可用版本与 Python 3 不兼容(即使已提交拉取请求以修复该问题)。 BayesOpt 似乎是贝叶斯优化中的黄金标准,但它主要是 C++,而且 Python 接口看起来没有太多文档记录。

在这些中,我只有真正(即有一个真正的问题)将 hyperopt 与 TensorFlow 一起使用,并且没有花费太多精力。 API 在某些方面有点奇怪,文档也不是很详尽,但它确实有效并且似乎正在积极开发中,可能会出现更多优化算法和适应(例如专门针对神经网络)。但是,正如之前链接的博客文章中所建议的那样,Scikit-Optimize 可能也一样好,而且 SigOpt 看起来很容易使用,如果它适合您的话。

【讨论】:

我是这个 DNN 的新手。但我使用 scikit-learn(传统 ML)进行了一些参数网格搜索。我的问题是:DNN中的网格搜索需要太多的计算能力,实用吗? @scotthuang 看看this paper。除了描述其他几种方法外,其中一个结论是即使进行随机搜索也可能更有效,因为通常只有一小部分超参数对模型的性能起重要作用。

以上是关于TensorFlow 的超参数调整的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow从0到1之TensorFlow超参数及其调整(24)

TensorFlow从0到1之TensorFlow超参数及其调整(24)

Tensorflow 模型的超参数调优

TensorFlow 对象检测 API 中的超参数优化

TensorFlow 的使用步骤

调整 SVR 的超参数 [关闭]