Basierend auf dem Code von Andrej Karpathy https://github.com/karpathy/char-rnn und Samy Bengios Papier http://arxiv.org/abs/1506.03099
Machen Sie den Code können sowohl englische als auch chinesische Zeichen verarbeiten. Dies ist meine erste Berührung von Lua, daher erscheint der String -Prozess albern, aber er funktioniert gut.
Ich füge auch eine Option mit dem Namen "min_freq" hinzu, da die Vokabellengröße in Chinesisch sehr groß ist, was den Parameter num stark erhöht. Wenn Sie also einen seltenen Charakter löschen können, kann dies helfen.
Samy Bengios Papier geplante Abtastung für die Sequenzvorhersage mit wiederkehrenden neuronalen Netzwerken in NIPS15 schlägt eine einfache, aber Leistungsmethode vor, um RNN zu imploven.
In meinem Experiment finde ich, dass es sehr hilft, Überanpassung zu vermeiden und den Testverlust tiefer zu machen. Ich benutze nur einen linearen Zerfall.
Verwenden Sie -use_ss , um die geplante Abtastung einzuschalten oder auszuschalten. Standard ist eingeschaltet. -start_ss ist der Start von realen Daten. Ich schlage vor, 1 zu verwenden, da unser Modell Daten zu Beginn ohne Rauschen lernen sollte. -min_ss ist auch sehr wichtig, da zu viel Lärm die Leistung beeinträchtigt. Schließlich ist -decay_ss die lineare Zerfallsrate.
Ich füge ein Skript hinzu, um eine von der GPU trainierte Modelldatei zum CPU -Modell zu konvertieren. Sie können es wie folgt versuchen:
$ th convert.lua gpu_model cpu_modelEine Web -Demo wird hinzugefügt, damit andere das Modell leicht testen können, basierend auf Sub/Pub of Redis. Ich benutze Redis, weil ich keine gute RPC- oder Webserver -Arbeiten finden kann, die gut in Taschenlampe integriert sind. Sie sollten feststellen, dass die Demo von Ajax asynchronisiert wird. Um die Demo auf Ubuntu einzurichten: Installieren Sie Redis und starten Sie sie
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &Installieren Sie dann den Kolben und das Redis -Plugin:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-luaStellen Sie Ihre Modelldatei in Online_Model ein, benennen Sie sie in "model.t7", starten Sie das Backend and Fontend -Skript:
$ nohup th web_backend.lua &
$ nohup python web_server.py & Bitte folgen Sie diesem, um Ihr Experiment einzurichten.
Dieser Code implementiert ein rezidivierendes neuronales Netzwerk (RNN, LSTM und GRU) für das Training/Stichproben aus Sprachmodellen auf Charakterebene. Das Modell lernt, die Wahrscheinlichkeit des nächsten Zeichens in einer Sequenz vorherzusagen. Mit anderen Worten, die Eingabe ist eine einzelne Textdatei und das Modell lernt, Text wie sie zu generieren.
Der Kontext dieser Codebasis wird in meinem Blog -Beitrag ausführlich beschrieben. Die Projektseite, die einige Hinweise auf einige Datensätze hat.
Dieser Code basierte ursprünglich auf der Oxford University Machine Learning Class Practical 6, die wiederum auf dem Lernen basiert, Code von Wojciech Zaremba auszuführen. In Zusammenarbeit mit meinem Labor Justin Johnson wurden auch Brocken davon entwickelt.
Dieser Code ist in Lua geschrieben und benötigt Taschenlampe. Zusätzlich müssen Sie die nngraph und optim -Pakete mit Luarocks installieren, die Sie nach der Installation von Taschenlampe durchführen können:
$ luarocks install nngraph
$ luarocks install optim Wenn Sie CUDA GPU Computing verwenden möchten, müssen Sie zunächst das CUDA -Toolkit installieren, dann die cutorch und cunn -Pakete:
$ luarocks install cutorch
$ luarocks install cunn Wenn Sie OpenCL GPU Computing verwenden möchten, müssen Sie zunächst die cltorch und clnn -Pakete installieren und dann während des Trainings die Option -opencl 1 verwenden:
$ luarocks install cltorch
$ luarocks install clnn Alle Eingabedaten werden im data/ Verzeichnis gespeichert. Sie werden feststellen, dass ein Beispiel -Datensatz im Repo (in data/tinyshakespeare ) enthalten ist, das aus einer Teilmenge von Arbeiten von Shakespeare besteht. Ich stelle noch ein paar Datensätze auf der Projektseite an.
Ihre eigenen Daten : Wenn Sie Ihre eigenen Daten verwenden möchten, erstellen Sie eine einzelne input.txt data/ Zum Beispiel data/some_folder/input.txt . Wenn Sie das Trainingsskript zum ersten Mal ausführen, wird zwei weitere Convenience -Dateien in data/some_folder geschrieben.
Beachten Sie, dass der RNN, wenn Ihre Daten zu klein sind (1 MB bereits als sehr klein angesehen werden) nicht sehr effektiv lernt. Denken Sie daran, dass es alles komplett von Grund auf lernen muss.
Umgekehrt, wenn Ihre Daten groß sind (mehr als etwa 2 MB), fühlen Sie sich zuversichtlich, rnn_size zu erhöhen und ein größeres Modell zu trainieren (siehe Details des Trainings unten). Es wird deutlich besser funktionieren. Zum Beispiel können Sie mit 6 MB problemlos auf rnn_size 300 oder sogar mehr fahren. Das größte, das auf meine GPU passt und mit diesem Code trainiert habe, ist rnn_size 700 mit num_layers 3 (2 ist Standard).
Geben Sie das Modell mit train.lua mit, zum Beispiel:
$ th train.lua -data_dir data/some_folder -gpuid -1
Das Flag -data_dir ist am wichtigsten, da es den zu verwendenden Datensatz angibt. Beachten Sie, dass wir in diesem Beispiel auch gpuid auf -1 einstellen, was dem Code mithilfe von CPU trainieren kann. Andernfalls ist es standardmäßig mit GPU 0. Es gibt viele andere Flags für verschiedene Optionen. Wenden Sie sich an $ th train.lua -help für umfassende Einstellungen. Hier ist ein weiteres Beispiel:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
Während das Modell trainiert, schreibt es regelmäßig Checkpoint -Dateien in den cv -Ordner. Die Frequenz, mit der diese Kontrollpunkte geschrieben werden, wird mit der Anzahl der Iterationen gesteuert, wie mit der Option eval_val_every angegeben (z. B. wenn dies 1 ist, wird bei jeder Iteration ein Kontrollpunkt geschrieben). Der Dateiname dieser Kontrollpunkte enthält eine sehr wichtige Zahl: der Verlust . Ein Checkpoint mit dem Dateinamen lm_lstm_epoch0.95_2.0681.t7 zeigt beispielsweise, dass sich das Modell zu diesem Zeitpunkt auf EPOCH 0.95 befand (dh es hat fast einen vollständigen Pass über die Trainingsdaten durchgeführt) und der Verlust der Validierungsdaten 2,0681. Diese Zahl ist sehr wichtig, da umso besser der Kontrollpunkt funktioniert. Sobald Sie mit der Generierung von Daten beginnen (unten diskutiert), sollten Sie den Modell -Checkpoint verwenden, der den niedrigsten Validierungsverlust aufweist. Beachten Sie, dass dies möglicherweise nicht unbedingt der letzte Kontrollpunkt am Ende des Trainings ist (aufgrund einer möglichen Überanpassung).
Eine weitere wichtige Menge, die Sie beachten sollten, sind batch_size (nennen b), seq_length (nennen Sie es) und die Einstellungen für train_frac und val_frac . Die Stapelgröße gibt an, wie viele Datenströme gleichzeitig parallel verarbeitet werden. Die Sequenzlänge gibt die Länge jedes Stücks an, was auch die Grenze ist, an der die Gradienten abgeschnitten werden. Wenn beispielsweise seq_length 20 beträgt, wird das Gradientensignal niemals mehr als 20 Zeitschritte zurückpropagieren, und das Modell findet möglicherweise nicht länger als diese Länge in der Anzahl der Zeichen. Zur Laufzeit enthält Ihre Eingabetottendatei N -Zeichen, diese werden zuerst in die Stücke der Größe BXS aufgeteilt. Diese Brocken werden dann drei Splits zugeteilt: Zug/Val/Test gemäß den frac -Einstellungen. Wenn Ihre Daten gering sind, ist es möglich, dass mit den Standardeinstellungen nur sehr wenige Teile insgesamt (z. B. 100) enthalten sind. Dies ist schlecht: In diesen Fällen möchten Sie möglicherweise die Stapelgröße oder die Sequenzlänge verringern.
Sie können auch Parameter von einem zuvor gespeicherten Checkpoint mit init_from initieren.
Wir können diese Kontrollpunkte verwenden, um Text zu generieren (als nächstes besprochen).
Bei einer Checkpoint -Datei (z. B. an cv geschrieben) können wir neuen Text generieren. Zum Beispiel:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
Stellen Sie sicher, dass Ihr Kontrollpunkt mit GPU auch mit GPU oder umgekehrt ausgetastet wird. Andernfalls beschwert sich der Code (derzeit). Wie beim Zugskript finden Sie $ th sample.lua -help für vollständige Optionen. Eine wichtige ist (zum Beispiel) -length 10000 , die 10.000 Zeichen erzeugen würde (Standard = 2000).
Temperatur . Ein wichtiger Parameter, den Sie vielleicht mit viel spielen möchten, ist -temperature , die eine Zahl im Bereich [0, 1] (Hinweis 0 nicht enthalten), Standard = 1. Die Temperatur taucht die vorhergesagten Protokollwahrscheinlichkeiten vor dem Softmax auf, sodass die niedrigere Temperatur das Modell wahrscheinlicher macht, aber auch mehr langweiligere und konservative Vorhersagen. Höhere Temperaturen führen dazu, dass das Modell mehr Risiken einnimmt und die Vielfalt der Ergebnisse erhöht, jedoch zu mehr Fehlern.
Priming . Es ist auch möglich, das Modell mit einem Starttext mit -primetext zu fördern. Dies beginnt den RNN mit einigen festcodierten Charakteren, um es mit einem Kontext aufzuwärmen , bevor er beginnt, Text zu generieren.
Happy Samping!
Wenn Sie mit maschinellem Lernen oder neuronalen Netzwerken etwas neu sind, kann es ein wenig Fachwissen benötigen, um gute Modelle zu erhalten. Die wichtigste Menge, die Sie im Auge behalten sollten, ist der Unterschied zwischen Ihrem Trainingsverlust (gedruckt während des Trainings) und dem Validierungsverlust (ab und zu gedruckt, wenn der RNN auf den Validierungsdaten ausgeführt wird (standardmäßig 1000 Iterationen). Insbesondere:
Die beiden wichtigsten Parameter, die das Modell steuern, sind rnn_size und num_layers . Ich würde empfehlen, dass Sie immer num_layers von beiden 2/3 verwenden. Die rnn_size kann anhand der Daten angepasst werden, die Sie haben. Die beiden wichtigen Mengen, die hier im Auge behalten sollten, sind:
Diese beiden sollten in etwa der gleichen Größenordnung sein. Es ist ein wenig schwierig zu erzählen. Hier sind einige Beispiele:
rnn_size größer zu machen.Die Gewinnstrategie, um sehr gute Modelle zu erhalten (wenn Sie die Rechenzeit haben), besteht darin, das Netzwerk immer größer zu machen (so groß wie Sie bereit sind, darauf zu warten, dass es berechnet wird) und dann unterschiedliche Tropfenwerte (zwischen 0,1) auszuprobieren. Was auch immer das Modell die beste Validierungsleistung hat (der im Checkpoint -Dateinamen geschriebene Verlust ist gut) ist diejenige, die Sie am Ende verwenden sollten.
Es ist sehr häufig im Deep Learning, viele verschiedene Modelle mit vielen verschiedenen Hyperparametern zu führen, und am Ende den Checkpoint nimm die beste Validierungsleistung.
Übrigens sind die Größe Ihres Trainings- und Validierungsaufteils auch Parameter. Stellen Sie sicher, dass Sie eine angemessene Datenmenge in Ihrem Validierungssatz haben oder auf andere Weise die Validierungsleistung laut und nicht sehr informativ ist.
MIT