web-dev-qa-db-fra.com

Réglage hyperparamètre pour Tensorflow

Je suis à la recherche d'un paquetage hyperparameter pour le code écrit directement dans Tensorflow (pas Keras ou Tflearn). Pourriez-vous faire une suggestion?

8
Mark

Généralement, vous n'avez pas besoin de coupler votre logique d'optimisation d'hyperparamètre avec le modèle optimisé (à moins que votre logique d'optimisation d'hyperparemètre ne soit spécifique au type de modèle que vous êtes en train de former, auquel cas vous auriez besoin de nous en dire un peu plus). Il existe plusieurs outils et packages disponibles pour la tâche. _ { Here est un bon article sur le sujet et here est un article de blog plus pratique, avec des exemples.

  • hyperopt implémente l'optimisation de la recherche aléatoire et de l'arbre des estimateurs parzen.
  • Scikit-Optimize implémente quelques autres, y compris l'optimisation bayésienne par processus gaussien.
  • SigOpt est un service pratique (payant, mais avec un niveau gratuit et une allocation supplémentaire pour les étudiants et les chercheurs) pour l'optimisation de l'hyperparamètre. Il est basé sur le MOE de Yelp, qui est open source (bien que la version publiée ne semble pas trop mettre à jour) et qui, en théorie, puisse être utilisé seul, bien que cela prendrait un peu plus de temps. effort.
  • Spearmint est également un package couramment référencé, également open source, mais non gratuit à des fins commerciales (bien que vous puissiez utiliser une ancienne version moins restrictive ). Cela a l'air bien, mais pas très actif, et la version disponible n'est pas compatible avec Python 3 (même si des demandes d'extraction ont été soumises pour résoudre ce problème).
  • BayesOpt semble être le standard en matière d'optimisation bayésienne, mais il s'agit principalement de C++ et l'interface Python n'a pas l'air très documentée.

Parmi ceux-ci, je n'ai utilisé que vraiment (c'est-à-dire avec un problème réel) hyperopt avec TensorFlow, et cela n'a pas demandé trop d'effort. L’API est un peu bizarre à certains moments et la documentation n’est pas très complète, mais elle fonctionne et semble être en cours de développement. D'autres algorithmes d'optimisation et adaptations (par exemple, spécifiquement pour les réseaux de neurones) sont à venir. Cependant, comme suggéré dans l'article de blog précédemment lié, Scikit-Optimize est probablement aussi bon, et SigOpt semble assez facile à utiliser s'il vous convient.

9
jdehesa

J'aimerais ajouter une bibliothèque supplémentaire à la liste de @ jdehesa, que j'ai appliquée dans mes recherches, en particulier avec tensorflow. C'est hyper-engine , Apache 2.0 sous licence.

Il implémente également l'optimisation bayésienne en processus gaussien et d'autres techniques, telles que prédiction de la courbe d'apprentissage , qui permettent de gagner beaucoup de temps.

4
Maxim

Vous pouvez essayer Ray Tune, une simple bibliothèque pour mettre à l’échelle la recherche hyperparamètre. Je l’utilise principalement pour la formation sur le modèle Tensorflow, mais il n’est pas lié au cadre - fonctionne parfaitement avec PyTorch, Keras, etc. Voici la page de la documentation - ray.readthedocs.io/en/latest/tune.html

Vous pouvez l'utiliser pour exécuter des versions distribuées d'algorithmes de pointe, tels que HyperBand ou Bayesian Optimization dans environ 10 lignes de code.

Comme exemple pour exécuter 4 évaluations parallèles à la fois:

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"])


tune.register_trainable("my_func", train_model)
ray.init(num_cpus=4)
tune.run_experiments({
    "my_experiment": { 
        "run": "my_func", 
        "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"))

Vous n'avez également pas besoin de modifier votre code si vous souhaitez exécuter ce script sur un cluster.

Avertissement: je travaille sur ce projet - laissez-moi savoir si vous avez des commentaires!

1
richliaw

Je ne sais pas si ce sont également les paramètres que vous souhaitez, mais vous avez mentionné les hyperparamètres TensorFlow, alors je suppose que je peux en suggérer certains. 

Essayez de cloner ce référentiel pour avoir les scripts nécessaires;

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

et dans le dossier principal, appelez l'invite de commande et exécutez cette ligne;

python -m scripts.retrain -h

pour obtenir la liste des arguments optionnels.

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

0
Infinite Loops

J'ai trouvé sci-kit optimiser très simple à utiliser pour l'optimisation bayésienne des hyperamètres, et cela fonctionne avec n'importe quel API tensorflow (estimateur, estimateur personnalisé, noyau, keras, etc.)

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

0
Jason