Als ich über die Erzeugung von Zufallszahlen nachdachte, war ich besorgt und konnte nicht schlafen, also fasste ich es zusammen.
Im maschinellen Lerncode ist er häufig reproduzierbar, indem zuerst eine Funktion wie diese ausgeführt wird.
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)
Ist das wirklich okay? Ich mache mir Sorgen, aber es ist in Ordnung, den Samen zu reparieren. Es gibt jedoch einige Punkte zu beachten, die den Unterschied zwischen random_seed und RandomState und der GPU betreffen, daher werde ich ein wenig erklären.
random --- Pseudo Random generieren - Python 3.8.3-Dokumentation
random.seed(seed)
Standardmäßig wird die aktuelle Systemzeit verwendet, einige Betriebssysteme verfügen jedoch über betriebssystemspezifische Zufallszahlenquellen.
[Mersenne Twister](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3 Ein Pseudozufallszahlengenerator namens% 83% BB% E3% 83% 84% E3% 82% A4% E3% 82% B9% E3% 82% BF) wird verwendet.
Beachten Sie, dass die Zufallszahlengenerierung von Numpy bei jeder Ausführung einen anderen Startwert verwendet.
import numpy as np
np.random.seed(42)
#Erstes Mal
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106 71 700 20 614 121]
#Zweites Mal
print(np.random.randint(0, 1000, 10))
# -> [466 214 330 458 87 372 99 871 663 130]
Wenn Sie das Problem beheben möchten, legen Sie den Startwert jedes Mal fest.
import numpy as np
np.random.seed(42)
#Erstes Mal
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106 71 700 20 614 121]
#Zweites Mal
np.random.seed(42)
print(np.random.randint(0, 1000, 10))
# -> [102 435 860 270 106 71 700 20 614 121]
Selbst wenn sich die Umgebung oder das Betriebssystem ändert und der ursprünglich festgelegte Startwert identisch ist, scheint die Ausgabe danach dieselbe zu sein.
Wenn Sie nur die Reproduzierbarkeit des Experiments beibehalten möchten, scheint es kein Problem zu geben, wenn Sie wie oben erwähnt nur den Samen am Anfang reparieren.
Grundsätzlich ist es mit np.random.seed (42)
in Ordnung, aber seien Sie vorsichtig, wenn der Startwert auch mit einem externen Modul behoben ist. Wenn Sie es wie "np.random.seed (43)" im externen Modul überschreiben, wird auch der Startwert des Aufrufers überschrieben.
In Anbetracht dessen haben Bibliotheken wie Optuna und Pandas eine neue Zufallszahlengenerierungsklasse mit numpy.random.RandomState
vorbereitet.
np.random.seed(42)
'''
Einige Verarbeitung
'''
df.sample(frac=0.5, replace=True, random_state=43)
Der Keim von Pandas wird festgelegt, indem "random_state = 43" in das Argument aufgenommen wird.
Dadurch wird der zu Beginn mit 43 festgelegte Startwert nicht überschrieben.
s = pd.Series(np.arange(100))
np.random.seed(42)
#Erster Lauf bei 42
print(s.sample(n=3)) # -> (83, 53, 70)
#Beim zweiten Mal wird ein weiterer zufälliger Startwert angewendet
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)
Beachten Sie außerdem, wie bei Numpy, dass der Samen nach dem zweiten Mal nicht mehr fixiert ist. Speichern Sie es in einer Variablen oder legen Sie jedes Mal den Wert von random_state fest.
Wenn das Jupyter-Notebook nacheinander ausgeführt wird und die Anzahl der Anrufe schließlich gleich ist, kann die Reproduzierbarkeit aufrechterhalten werden, indem zuerst einmal "np.random.seed (42)" eingestellt wird.
Beachten Sie jedoch, dass die Reproduzierbarkeit bei Verwendung einer GPU, wie später beschrieben, möglicherweise nicht geringfügig erhalten bleibt.
Sie können random_state
mit der Funktion train_test_split von Scikit-learn angeben, es gibt jedoch keine Möglichkeit, dies für das gesamte Scikit-learn zu beheben.
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
Gemäß dem obigen Link ist es in Ordnung, den zufälligen Startwert von Numpy zu korrigieren, aber seien Sie vorsichtig, da sich das Ergebnis jedes Mal ändert, wenn Sie Split ab dem zweiten Mal ausführen.
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)
Da in Optuna eine andere RandomState-Instanz vorbereitet wird, kann Startwert angegeben werden. RandomState wird intern verwendet.
Bei Verwendung der Kreuzvalidierung
lgb.cv(lgbm_params,
lgb_train,
early_stopping_rounds=10,
nfold=5,
shuffle=True,
seed=42,
callbacks=callbacks,
)
Kann eingestellt werden als. Im Handbuch
Seed used to generate the folds (passed to numpy.random.seed)
Weil es heißt: "Oh! Wird der Samen neu geschrieben?", Aber wenn Sie sich den Quellcode ansehen
randidx = np.random.RandomState(seed).permutation(num_data)
Es scheint in Ordnung zu sein, weil es war.
Auch bei Verwendung der Scikit-Learn-API
clf = lgb.LGBMClassifier(random_state=42)
Kann eingestellt werden als.
Das Handbuch besagt, dass der C ++ - Standard-Seed verwendet wird, wenn er nicht festgelegt ist.
If None, default seeds in C++ code are used.
Wenn Sie sich fragen, was der Standard-Startwert von C ++ ist, gibt es kein Ende, also werde ich hier aufhören.
Reproducibility — PyTorch 1.5.0 documentation
torch.manual_seed(seed)
#Für cuDNN
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
Es gibt eine Methode namens "torch.cuda.manual_seed_all (seed)", aber mit der neuesten Pytorch reicht "torch.manual_seed (seed)" aus.
Das Handbuch sagt auch:
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.
Beachten Sie, dass sich die Verarbeitungsgeschwindigkeit verlangsamen kann, wenn Sie die GPU-Verarbeitung deterministisch machen.
Wenn die Reproduzierbarkeit keine Rolle spielt & Wenn sich die Netzwerkstruktur (Berechnungsdiagramm) nicht ändert
torch.backends.cudnn.benchmark = True
Kann beschleunigen
Befestigen Sie den Samen grundsätzlich wie unten gezeigt
tf.random.set_seed(seed)
Sie können den Startwert jedoch auch auf Betriebsebene angeben, wie unten gezeigt.
tf.random.uniform([1], seed=1)
Um ehrlich zu sein, konnte ich nicht viele Informationen über die GPU von Tensorflow finden. Die Generierung von GPUs und Zufallszahlen scheint einige tiefgreifende Probleme zu haben. Software und Hardware werden völlig unterschiedlich sein.
NVIDIA/tensorflow-determinism: Tracking, debugging, and patching non-determinism in TensorFlow
Genau wie bei Pytorch auch die Gefahr einer Verlangsamung besteht, sollten Sie berücksichtigen, dass ein Kompromiss zwischen Reproduzierbarkeit und GPU-Verarbeitungsleistung besteht.
Da Datentypen wie FP16 und INT8 zur Beschleunigung in die GPU konvertiert werden können, sind Rundungsfehler möglicherweise nicht vernachlässigbar. Es gibt wahrscheinlich viele Dinge zu beachten, um die Reproduzierbarkeit aufrechtzuerhalten.
"Die Antwort auf die ultimative Frage über das Leben, das Universum und alle Dinge" wurde vom Supercomputer DeepThought in dem Roman The Hitchhiker's Guide to the Galaxy veröffentlicht. % 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) "ist 42.
What is it about the random seed "4242"? | Kaggle
In Kaggle wird der Code ~~ copy ~~ häufig wiederverwendet, sodass der Teil, den jemand im Witz verwendet hat, seed = 42, häufiger verwendet wird.
Heutzutage stellen wir manchmal Vorhersagen von Modellen zusammen, die durch Ändern des Startwerts trainiert wurden.
Klicken Sie hier für einen einfachen experimentellen Code machine_leraning_experiments/random_seed_experiment.ipynb at master · si1242/machine_leraning_experiments
Recommended Posts