Table of Contents
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.