Recherche de site Web

Une introduction aux réseaux de neurones récurrents et aux mathématiques qui les alimentent


Lorsqu'il s'agit de données séquentielles ou de séries chronologiques, les réseaux de rétroaction traditionnels ne peuvent pas être utilisés à des fins d'apprentissage et de prédiction. Un mécanisme est nécessaire pour conserver les informations passées ou historiques afin de prévoir les valeurs futures. Les réseaux de neurones récurrents, ou RNN en abrégé, sont une variante des réseaux de neurones artificiels à action directe conventionnels qui peuvent traiter des données séquentielles et peuvent être formés pour détenir des connaissances sur le passé.

Après avoir terminé ce tutoriel, vous saurez :

  • Réseaux de neurones récurrents
  • Qu'entend-on par déplier un RNN
  • Comment les poids sont mis à jour dans un RNN
  • Diverses architectures RNN

Démarrez votre projet avec mon livre Building Transformer Models with Attention. Il fournit des tutoriels d'auto-apprentissage avec du code fonctionnel pour vous guider dans la création d'un modèle de transformateur entièrement fonctionnel qui peut
traduire des phrases d'une langue à une autre
traduire des phrases d'une langue à une autre
...

Commençons.

Présentation du didacticiel

Ce didacticiel est divisé en deux parties ; ils sont:

  1. Le fonctionnement d'un RNN

    1. Se dérouler dans le temps
    2. Rétropropagation à travers l'algorithme temporel
  2. Différentes architectures et variantes RNN

Conditions préalables

Ce tutoriel suppose que vous êtes déjà familier avec les réseaux de neurones artificiels et l'algorithme de rétropropagation. Sinon, vous pouvez consulter ce très joli tutoriel, Calculus in Action : Neural Networks, de Stefania Cristina. Le didacticiel explique également comment un algorithme de rétropropagation basé sur le gradient est utilisé pour entraîner un réseau neuronal.

Qu'est-ce qu'un réseau neuronal récurrent

Un réseau neuronal récurrent (RNN) est un type spécial de réseau neuronal artificiel adapté pour fonctionner avec des données de séries chronologiques ou des données impliquant des séquences. Les réseaux de neurones à action directe ordinaires sont uniquement destinés aux points de données indépendants les uns des autres. Cependant, si nous avons des données dans une séquence telle qu'un point de données dépend du point de données précédent, nous devons modifier le réseau neuronal pour incorporer les dépendances entre ces points de données. Les RNN ont le concept de « mémoire » qui les aide à stocker les états ou les informations des entrées précédentes pour générer la sortie suivante de la séquence.

Déployer un réseau neuronal récurrent

Un RNN simple possède une boucle de rétroaction, comme le montre le premier diagramme de la figure ci-dessus. La boucle de rétroaction représentée dans le rectangle gris peut être déroulée en trois pas de temps pour produire le deuxième réseau de la figure ci-dessus. Bien sûr, vous pouvez varier l'architecture pour que le réseau déroule des pas de temps de k$. Sur la figure, la notation suivante est utilisée :

  • $x_t \in R$est l'entrée au pas de temps $t$. Pour simplifier les choses, nous supposons que $x_t$est une valeur scalaire avec une seule fonctionnalité. Vous pouvez étendre cette idée à un vecteur de caractéristiques dimensionnelles $d$.
  • $y_t \in R$est la sortie du réseau au pas de temps $t$. Nous pouvons produire plusieurs sorties dans le réseau, mais pour cet exemple, nous supposons qu'il y a une seule sortie.
  • Le vecteur $h_t \in R^m$stocke les valeurs des unités/états cachés au temps $t$. C'est ce qu'on appelle aussi le contexte actuel. $m$est le nombre d'unités cachées. Le vecteur $h_0$est initialisé à zéro.
  • $w_x \in R^{m}$sont des poids associés aux entrées de la couche récurrente
  • $w_h \in R^{mxm}$sont des poids associés aux unités cachées dans la couche récurrente
  • $w_y \in R^m$sont des poids associés aux unités cachées pour produire des unités
  • $b_h \in R^m$est le biais associé à la couche récurrente
  • $b_y \in R$est le biais associé à la couche feedforward

À chaque pas de temps, nous pouvons déplier le réseau sur des pas de temps de $k$pour obtenir la sortie au pas de temps de $k+1$. Le réseau déplié est très similaire au réseau neuronal feedforward. Le rectangle dans le réseau déplié montre une opération en cours. Ainsi, par exemple, avec une fonction d'activation f :

La sortie $y$au temps $t$est calculée comme :

$$
y_{t}=f(h_t, w_y)=f(w_y \cdot h_t + b_y)
$$

Ici, $\cdot$est le produit scalaire.

Par conséquent, dans la passe anticipative d'un RNN, le réseau calcule les valeurs des unités cachées et la sortie après $k$pas de temps. Les poids associés au réseau sont partagés temporellement. Chaque couche récurrente possède deux ensembles de poids : un pour l'entrée et le second pour l'unité cachée. La dernière couche de rétroaction, qui calcule la sortie finale pour le kième pas de temps, est comme une couche ordinaire d'un réseau de rétroaction traditionnel.

La fonction d'activation

