[PYTHON] Random Seed Research im maschinellen Lernen

Einführung

Als ich über die Erzeugung von Zufallszahlen nachdachte, war ich besorgt und konnte nicht schlafen, also fasste ich es zusammen.

Zunächst aus der Schlussfolgerung

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.

Zufälliges Seeding von in Python integrierten Modulen

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.

Numpy Samenfixierung

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.

Bibliothek mit Numpy

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.

Scikit-lernen Samenfixierung

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.

Optuna Samenfixierung

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.

Samenfixierung mit LightGBM

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.

Fixed Seed von PyTorch

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

Fixed Seed von TensorFlow

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)

Deep Learning Framework und GPU Seed Fixing

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.

Woher kam Seed = 42?

"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.

Zusammenfassung

Klicken Sie hier für einen einfachen experimentellen Code machine_leraning_experiments/random_seed_experiment.ipynb at master · si1242/machine_leraning_experiments

Recommended Posts

Random Seed Research im maschinellen Lernen
Maschinelles Lernen in Delemas (Praxis)
Maschinelles Lernen: Überwacht - Zufälliger Wald
Automatisieren Sie Routineaufgaben beim maschinellen Lernen
Klassifikation und Regression beim maschinellen Lernen
Maschinelles Lernen
Python: Vorverarbeitung beim maschinellen Lernen: Übersicht
[Maschinelles Lernen] Versuchen Sie, zufällige Wälder zu studieren
Vorverarbeitung beim maschinellen Lernen 2 Datenerfassung
Vorverarbeitung beim maschinellen Lernen 4 Datenkonvertierung
[Python] Techniken, die häufig beim maschinellen Lernen verwendet werden
Python: Vorverarbeitung beim maschinellen Lernen: Datenerfassung
[Python] Speichern von Lernergebnissen (Modellen) beim maschinellen Lernen
Python: Vorverarbeitung beim maschinellen Lernen: Datenkonvertierung
Vorverarbeitung beim maschinellen Lernen 1 Datenanalyseprozess
[Memo] Maschinelles Lernen
Klassifikation des maschinellen Lernens
Beispiel für maschinelles Lernen
Datenversorgungstricks mit deque beim maschinellen Lernen
Vollständige Offenlegung der beim maschinellen Lernen verwendeten Methoden
Zusammenfassung der beim maschinellen Lernen verwendeten Bewertungsfunktionen
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Zusammenfassung des Lernprogramms für maschinelles Lernen
Maschinelles Lernen Über Overlearning
Maschinelles Lernen ⑤ AdaBoost-Zusammenfassung
Tool MALSS (Anwendung), das maschinelles Lernen in Python unterstützt
Logistische Regression beim maschinellen Lernen
Tool MALSS (Basic), das maschinelles Lernen in Python unterstützt
Maschinelles Lernen unterstützt Vektormaschine
Zufälliger Spaziergang in Python
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Maschinelles Lernen studieren ~ matplotlib ~
Lineare Regression des maschinellen Lernens
Memo zum Kurs für maschinelles Lernen
Bibliothek für maschinelles Lernen dlib
Maschinelles Lernen (TensorFlow) + Lotto 6
Coursera Machine Learning Challenge in Python: ex1 (lineare Regression)
Lerne irgendwie maschinelles Lernen
Versuchen Sie, das Modell des maschinellen Lernens in das Python-Paket aufzunehmen
Cross-Entropie zur Überprüfung in Coursera Machine Learning Woche 2 Aufgaben
Bibliothek für maschinelles Lernen Shogun
Maschinelles Lernen Kaninchen Herausforderung
Einführung in das maschinelle Lernen
Maschinelles Lernen: k-Nächste Nachbarn
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Was ist maschinelles Lernen?
Maschinelles Lernen mit Jupyter Notebook in einer OCI Always Free-Umgebung (17.12.2019)
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
Vorverarbeitung beim maschinellen Lernen 3 Fehlende Wert- / Ausreißer- / Ungleichgewichtsdaten
Coursera-Herausforderungen für maschinelles Lernen in Python: ex7-2 (Primäranalyse)
Modell des maschinellen Lernens unter Berücksichtigung der Wartbarkeit
Einbettung der Maschinensprache in die Sprache C.
Maschinelles Lernen mit Pokemon gelernt
Datensatz für maschinelles Lernen
Japanische Vorverarbeitung für maschinelles Lernen
Balanced Random Forest in Python
Eine Einführung in das maschinelle Lernen
Techniken im Zusammenhang mit maschinellem Lernen / Klassifizierung
Grundlagen des maschinellen Lernens (Denkmal)
Anfänger des maschinellen Lernens versuchten RBM
Maschinelles Lernen mit Python! Vorbereitung