[PYTHON] Recherche de semences aléatoires dans l'apprentissage automatique

introduction

Quand je pensais à la génération de nombres aléatoires, j'étais inquiet et ne pouvais pas dormir, alors je l'ai résumé.

Premier de la conclusion

Dans le code d'apprentissage automatique, il est souvent reproductible en exécutant d'abord une fonction comme celle-ci.

seal_seed.py


def fix_seed(seed):
    # random
    random.seed(seed)
    # Numpy
    np.random.seed(seed)
    # Pytorch
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.deterministic = True
    # Tensorflow
    tf.random.set_seed(seed)

SEED = 42
fix_seed(SEED)

Est-ce vraiment bien? Je suis inquiet, mais c'est parfait pour réparer la graine. Cependant, il y a quelques points à noter sur la différence entre random_seed et RandomState et autour du GPU, donc je vais expliquer un peu.

Amorçage aléatoire des modules intégrés Python

random --- Generate Pseudo Random - Python 3.8.3 Documentation

random.seed(seed)

Par défaut, l'heure système actuelle est utilisée, mais certains systèmes d'exploitation ont des sources de nombres aléatoires spécifiques au système d'exploitation.

[Mersenne Twister](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3 Un générateur de nombres pseudo-aléatoires appelé% 83% BB% E3% 83% 84% E3% 82% A4% E3% 82% B9% E3% 82% BF) est utilisé.

Fixation des graines numpy

Notez que la génération de nombres aléatoires de Numpy utilise une valeur de départ différente chaque fois qu'elle est exécutée.

import numpy as np
np.random.seed(42)
#Première fois
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106  71 700  20 614 121]

#Deuxième fois
print(np.random.randint(0, 1000, 10))
# -> [466 214 330 458  87 372  99 871 663 130]

Si vous souhaitez le réparer, définissez la valeur de départ à chaque fois.

import numpy as np
np.random.seed(42)
#Première fois
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106  71 700  20 614 121]

#Deuxième fois
np.random.seed(42)
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106  71 700  20 614 121]

Même si l'environnement ou le système d'exploitation change, si la valeur de départ initialement fixée est la même, la sortie qui suit semble être la même.

Si vous souhaitez simplement conserver la reproductibilité de l'expérience, il semble qu'il n'y ait pas de problème si vous ne corrigez que la graine au début comme mentionné ci-dessus.

Bibliothèque utilisant Numpy

np.random.seed (42) est fondamentalement correct, mais faites attention si la graine est fixée même dans un module externe. Si vous l'écrasez comme np.random.seed (43) dans le module externe, la graine de l'appelant sera également écrasée.

En tenant compte de cela, des bibliothèques telles qu'Optuna et Pandas ont préparé une nouvelle classe de génération de nombres aléatoires avec numpy.random.RandomState.

np.random.seed(42)
'''
Certains traitements
'''
df.sample(frac=0.5, replace=True, random_state=43)

La graine des pandas est fixée en incluant random_state = 43 dans l'argument.

Cela n'écrasera pas la graine de numpy fixée au début par 43.

s = pd.Series(np.arange(100))
np.random.seed(42)
#Première manche à 42
print(s.sample(n=3)) # -> (83, 53, 70)
#La deuxième fois qu'une autre graine aléatoire est appliquée
print(s.sample(n=3)) # -> (79, 37, 65)

print(s.sample(n=3, random_state=42)) # -> (83, 53, 70)
print(s.sample(n=3, random_state=42)) # -> (83, 53, 70)

De plus, comme avec Numpy, notez que la graine n'est pas fixée après la deuxième fois. Enregistrez-le dans une variable ou définissez la valeur de random_state à chaque fois.

Si vous exécutez le notebook jupyter séquentiellement et que finalement le nombre d'appels est le même, vous pouvez conserver la reproductibilité en définissant np.random.seed (42) une fois au début.

Cependant, veuillez noter que la reproductibilité peut ne pas être légèrement maintenue lors de l'utilisation du GPU comme décrit plus loin.

Fixation des semences Scikit-learn

Vous pouvez spécifier random_state avec la fonction train_test_split de Scikit-learn, mais il n'y a aucun moyen de le corriger pour tout le Scikit-learn.

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=SEED)

