Attention aux nuls et à l'implémentation dans Keras

À propos des articles sur l'intelligence artificielle en russe


Malgré le fait que le mécanisme Attention est décrit dans la littérature anglaise, je n'ai toujours pas vu de description décente de cette technologie dans le secteur russophone. Il existe de nombreux articles sur l'intelligence artificielle (IA) dans notre langue. Cependant, les articles trouvés ne révèlent que les modèles d'IA les plus simples, par exemple les réseaux de convolution, les réseaux génératifs. Cependant, selon les derniers développements de pointe dans le domaine de l'IA, il y a très peu d'articles dans le secteur russophone.

Le manque d'articles en russe sur les derniers développements est devenu un problème pour moi lorsque j'ai abordé le sujet, étudié la situation actuelle dans le domaine de l'IA. Je connais bien l'anglais, j'ai lu des articles en anglais sur des sujets liés à l'IA. Cependant, lorsqu'un nouveau concept ou un nouveau principe de l'IA sort, sa compréhension dans une langue étrangère est douloureuse et longue. Connaître l'anglais, pénétrer dans un non-natif dans un objet complexe vaut encore beaucoup plus de temps et d'efforts. Après avoir lu la description, vous vous posez la question: combien de pour cent comprenez-vous? S'il y avait un article en russe, je comprendrais à 100% après la première lecture. Cela s'est produit avec les réseaux génératifs, pour lesquels il existe une excellente série d'articles: après la lecture, tout est devenu clair. Mais dans le monde des réseaux, il existe de nombreuses approches qui ne sont décrites qu'en anglais et qui ont dû être traitées pendant des jours.

Je vais régulièrement écrire des articles dans ma langue maternelle, apportant des connaissances dans notre domaine linguistique. Comme vous le savez, la meilleure façon de comprendre un sujet est de l'expliquer à quelqu'un. Alors, qui d'autre que moi devrait commencer une série d'articles sur l'IA architecturale la plus moderne, la plus complexe et la plus avancée. À la fin de l'article, je comprendrai moi-même une approche à 100%, et cela sera utile pour quelqu'un qui lit et améliore sa compréhension (au fait, j'aime Gesser, mais mieux ** Blanche de bruxelles **).

Lorsque vous comprenez le sujet, il existe 4 niveaux de compréhension:

  1. vous comprenez le principe et les entrées et sorties de l'algorithme / niveau
  2. vous comprenez les sorties de rassemblement et en termes généraux comment cela fonctionne
  3. vous comprenez tout ce qui précède, ainsi que l'appareil de chaque niveau de réseau (par exemple, dans le modèle VAE, vous avez compris le principe, et vous avez également compris l'essence de l'astuce de reparameterization)
  4. J'ai tout compris, y compris tous les niveaux, j'ai également compris pourquoi tout cela apprenait, et en même temps, je suis en mesure de sélectionner des hyperparamètres pour ma tâche, plutôt que de copier-coller des solutions toutes faites.

Pour les nouvelles architectures, le passage du niveau 1 au niveau 4 est souvent difficile: les auteurs soulignent qu'ils décrivent de manière superficielle divers détails importants (les ont-ils compris eux-mêmes?). Ou votre cerveau ne contient aucune construction, donc même après avoir lu la description, il n'a pas déchiffré et ne s'est pas transformé en compétences. Cela se produit si pendant vos années d'étudiant, vous avez dormi dans la même leçon de matan, après une soirée nocturne  où vous avez donné le bon tapis. appareil. Et juste ici, nous avons besoin d'articles dans notre langue maternelle qui révèlent les nuances et les subtilités de chaque opération.

Concept d'attention et application


