[PYTHON] [TensorFlow 2.x (tf.keras)] Zufälliger Startwert zur Verbesserung der Reproduzierbarkeit behoben

Ich werde Ihnen zeigen, wie Sie den zufälligen Startwert mit Tensorflow 2.x ( tf.keras) reparieren.

Ausführungsumgebung

Den für den Test verwendeten Code finden Sie hier (https://github.com/tokusumi/tf-keras-random-seed).

Hintergrund

Bei der Entwicklung des maschinellen Lernens gibt es Anforderungen wie "Ich möchte das Lernen reproduzierbar machen" und "Ich möchte den Anfangswert des Modells zum Testen festlegen". Da der Unterschied im Anfangswert des Gewichts das Lernergebnis beeinflusst, scheint die Festlegung des Anfangswertes zur Lösung dieser Probleme beizutragen.

Zufallszahlen werden verwendet, um den Anfangswert des Gewichts zu generieren. Zufallszahlen werden basierend auf Zufallszahlen-Seeds generiert. Standardmäßig verfügt TensorFlow über einen variablen zufälligen Startwert. Daher wird jedes Mal ein Modell mit einem anderen Anfangswert generiert. Daher möchten wir diesmal die Reproduzierbarkeit verbessern, indem wir den Zufallszahlen-Seed festlegen.

Zufälliger Startwert behoben

Zusätzlich zu TensorFlow korrigieren wir auch die Startwerte für die integrierten Funktionen von NumPy und Python. Zusammenfassend können die folgenden festen Zufallszahlenfunktionen implementiert werden.

import tensorflow as tf
import numpy as np
import random
import os

def set_seed(seed=200):
    tf.random.set_seed(seed)

    # optional
    # for numpy.random
    np.random.seed(seed)
    # for built-in random
    random.seed(seed)
    # for hash seed
    os.environ["PYTHONHASHSEED"] = str(seed)

Es wird wie folgt verwendet. Wenn jedoch der feste zufällige Startwert von TensorFlow ausreicht, ersetzen Sie "set_seed" durch "tf.random.set_seed".

set_seed(0)
toy_model = tf.keras.Sequential(
    tf.keras.layers.Dense(2, input_shape=(10,))
)

#Einige Verarbeitung...

#Reproduzieren Sie das Modell
set_seed(0)
reproduced_toy_model = tf.keras.Sequential(
    tf.keras.layers.Dense(2, input_shape=(10,))
)

reproduced_toy_model hat den gleichen Anfangswert (des Gewichts) wie das zuvor generierte Modell toy_model. Mit anderen Worten, es wurde reproduziert.

Wenn Sie "set_seed" nicht verwenden, haben "reproducible_toy_model" und "toy_model" völlig unterschiedliche Anfangswerte, was die Reproduzierbarkeit beeinträchtigt.

Zusätzlich zu tf.keras.Sequential können Sie auch die Functional API und SubClass verwenden.

Lassen Sie uns herausfinden, wie Sie den zufälligen Startwert (set_seed) ein wenig mehr korrigieren können.

Über tf.random.set_seed

Das Verhalten von tf.random.set_seed braucht ein wenig Aufmerksamkeit.

Versuchen Sie nach der Verwendung von "tf.random.set_seed" zunächst, eine Funktion zu verwenden, die Zufallszahlen ("tf.random.uniform": Zufallsstichprobenwerte aus einer gleichmäßigen Verteilung) mehrmals verwendet.

tf.random.set_seed(0)
tf.random.uniform([1])  # => [0.29197514]
tf.random.uniform([1])  # => [0.5554141]  (Verschiedene Werte!)
tf.random.uniform([1])  # => [0.1952138]  (Verschiedene Werte!!)
tf.random.uniform([1])  # => [0.17513537](Verschiedene Werte!!!)

Für jeden wurden unterschiedliche Werte ausgegeben. Es scheint, dass es keine Reproduzierbarkeit gibt, wie sie ist. Verwenden Sie jedoch erneut "tf.random.set_seed" wie folgt.

tf.random.set_seed(0)
tf.random.uniform([1])  # => [0.29197514](A)
tf.random.uniform([1])  # => [0.5554141]  (B)

tf.random.set_seed(0)
tf.random.uniform([1])  # => [0.29197514](Reproduktion von A.)
tf.random.uniform([1])  # => [0.5554141]  (Reproduktion von B.)

Auf diese Weise wird die Ausgabe beginnend an der Stelle reproduziert, an der "tf.random.set_seed" aufgerufen wird (obwohl "tf.random.uniform" eine Funktion ist, die einen Wert zufällig ausgibt).

Wenn Sie beispielsweise "tf.random.set_seed" aufrufen, bevor Sie eine Modellinstanz erstellen (mithilfe der sequentiellen, funktionalen API oder Unterklasse), hat das generierte Modell jedes Mal den gleichen Anfangswert.

Ergänzung

TensorFlow verfügt über Ebenen und Funktionen, mit denen Sie Seed als Argument übergeben können.

Ich denke jedoch, dass die explizite Angabe des Initialisierungsarguments, das an Layer oder Layer übergeben werden soll, keine sehr realistische Methode ist, wenn das Modell wächst.

Darüber hinaus gibt es einige, die nur dann gut funktionieren, wenn das diesmal eingeführte tf.random.set_seed zusammen verwendet wird.

Selbst wenn es nur wenige Stellen gibt, die Sie reparieren möchten, versuchen Sie es zuerst mit "tf.random.set_seed".

Zusammenfassung

In TensorFlow 2.x (tf.keras) können Sie "tf.random.set_seed" verwenden, um den zufälligen Startwert zu korrigieren.

Insbesondere wird es möglich sein, jedes Mal ein Modell mit demselben anfänglichen Gewichtswert zu erzeugen, so dass eine Verbesserung der Reproduzierbarkeit erwartet werden kann.

Ref

Recommended Posts

[TensorFlow 2.x (tf.keras)] Zufälliger Startwert zur Verbesserung der Reproduzierbarkeit behoben
Zufälliger Samen in TensorFlow und Numpy fixiert Etwas anders
Korrigieren Sie zufällige Samen mit TensorFlow
Stellen Sie die Reproduzierbarkeit mit tf.keras in Tensorflow 2.3 sicher