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

Actualités de de l'Intelligence Artificielle - Machine Learning - Objets connectés

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 anticipatifs traditionnels ne peuvent pas être utilisés pour l’apprentissage et la prédiction. Il faut un mécanisme capable de conserver des informations passées ou historiques pour 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 conventionnels qui peuvent traiter des données séquentielles et peuvent être entraînés à conserver les 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

Commençons.

Une introduction aux réseaux de neurones récurrents et aux mathématiques qui les alimentent. Photo de Mehreen Saeed, certains droits réservés.

Présentation du didacticiel

Ce tutoriel est divisé en deux parties ; elles sont:

  1. Le fonctionnement d’un RNN
    1. Se dérouler dans le temps
    2. Algorithme de rétropropagation dans le temps
  2. Différentes architectures et variantes RNN

Conditions préalables

Pour ce didacticiel, nous partons du principe que vous êtes déjà familiarisé avec les réseaux de neurones artificiels et l’algorithme de rétro-propagation. Sinon, vous pouvez parcourir ce très joli tutoriel Calculus in Action: Neural Networks par Stefania Cristina. Le didacticiel explique également comment l’algorithme de rétropropagation basé sur le gradient est utilisé pour entraîner un réseau de neurones.

Qu’est-ce qu’un réseau de neurones récurrents

Un réseau de neurones récurrents (RNN) est un type spécial de réseau de neurones artificiels adapté pour fonctionner pour des données de séries chronologiques ou des données impliquant des séquences. Les réseaux de neurones à action directe ordinaires ne sont destinés qu’aux points de données, qui sont 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 de neurones 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

Réseau de neurones récurrent.  Représentation compressée (en haut), réseau déplié (en bas).

Réseau de neurones récurrent. Représentation compressée (en haut), réseau déplié (en bas).

Un RNN simple a 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 3 pas de temps pour produire le deuxième réseau de la figure ci-dessus. Bien entendu, vous pouvez varier l’architecture pour que le réseau déroule $k$ pas de temps. Dans 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 caractéristique. Vous pouvez étendre cette idée à un vecteur de caractéristiques $d$-dimensionnel.
  • $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 n’y a qu’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 dans 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 masquées en sortie
  • $b_h in R^m$ est le biais associé à la couche récurrente
  • $b_y in R$ est le biais associé à la couche feedforward

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

$$h_{t+1} = f(x_t, h_t, w_x, w_h, b_h) = f(w_{x} x_t + w_{h} h_t + b_h)$$

La sortie $y$ à l’instant $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 d’anticipation 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 a deux ensembles de poids ; un pour l’entrée et le second pour l’unité cachée. La dernière couche feedforward, qui calcule la sortie finale pour le kième pas de temps, est comme une couche ordinaire d’un réseau feedforward 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)$

Former un réseau de neurones récurrents

L’algorithme de rétropropagation d’un réseau de neurones artificiels est modifié pour inclure le déroulement dans le temps pour former les poids du réseau. Cet algorithme est basé sur le calcul du vecteur de gradient et est appelé rétropropagation dans le temps ou algorithme BPTT en abrégé. Le pseudo-code pour 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 satisfait :
    1. Mettez tous les $h$ à zéro.
    2. Répétez pour t = 0 à nk
      1. Propagation vers l’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étropropagez l’erreur sur le réseau déplié et mettez à jour les pondérations.

Types de RNN

Il existe différents types de réseaux de neurones récurrents avec des architectures différentes. Quelques exemples sont:

Un par 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 un à plusieurs réseaux, une seule entrée à $x_t$ peut produire plusieurs sorties, par exemple, $(y_{t0}, y_{t1}, y_{t2})$. La génération de musique est un exemple de domaine, où un à plusieurs réseaux sont utilisés.

Plusieurs à un

Dans ce cas, de nombreuses entrées 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 montré ci-dessus, où deux entrées produisent trois sorties. De nombreux réseaux sont appliqués à la traduction automatique, par exemple les systèmes de traduction anglais-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 longueurs variables.
  • Capacité 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 intrants futurs pour prendre des décisions.
  • Problème de gradient de fuite, où les gradients utilisés pour calculer la mise à jour du poids peuvent devenir 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 dans la pratique 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 avoir connaissance du premier et du 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 gérer le problème du gradient de fuite. 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 court terme (LSTM)

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

Lectures complémentaires

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

Livres

Des articles

Sommaire

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 de neurones récurrent gère les données séquentielles
  • Se dérouler dans le temps dans un réseau de neurones récurrent
  • Qu’est-ce que la rétro-propagation dans le temps
  • Avantages et inconvénients des RNN
  • Diverses architectures et variantes de RNN

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