Ce qui précède est un scénario de niveaux de compréhension. Pour analyser Attention, commençons au niveau un. Avant de décrire les entrées et les sorties, nous analyserons l'essence: sur quels concepts de base, compréhensible même pour un enfant, ce concept est basé. Dans l'article, nous utiliserons le terme anglais Attention, car sous cette forme, il s'agit également d'un appel à la fonction de bibliothèque Keras (il n'y est pas directement implémenté, un module supplémentaire est requis, mais plus sur celui ci-dessous). Pour lire plus loin, vous devez avoir une compréhension des bibliothèques Keras et python, car le code source sera fourni.

Attention traduit de l'anglais par «attention». Ce terme décrit correctement l'essence de la démarche: si vous êtes automobiliste et que le général de la police de la circulation est représenté sur la photo, vous y attachez intuitivement de l'importance, quel que soit le contexte de la photo. Vous allez probablement regarder de plus près le général. Vous tendez les yeux, regardez attentivement les bretelles: combien d'étoiles il a là-bas spécifiquement. Si le général n'est pas très grand, ignorez-le. Sinon, considérez-le comme un facteur clé dans la prise de décisions. Voilà comment fonctionne notre cerveau. Dans la culture russe, nous avons été formés par des générations à prêter attention aux rangs élevés, notre cerveau accorde automatiquement une haute priorité à ces objets.

L'attention est un moyen de dire au réseau à quoi vous devez prêter plus d'attention, c'est-à-dire de signaler la probabilité d'un résultat particulier en fonction de l'état des neurones et des données d'entrée. La couche Attention implémentée dans Keras identifie elle-même les facteurs basés sur l'ensemble de formation, dont l'attention réduit l'erreur de réseau. L'identification des facteurs importants se fait par le biais de la méthode de rétropropagation des erreurs, similaire à celle qui est utilisée pour les réseaux de convolution.

Dans la formation, Attention démontre sa nature probabiliste. Le mécanisme lui-même forme une matrice d'échelles d'importance. Si nous n'avions pas formé l'attention, nous aurions pu définir l'importance, par exemple, empiriquement (le général est plus important que l'enseigne). Mais lorsque nous formons un réseau sur des données, l'importance devient fonction de la probabilité d'un résultat particulier, en fonction des données reçues à l'entrée du réseau. Par exemple, si nous rencontrions un général vivant dans la Russie tsariste, la probabilité d'obtenir des gantelets serait élevée. Une fois cela vérifié, il serait possible, grâce à plusieurs réunions personnelles, de collecter des statistiques. Après cela, notre cerveau mettra le poids approprié sur le fait de la rencontre de ce sujet et mettra des marqueurs sur les bretelles et les rayures. Il convient de noter que le marqueur défini n'est pas une probabilité: maintenant la réunion du général entraînera des conséquences complètement différentes pour vous qu'alors, en outre, le poids peut être supérieur à un. Mais, le poids peut être réduit à la probabilité en le normalisant.

La nature probabiliste du mécanisme Attention dans l'apprentissage se manifeste dans les tâches de traduction automatique. Par exemple, informons le réseau que lors de la traduction du russe vers l'anglais, le mot Amour est traduit dans 90% des cas par Amour, dans 9% des cas par Sexe, dans 1% des cas autrement. Le réseau marque immédiatement de nombreuses options, montrant la meilleure qualité de formation. Lors de la traduction, nous disons au réseau: "lors de la traduction du mot amour, portez une attention particulière au mot anglais Love, voyez aussi s'il peut encore être Sex."

L'approche Attention est appliquée pour travailler avec du texte, ainsi qu'avec du son et des séries temporelles. Pour le traitement de texte, les réseaux de neurones récurrents (RNN, LSTM, GRU) sont largement utilisés. L'attention peut soit les compléter, soit les remplacer, déplaçant le réseau vers des architectures plus simples et plus rapides.

L'une des applications les plus célèbres d'Attention est son utilisation pour abandonner le réseau de récurrence et passer à un modèle entièrement connecté. Les réseaux récurrents présentent une série de lacunes: l'incapacité de fournir une formation sur le GPU, une reconversion rapide. En utilisant le mécanisme Attention, nous pouvons construire un réseau capable d'apprendre des séquences sur la base d'un réseau entièrement connecté, le former sur le GPU, utiliser droput.