How to set the global random_state in Scikit Learn | Bartosz Mikulski

Selon le lien ci-dessus, il est normal de corriger la graine aléatoire de Numpy, mais soyez prudent car le résultat changera à chaque fois que vous exécuterez le fractionnement à partir de la deuxième fois.

Fixation des graines Optuna

How can I obtain reproducible optimization results?

sampler = TPESampler(seed=SEED)  # Make the sampler behave in a deterministic way.
study = optuna.create_study(sampler=sampler)
study.optimize(objective)

Puisqu'une autre instance RandomState est préparée dans Optuna, il est possible de spécifier seed. RandomState est utilisé en interne.

Fixation des semences avec LightGBM

Lors de l'utilisation de la validation croisée

lgb.cv(lgbm_params,
       lgb_train,
       early_stopping_rounds=10,
       nfold=5,
       shuffle=True,
       seed=42,
       callbacks=callbacks,
       )

Peut être défini comme. Dans le manuel

Seed used to generate the folds (passed to numpy.random.seed)

Parce qu'il dit: "Oh! Est-ce que c'est la graine qui sera réécrite?", Mais si vous regardez le code source randidx = np.random.RandomState(seed).permutation(num_data) Cela semble aller parce que c'était le cas.

De plus, lors de l'utilisation de l'API Scikit-learn

clf = lgb.LGBMClassifier(random_state=42)

Peut être défini comme.

Le manuel indique que s'il n'est pas défini, la valeur de départ par défaut du C ++ sera utilisée.

If None, default seeds in C++ code are used.

Si vous commencez à vous demander quelle est la graine par défaut de C ++, il n'y a pas de fin, je vais donc m'arrêter ici.

Correction de la graine de PyTorch

Reproducibility — PyTorch 1.5.0 documentation

torch.manual_seed(seed)
#Pour cuDNN
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

Il existe une méthode appelée torch.cuda.manual_seed_all (seed), mais avec le dernier Pytorch, torch.manual_seed (seed) suffit.

En outre, le manuel dit:

Deterministic operation may have a negative single-run performance impact, depending on the composition of your model. Due to different underlying operations, which may be slower, the processing speed (e.g. the number of batches trained per second) may be lower than when the model functions nondeterministically. However, even though single-run speed may be slower, depending on your application determinism may save time by facilitating experimentation, debugging, and regression testing.

Notez que si le traitement GPU est déterministe, la vitesse de traitement peut ralentir.

Lorsque la reproductibilité n'a pas d'importance & Lorsque la structure du réseau (graphique de calcul) ne change pas torch.backends.cudnn.benchmark = True Peut accélérer

Correction de la graine de TensorFlow

Fixez essentiellement la graine comme indiqué ci-dessous

tf.random.set_seed(seed)

Cependant, vous pouvez également spécifier la valeur de départ au niveau de l'opération, comme indiqué ci-dessous.

tf.random.uniform([1], seed=1)

Cadre d'apprentissage profond et correction des semences GPU

Pour être honnête, je n'ai pas trouvé beaucoup d'informations sur le GPU de Tensorflow. La génération de GPU et de nombres aléatoires semble avoir des problèmes profonds. Le logiciel et le matériel seront complètement différents.

NVIDIA/tensorflow-determinism: Tracking, debugging, and patching non-determinism in TensorFlow

Tout comme Pytorch court également le risque de ralentir, il est préférable de supposer qu'il existe un compromis entre la reproductibilité et les performances de traitement du GPU.

Étant donné que les types de données tels que FP16 et INT8 peuvent être convertis à l'intérieur du GPU pour accélérer, les erreurs d'arrondi peuvent ne pas être négligeables. Il y aura probablement beaucoup de choses à penser pour maintenir la reproductibilité.

D'où vient Seed = 42?

