Variational AutoEncoder

Variational AutoEncoder

2017-03-08T00:00+02:00

Si vous vous intéressez aux modèles générationnels (par exemple les GANS dont nous parlions plus tôt), vous aurez nécessairement vu passer le VAE (Variationnal Autoencoder) qui reste une alternative importante aux GANs. Le sujet a apporté une approche novatrice de la compréhension et génération de données par les réseaux de neurones en reliant ces concepts à l'inférence variationnelle, un des champs de bataille les plus actifs des statisticiens aujourd'hui.

L'objet de ce billet est de présenter les VAEs au lecteur en essayant d'être le moins "mathématique" possible, tout en explicitant au mieux les grandes idées sous-jacentes. Dès lors :

  • Si vous avez déjà un niveau correct en mathématiques, nous vous conseillons directement la publication originale Auto-Encoding Variational Bayes - Diederik P Kingma et Max Welling(https://arxiv.org/abs/1312.6114) ou tout du moins ce tutoriel un peu moins obscur Tutorial on Variational Autoencoders - Carl Doersch(https://arxiv.org/abs/1606.05908)
  • Le texte ci-dessous présentera des approximations nécessaires au regard de la vérité mathématique. Si vous êtes témoin d'une équation ou d'un principe mathématique trop maltraité, n'hésitez pas à nous le signaler par le formulaire de contact.

1 - Densités de probabilités et inférence variationnelle.

Densités de probabilités

blog vae 1 psd

  • En introduction, il est nécessaire d'aborder le concept de densité de probabilité qui sous-tendra l'ensemble des explications suivantes. Une densité de probabilité est (à peu près) un outil mathématique représentant un sous-ensemble de données et la façon dont il est distribué dans un ensemble plus large. Prenons l'exemple d'images, et imaginons que nous travaillons uniquement sur des images noir et blanc faisant 32 pixels de haut et 32 pixels de large. Une telle image est donc définie exactement par 32*32 pixels = 1024 pixels. Si on imagine que chaque pixel choisit sa couleur parmi 256 niveaux de gris différent, on voit donc qu'il existe (1024 à la puissance 256) images possibles différentes au total.

(1024^256 donne donc 4,3*10^770 possibilités. À ce stade, limitons-nous en disant qu'il y a donc plus d'image possible de 32 par 32 pixels que d'atomes dans l'univers).

Nous avons donc là l'ensemble de toutes les images possibles. Maintenant, imaginons que nous travaillons sur un petit sous-ensemble : les images sur lesquelles apparaissent un visage vu de face, quel qu'il soit. S'il existe un énorme nombre de possibilités de telles images, ce nombre reste infiniment plus petit que le nombre de possibilités totales. À ce titre, si nous décidons donc d'étudier l'ensemble de ces portraits, nous aurions besoin de comprendre leur distribution de probabilité, soit, un outil mathématique permettant de voir "où" se trouvent ces portraits dans l'espace de toutes les images possibles, comment ils sont repartis entre eux, etc. Cet outil permet ainsi de générer de nouveaux visages, de définir pour toute image si celle-ci est un visage ou non, etc.

Connaître une densité de probabilité est donc un objectif important pour tout Data Scientist désirant étudier une donnée. Il s'agit même d'un "Graal" qui sera régulièrement, sous sa forme la plus pure, parfaitement inconnu, mais que nous arriverons en revanche à plus ou moins bien approximer.

Variables latentes

Restons sur notre exemple d'images et de visages pour expliquer ce que nous entendons par "variable latente". Nous voulons avoir une compréhension la plus efficace possible sur la répartition de nos images de visage parmi l'ensemble de toutes les images possibles. Hors, nous avons vu plus haut qu'une telle image est déjà une variable complexe : elle est définie par 1024 pixels, chacun prenant une valeur différente. On parle de variable mathématique ayant 1024 dimensions, ce qui est énorme (pour rappel, nous agissons tous les jours avec plus ou moins de succès dans un univers à trois dimensions). Avoir autant de dimensions rend très difficile tout travail global sur ces variables.

Nous avons donc comme objectif de définir ces données comme étant le résultat de la transformation mathématique connue (et donc, relativement simple) d'une variable beaucoup plus simple que l'on appellera "variable latente". Ainsi, nous n'avons plus besoin que de comprendre et maîtriser ces variables plus simples tout en connaissant la transformation mathématique qu'on leur appliquera.

blog vae 2 latentvariable(https://arxiv.org/abs/1606.05908)

Découvrir de telles variables est souvent un objectif important. Celles-ci sont beaucoup plus faciles à visualiser, à comprendre et à manipuler. Pour l'exemple des visages, de nombreux travaux ont permis d'exprimer des variables latentes ayant beaucoup plus de sens que la simple couleur de chaque pixel, par exemple : l'expression de la bouche (sourires, bouche ouverte, ....), le sexe, la présence de lunettes, etc.

blog vae animatedfaces(https://github.com/zo7/deconvfaces)

Inférence variationnelle

Nous arrivons là à la limite de l'exercice de vulgarisation que nous nous étions fixé... L'inférence variationnelle est une branche des statistiques où l'objectif est de trouver, par rapport à un ensemble de données, une meilleure expression de cette donnée, en l'exprimant comme le résultat de la transformation de variables latentes. L'objectif est ainsi d'exprimer ce que l'on appelle l'ELBO (Estimated Lower Bound). En optimisant cette valeur, on arrive à générer des approximations de plus en plus valable de la transformation nécessaire comme de l'espace latent utilisé. Ce champs de recherche est très actif en ce moment et connaît de nombreuses propositions chaque mois, et pour une revue à jour, nous vous conseillons : Variational Inference: A Review for Statisticians - David M. Blei Alp Kucukelbir Jon D. McAuliffe(https://arxiv.org/abs/1601.00670)

2. V.A.E.

Il existe de nombreuses manières de présenter le VAE, et il est assez difficile d'en choisir une meilleure. Nous présenterons dans un premier temps ce qu'est un auto-encoder (AE) et ses limites, pour ensuite préciser ce qui différencie un VAE d'un AE et enfin faire un court approfondissement mathématique sur le "reparameterization trick"

Auto-encoders

blog vae 4 ae

L'Auto-encoder peut être présenté comme un réseau de neurones classique à trois couches dans sa forme la plus simple, avec une couche d'entrée, une couche intermédiaire et une couche de sortie. Le point d'attention est que la couche intermédiaire contient beaucoup moins de neurones que l'entrée et la sortie qui elles, sont identiques. L'entrainement consiste à faire apprendre au réseau à reproduire ce qu'il voit en entrée. Tout l'intérêt est que ce processus va forcer le réseau à créer, au niveau de sa couche intermédiaire, un système de représentation de l'information qui, parce qu'il a beaucoup moins de neurones, sera "naturellement" moins complexe que la donnée originale.

Cet outil est donc intéressant dans notre quête de variables latentes, mais fondamentalement limité par la nature "brute" (opposée à ce que peut être l'inférence variationnelle) de son apprentissage. Un AE apprendra facilement à générer quelques échantillons de la donnée uniquement et à se bloquer dans ce fonctionnement, ce qui implique que le réseau n'a pas appris à recouvrir l'ensemble de la distribution étudiée.

Variational Auto Encoders

blog vae 5 vae(http://kvfrans.com/variational-autoencoders-explained)

Le VAE est apparu dans la publication Auto-Encoding Variational Bayes - Diederik P Kingma et Max Welling(https://arxiv.org/abs/1312.6114), où reprenant le principe de l'inférence variationnelle, les auteurs veulent découvrir un espace latent permettant d'expliciter la distribution d'une donnée. On peut représenter cette démarche (dans la ligne de l'excellent tutoriel https://jaan.io/what-is-variational-autoencoder-vae-tutorial/(https://jaan.io/what-is-variational-autoencoder-vae-tutorial/])) de deux manières différentes : celle de l'architecture de réseaux et la manière probabiliste.</p><p>Du point de vue de l'architecture de réseaux, un VAE est consitué de deux réseaux à la manière d'un AE, un Encodeur et un Decodeur :

  • L'encodeur prend en entrée la donnée que nous analysons et doit apprendre à générer la variable latente.
  • Le décodeur prend en entrée la variable latente et doit apprendre à re-générer la donnée à partir de celle-ci.

Les différences avec l'autoencoder apparaissent donc son entrainement. Déjà car il vise à optimiser l'ELBO de la distribution de probabilité, mais aussi dans la mesure où il impose une "forme" à la distribution des variables latentes (un prior pour les Bayesiens, DA loves you). Cette "forme" force la variable latente à ne pas se recroqueviller à la manière d'un AE classique, mais justement à acquérir une certaine "expressivité". Il s'agit, dans le cas classique, d'une gaussienne.

Plus précisément, l'encodeur du VAE génèrera non pas la variable latente directement, mais une moyenne et une variance qui seront elles utilisées pour générer cette variable latente. L'encodeur a donc pour objet de générer des paramètres, ceux de la distribution de la variable latente. On note que ces paramètres changeront pour chaque donnée en entrée. Cette vision rejoint la deuxième approche présente dans le tutoriel cité ci-dessus, l'approche probabiliste.

Reparameterization trick

Ce point est beaucoup plus technique, mais doit être signalé dans la mesure où il s'agit d'un des apports les plus importants issus de la publication originelle. En effet, en l'état, suivant ce qui a été dit plus haut, l'encodeur ne génère pas directement la variable latente, mais les paramètres d'une distribution à partir de laquelle nous échantillerons la variable latente. Hors, pour qu'un réseau de neurone puisse être soumis à un quelconque apprentissage, il est indispensable de pouvoir différencier (dériver) chaque paramètre du réseau. Hors, différencier ce processus d'échantillonage est en soi impossible.

<img src="/data/img/blog_vae_6_paramtrick.jpg" alt="Tutorial on VAE" >

L'idée est donc de modifier ce processus, et de considérer que la variable latente sera maintenant issue d'une distribution de probabilité fixe (qui n'évoluera jamais au cours de l'apprentissage) à laquelle on appliquera une fonction déterministe qui, elle, sera paramétrée et donc soumise au processus d'apprentissage. Cette séparation permet à l'encodeur de toujours pouvoir générer une moyenne et une variance définissant la variable latente, mais de façon à pouvoir faire évoluer les paramètres de cet encodeur au cours de l'apprentissage. Au delà du schéma ci-dessous, nous vous conseillons l'excellent Tutorial on Variational Autoencoders de Carl Doersch pour aller plus loin

3. VAE aujourd'hui ( Versus GANs)

Les VAEs sont aujourd'hui souvent mis en concurrence avec les Generative Adversarial Networks. Pour reprendre l'analyse de Goodfellow dans son tutoriel NIPS 2016, les VAEs offrent une compréhension mathématique plus fine du problème, mais ont des résultats pratiques (notamment sur l'image) plus décevants, avec des images plus floues. Une raison souvent avancée est que le fait que le prior soit gaussien au sein d'un VAE limite beaucoup plus son apprentissage. Néanmoins, les VAEs restent un élément central souvent utilisé comme référence.

Une publication récente propose de relier VAEs et GANs dans une même architecture. Nous n'avons pas encore pu tester ou confirmer ses résultats, mais en première lecture, elle présente une approche très intéressante : Adversarial Variational Bayes: Unifying Variational Autoencoders and Generative Adversarial Networks par Lars Mescheder - Sebastian Nowozin - Andreas Geiger