Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Notieren Sie sich diesmal in Kapitel 3, Schritt 13 Ihre eigenen Punkte.
Im vorherigen Kapitel haben wir ein Faltungs-Neuronales Netzwerk (CNN) erstellt, das eine Spalte mit verteilten Ausdrücken von Wörtern verwendet, die in einer Form angeordnet sind, die einem Satz als Eingabe entspricht. In diesem Kapitel werden wir auch ein rekursives neuronales Netzwerk (RNN) mit einer Folge verteilter Ausdrücke von Wörtern aufbauen, die in einer Form angeordnet sind, die einem Satz als Eingabe entspricht. Die ausführliche Erläuterung des Mechanismus entfällt.
13.1 Recurrent layer
Geben Sie die Spalte ganz links des Merkmalsvektors in eine Schicht (vollständig verbundene Schicht) des mehrschichtigen Perzeptrons ein. Verschieben Sie als nächstes das Eingangsneuron um eine Zeile nach rechts und geben Sie es auf die gleiche Weise in die vollständig verbundene Schicht ein, aber das Gewicht der hier verwendeten ** vollständig verbundenen Schicht ist das gleiche wie das zuvor verwendete **. Verbinden Sie gleichzeitig ** das vorherige Ausgangsneuron über eine andere vollständig verbundene Schicht **.
--CNN: Enthält Informationen für die gesamte Spalte der Merkmalsvektoren, indem eine Reihe von Ausgaben in die Max-Pooling-Ebene eingegeben werden, um den Vektor zu erhalten --RNN: Da der vorherige Ausgang mit dem nächsten Ausgang verbunden ist, enthält der am Ende erhaltene die Informationen der gesamten Spalte des Merkmalsvektors (das erste Merkmal wird jedoch kleiner). Beachten Sie, dass
Dies kann auch erklärt werden, indem eine vollständig verbundene Schicht mit einer "Verbindung, die ihre Ausgabe an sich selbst zurückgibt" vorbereitet und der Reihe nach Vektoren eingegeben werden. Ich hatte ursprünglich dieses Bild und als ich den Loop-Teil erweiterte, wurde es die Komposition, die ich zuvor erwähnt hatte.
13.2 LSTM RNN, eine Abkürzung für Langzeit-Kurzzeitgedächtnis, hatte das Problem, dass die Eigenschaften am Anfang kleiner wurden, aber LSTM ist eine verbesserte Version, die alte Informationen beibehalten kann. (Ich möchte LSTM in Zukunft zusammenfassen)
Ergänzungen / Änderungen gegenüber dem vorherigen Kapitel (Schritt 12)
rnn_sample.py
model = Sequential()
model.add(get_keras_embedding(we_model.wv,
input_shape=(MAX_SEQUENCE_LENGTH, ),
mask_zero=True,
trainable=False))
model.add(LSTM(units=256))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=n_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
Ausführungsergebnis
# CNN
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python cnn_sample.py
Epoch 50/50
917/917 [==============================] - 0s 303us/step - loss: 0.0357 - acc: 0.9924
0.6808510638297872
Epoch 100/100
917/917 [==============================] - 0s 360us/step - loss: 0.0220 - acc: 0.9902
0.6808510638297872
# LSTM
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python rnn_sample.py
Epoch 50/50
917/917 [==============================] - 4s 4ms/step - loss: 0.2530 - acc: 0.9378
0.6063829787234043
Epoch 100/100
917/917 [==============================] - 4s 4ms/step - loss: 0.0815 - acc: 0.9793
0.5851063829787234
# Bi-directional RNN
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python bid_rnn_sample.py
Epoch 50/50
917/917 [==============================] - 2s 2ms/step - loss: 0.2107 - acc: 0.9487
0.5851063829787234
Epoch 100/100
917/917 [==============================] - 2s 2ms/step - loss: 0.0394 - acc: 0.9858
0.5851063829787234
# GRU
Epoch 50/50
917/917 [==============================] - 1s 1ms/step - loss: 0.2947 - acc: 0.9368
0.4787234042553192
Epoch 100/100
917/917 [==============================] - 1s 1ms/step - loss: 0.0323 - acc: 0.9869
0.5531914893617021
Vergleiche mit 50 Epochennummern. Anders als bei CNN ist die Verlustfunktion auch bei Epoch50 nicht gesunken, daher habe ich sie bei Epoch100 überprüft.
Art der NN | Ausführungsergebnis | Ausführungsgeschwindigkeit |
---|---|---|
CNN | Epoch50:68.1% Epoch100:68.1% |
300us im Durchschnitt/step -> 0.27s/epoch |
LSTM | Epoch50:60.6% Epoch100:58.5% |
4ms im Durchschnitt/step -> 3.6s/epoch |
Bi-directional RNN | Epoch50:58.5% Epoch100:58.5% |
2ms im Durchschnitt/step -> 1.8s/epoch |
GRU | Epoch50:47.9% Epoch100:55.3% |
1ms im Durchschnitt/step -> 0.9s/epoch |
Eine Optimierung des neuronalen Netzwerks wie die Suche nach Hyperparametern in den folgenden Kapiteln ist erforderlich, aber CNN ist schnell und die Unterscheidungsrate ist recht gut.
Da ein einfaches RNN, das einfach eine vollständig verbundene Schicht ähnlich dem mehrschichtigen Perceptron umleitet, nicht gut funktioniert, wurde LSTM eingeführt.
Der Inhalt von Kapitel 3 dieses Buches ist elementar und konzentriert sich darauf, wie man sie für praktische Anwendungen verwendet. Um ein tieferes Verständnis in der Theorie zu erlangen, sollten wir die Theorie der neuronalen Netze festigen, bevor wir beginnen. Es könnte eine gute Idee sein, den Kaggle-Wettbewerb auszuprobieren.
Recommended Posts