Ich fing plötzlich an zu studieren "Deep Learning von Grund auf neu - Verarbeitung natürlicher Sprache". Beachten Sie, dass ich in Kapitel 5 gestolpert bin ist.
Die Ausführungsumgebung ist macOS Catalina + Anaconda 2019.10 und die Python-Version ist 3.7.4. Weitere Informationen finden Sie in Kapitel 1 dieses Memos.
Dieses Kapitel beschreibt das wiederkehrende neuronale Netzwerk.
Es erklärt das Sprachmodell und die Probleme beim Versuch, CBOW als Sprachmodell zu verwenden. Ich denke, dass der Grund, warum Gleichung 5.8 eine Annäherung ist, darin besteht, dass CBOW die Wortfolge ignoriert.
Da word2vec die Wortfolge ignoriert, scheint es, dass die in diesem Kapitel erlernte RNN besser ist, wenn sie für verteilte Ausdrücke verwendet wird. Die RNN wurde jedoch zuerst und später geboren, um die Anzahl der Vokabeln zu erhöhen und die Qualität zu verbessern. Es ist interessant, dass word2vec von der Firma vorgeschlagen wurde und dass es tatsächlich der entgegengesetzte Fluss war.
Erklärung von RNN. Die Tanh-Funktion (Bicurve-Tangentenfunktion) wird als Aktivierungsfunktion angezeigt, aber aus irgendeinem Grund gibt es in diesem Buch keine Erklärung. Lassen Sie uns also mit "Tanh" nach Details suchen.
Etwas besorgniserregender ist die Unterstützung, zum Anfang zurückzukehren, wenn die Daten beim Mini-Batch-Lernen bis zum Ende verwendet werden. In diesem Fall werden das Ende und der Anfang des Korpus verbunden. In erster Linie behandelt dieses Buch den PTB-Korpus jedoch als "eine große Zeitreihendaten" und berücksichtigt nicht einmal die Satzbrüche (siehe den Teil mit der Skorpionmarke in der Mitte von S.87). Daher kann es sinnlos sein, sich Gedanken darüber zu machen, ob das Ende und der Anfang miteinander verbunden sind.
Die Implementierung sollte etwas schwierig sein, da der Wiederholungsknoten nach dem Weglassen des Bias $ b $ in den Abbildungen 5-19 und 5-20 weggelassen wird. Die Vorwärtsausbreitung kann wie in der Abbildung gezeigt implementiert werden, da sie gesendet wird. Bei der Berechnung von $ db $ durch Rückausbreitung muss sie jedoch bewusst hinzugefügt werden. Gerade dieser Teil der Qualitätssicherung befand sich auch in Teratail (Teratail: Warum Summe Summe db mit Achse = 0 in Backpropagation von RNN).
Auch die Tanh-Funktion, die dieses Mal herauskam, wird ohne Erklärung implementiert, aber die Vorwärtsausbreitung kann mit numpy.tanh ()
wie im Code des Buches berechnet werden. Für die Rückausbreitung ist der Teil "dt = dh_next * (1 --h_next ** 2)" die Differenzierung von tanh, die ausführlich in "Anhang A Unterscheidung von Sigmoidfunktion und tanh-Funktion" am Ende des Buches erläutert wird. es gibt.
Außerdem wird auf Seite 205 die Geschichte von "... (3-Punkt-Punkt)" angezeigt, die der Geschichte des "3-Punkt-Lesers" auf Seite 34 entspricht. [Kapitel 1 dieses Memos](https://qiita.com/segavvy/items/91be1d4fc66f7e322f25#13-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3 % 83% AB% E3% 83% 8D% E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% AF% E3% 81% AE% E5% AD Wie ich in% A6% E7% BF% 92) geschrieben habe, ist es besser, die Beziehung zwischen Slices und Ansichten von ndarray zu verstehen, als sich daran zu erinnern, dass es mit 3-Punkt-Punkten überschrieben wird.
Die Erklärung des Codes wird weggelassen, ist aber einfach und verständlich.
Die Time Embedding-Ebene (TimeEmbedding
-Klasse in common / time_layers.py) durchläuft einfach $ T $ von Embedding-Ebenen.
In der Time Affine-Ebene (TimeAffine
-Klasse von common / time_layers.py) wird anstelle von $ T $ -Zeiten die Stapelgröße $ N $ in $ T $ -Zeiten transformiert und sofort berechnet, und das Ergebnis ist das Original. Es wird effizienter, indem es in eine Form umgewandelt wird.
Die Ebene "Zeit-Softmax mit Verlust" ("TimeSoftmaxWithLoss" -Klasse in common / time_layers.py) entspricht den Angaben im Buch, aber ich befürchtete, dass eine Maske mit "ignore_label" implementiert wurde. Wenn das richtige Antwortetikett -1 ist, werden sowohl der Verlust als auch der Gradient auf 0 gesetzt und bei der Berechnung von $ L $ vom Nenner $ T $ ausgeschlossen. Der Vorgang zum Setzen des richtigen Antwortetiketts auf -1 ist jedoch jetzt Ich glaube nicht, dass es da war. Ich kann es in einem späteren Kapitel verwenden, also werde ich es vorerst verlassen.
Leider liefert diese Implementierung keine guten Ergebnisse, wenn der gesamte PTB-Datensatz verwendet wird. Daher habe ich mit dem vorherigen Kapitel Aozora Bunkos vorab geschriebener Text gespielt. Ich habe auch aufgehört zu studieren. Es wird gesagt, dass es im nächsten Kapitel verbessert wird, also werde ich es dort versuchen.
Abgesehen davon fand ich den Code rn = np.random.randn
in SimpleRnnlm .__ init __ ()
nützlich, da Python Funktionen einfach in Variablen einfügen und verwenden kann. In der Sprache C ist es kompliziert, eine Funktion in eine Variable (einen Funktionseinstiegspunkt in eine Variable) mit vielen "*" und "()" einzufügen, und es ist kompliziert, sie zu verwenden, und ich bin in meinen aktiven Tagen nicht wirklich gut darin. Did: Schweiß:
Ich habe es geschafft, Zeitreihendaten zu verarbeiten. .
Das ist alles für dieses Kapitel. Wenn Sie Fehler haben, wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten.
Recommended Posts