Nous pouvons utiliser n'importe quelle fonction d'activation que nous aimons dans le réseau neuronal récurrent. Les choix courants sont :

  • Fonction sigmoïde : $\frac{1}{1+e^{-x}}$
  • Fonction Tanh : $\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}$
  • Fonction Relu : max$ (0,x)$

Formation d'un réseau neuronal récurrent

L'algorithme de rétropropagation d'un réseau neuronal artificiel est modifié pour inclure le déploiement dans le temps afin d'entraîner les poids du réseau. Cet algorithme est basé sur le calcul du vecteur gradient et est appelé rétropropagation dans le temps ou algorithme BPTT en abrégé. Le pseudo-code de la formation est donné ci-dessous. La valeur de $k$peut être sélectionnée par l'utilisateur pour la formation. Dans le pseudo-code ci-dessous, $p_t$ est la valeur cible au pas de temps t :

  1. Répétez jusqu'à ce que le critère d'arrêt soit rempli :

    1. Mettez tous les $h$à zéro.
    2. Répétez pour t=0 à n-k

      1. Propagation avant du réseau sur le réseau déplié pendant $k$pas de temps pour calculer tous les $h$et $y$
      2. Calculez l'erreur comme suit : $e=y_{t+k}-p_{t+k}$
      3. Rétropropager l'erreur sur le réseau déplié et mettre à jour les poids

Types de RNN

Il existe différents types de réseaux de neurones récurrents avec des architectures variables. Voici quelques exemples :

Un à Un

Ici, il y a une seule paire $ (x_t, y_t)$. Les réseaux de neurones traditionnels utilisent une architecture un-à-un.

Un à plusieurs

Dans les réseaux un-à-plusieurs, une seule entrée à $x_t$peut produire plusieurs sorties, par exemple $ (y_{t0}, y_{t1}, y_{t2})$. La génération musicale est un exemple de domaine dans lequel des réseaux un-à-plusieurs sont utilisés.

Plusieurs contre un

Dans ce cas, de nombreuses entrées provenant de différents pas de temps produisent une seule sortie. Par exemple, $ (x_t, x_{t+1}, x_{t+2})$peut produire une seule sortie $y_t$. De tels réseaux sont utilisés dans l'analyse des sentiments ou la détection des émotions, où l'étiquette de classe dépend d'une séquence de mots.

Plusieurs à plusieurs

Il existe de nombreuses possibilités pour plusieurs à plusieurs. Un exemple est présenté ci-dessus, où deux entrées produisent trois sorties. Les réseaux plusieurs-à-plusieurs sont appliqués à la traduction automatique, par exemple les systèmes de traduction de l'anglais vers le français ou vice versa.

Avantages et inconvénients des RNN

Les RNN présentent divers avantages, tels que :

  • Capacité à gérer les données de séquence
  • Capacité à gérer des entrées de différentes longueurs
  • Possibilité de stocker ou de « mémoriser » des informations historiques

Les inconvénients sont :

  • Le calcul peut être très lent.
  • Le réseau ne prend pas en compte les apports futurs pour prendre des décisions.
  • Problème de gradient de disparition, où les gradients utilisés pour calculer la mise à jour des poids peuvent être très proches de zéro, empêchant le réseau d'apprendre de nouveaux poids. Plus le réseau est profond, plus ce problème est prononcé.

Différentes architectures RNN

Il existe différentes variantes de RNN qui sont appliquées pratiquement aux problèmes d'apprentissage automatique :

Réseaux de neurones récurrents bidirectionnels (BRNN)

Dans BRNN, les entrées des pas de temps futurs sont utilisées pour améliorer la précision du réseau. C'est comme connaître le premier et le dernier mot d'une phrase pour prédire les mots du milieu.

Unités récurrentes fermées (GRU)

Ces réseaux sont conçus pour résoudre le problème du gradient de disparition. Ils ont une porte de réinitialisation et de mise à jour. Ces portes déterminent quelles informations doivent être conservées pour les prédictions futures.

Mémoire à long terme (LSTM)

Les LSTM ont également été conçus pour résoudre le problème du gradient de disparition dans les RNN. Les LSTM utilisent trois portes appelées porte d'entrée, de sortie et d'oubli. Semblables au GRU, ces portes déterminent les informations à conserver.

Lectures complémentaires

Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.

Livres

  • Les essentiels du Deep Learning par Wei Di, Anurag Bhardwaj et Jianing Wei.
  • Apprentissage profond par Ian Goodfellow, Joshua Bengio et Aaron Courville.

Articles

  • Article Wikipédia sur le BPTT
  • Une visite guidée des algorithmes de réseaux neuronaux récurrents pour l'apprentissage profond
  • Une introduction douce à la rétropropagation dans le temps

Résumé

Dans ce tutoriel, vous avez découvert les réseaux de neurones récurrents et leurs différentes architectures.

Concrètement, vous avez appris :

  • Comment un réseau neuronal récurrent gère les données séquentielles
  • Déploiement dans le temps dans un réseau neuronal récurrent
  • Qu'est-ce que la rétropropagation dans le temps
  • Avantages et inconvénients des RNN
  • Diverses architectures et variantes de RNN

Avez-vous des questions sur les RNN abordées dans cet article ? Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.

Articles connexes