Ich fing plötzlich an zu studieren "Deep Learning von Grund auf neu - Verarbeitung natürlicher Sprache". Beachten Sie, dass ich in Kapitel 4 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 ist eine Beschleunigung des in Kapitel 3 erstellten CBOW-Modells word2vec.
Erstens ist die Beschleunigung von der Eingabeebene zur Zwischenebene. Dieser Teil spielt die Rolle der Einbettung, um Wörter in verteilte Ausdrücke umzuwandeln. Da die MatMul-Ebene jedoch verschwenderisch ist, ersetzen Sie sie durch die Einbettungsebene.
Die Einbettungsebene ist einfach, aber der Teil, der $ dW $ hinzufügt, wenn idx in der Backpropagation-Implementierung dupliziert wird, kann etwas verwirrend sein. In dem Buch wird es in Abbildung 4-5 aufgegriffen, und die Erklärung wird weggelassen als "Lassen Sie uns darüber nachdenken, warum wir hinzufügen".
Also habe ich darüber nachgedacht, indem ich es mit der Backpropagation-Berechnung für die MatMul-Ebene verglichen habe. Dies liegt daran, dass die Einbettungsebene das gleiche Ergebnis wie die MatMul-Ebene haben muss.
Ändern Sie zunächst $ idx $ in Abbildung 4-5 wieder in $ x $ in der MatMul-Ebene.
\begin{align}
idx &=
\begin{pmatrix}
0\\
2\\
0\\
4\\
\end{pmatrix}\\
\\
x &=
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 1 & 0 & 0 & 0 & 0\\
1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 1 & 0 & 0\\
\end{pmatrix}
\end{align}
Die Backpropagation-Formel für die MatMul-Ebene lautet $ \ frac {\ partielles L} {\ partielles W} = x ^ T \ frac {\ partielles L} {\ partielles y} $ (siehe Seite 33), siehe Abbildung 4-5 Wenn Sie es durch die Notation von ersetzen, wird es zu $ dw = x ^ Tdh $. Wenn Sie hier $ x $ und $ dh $ in Abbildung 4-5 anwenden, um $ dW $ zu berechnen, erhalten Sie: Eigentlich wollte ich $ dh $ machen, wie in Abb. 4-5 gezeigt, aber ich kann den Farbton von ● nicht wie ein Buch ausdrücken, also drücke ich ihn hier mit $ ●, ◆, a, b $ aus.
\begin{align}
dW &= x^Tdh\\
\\
\begin{pmatrix}
? & ? & ? \\
○ & ○ & ○ \\
●_1 & ●_2 & ●_3 \\
○ & ○ & ○ \\
◆_1 & ◆_2 & ◆_3 \\
○ & ○ & ○ \\
○ & ○ & ○ \\
\end{pmatrix}
&=
\begin{pmatrix}
1 & 0 & 1 & 0\\
0 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 0\\
\end{pmatrix}
\begin{pmatrix}
a_1 & a_2 & a_3 \\
●_1 & ●_2 & ●_3 \\
b_1 & b_2 & b_3 \\
◆_1 & ◆_2 & ◆_3 \\
\end{pmatrix}\\
\end{align}
Wie Sie der Berechnung entnehmen können, sind die zweite Zeile ($ ● _1 ● _2 ● _3
\begin{align}
\begin{pmatrix}
a_1 + b_1 & a_2 + b_2 & a_3 + b_3 \\
○ & ○ & ○ \\
●_1 & ●_2 & ●_3 \\
○ & ○ & ○ \\
◆_1 & ◆_2 & ◆_3 \\
○ & ○ & ○ \\
○ & ○ & ○ \\
\end{pmatrix}
&=
\begin{pmatrix}
1 & 0 & 1 & 0\\
0 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 0\\
\end{pmatrix}
\begin{pmatrix}
a_1 & a_2 & a_3 \\
●_1 & ●_2 & ●_3 \\
b_1 & b_2 & b_3 \\
◆_1 & ◆_2 & ◆_3 \\
\end{pmatrix}
\end{align}
Mit anderen Worten, Sie können sehen, dass wir die erste und dritte Zeile von $ dh $ hinzufügen. Das Gleiche wie die Berechnung dieser MatMul-Ebene muss in der Einbettungsschicht implementiert werden, daher muss sie hinzugefügt werden.
Als nächstes folgt die Verbesserung von der Zwischenschicht zur Ausgangsschicht. Interessant ist die Idee der negativen Stichprobe, um das Lernen mit negativen Beispielen drastisch zu reduzieren.
Es gab keinen großen Stolperstein, aber in dem Buch wird die Erklärung der Rückausbreitung der Embedding Dot-Ebene weggelassen, da es "kein schwieriges Problem ist, also lassen Sie uns selbst darüber nachdenken", daher werde ich hier ein wenig zusammenfassen. schauen.
Wenn Sie in Abbildung 4-12 nur den Teil der Ebene "Einbettungspunkt" ausschneiden, ist dies wie folgt.
Der Punktknoten multipliziert jedes Element und addiert die Ergebnisse. Berücksichtigen Sie daher die Rückausbreitung, indem Sie sie in einen Multiplikationsknoten (siehe "1.3.4.1 Multiplikationsknoten" in Kapitel 1) und einen Summenknoten (siehe "1.3.4.4 Summenknoten" in Kapitel 1) zerlegen. Dann hat es die folgende Form. Blaue Buchstaben sind Rückausbreitung.
Wenn Sie dies zum vorherigen Punktknotendiagramm zurückgeben, sieht es folgendermaßen aus:
Es ist in Ordnung, wenn es wie in dieser Abbildung gezeigt implementiert ist, aber da die Form von "dout" nicht mit "h" und "target_W" übereinstimmt, kann das Produkt jedes Elements nicht mit "*" von NumPy berechnet werden. Ordnen Sie daher zuerst die Formen "dout.reshape (dout.shape [0], 1)" zu und berechnen Sie dann das Produkt. Wenn Sie es auf diese Weise implementieren, können Sie sehen, dass es der Code von "EmbeddingDot.backwad ()" im Buch wird.
Die Umsetzung des Lernens ist nicht besonders stolpernd. Ich benutze das PTB-Korpus in dem Buch, aber ich mag Japanisch, also habe ich versucht, mit Aozora Bunkos vorab geschriebenem Text wie in Kapitel 2 zu lernen. Es war.
Um den Korpus zu erhalten, verwenden Sie die modifizierte Version von "Dataset / aozorabunko.py" anstelle von "Dataset / ptb.py". Weitere Informationen zu dieser Quelle und diesem Mechanismus finden Sie in [Kapitel 2, Memo "Verbesserung der zählbasierten Methode"](https://qiita.com/segavvy/items/52feabbf7867020e117d#24-Verbesserung der zählbasierten Methode). Ich habe es geschrieben, bitte beziehen Sie sich darauf.
ch04 / train.py
wurde ebenfalls geändert, um den Korpus von Aozora Bunko wie folgt zu verwenden. Die Änderungen sind diejenigen mit "★" in den Kommentaren.
ch04/train.py
# coding: utf-8
import sys
sys.path.append('..')
from common import config
#Wenn Sie mit einer GPU arbeiten, löschen Sie den folgenden Kommentar (Cupy erforderlich).
# ===============================================
# config.GPU = True
# ===============================================
from common.np import *
import pickle
from common.trainer import Trainer
from common.optimizer import Adam
from cbow import CBOW
from skip_gram import SkipGram
from common.util import create_contexts_target, to_cpu, to_gpu
from dataset import aozorabunko #★ Geändert, um das Korpus von Aozora Bunko zu verwenden
#Hyper-Parametereinstellungen
window_size = 5
hidden_size = 100
batch_size = 100
max_epoch = 10
#Daten lesen
corpus, word_to_id, id_to_word = aozorabunko.load_data('train') #★ Korpus wechseln
vocab_size = len(word_to_id)
contexts, target = create_contexts_target(corpus, window_size)
if config.GPU:
contexts, target = to_gpu(contexts), to_gpu(target)
#Generierung von Modellen etc.
model = CBOW(vocab_size, hidden_size, window_size, corpus)
# model = SkipGram(vocab_size, hidden_size, window_size, corpus)
optimizer = Adam()
trainer = Trainer(model, optimizer)
#Fang an zu lernen
trainer.fit(contexts, target, max_epoch, batch_size)
trainer.plot()
#Speichern Sie die Daten, die Sie zur späteren Verwendung benötigen
word_vecs = model.word_vecs
if config.GPU:
word_vecs = to_cpu(word_vecs)
params = {}
params['word_vecs'] = word_vecs.astype(np.float16)
params['word_to_id'] = word_to_id
params['id_to_word'] = id_to_word
pkl_file = 'cbow_params.pkl' # or 'skipgram_params.pkl'
with open(pkl_file, 'wb') as f:
pickle.dump(params, f, -1)
Darüber hinaus dauerte das Lernen in der jeweiligen Umgebung ca. 8 Stunden.
Als nächstes folgt die Bestätigung des Ergebnisses. Ich habe ch04 / eval.py
ein wenig geändert, damit ich verschiedene Wörter aus der Standardeingabe ausprobieren kann. ★
ist der geänderte Teil.
ch04/eval.py
# coding: utf-8
import sys
sys.path.append('..')
from common.util import most_similar, analogy
import pickle
pkl_file = 'cbow_params.pkl'
# pkl_file = 'skipgram_params.pkl'
with open(pkl_file, 'rb') as f:
params = pickle.load(f)
word_vecs = params['word_vecs']
word_to_id = params['word_to_id']
id_to_word = params['id_to_word']
#ähnlichste Aufgabe ★ Die Abfrage wurde in die Standardeingabe geändert
while True:
query = input('\n[similar] query? ')
if not query:
break
most_similar(query, word_to_id, id_to_word, word_vecs, top=5)
#Analogie-Aufgabe ★ Die Abfrage wurde in die Standardeingabe geändert
print('-'*50)
while True:
query = input('\n[analogy] query? (3 words) ')
if not query:
break
a, b, c = query.split()
analogy(a, b, c, word_to_id, id_to_word, word_vecs)
Nachfolgend sind die Ergebnisse verschiedener Versuche aufgeführt.
Suchen Sie zunächst nach ähnlichen Wörtern. Zum Vergleich habe ich auch die zählbasierte aufgelistet, die ich in Kapitel 2 ausprobiert habe. Außerdem war die Fenstergröße von CBOW im Code des Buches 5, aber ich habe auch 2 ausprobiert, was der Zählbasis entspricht.
Ähnliche Wörter | Kapitel 2 Zählbasis (Fenstergröße: 2) |
CBOW (Fenstergröße: 5) |
CBOW (Fenstergröße: 2) |
---|---|---|---|
Sie | Ehefrau: 0.6728986501693726 Ehefrau: 0.6299399137496948 K: 0.6205178499221802 Vater: 0.5986840128898621 ich: 0.5941839814186096 |
Sie: 0.7080078125 Ehefrau: 0.6748046875 Ehefrau: 0.64990234375 Junge Dame: 0.63330078125 ich: 0.62646484375 |
Ehefrau: 0.7373046875 Sie: 0.7236328125 Ehefrau: 0.68505859375 Die Person: 0.677734375 Lehrer: 0.666015625 |
Jahr | Anti: 0.8162745237350464 hundert: 0.8051895499229431 Protokoll: 0.7906433939933777 Acht: 0.7857747077941895 Kreis: 0.7682645320892334 |
Kreis: 0.78515625 Protokoll: 0.7744140625 Jahr: 0.720703125 Jahrhundert: 0.70751953125 30:30: 0.70361328125 |
Tsubo: 0.71923828125 Meter: 0.70947265625 Protokoll: 0.7080078125 Protokollの: 0.7060546875 Sekunden: 0.69091796875 |
Wagen | Tür: 0.6294019222259521 Tür: 0.6016885638237 Wagen: 0.5859153270721436 Tor: 0.5726617574691772 Vorhang: 0.5608214139938354 |
Oberkörper: 0.74658203125 Warenhaus: 0.744140625 Gebäude im westlichen Stil: 0.7353515625 Treppe: 0.7216796875 Tür: 0.71484375 |
Treppe: 0.72216796875 Wagen: 0.7216796875 Höhle: 0.716796875 unter Tage: 0.7138671875 Tür: 0.71142578125 |
Toyota | Toyotais not found | Toyotais not found | Toyotais not found |
Morgen | Nacht-: 0.7267987132072449 Um: 0.660172164440155 Mittag: 0.6085118055343628 Abend: 0.6021789908409119 Nächstes Mal: 0.6002975106239319 |
Abend: 0.65576171875 Kunimoto: 0.65576171875 Der Erste: 0.65087890625 Tenchobushi: 0.6494140625 Nächster: 0.64501953125 |
Abend: 0.68115234375 Mittag: 0.66796875 Letzter Nacht: 0.6640625 Nacht-: 0.64453125 Im Tor: 0.61376953125 |
Schule | Tokio: 0.6504884958267212 Höher: 0.6290650367736816 Junior High School: 0.5801640748977661 Universität: 0.5742003917694092 Einsteigen: 0.5358142852783203 |
Universität: 0.81201171875 Einsteigen: 0.732421875 Sumita: 0.7275390625 Schüler: 0.68212890625 Junior High School: 0.6767578125 |
Junior High School: 0.69677734375 Universität: 0.68701171875 vor kurzem: 0.6611328125 Tokio: 0.65869140625 Hier: 0.65771484375 |
Zashiki | Studie: 0.6603355407714844 Sou Seite: 0.6362787485122681 Zimmer: 0.6142982244491577 Zimmer: 0.6024710536003113 Küche: 0.6014574766159058 |
Fußboden: 0.77685546875 Schreibtisch: 0.76513671875 Schwelle: 0.76513671875 Haupthalle: 0.744140625 Eingang: 0.73681640625 |
Schreibtisch: 0.69970703125 Fußboden: 0.68603515625 椽: 0.6796875 Studie: 0.6748046875 Zojigaya: 0.6708984375 |
Kimono | Schädel: 0.5216895937919617 schwarz: 0.5200990438461304 Kleider: 0.5096032619476318 洋Kleider: 0.48781922459602356 Hut: 0.4869200587272644 |
Vermeiden: 0.68896484375 kalter Schweiß: 0.6875 Wecken: 0.67138671875 Unterwäsche: 0.6708984375 Was bedeutet: 0.662109375 |
Kostüm: 0.68359375 Besichtigung: 0.68212890625 Baumwolle: 0.6787109375 abspielen: 0.66259765625 硯: 0.65966796875 |
ich | Meister: 0.6372452974319458 Extra: 0.5826579332351685 Kaneda: 0.4684762954711914 Sie: 0.4676626920700073 Labyrinth: 0.4615904688835144 |
Meister: 0.7861328125 Sie: 0.7490234375 Extra: 0.71923828125 Katze: 0.71728515625 Unvermeidlich: 0.69287109375 |
Meister: 0.80517578125 Sie: 0.6982421875 Katze: 0.6962890625 Ehefrau: 0.6923828125 Lessing: 0.6611328125 |
Verbrecher | Phantom: 0.6609077453613281 Diebe: 0.6374931931495667 Mitglied: 0.6308270692825317 diese Person: 0.6046633720397949 Tauchen: 0.5931873917579651 |
Nächstes Mal: 0.7841796875 Boss: 0.75439453125 diese Person: 0.74462890625 Schmuck: 0.74169921875 ich: 0.73779296875 |
Fischangeln: 0.77392578125 diese Person: 0.74072265625 Kommt bald: 0.7392578125 Leichter Ballon: 0.7021484375 Intraktable Krankheit: 0.70166015625 |
bestellen | Geschichte: 0.6200630068778992 Beratung: 0.5290789604187012 Beschäftigt: 0.5178924202919006 Freundlichkeit: 0.5033778548240662 Vorlesung: 0.4894390106201172 |
Erinnerung: 0.6279296875 Bewertung: 0.61279296875 Absolvent: 0.611328125 Hauptversammlung: 0.6103515625 Luxus: 0.607421875 |
Beratung: 0.65087890625 Rat: 0.63330078125 Bewertung: 0.62451171875 Rücktritt: 0.61474609375 Vorschlag: 0.61474609375 |
Waffenlose Waffe | Obsolet: 0.7266454696655273 Altmodisch: 0.6771457195281982 sah: 0.6735808849334717 Nasenatem: 0.6516652703285217 Ignoranz: 0.650424063205719 |
Glauben: 0.7353515625 Top Sortierung: 0.7294921875 Protagonist: 0.693359375 Geboren: 0.68603515625 Zu verkaufen: 0.68603515625 |
Position: 0.724609375 Verfügbar: 0.71630859375 Straße weiter: 0.71142578125 Gesicht: 0.70458984375 Gegenstand: 0.69921875 |
Katze | Amen: 0.6659030318260193 Nobujo: 0.5759447813034058 Sumi: 0.5374482870101929 Status: 0.5352671146392822 gewöhnlich: 0.5205280780792236 |
Weisheit: 0.728515625 ich: 0.71728515625 Bild: 0.70751953125 Dyspepsie: 0.67431640625 Völlerei: 0.66796875 |
ich: 0.6962890625 Junior High School: 0.6513671875 Liebe: 0.64306640625 Sie: 0.63818359375 Schwein: 0.6357421875 |
Alkohol | Buch: 0.5834404230117798 Tee: 0.469807893037796 Sich ausruhen: 0.4605821967124939 Essen: 0.44864168763160706 Stange: 0.4349029064178467 |
Trinken: 0.6728515625 Streit: 0.6689453125 Lebensmittel: 0.66259765625 Yamakoshi: 0.646484375 Soba: 0.64599609375 |
Violine: 0.63232421875 Monatliches Gehalt: 0.630859375 Medizin: 0.59521484375 Handgranate: 0.59521484375 Kira: 0.5947265625 |
Küche | Strang: 0.5380040407180786 Zeichen: 0.5214874744415283 Original: 0.5175281763076782 Recht: 0.5082278847694397 Geschäft: 0.5001937747001648 |
Halle: 0.68896484375 Geschichte: 0.615234375 Roman: 0.59912109375 Literarische Kunst: 0.5947265625 nehmen: 0.59033203125 |
Zeitschrift: 0.666015625 Stand: 0.65625 Schmied: 0.61376953125 Musik: 0.6123046875 Kimono: 0.6083984375 |
Es ist ziemlich verwirrend wie in Kapitel 2. Es kann keine Überlegenheit oder Unterlegenheit gegeben werden. Der Bereich, in dem "Katzen" in "mir" erscheinen, zeigt die Tendenz des Korpus. Es scheint, dass der Grund dafür ist, dass die Größe des Korpus zu klein ist, da nur die Werke von Soseki Natsume, Kenji Miyazawa und Ranpo Edogawa verwendet werden.
Als nächstes kommt das Analogieproblem.
Analog Problem | CBOW (Fenstergröße: 5) | CBOW (Fenstergröße: 2) |
---|---|---|
Mann:König=Frau:? | Nu: 5.25390625 Abwesend: 4.2890625 Zu: 4.21875 Ruru: 3.98828125 Scheisse: 3.845703125 |
Großer Vogel: 3.4375 Jeder Moment: 3.052734375 Hintertor: 2.9140625 Kage: 2.912109375 Bodensäule: 2.873046875 |
Körper:Gesicht=Wagen:? | Polizist: 6.5 Tür: 5.83984375 Zwei Menschen: 5.5625 Polizei: 5.53515625 Chef: 5.4765625 |
Tür: 3.85546875 Loch: 3.646484375 Elektrisches Licht: 3.640625 Polizei: 3.638671875 Schulter: 3.6328125 |
gehen:Kommen Sie=sprechen:? | Erzählen: 4.6640625 elf: 4.546875 Dreizehn: 4.51171875 Hör mal zu: 4.25 Fragen: 4.16796875 |
Hör mal zu: 4.3359375 Bedauerlich: 4.14453125 Miya: 4.11328125 Sagen: 3.671875 elf: 3.55078125 |
Lebensmittel:Essen=Buch:? | Haben: 4.3671875 Fragen: 4.19140625 Popularität: 4.1328125 Bergstraße: 4.06640625 erhalten: 3.857421875 |
Prompt: 3.51171875 Gehen: 3.357421875 Sagen: 3.2265625 Hör mal zu: 3.2265625 Fangen Sie an, schleimig zu werden: 3.17578125 |
Sommer-:heiß=Winter:? | Akkumulieren: 5.23828125 Teru: 4.171875 Kommen Sie: 4.10546875 Überall: 4.05859375 Gehen: 3.978515625 |
elf: 4.29296875 Fertig: 3.853515625 Dreizehn: 3.771484375 Werden: 3.66015625 Schlecht: 3.66015625 |
Plötzlich ist das erste Problem eine Mischung aus niedrigen Punktzahlen, aber belastenden Ergebnissen. Unzureichende Trainingsdaten können beängstigende Dinge verursachen. Ich habe das Gefühl, einen Blick auf den Hintergrund der jüngsten Nachfrage nach "erklärbarer KI" zu werfen.
Andere Ergebnisse sind ebenfalls zerfetzt, aber kaum die richtigen Antworten wurden in "body: face = car :?" Und "go: come = speak :?" Gemischt. Das Auftreten von "Polizisten" und "Polizisten" in "Automobilen" ist wahrscheinlich auf Ranpo Edogawa zurückzuführen.
Immerhin hätte ich die japanische Version von Wikipedia gehorsam verwenden sollen, aber es ist eine teuflische Sache: Schweiß: Es gibt viele Leute, die Wikipedia ausprobieren. Wenn Sie also interessiert sind, "Wikipedia Japanese Corpus" Bitte versuchen Sie es mit Google mit.
Die negative / positive Beurteilung von E-Mails wird als Beispiel für das Transferlernen erläutert. Mit dem Wissen bis zu diesem Kapitel können Sätze wie E-Mails jedoch nicht in Vektoren fester Länge konvertiert werden, selbst wenn Wörter in Vektoren fester Länge konvertiert werden können. .. Daher können wir eine solche Aufgabe noch nicht anfechten.
Auch in Bezug auf die Qualität verteilter Ausdrücke scheint im Fall von Japanisch die Qualität des Schreibens vor der Trennung einen großen Effekt zu haben. Einige japanische Modelle für verteilte Ausdrücke wurden veröffentlicht, aber wenn ich überlege, sie zu übertragen, denke ich, dass es eine Voraussetzung ist, denselben abteilungsweisen Schreibmechanismus (Logik, Wörterbuchinhalte, Parameter usw.) zu verwenden. .. Bedeutet dies in diesem Fall, dass Transferlernen nicht einfach mit Aufgaben durchgeführt werden kann, die sich beispielsweise mit branchenspezifischen Fachbegriffen oder einzelnen Unternehmen befassen? Japanisch ist viel Arbeit.
Die erste Hälfte dieses Buches ist endlich vorbei, aber wenn man bedenkt, dass Kapitel 1 eine Rezension des ersten Bandes war, kann es immer noch ungefähr 1/3 sein. Das Ziel scheint lang zu sein ...
Das ist alles für dieses Kapitel. Wenn Sie Fehler haben, wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten.
Recommended Posts