L'attention est largement utilisée pour améliorer les performances des réseaux de récurrence, par exemple dans le domaine de la traduction d'une langue à l'autre. Lorsque vous utilisez l'approche de codage / décodage, qui est souvent utilisée dans l'IA moderne (par exemple, les codeurs automatiques variationnels). Lorsqu'une couche Attention est ajoutée entre l'encodeur et le décodeur, le résultat du fonctionnement du réseau s'améliore sensiblement.

Dans cet article, je ne cite pas des architectures réseau spécifiques utilisant Attention, cela fera l'objet d'un travail séparé. Une liste de toutes les utilisations possibles de l'attention mérite un article séparé.

Implémentation de l'attention dans Keras prêt à l'emploi


Lorsque vous comprenez quel type d'approche, il est très utile d'apprendre le principe de base. Mais souvent, la pleine compréhension ne vient qu'en examinant une implémentation technique. Vous voyez les flux de données qui composent la fonction de l'opération, il devient clair ce qui est calculé exactement. Mais vous devez d'abord l'exécuter et écrire «Attention bonjour mot».

L'attention n'est actuellement pas implémentée dans Keras lui-même. Mais il existe déjà des implémentations tierces, telles que attention-keras, qui peuvent être installées avec github. Ensuite, votre code deviendra extrêmement simple:

from attention_keras.layers.attention import AttentionLayer attn_layer = AttentionLayer(name='attention_layer') attn_out, attn_states = attn_layer([encoder_outputs, decoder_outputs]) 

Cette implémentation prend en charge la fonction de visualisation de l'échelle d'attention. Après avoir formé Attention, vous pouvez obtenir une signalisation matricielle qui, selon le réseau, est particulièrement importante pour ce type (image de github de la page de la bibliothèque attention-keras).


Fondamentalement, vous n'avez besoin de rien d'autre: incluez ce code dans votre réseau comme l'un des niveaux et profitez de l'apprentissage de votre réseau. Tout réseau, tout algorithme est conçu dans les premières étapes à un niveau conceptuel (comme la base de données, soit dit en passant), après quoi l'implémentation est spécifiée dans une représentation logique et physique avant l'implémentation. Cette méthode de conception n'a pas encore été développée pour les réseaux de neurones (oh oui, ce sera le sujet de mon prochain article). Vous ne comprenez pas comment les couches de convolution fonctionnent à l'intérieur? Le principe est décrit, vous les utilisez.

Implémentation Keras de Attention low


Pour enfin comprendre le sujet, nous analyserons ci-dessous en détail la mise en œuvre d'Attention sous le capot. Le concept est bon, mais comment fonctionne-t-il exactement et pourquoi le résultat est-il obtenu exactement comme indiqué?

