[PYTHON] Erklärung und Implementierung des Decomposable Attention-Algorithmus

Die Algorithmuserklärung und Implementierung des folgenden Dokuments.

Die Geschichte ist, dass der Decomposable Attention [^ 1] -Algorithmus verwendbar zu sein scheint, wenn Sie die Beziehung zwischen zwei Sätzen untersuchen möchten, z. B. Annahmen und Annahmen, Antworten und ob er bereits erwähnt wurde oder nicht. Wie können Sie also die Leistung verbessern? Während ich es vorstellte, war es eine Geschichte, die ich mit Keras implementiert habe [^ 4].

Was ist zerlegbare Aufmerksamkeit [^ 1]?

image.png Abbildung: Aus einer zerlegbaren Aufmerksamkeit für die Inferenz natürlicher Sprache [^ 1]

Algorithmus

Um diesen Algorithmus verwenden zu können, muss jedes Wort mit GloVe [^ 7] oder Word2Vec [^ 8] in eine verteilte Darstellung konvertiert werden.

❏ Durchfluss

--Besuchen?

❏ Eingangsvariablen

Ein Paar Eingabesätze

\bar{a} = (a_1, ..., a_{l_a})^\mathrm{T} \\
\bar{b} = (b_1, ..., b_{l_b})^\mathrm{T} \\

Lassen. Hier repräsentieren $ l_a und l_b $ die Länge des Dokuments.

Außerdem ist $ a_i, b_j \ in \ mathbb {R} ^ d $ eine Art verteilte Darstellung.

❏ Attend

Das Gewicht der Aufmerksamkeit wird unten berechnet. Auf diese Weise werden wichtige Wörter so sortiert, dass sie stark korrelieren.

e_{ij} := F'(\bar{a_i}, \bar{b_j}) := F(\bar{a})^{\mathrm{T}}F(\bar{b})

Lassen. Das Gewicht dieser Aufmerksamkeit $ e_ {ij} $ erhöht die Gewichtung von Wörtern, die eng mit den Dokumenten $ a $ und $ b $ zusammenhängen.

Die Funktion $ F $ zum Zeitpunkt der Implementierung ist nur ein neuronales Netzwerk.

Wenn Sie mit $ F '$ rechnen, ist die Dimension der Eingabevariablen $ l_a \ times l_b $, was groß ist. Bei der tatsächlichen Berechnung wird die Anzahl der Eingabedimensionen von $ l_a + l_b $ auf $ F $ vereinfacht.

Dieses $ F $ ist zum Zeitpunkt der Implementierung ein vollständig verbundenes neuronales Netzwerk.

Ermitteln Sie basierend auf dem berechneten Aufmerksamkeitsgewicht $ e_ {ij} $ den normalisierten Wert von $ \ bar {a_i}, \ bar {b_j} $ $ \ alpha_i, \ beta_j $.

\beta_i := \sum_{j=1}^{l_b} \frac{ \exp(e_{ij}) }{ \sum_{k=1}^{l_b} \exp(e_{ik})} \bar{b}_j \quad \forall i \in \left\{1,...,l_a \right\} \\

\alpha_j := \sum_{i=1}^{l_a} \frac{ \exp(e_{ij}) }{ \sum_{k=1}^{l_b} \exp(e_{kj})} \bar{a}_j \quad \forall j \in \left\{1,...,l_b \right\} 

❏ Compare

v_{1,i} := G([\bar{\alpha_i}, \beta_i]) \quad \forall i \in \left\{1,...,l_a \right\} \\
v_{2,j} := G([\bar{\beta_j}, \alpha_i]) \quad \forall j \in \left\{1,...,l_b \right\}

Hier ist $ G $ zum Zeitpunkt der Implementierung ein neuronales Netzwerk.

❏ Aggregate

v_1 = \sum_{i=1}^{l_a} v_{1,i} \\
v_2 = \sum_{j=1}^{l_b} v_{2,j} \\
\hat{y} = H([v_1, v_2])

❏ Intra-Satz-Aufmerksamkeit (optional)

Im Teil zum Einbetten von Wörtern dachte ich, dass die Bedeutung als Satz durch die Verwendung eines neuronalen Netzes aufgenommen werden könnte, anstatt einfach jedes Wort zu konvertieren.

f_{ij} := F_{\rm{intra}}(a_i)^{\mathrm{T}}F_{\rm{intra}}(a_j)

Hier wird $ F_ {\ rm {intra}} $ als Feed-Forward-Netz verwendet, und $ \ bar {a_i} und \ bar {b_i} $ werden wie folgt geändert.

\bar{a_i} := [a_i, a'_i]\\
\bar{b_i} := [b_i, b'_i]

Wo $ a'_i $ ist

a'_i := \sum_{j=1}^{l_a} \frac{\exp(f_{ij} + d_{i-j})}{\sum_{k=1}^{l_a} \exp(f_{ik + d_{i-k}})} a_j

Es wird gesagt. Dieses $ d_ {i-j} \ in \ mathbb {R} $ ist eine Verzerrung. Gleiches gilt für $ b'_i $

Implementierung [^ 4]

Es wird mit Keras [^ 9] unter Bezugnahme auf den Code [^ 2] [^ 6] [^ 10] erstellt.

https://gist.github.com/namakemono/f4f273dbc63fc2174940415a9f689a6f

References

Recommended Posts

Erklärung und Implementierung des Decomposable Attention-Algorithmus
Erklärung und Implementierung des ESIM-Algorithmus
Erklärung und Implementierung von SocialFoceModel
Erläuterung und Implementierung von PRML Kapitel 4
Erklärung und Implementierung von einfachem Perzeptron
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Erläuterung der CSV und Implementierungsbeispiel in jeder Programmiersprache
Einführung und Implementierung von JoCoR-Loss (CVPR2020)
Einführung und Implementierung der Aktivierungsfunktion
Implementierung der Dyxtra-Methode durch Python
Mathematische Erklärung der Dichotomie- und Trisektionssuch- und Implementierungsmethode ohne Fehler
Implementierung und Experiment der konvexen Clustering-Methode
Implementierung und Beschreibung mit XGBoost für Anfänger
Zusammenfassung der Klassifizierung und Implementierung von Algorithmen für maschinelles Lernen
Erläuterung und Implementierung des in Slack, HipChat und IRC verwendeten XMPP-Protokolls
TRIE-Baumimplementierung mit Python und LOUDS
R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Sequentielle Aktualisierung der Co-Distribution zur Ableitung und Implementierung von Ausdrücken
Implementierung des DB-Administratorbildschirms durch Flask-Admin und Flask-Login
Implementierung der Fibonacci-Sequenz
Perceptron Grundlagen und Implementierung
Kaninchen- und Schildkrötenalgorithmus
Python-Implementierung des CSS3-Mischmodus und Diskussion über den Farbraum
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Ableitung und Implementierung von Aktualisierungsgleichungen für die nicht negative Tensorfaktorzerlegung
[Mit einfacher Erklärung] Scratch-Implementierung einer Deep Boltsman-Maschine mit Python ②
[Mit einfacher Erklärung] Scratch-Implementierung einer tiefen Boltzmann-Maschine mit Python ①
Theorie und Implementierung mehrerer Regressionsmodelle - warum Regularisierung erforderlich ist -
Überprüfung und Implementierung der Videorekonstruktionsmethode mit GRU und Autoencoder
Ableitung des EM-Algorithmus und Berechnungsbeispiel für den Münzwurf
Implementierung der ML-EM-Methode, Querschnittsrekonstruktionsalgorithmus für CT-Scan