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].
Abbildung: Aus einer zerlegbaren Aufmerksamkeit für die Inferenz natürlicher Sprache [^ 1]
Um diesen Algorithmus verwenden zu können, muss jedes Wort mit GloVe [^ 7] oder Word2Vec [^ 8] in eine verteilte Darstellung konvertiert werden.
--Besuchen?
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])
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 $
Es wird mit Keras [^ 9] unter Bezugnahme auf den Code [^ 2] [^ 6] [^ 10] erstellt.
https://gist.github.com/namakemono/f4f273dbc63fc2174940415a9f689a6f
References