L'implémentation la plus simple du mécanisme Attention dans Keras ne prend que 3 lignes:

 inputs = Input(shape=(input_dims,)) attention_probs = Dense(input_dims, activation='softmax', name='attention_probs')(inputs) attention_mul = merge([inputs, attention_probs], output_shape=32, name='attention_mul', mode='mul' 

Dans ce cas, la couche Input est déclarée dans la première ligne, puis vient une couche entièrement connectée avec la fonction d'activation softmax avec un nombre de neurones égal au nombre d'éléments dans la première couche. La troisième couche multiplie le résultat de la couche entièrement connectée par les données d'entrée élément par élément.

Vous trouverez ci-dessous toute la classe Attention, qui implémente un mécanisme d'auto-attention légèrement plus complexe, qui peut être utilisé comme un niveau à part entière dans le modèle; la classe hérite de la classe de couche Keras.

 # Attention class Attention(Layer): def __init__(self, step_dim, W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None, bias=True, **kwargs): self.supports_masking = True self.init = initializers.get('glorot_uniform') self.W_regularizer = regularizers.get(W_regularizer) self.b_regularizer = regularizers.get(b_regularizer) self.W_constraint = constraints.get(W_constraint) self.b_constraint = constraints.get(b_constraint) self.bias = bias self.step_dim = step_dim self.features_dim = 0 super(Attention, self).__init__(**kwargs) def build(self, input_shape): assert len(input_shape) == 3 self.W = self.add_weight((input_shape[-1],), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) self.features_dim = input_shape[-1] if self.bias: self.b = self.add_weight((input_shape[1],), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None self.built = True def compute_mask(self, input, input_mask=None): return None def call(self, x, mask=None): features_dim = self.features_dim step_dim = self.step_dim eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim)) if self.bias: eij += self.b eij = K.tanh(eij) a = K.exp(eij) if mask is not None: a *= K.cast(mask, K.floatx()) a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx()) a = K.expand_dims(a) weighted_input = x * a return K.sum(weighted_input, axis=1) def compute_output_shape(self, input_shape): return input_shape[0], self.features_dim 

Ici, nous voyons à peu près la même chose qui a été implémentée ci-dessus via la couche Keras entièrement connectée, uniquement exécutée via une logique plus profonde à un niveau inférieur. Un niveau paramétrique (self.W) est créé dans la fonction, qui est ensuite multiplié scalairement (K.dot) par le vecteur d'entrée. La logique câblée dans cette variante est un peu plus compliquée: décalage (si le paramètre de biais est divulgué), tangente hyperbolique, exposition, masque (si spécifié), normalisation sont appliquées au vecteur d'entrée fois self.W, puis le vecteur d'entrée est à nouveau pondéré par le résultat obtenu. Je n'ai pas de description de la logique posée dans cet exemple, je reproduis les opérations de lecture du code. Au fait, veuillez écrire dans les commentaires si vous reconnaissez une sorte de fonction mathématique de haut niveau dans cette logique.

La classe a un paramètre "biais" ie biais. Si le paramètre est activé, après avoir appliqué la couche Dense, le vecteur final sera ajouté au vecteur des paramètres de la couche «self.b», ce qui permettra non seulement de déterminer les «poids» pour notre fonction d'attention, mais aussi de décaler le niveau d'attention d'un nombre. Exemple de vie: nous avons peur des fantômes, mais nous ne les avons jamais rencontrés. Ainsi, nous faisons une correction pour la peur de -100 points. Autrement dit, seulement si la peur monte en puissance pour 100 points, nous prendrons des décisions sur la protection contre les fantômes, en appelant une agence anti-fantômes, en achetant des appareils répulsifs, etc.

Conclusion


Le mécanisme Attention a des variantes. L'option Attention la plus simple implémentée dans la classe ci-dessus est appelée Self-Attention. L'auto-attention est un mécanisme conçu pour traiter des données séquentielles, en tenant compte du contexte de chaque horodatage. Il est le plus souvent utilisé pour travailler avec des informations textuelles. L'implémentation de l'auto-attention peut être retirée de la boîte en important la bibliothèque keras-self-attention. Il existe d'autres variantes d'attention. En étudiant des matériaux en anglais, il a été possible de compter plus de 5 variantes.

En écrivant même cet article relativement court, j'ai étudié plus de 10 articles en anglais. Bien sûr, je n'ai pas pu télécharger toutes les données de tous ces articles en 5 pages, je viens de faire une compression afin de créer un «guide pour les nuls». Pour comprendre toutes les nuances du mécanisme Attention, vous avez besoin d'un livre de pages 150-200. J'espère vraiment que j'ai pu révéler l'essence de base de ce mécanisme afin que ceux qui commencent tout juste à comprendre l'apprentissage automatique comprennent comment tout cela fonctionne.

Les sources


  1. Mécanisme d'attention dans les réseaux neuronaux avec Keras
  2. Attention dans les réseaux profonds avec Keras
  3. Séquence à séquence basée sur l'attention dans Keras
  4. Classification de texte à l'aide du mécanisme d'attention dans Keras
  5. Attention omniprésente: réseaux de neurones convolutifs 2D pour la prédiction de séquence à séquence
  6. Comment implémenter la couche Attention dans Keras?
  7. Attention? Attention!
  8. Traduction automatique de neurones avec attention

Source: https://habr.com/ru/post/fr458992/


All Articles