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é.
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.
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é.
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.
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.
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.
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.
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.
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
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)
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é.
"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.
Cliquez ici pour un code expérimental simple machine_leraning_experiments/random_seed_experiment.ipynb at master · si1242/machine_leraning_experiments
Recommended Posts