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.
(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.
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
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.
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.
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.
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.
(Ausgeliehen von [Studio Ghibli Red Pig](https://www.amazon.co.jp/dp/B00005R5J6))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.
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.
(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.
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).
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.
Recommended Posts