[PYTHON] Über das Testen bei der Implementierung von Modellen für maschinelles Lernen

Ein Beispiel mit einer Reihe von Frameworks, eine Geschichte über die Implementierung eines maschinellen Lernmodells. Allen gemeinsam ist, dass es keine Tests gibt. Sogar ein Modell für maschinelles Lernen ist Teil des Produktionscodes, sobald es in die Anwendung eingebettet ist. Möchten Sie eine nicht getestete Implementierung in Ihre Produktionsumgebung integrieren? Ich glaube nicht, dass das normalerweise der Fall ist.

kurenai.PNG (Ausgeliehen von [Studio Ghibli Red Pig](https://www.amazon.co.jp/dp/B00005R5J6))

Es ist leicht zu vergessen, dass Modelle für maschinelles Lernen zum "Zeitpunkt der Veröffentlichung" am genauesten sind. Dies liegt daran, dass es sich bei der Veröffentlichung um ein Modell handelt, das unter Verwendung der zu diesem Zeitpunkt verfügbaren vollständigen Daten trainiert wurde. Danach werden immer mehr unbekannte Daten eingehen. Daher ist es sehr wichtig, jederzeit die Genauigkeit und Gültigkeit des Modells überprüfen zu können. Dies ist der gleiche Grund, Ihren regulären Code zu testen. Dies bedeutet, dass es kein besonderes Modell ist, nur weil es sich um ein Modell für maschinelles Lernen handelt.

In diesem Artikel werde ich erklären, wie dieses Modell des maschinellen Lernens getestet wird. Natürlich ist dies die Methode, die ich derzeit praktiziere, und ich denke, dass sich das Know-how praktischerer Methoden mit fortschreitender Anwendung des maschinellen Lernens auf Anwendungen in Zukunft verbreiten wird.

Entwerfen eines Modells für maschinelles Lernen

Erstens muss es für die Durchführung des Tests gut ausgelegt sein. Es gibt ein Material, das diesen Punkt früher erklärt hat, deshalb möchte ich daraus zitieren.

Code-Design, um beim maschinellen Lernen nicht zu weinen

-21-320.jpg

Das Modell ist ein echtes Modell für maschinelles Lernen (erstellt mit scicit-learn, Chainer, TensorFlow), das häufig mit der gesamten Verarbeitung gefüllt ist. Es ist eine Geschichte, es wie folgt zu teilen.

Wenn ein Problem wie Ungenauigkeit aufgrund dessen auftritt, ist es ein Problem des Modells selbst, ist es schlecht zu trainieren, ist das Modell in Ordnung und es gibt ein Problem nur, wenn es von der Anwendungsseite aus verwendet wird? Ist in der Lage zu sein, zu isolieren und zu überprüfen und zu testen, ob ein Fehler in der Datenvorverarbeitung vorliegt.

Die Ausgabe des maschinellen Lernens ist jedoch im Vergleich zu einem normalen Programm, in dem die Eingabe / Ausgabe klar definiert werden kann, unbegrenzt. DataProcessor und Resource sind fast identisch mit normalen Programmen, daher ist das Testen einfach, dies ist jedoch ein Problem für Trainer und Model API, einschließlich Model selbst.

Auf diesen Punkt habe ich im obigen Material nicht näher eingegangen, aber ich möchte mir diese Tests von hier aus ansehen.

Testen des maschinellen Lernmodells

In einem Modell für maschinelles Lernen müssen hauptsächlich vier Dinge getestet werden:

Ich möchte diese Tests Schritt für Schritt angehen. In der folgenden Codeeinführung zitiere ich aus dem folgenden kürzlich entwickelten Repository.

icoxfog417/tensorflow_qrnn

Dies basiert auf TensorFlow, aber ich denke, die Idee kann mit anderen Bibliotheken verwendet werden (ich habe das gleiche Design und die gleichen Tests durchgeführt, als ich zuvor Chainer verwendet habe). Wenn Sie dagegen TensorFlow verwenden, werden Sie während des Tests davon abhängig sein. Daher werde ich auch erwähnen, wie Sie mit diesem Problem umgehen können.

Betriebstest

Im Betriebstest prüfen wir, ob das Modell von Eingabe zu Ausgabe funktioniert, ohne einen Fehler auszulösen. Im Fall eines neuronalen Netzwerkmodells kann es auch als Vorwärtsprüfung bezeichnet werden.

Hier ist der Code, den ich tatsächlich verwendet habe.

tensorflow_qrnn/test_tf_qrnn_forward.py

Die Eingabe kann zufällig sein. Stellen Sie daher sicher, dass sie an die Ausgabe weitergeleitet wird. Der Betriebstest wird während der Entwicklung häufig verwendet, um "so leicht und schnell wie möglich zu überprüfen", ob er vorerst bei der Entwicklung oder Neuordnung eines Modells funktioniert oder nicht. In diesem Sinne steht die Position kurz vor der Kompilierung.

Wenn Sie in TensorFlow unittest ausführen, teilen mehrere Tests Informationen zum globalen Diagramm, und es tritt ein unbeabsichtigter Fehler auf. Beachten Sie daher, dass Sie das Diagramm für jeden Testfall trennen müssen.

class TestQRNNForward(unittest.TestCase):

    def test_qrnn_linear_forward(self):
        batch_size = 100
        sentence_length = 5
        word_size = 10
        size = 5
        data = self.create_test_data(batch_size, sentence_length, word_size)

        with tf.Graph().as_default() as q_linear:
            qrnn = QRNN(in_size=word_size, size=size, conv_size=1)
            ...

Insbesondere wird dieses Phänomen chaotisch, wenn der variable Bereich nicht ausgeschaltet wird. Grundsätzlich ist es bei Verwendung von TensorFlow wichtig, den Variablenbereich beim Deklarieren von Variablen mit variable_scope fest zu kürzen (Duplikate können nicht mit name_scope überprüft werden).

class QRNNLinear():

    def __init__(self, in_size, size):
        self.in_size = in_size
        self.size = size
        self._weight_size = self.size * 3  # z, f, o
        with tf.variable_scope("QRNN/Variable/Linear"):
            initializer = tf.random_normal_initializer()
            self.W = tf.get_variable("W", [self.in_size, self._weight_size], initializer=initializer)
            self.b = tf.get_variable("b", [self._weight_size], initializer=initializer)

Weitere Informationen zum Gültigkeitsbereich finden Sie in diesem Artikel. Ich werde es zusammenfassen). Beachten Sie in jedem Fall Folgendes, wenn Sie TensorFlow verwenden.

scope.PNG (Ausgeliehen von [Studio Ghibli Red Pig](https://www.amazon.co.jp/dp/B00005R5J6))

Überprüfen Sie den Test

Sobald Sie ein Modell haben, das den Betriebstest besteht, ist es etwas voreilig, sofort mit den Produktionsdaten zu lernen. Das Volumen der Produktionsdaten wird beträchtlich sein und es wird einige Zeit dauern, bis es gelernt ist. Wenn Sie nicht sehr sicher sind, sollten Sie zuerst überprüfen, ob sich Ihr Modell wie beabsichtigt verhält, und eine bessere Genauigkeit als die Basislinie aufzeichnen oder mit kleineren Daten prüfen. Dies ist ein Verifikationstest.

Umgekehrt hilft das Erstellen eines Datensatzes für Validierungstests und eines Basismodells dafür bei der Verbesserung des maschinellen Lernmodells. Ein Validierungstest-Datensatz ist einfach zu handhaben und schließt die Schulung in relativ kurzer Zeit ab. Und das Basismodell ist ein Grundmodell, das "wenn es dies nicht überschreitet, ist es NG".

Ohne dies besteht die Tendenz, in die Täuschung zu geraten, dass "es besser sein könnte, die Daten ein wenig mehr zu erhöhen" und "die Genauigkeit verbessert werden kann, wenn etwas mehr Lernzeit benötigt wird", und es ist tendenziell schwierig, den wesentlichen Algorithmus zu verbessern. Es gibt.

image.png

Es ist eine ziemliche Falle zu sagen: "Wir können sofort dieselben Daten wie die tatsächlichen verarbeiten", und die Tendenz kann stark verzerrt sein, da die tatsächlichen Daten die tatsächlichen Daten sind (z. B. wird 90 normalerweise für die diagnostische Bildgebung verwendet. Wenn% normal ist, beträgt die Genauigkeit 90%, selbst bei einem Modell, das einfach "keine Abnormalität" vorhersagt. Beim maschinellen Lernen ist es eine grundlegende Angelegenheit, dass eine Verzerrung des Urteils durch eine Verzerrung der Daten verursacht wird, aber das Sicherheitsgefühl, dass "wir Produktionsdaten verwenden", lenkt uns tendenziell von einem solchen Punkt ab.

Um die oben genannten Probleme zu lösen, wird empfohlen, Verifizierungstestdaten für "benutzerfreundliche Größe" und "Etikett ausgewogen" und deren Umgebung vorzubereiten.

In der folgenden Implementierung testen wir mit einem handgeschriebenen Zeichendatensatz namens digit, der mit scicit-learn geliefert wird. scikit-learn wird im Voraus mit einem Datensatz wie handgeschriebenen Zeichen geliefert. Wenn Sie ihn also verwenden können, können Sie sich die Mühe ersparen, die Daten vorzubereiten.

tensorflow_qrnn/test_tf_qrnn_work.py

Wenn Sie über Produktionsdaten verfügen, empfiehlt es sich, einen ausgewogenen Stichproben-Datensatz unter Berücksichtigung des Zieletiketts zu erstellen, anstatt ihn einfach nach Zeitraum zu extrahieren. Dies reduziert den Verlust und prüft, ob die Genauigkeit korrekt ist.

Der Vergleich mit der Basislinie ist auch eine wichtige Rolle bei Validierungstests. Es wird oft gesagt, dass SVM definitiv besser war als das hart erstellte Modell des neuronalen Netzwerks (* Passen Sie das für die Basislinie verwendete Modell richtig an. Wichtig ist, dass Sie das neuronale Netz nicht verwenden, sondern für Ihren Zweck. Weil Sie nach einem geeigneten Modell suchen). Glücklicherweise wird scikit-learn mit einer Vielzahl von Modellen geliefert, was es perfekt für diese Überprüfung macht. Ich denke, Sie können mit dem Basismodell vergleichen und überprüfen, ohne zu viel Code zu schreiben.

Durch die Einrichtung dieser Barriere, die als Verifikationstest bezeichnet wird, können Sie Zeit und Geld (GPU-Gebühr) sparen, die für ein schlechtes Modell aufgewendet werden.

seido.PNG (Ausgeliehen von [Studio Ghibli Red Pig](https://www.amazon.co.jp/dp/B00005R5J6))

Es ist jedoch auch wahr, dass es einige Modelle gibt, die nicht genau sein können, wenn sie nicht endlos trainiert werden. In solchen Fällen können Sie den Verlust- / Genauigkeitswert (geschwindigkeitsabhängig) für die Lernzeit aufzeichnen und überprüfen, um ihn zu ersetzen.

Integrationstest

Der Integrationstest prüft, ob der Aufruf von der Anwendung erfolgreich ist. Bei der Verwendung eines maschinellen Lernmodells sollte nicht nur die Genauigkeit getestet werden, sondern auch die Vorverarbeitung usw.

Daher sollte der Datenprozessor vor dem Kooperationstest unabhängig getestet werden. Testen Sie anschließend, ob die Modell-API bei Verwendung in der Anwendung ordnungsgemäß funktioniert. In Bezug auf die Genauigkeit empfiehlt es sich, einen Datensatz mit einer Größe vorzubereiten, mit der die Modell-API leicht überprüft und getestet werden kann, dh die Genauigkeit beim Ausführen in einer tatsächlichen Anwendung, wie im obigen Bewertungstest. Dies liegt daran, dass während des Kooperationstests häufig die folgenden Dinge passieren.

Aus diesem Grund ist es ratsam, die Genauigkeit zu messen und einfach zu funktionieren.

Der zum Testen der Genauigkeit dieser Modell-API verwendete Datensatz ist auch nützlich, um die Leistung von Modellen für maschinelles Lernen ständig zu überwachen. Auf diese Weise können Sie den Zeitpunkt des erneuten Lernens / Wiederaufbaus beurteilen. In diesem Sinne wird empfohlen, einen kollaborativen Test getrennt vom Bewertungstest vorzubereiten (die Daten sind etwas aktueller als der Bewertungstest).

Bewertungstest

Wir werden zum Bewertungstest übergehen, wenn der Verifikationstest die Basislinie überschreitet und der Kooperationstest bestätigt, dass er aus der Anwendung aufgerufen werden kann.

Hier werden sogenannte A / B-Tests durchgeführt. Falls erforderlich, werden wir bei der Implementierung fest mit der Datenmenge trainieren, die den Verifikationstest überschreitet. Überprüfen Sie dann, ob Sie einen Vorteil gegenüber vorhandenen Modellen haben.

Die in der Phase des Bewertungstests überprüften Indikatoren und die im Überprüfungstest überprüften Indikatoren sind sehr unterschiedlich. In der Phase des Verifikationstests werden Indikatoren überprüft, die die Leistung des Modells darstellen, z. B. die Genauigkeit, und im Bewertungstest wird der KPI (Key Performance Indicator) im Dienst wie die "Benutzereingriffsrate" überprüft.

Letztendlich ist es nicht wichtig, ein hochgenaues Modell zu erstellen, sondern ein Modell zu erstellen, das zum Service beiträgt, dh dem Benutzer einen Mehrwert bietet. Der Bewertungstest überprüft diesen Punkt.

Das Obige ist die Testmethode zum Implementieren des maschinellen Lernmodells. Tatsächlich mache ich es durch Versuch und Irrtum. Wenn Sie also solche Meinungen haben, würde ich gerne von Ihnen hören.

last.PNG

Recommended Posts

Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Algorithmus für maschinelles Lernen (Implementierung einer Klassifizierung mit mehreren Klassen)
[Python] Speichern von Lernergebnissen (Modellen) beim maschinellen Lernen
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Vollständige Offenlegung der beim maschinellen Lernen verwendeten Methoden
Zusammenfassung der beim maschinellen Lernen verwendeten Bewertungsfunktionen
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Informationen zur Datenvorverarbeitung von Systemen, die maschinelles Lernen verwenden
Eindrücke vom Udacity Machine Learning Engineer Nano-Abschluss
Über die Ineffizienz der Datenübertragung im luigi on-memory
Prognostizieren Sie das Geschlecht von Twitter-Nutzern durch maschinelles Lernen
Über die übersichtliche Anordnung in der Importreihenfolge von Flake8
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras
[Maschinelles Lernen] "Erkennung von Abnormalitäten und Erkennung von Änderungen" Zeichnen wir die Abbildung von Kapitel 1 in Python.
Maschinelles Lernen in Delemas (Praxis)
Grundlagen des maschinellen Lernens (Denkmal)
Über maschinelles Lernen gemischte Matrix
Der erste Schritt für diejenigen, die Amateure der Statistik sind, aber Modelle für maschinelles Lernen in Python implementieren möchten
Wird in EDA für maschinelles Lernen verwendet
Bedeutung von Datensätzen für maschinelles Lernen
Über die Komponenten von Luigi
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Tiefes Lernen der Verstärkung 2 Implementierung des Lernens der Verstärkung
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
So erhöhen Sie die Anzahl der Datensatzbilder für maschinelles Lernen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe die Methode des maschinellen Lernens und ihre Implementierungssprache anhand der Tag-Informationen von Qiita betrachtet
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Echtzeitanzeige des serverseitigen Verarbeitungsfortschritts im Browser (Implementierung des Fortschrittsbalkens)
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Die Geschichte der Teilnahme an AtCoder
Qiskit: Implementierung einer Quantenbolzenmaschine
Coursera-Herausforderungen beim maschinellen Lernen in Python: ex5 (Anpassung der Regularisierungsparameter)
Implementierung der Login-Funktion in Django
Automatisieren Sie Routineaufgaben beim maschinellen Lernen
Führen Sie eine morphologische Analyse in der von GCE gestarteten maschinellen Lernumgebung durch
Über den Rückgabewert von pthread_mutex_init ()
Implementierung eines Lebensspiels in Python
Maschinelles Lernen ③ Zusammenfassung des Entscheidungsbaums
Klassifikation und Regression beim maschinellen Lernen
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Die Geschichte des "Lochs" in der Akte