Deep-Learning, Master AIC

By Alexandre Allauzen

Cours fait avec Michèle Sebag. Ce site contient les infos sur ma (première) partie.

1 Cours 1 : 03/10, double séance 3h sur les bases du deep-learning

Pour les premiers cours, nous nous appuierons sur le cours en ligne de Hugo Larochelle. La page officielle du cours est : http://www.dmi.usherb.ca/~larocheh/cours/ift725_A2014/contenu.html

Les vidéos associées sont accessibles via YouTube: https://www.youtube.com/playlist?list=PL6Xpj9I5qXYEcOhn7TqghAJ6NAPrNmUBH

Pour la première séance, il est demandé de suivre AVANT les vidéos numérotées de 1.1 (Artificial neuron) à 2.3 (output layer gradient). Le travail à faire est donc d'avoir suivit ces cours: regarder et prendre des notes comme pour un cours "habituel". La séance du 03/10 partira du principe que ces vidéos ont été visionnées et sera dédiée à vos questions et à des exercices.

Bon visionnage !

2 TP 1 : 09/10, premier pas

Le TP est diponible via un notebook sur le drive habituel (rappel du lien). Pour simplifier les choses, un module python l'accompagne et il concerne le chargement des données.

3 Cours 2 : 10/10

  • Faire les exercices qui sont à la fin des slides
  • Finir de voir les vidéos jusqu'à la 2.11.

4 TP2 : le 16/10, 1 couche cachée et back-prop

On poursuit le TP précédent en ajoutant une couche cachée et implémenter la back-prop.

4.1 Récapitulation du TP1: sans couche cachée

Les fonctions écrites:

  • init : initialisation des paramètres (\(\mathbf{W},\mathbf{b}\))
  • forward : à partir d'une entrée \(\mathbf{x}\) calcul \(\mathbf{a}=\mathbf{W}\mathbf{x}+\mathbf{b}\)
  • softmax : calcul la version stable du softmax
  • grad-out : calcul le gradient de la fonction de perte par rapport à la pré-activation de sortie, soit

\[\mathbf{\delta} = \frac{\partial \mathcal{L}}{\partial \mathbf{a}}.\]

La mise à jour des paramètres se calcul alors à partir de \(\mathbf{\delta}\).

4.2 TP2: avec une couche cachée

Avec l'ajout d'une couche cachée, nous allons décomposer le calcul en plusieurs étapes. Pour la propagation forward

  • \(\mathbf{a^{(1)}}=\mathbf{W^{(1)}}\mathbf{x}+\mathbf{b^{(1)}}\)
  • \(\mathbf{y^{(1)}}=f^{(1)}(\mathbf{a^{(1)}})\)
  • \(\mathbf{a^{(2)}}=\mathbf{W^{(2)}}\mathbf{y}^{(1)}+\mathbf{b^{(2)}}\)
  • \(\mathbf{y^{(2)}}=f^{(2)}(\mathbf{a^{(2)}})\)

Nous savons calculer le gradient de l'erreur par rapport à la couche de sortie. Il faut maintenant propager le gradient de sortie jusqu'à la couche cachée:

\[ \mathbf{\delta^{(1)}} = \frac{\partial \mathcal{L}}{\partial \mathbf{a^{(1)}}} = \frac{\partial \mathcal{L}}{\partial\mathbf{a^{(2)}}} \frac{\partial \mathbf{a^{(2)}}}{\partial\mathbf{y^{(1)}}} \frac{\partial \mathbf{y^{(1)}}}{\partial\mathbf{a^{(1)}}} = \mathbf{\delta^{(1)}} \frac{\partial \mathbf{a^{(2)}}}{\partial\mathbf{y^{(1)}}} \frac{\partial \mathbf{y^{(1)}}}{\partial\mathbf{a^{(1)}}} \]

Ainsi il faut implémenter les deux dérivées partielles "nouvelles". Une dépend du choix de la fonction d'activation.

4.3 TP2: Roadmap

Les choses à faire pour ce TP sont:

  • écrire les fonctions qui manquent pour mettre en pratique la back-propagation du gradient;
  • ensuite, créer un test essentiel à la vérification de votre implémentation: le test des différences finies.

\[ \frac{\partial g(\mathbf{w})}{\partial w_{i}} \approx \frac{g(\mathbf{w} + \epsilon \mathbf{e}_{i}) -g(\mathbf{w} - \epsilon \mathbf{e}_{i}) }{2 \epsilon}, \] avec \(\mathbf{e}_{i}\) le ième vecteur de la base canonique de l'espace euclidien.

  • effectuer un apprentissage sur les données MNIST compléte et comparer les résultats avec et sans couche cachée.

4.4 Travail à rendre pour le 23/10

Il est demander de rendre le code pour les TP 1 et 2, accompagné d'un compte rendu. Ainsi vous pouvez au m'envoyer 1/2 notebook, ou du code source mais dans ce cas accompagné d'un compte rendu au format pdf.

L'objectif est pour vous de finaliser votre code et d'observer un apprentissage satisfaisant, c-a-d:

  • l'évolution de la fonction objectif lors de l'apprentissage doit décroitre lorsqu'elle est mesurée sur les données d'apprentissage
  • un modèle avec une couche cachée doit faire mieux qu'un modèle sans couche cachée sur les données d'apprentissage

Il est important donc tracer l'evolution de la fonction objectif et du taux d'erreur (ou de précision) sur les données d'apprentissage et les données de validation.

La partie sur la vérification du gradient est optionnelle.

Si vous avez des questions, n'hésitez pas à communiquer via le groupe google.

4.5 Remarques

Attention à la stabilité numérique ! En cas d'incohérence, pensez à observer l'évolution lors de l'apprentissage des prédiction:

  • les valeurs données par le soft-max
  • les valeurs données avant (la pré-activation de sortie)

Les causes fréquentes:

  • une mauvaise initialisation des paramètres. Il faut des valeurs faibles et proches de zéro (voir le cours 1)
  • un pas de gradient trop élevé

5 TP3: le 23/10 : Sur-apprentissage et régularisation

Ce TP suppose que vous avez terminé le TP2. Le but est d'observé le phénomène de sur-apprentissage puis d'explorer des solutions.

5.1 Sur-apprentissage

  • Vérifier que le code du TP2 fonctionne bien (réseau avec 97% de précision sur l'entraînement)
  • Montrer à l'aide d'une figure la différence entre l'utilisation de la fonction sigmoïde et/ou ReLU sur différents réseaux, e.g., 128-128, 128-64-32-16, 256-128-64-32-16, 512-256-128-64-32-16
  • Montrer à l'aide d'une figure le phénomène de sur-apprentissage sur les expériences précédentes ou sur un réseau 800-800

5.2 Régularisation L2

La première méthode de régularisation est le weight decay. Avant de se lancer dans le code, il est important de réfléchir:

  • écrire l'équation de la fonction objectif qui intègre le terme de régularisation L2
  • Calculer le gradient et observer l'impact de ce terme sur les mises à jour
  • expérimenter la régularisation L2
  • Que se passe-t-il avec la régularisation L1 ?

5.3 Drop-out

Proposer puis implémenter le drop-out.