"La réponse à la question ultime sur la vie, l'univers et toutes choses" a été publié par DeepThought, un superordinateur dans le roman The Hitchhiker's Guide to the Galaxy. % 94% 9F% E5% 91% BD% E3% 80% 81% E5% AE% 87% E5% AE% 99% E3% 80% 81% E3% 81% 9D% E3% 81% 97% E3% 81 % A6% E4% B8% 87% E7% 89% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6% E3% 81% AE% E7% A9% B6 % E6% A5% B5% E3% 81% AE% E7% 96% 91% E5% 95% 8F% E3% 81% AE% E7% AD% 94% E3% 81% 88) "est 42.

What is it about the random seed "4242"? | Kaggle

Dans Kaggle, le code ~~ copy ~~ est fréquemment réutilisé, donc la partie que quelqu'un a utilisée dans la blague, seed = 42, est devenue plus souvent utilisée.

De nos jours, nous assemblons parfois des prédictions de modèles entraînés en modifiant la valeur de départ.

Résumé

Cliquez ici pour un code expérimental simple machine_leraning_experiments/random_seed_experiment.ipynb at master · si1242/machine_leraning_experiments

Recommended Posts

Recherche de semences aléatoires dans l'apprentissage automatique
Apprentissage automatique dans Delemas (s'entraîner)
Apprentissage automatique: forêt supervisée - aléatoire
Automatisez les tâches de routine dans l'apprentissage automatique
Classification et régression dans l'apprentissage automatique
Apprentissage automatique
Python: prétraitement dans l'apprentissage automatique: présentation
[Apprentissage automatique] Essayez d'étudier une forêt aléatoire
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
Prétraitement dans l'apprentissage automatique 4 Conversion de données
[python] Techniques souvent utilisées dans l'apprentissage automatique
Python: prétraitement en machine learning: acquisition de données
[Python] Enregistrement des résultats d'apprentissage (modèles) dans l'apprentissage automatique
Python: prétraitement dans l'apprentissage automatique: conversion de données
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
[Memo] Apprentissage automatique
Classification de l'apprentissage automatique
Exemple d'apprentissage automatique
Astuces de fourniture de données utilisant deque dans l'apprentissage automatique
Divulgation complète des méthodes utilisées dans l'apprentissage automatique
Résumé des fonctions d'évaluation utilisées dans l'apprentissage automatique
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Résumé du didacticiel d'apprentissage automatique
Apprentissage automatique sur le surapprentissage
Apprentissage automatique ⑤ Résumé AdaBoost
Outil MALSS (application) qui prend en charge l'apprentissage automatique en Python
Régression logistique d'apprentissage automatique
Outil MALSS (basique) qui prend en charge l'apprentissage automatique en Python
Machine de vecteur de support d'apprentissage automatique
Marche aléatoire en Python
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Étudier l'apprentissage automatique ~ matplotlib ~
Régression linéaire d'apprentissage automatique
Mémo du cours d'apprentissage automatique
Bibliothèque d'apprentissage automatique dlib
Apprentissage automatique (TensorFlow) + Lotto 6
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)
Apprenez en quelque sorte le machine learning
Tentative d'inclusion du modèle d'apprentissage automatique dans le package python
Entropie croisée à revoir dans les devoirs de la semaine 2 de Coursera Machine Learning
Bibliothèque d'apprentissage automatique Shogun
Défi de lapin d'apprentissage automatique
Introduction à l'apprentissage automatique
Apprentissage automatique: k-voisins les plus proches
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
Qu'est-ce que l'apprentissage automatique?
Apprentissage automatique à l'aide de Jupyter Notebook dans l'environnement OCI Always Free (2019/12/17)
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Prétraitement dans l'apprentissage automatique 3 Données de valeur manquante / aberrante / de déséquilibre
Défis d'apprentissage automatique de Coursera en Python: ex7-2 (analyse principale)
Modèle d'apprentissage automatique prenant en compte la maintenabilité
Intégration du langage machine en langage C
L'apprentissage automatique appris avec Pokemon
Ensemble de données pour l'apprentissage automatique
Prétraitement japonais pour l'apprentissage automatique
Forêt aléatoire équilibrée en python
Une introduction à l'apprentissage automatique
Techniques liées à l'apprentissage automatique / à la classification
Bases de l'apprentissage automatique (mémoire)
Un débutant en apprentissage automatique a essayé la RBM
Apprentissage automatique avec Python! Préparation