• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 14/11/2019

Initiez-vous aux autoencodeurs

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans ce chapitre, nous allons comprendre l’architecture et quelques applications des autoencodeurs. Ensuite nous allons apprendre à différencier un réseau standard et un réseau profond. Finalement, nous allons identifier les contraintes liées aux réseaux profonds et savoir utiliser des AE pour les construire. $\(\newcommand{\abbva}{\texttt{v.a.}} \newcommand{\abbea}{\texttt{e.a.}} \newcommand{\abbddp}{\texttt{d.d.p.}} \newcommand{\vaX}{\mathrm{X}} \newcommand{\vaY}{\mathrm{Y}} \newcommand{\msR}{\mathbb{R}} \newcommand{\sH}{\mathcal{H}} \newcommand{\sV}{\mathcal{V}} \newcommand{\sW}{\mathcal{W}} \newcommand{\sX}{\mathcal{X}} \newcommand{\sY}{\mathcal{Y}} \newcommand{\sZ}{\mathcal{Z}} \newcommand{\va}{\mathbf{a}} \newcommand{\vb}{\mathbf{b}} \newcommand{\ve}{\mathbf{e}} \newcommand{\vf}{\mathbf{f}} \newcommand{\vg}{\mathbf{g}} \newcommand{\vh}{\mathbf{h}} \newcommand{\vm}{\mathbf{m}} \newcommand{\vq}{\mathbf{q}} \newcommand{\vr}{\mathbf{r}} \newcommand{\vu}{\mathbf{u}} \newcommand{\vv}{\mathbf{v}} \newcommand{\vw}{\mathbf{w}} \newcommand{\vx}{\mathbf{x}} \newcommand{\vy}{\mathbf{y}} \newcommand{\vz}{\mathbf{z}} \newcommand{\valpha}{\boldsymbol{\alpha}} \newcommand{\vze}{{\Pi}} \newcommand{\mA}{\mathbf{A}} \newcommand{\mB}{\mathbf{B}} \newcommand{\mC}{\mathbf{C}} \newcommand{\mF}{\mathbf{F}} \newcommand{\mG}{\mathbf{G}} \newcommand{\mH}{\mathbf{H}} \newcommand{\mQ}{\mathbf{Q}} \newcommand{\mR}{\mathbf{R}} \newcommand{\mP}{\mathbf{P}} \newcommand{\mS}{\mathbf{S}} \newcommand{\mK}{\mathbf{K}} \newcommand{\norml}{\mathcal{N}} \newcommand{\normc}{\boldsymbol{\mu}} \newcommand{\norms}{\boldsymbol{\Sigma}} \newcommand{\normf}{f_{\mathcal{N}}} \newcommand{\dyncolor}[1]{ {\color{magenta!50!black} #1 }} \newcommand{\obscolor}[1]{ {\color{yellow!50!black} #1 } } \newcommand{\priorcolor}[1]{ {\color{blue!50!black} #1 } } \DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\mmax}{max} \DeclareMathOperator*{\argmin}{arg\,min} \DeclareMathOperator*{\mmin}{min} \DeclareMathOperator*{\msup}{sup} \DeclareMathOperator*{\minf}{inf}\)$ 

Dans cette partie, nous allons observer un type de réseaux adaptés à une tâche d'apprentissage non supervisée.

Nous sommes en apprentissage non supervisé ; nous ne traiterons donc que des caractéristiques $\(\vx\)$ d'un exemple, et nous n'avons pas accès à son étiquette $\(\vy\)$, si elle existe.

Nous allons essayer de faire de la réduction de dimension, c'est-à-dire projeter une base d'exemples de grande dimension dans un espace de plus petite dimension. Par exemple, pour en faire une visualisation.

Prenons comme illustration les imagettes de chiffres de la base MNIST.

Dans le SPOC d'Initiation au Machine Learning, vous avez vu comment les représenter en 2D grâce à de l'analyse en composante principale (ACP). Voilà ce que cela donne sur MNIST :

Projection des chiffres de la base MNIST en 2D grâce à un ACP
Projection des chiffres de la base MNIST en 2D grâce à une ACP

 

Architecture diabolo

Pour ce faire, nous pouvons utiliser l'architecture suivante :

Architecture Diabolo simple avec une couche pour l'encodeur et une couche pour le décodeur
Architecture diabolo simple, avec une couche pour l'encodeur et une couche pour le décodeur

On appelle cela une architecture diabolo, car elle prend la forme de l'instrument de jonglage dit diabolo. En effet, elle possède un centre resserré, avec des entrées et des sorties élargies.

Compression/décompression de données

Cette architecture peut être décomposée en deux parties :

  • un encodeur qui prend les données en grande dimension et les compresse vers une plus petite dimension :

La parite Encodeur d'un réseau diabolo
La partie Encodeur d'un réseau diabolo

 

  • un décodeur qui prend les données en petite dimension et les rétroprojette vers la plus grande dimension :

La partie Décodeur d'un réseau diabolo
La partie Décodeur d'un réseau diabolo

La valeur centrale $\(\vh\)$ est appelée le code ; elle est censée contenir l'information de l'entrée de manière compressée. Ainsi, on appelle aussi un diabolo un auto encodeur (AE). Pour simplifier les illustrations, nous ne montrons ici que des réseaux diabolos à deux couches : une pour l'encodeur, une pour le décodeur. Cependant, chacune de ces parties peut avoir un nombre de couches quelconque.

Apprentissage autoencoder

L'apprentissage de l'autoencodeur (autoencoder en anglais) se fait par rétropropagation du gradient. Il s'agit tout simplement d'un réseau dont la cible est l'entrée elle-même.

L'apprentissage d'un réseau diabolo
L'apprentissage d'un réseau diabolo

 

Under/over complete

En fait, il existe deux types d'autoencodeur :

  • les under-complete sont ceux dont les unités centrales sont en plus petit nombre que les unités d'entrée ; ils effectuent une réduction de dimension, comme vu précédemment ;

    Un exemple de réseau under-complete
    Un exemple de réseau under-complete
  •  les over-complete sont ceux dont les unités centrales sont en plus grand nombre que les unités d'entrée ; ils cherchent, eux, une meilleure représentation des données pour un traitement ultérieur (cela correspond à la projection dans une plus grande dimension des SVM) .

    Un exemple de réseau over-complete
    Un exemple de réseau over-complete

Nous constatons que chacun a ses particularités d'apprentissage.

Débruitage avec les autoencodeurs (under-complete)

On peut améliorer l'apprentissage des AE under-complete en rajoutant des perturbations à l'entrée (comme du bruit, mais aussi comme des transformations).

Apprendre un réseau under-complete en ajoutant de la perturbation
Apprendre un réseau under-complete en ajoutant de la perturbation

 

En fait, cela revient à faire de la régularisation.

Prévenir la coadaptation sur les autoencodeurs (over-complete)

Pour les autoencodeurs over-complete, l'apprentissage est plus complexe. On peut vite tomber sur des solutions triviales où le réseau se contente de recopier l'information de couche en couche. Pour éviter cela, on va déconnecter aléatoirement des neurones de la représentation intermédiaire.

Apprendre un réseau over-complete en déconnectant des neurones
Apprendre un réseau over-complete en déconnectant des neurones

 

Exemple sur une base de caractères

Voici un exemple sur la base de caractères MNIST :

Projection 2D grâce à un Auto-Encodeur
Projection 2D grâce à un autoencodeur
Poids de la couche de l'encodeur
Poids de la couche de l'encodeur

Que voit-on ?

Le réseau a appris des filtres typiques pour qualifier les caractères.
Ce qui correspond à de l'extraction de caractéristiques. Cependant, cette extraction n'a pas été fixée à la main à l'avance par des connaissances a priori, mais apprise/adaptée à la base fournie grâce à l'apprentissage de l'AE.

Ne serait-il pas intéressant d'utiliser cette propriété aussi pour l'apprentissage supervisé ?

Cela s'appelle l'apprentissage profond, ou deep learning en anglais.

Réseaux profonds (données brutes vs caractéristiques)

Dans un apprentissage supervisé classique, on extrait d'abord des caractéristiques des données brutes (comme par exemple un histogramme sur une image), puis on passe ces caractéristiques à un classifieur :

Apprentissage classique
Apprentissage classique

Seule la dernière phase est apprise de façon supervisée ; l'extraction de caractéristiques est statique.

Dans un apprentissage profond, on va directement travailler sur les données brutes. La phase d'extraction des caractéristiques est elle aussi apprise, et n'est plus statique.

Apprentissage profond
Apprentissage profond

Exemple de construction de réseaux profonds grâce aux autoencodeurs

On peut d'abord apprendre un autoencodeur sur une base de caractères.

Premier auto-encodeur
Premier autoencodeur

On garde l'encodeur comme première couche d'un réseau PMC classique, et on fixe ses paramètres.

Encodeur du premier AE
Encodeur du premier AE

On dit que la première couche du réseau a été préentraînée de manière non supervisée. On prend la sortie de l'encodeur et on l'apprend dans un nouvel autoencodeur.

Pré-apprentissage de la seconde couche
Préapprentissage de la seconde couche

Et ainsi de suite...

Pré-apprentissage de la troisième couche
Préapprentissage de la troisième couche

On finit l'apprentissage de toutes les couches (y compris la première) par un apprentissage supervisé classique appelé fine-tuning.

Apprentissage final ou Fine tuning
Apprentissage final, ou fine-tuning

 

On peut multiplier les couches préapprises et les couches du PMC pour des problèmes de grandes dimensions. On appelle alors le réseau de neurones un réseau de neurones profond ou Deep Neural Network (DNN).

Problématique du gradient évanescent liée aux réseaux profonds

En effet, lorsque les unités des couches supérieures sont saturées, peu de gradient est transmis aux couches précédentes. Par exemple, pour la fonction tanh en dessous de -4 et au-dessus de +4, le gradient est très faible :

La fonction de transfert tanh
La fonction de transfert tanh

 

Plus il y a de couches, plus ce phénomène, appelé gradient évanescent ou vanishing gradient, est problématique.

Comment passer outre ? notamment dans le cadre du traitement des images ?

Nous allons le voir au prochain chapitre.

Allez plus loin

LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324.

Bourlard, H., & Kamp, Y. (1988). Auto-association by multilayer perceptrons and singular value decomposition. Biological cybernetics, 59(4-5), 291-294.

Vincent, P., Larochelle, H., Lajoie, I., Bengio, Y., & Manzagol, P. A. (2010). Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion. Journal of machine learning research, 11(Dec), 3371-3408.

En résumé

Nous avons vu dans ce chapitre une forme spéciale de réseau de neurones en couches appelée autoencodeur, ou réseau diabolo. Elle est premièrement adaptée à une tâche d'apprentissage non supervisé, comme la réduction de dimension. Cependant, elle effectue ainsi une extraction de caractéristiques. Nous utilisons cette propriété dans l'apprentissage profond, un type d'apprentissage où le réseau de neurones attaque directement les données brutes et réalise lui-même l'extraction de caractéristiques. Cependant, il est difficile d'apprendre un tel réseau à cause du gradient évanescent.

Exemple de certificat de réussite
Exemple de certificat de réussite