L'explication de l'algorithme et la mise en œuvre de l'article suivant.
L'histoire est que l'algorithme Decomposable Attention [^ 1] semble être utilisable lorsque vous souhaitez étudier la relation entre deux phrases, telles que des hypothèses et des hypothèses, des réponses, et si oui ou non il est déjà mentionné, alors comment améliorer les performances? En l'introduisant, c'est une histoire que j'ai essayé de mettre en œuvre avec Keras [^ 4].
--Réseau pour l'inférence de langage naturel (NLI)
Figure: À partir d'une attention décomposable pour l'inférence de langage naturel [^ 1]
Pour utiliser cet algorithme, il est nécessaire de convertir chaque mot en une représentation distribuée avec GloVe [^ 7] ou Word2Vec [^ 8].
--Assister?
Une paire de phrases d'entrée
\bar{a} = (a_1, ..., a_{l_a})^\mathrm{T} \\
\bar{b} = (b_1, ..., b_{l_b})^\mathrm{T} \\
Laisser. Ici, $ l_a et l_b $ représentent la longueur du document.
De plus, $ a_i, b_j \ in \ mathbb {R} ^ d $ est une sorte de représentation distribuée.
--Dans l'expérience, GloVe [^ 7] est utilisé pour convertir en un vecteur de dispersion à 300 dimensions. --Les vecteurs distribués $ \ bar {a}, \ bar {b} $ sont normalisés à la norme $ l_2 $ de $ 1 $
❏ Attend
Le poids de l'attention est calculé ci-dessous. En faisant cela, les mots importants sont triés afin qu'ils soient fortement corrélés.
e_{ij} := F'(\bar{a_i}, \bar{b_j}) := F(\bar{a})^{\mathrm{T}}F(\bar{b})
Laisser. Ce poids d'attention $ e_ {ij} $ rend les poids des mots étroitement liés aux documents $ a $ et $ b $ plus forts.
La fonction $ F $ au moment de l'implémentation n'est qu'un réseau de neurones.
Si vous calculez avec $ F '$, la dimension de la variable d'entrée sera $ l_a \ times l_b $, ce qui est grand. Lors du calcul réel, le nombre de dimensions d'entrée de $ l_a + l_b $ est simplifié en $ F $.
Ce $ F $ est un réseau de neurones entièrement connecté au moment de la mise en œuvre.
Sur la base du poids d'attention calculé $ e_ {ij} $, trouvez la valeur normalisée de $ \ 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\}
Ici, $ G $ est un réseau de neurones au moment de la mise en œuvre.
❏ 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])
Dans la partie d'intégration de mots, j'ai pensé que le sens en tant que phrase pouvait être repris en utilisant un réseau neuronal au lieu de simplement convertir chaque mot.
f_{ij} := F_{\rm{intra}}(a_i)^{\mathrm{T}}F_{\rm{intra}}(a_j)
Ici, $ F_ {\ rm {intra}} $ est utilisé en tant que filet d'avance, et $ \ bar {a_i} et \ bar {b_i} $ sont modifiés comme suit.
\bar{a_i} := [a_i, a'_i]\\
\bar{b_i} := [b_i, b'_i]
Où $ a'_i $ est
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
C'est dit. Ce $ d_ {i-j} \ in \ mathbb {R} $ est un biais. La même chose s'applique à $ b'_i $
Il est créé avec Keras [^ 9] en référence au code [^ 2] [^ 6] [^ 10].
https://gist.github.com/namakemono/f4f273dbc63fc2174940415a9f689a6f
References
Recommended Posts