Tensorflow的超参数调整

9

我正在寻找一个可以用于直接编写Tensorflow代码(而不是Keras或Tflearn)的超参数调整包。你能给出一些建议吗?


https://github.com/cerlymarco/keras-hypetune - Marco Cerliani
6个回答

12
通常情况下,您不需要将超参数优化逻辑与优化模型耦合在一起(除非您的超参数优化逻辑特定于您正在训练的模型类型,在这种情况下,您需要告诉我们更多信息)。有几个可用于此任务的工具和软件包。这篇文章是关于这个话题的好稿子,这篇则是一个更实际的博客文章,带有示例。
以下是一些常用的工具和软件包:
  • Hyperopt 实现了随机搜索和基于 Parzen 估计器的树形优化。
  • Scikit-Optimize 实现了一些其他方法,包括高斯过程贝叶斯优化。
  • SigOpt 是一个方便的服务(收费,但有免费版和为学生和研究人员提供额外使用量),用于超参数优化。它基于 Yelp 的 MOE,该软件是开源的(尽管发布版本似乎不经常更新),理论上可以单独使用,但需要一些额外的工作。
  • Spearmint 也是一个常用的软件包,同样是开源的,但商业用途不免费(尽管您可以退回到旧版)。看起来不错,但并不活跃,而且可用版本与 Python 3 不兼容(即使已提交拉取请求进行修复)。
  • BayesOpt 看起来是贝叶斯优化中的黄金标准,但主要使用 C++,Python 接口文档不太完整。
  • 在这些库里面,我只真正应用过 hyperopt 和 TensorFlow 进行解决实际问题,而且没有花费太多的精力。API 在某些方面有点奇怪,文档也不够详细,但它确实可用,并且看起来正在积极开发中,可能会推出更多的优化算法和适配(例如,专门针对神经网络)。然而,正如之前链接的博客文章所建议的那样,Scikit-Optimize 也很好用,如果适合您的话,SigOpt 看起来也很容易使用。


    我对DNN还不熟悉,但我用scikit-learn(传统机器学习)进行了一些参数网格搜索。我的问题是:在DNN中进行网格搜索需要太多的计算能力,这实际可行吗? - scott huang
    @scotthuang 请看一下这篇论文。除了描述其他几种方法之外,其中一个结论是,即使进行随机搜索可能更有效,因为通常只有少量的超参数对模型的性能起到重要作用。 - jdehesa

    4
    我希望为@jdehesa的列表增加一个库,我在使用tensorflow时尤其应用了它。它是hyper-engine,采用Apache 2.0许可证。
    它还实现了高斯过程贝叶斯优化和其他一些技术,如“学习曲线预测”,这些技术可以节省很多时间。

    2
    您可以尝试使用 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对象? - Karl
    使用 analysis = tune.run(...) 进行调参分析,然后使用 analysis.get_best_config 获取最佳配置。 - richliaw

    0

    0

    我发现sci-kit optimize非常简单易用,可用于超参数的贝叶斯优化,并且它可以与任何tensorflow API(估算器、自定义估算器、核心、keras等)一起使用。

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


    0

    你可以使用变分推断(贝叶斯)作为优化空间的点云,超参数调整会更好。Tensorflow probability 是一种方法。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接