TP Module 4 : Les méthodes d'optimisation des réseaux de neurones
Import libs
Import dataset
Le but ici sera de voir l'impact des différentes méthodes d'optimisation.
Pour se faire on se basera sur le même dataset pour toute la suite du TP, avec un entraînement de \(20\) époques et une batchsize de \(64\).
CNN basique
Régularisation \(L_{1}\), \(L_{2}\)
BatchNorm
La question de savoir si oui ou non la couche de BatchNorm devrait êêtre placée avant ou après la fonction d'activation fait toujours débat.
Dans l'article d'origine, et les architectures classiques, elle est placée avant.
Dropout
Remarque : il n'est pas toujours nécéssaire ou mêême utile de laisser la dernière fonction d'activation
Dans certains cas, il est plus utilse de s'arrêêter à la dernière couche dense
Monte Carlo Dropout
Si l'on se souvient de la partie théorique, le dropout est désactivé lorsque l'on fait de l'inférence. Toutefois, il est possible de le réactiver pour avoir une simulation de Monte Carlo pour la prédiction, en moyennant plusieurs prédictions pour la même observation.
Avant de développer le code précedent, voyons une prédiction classique sur la première observation de X_test
.
Le modèle est semble certain que cette image appartient à la dernière classe "ankle boot". Mais si l'on réactive le dropout durant l'inférence, il y a des prédictions, où il n'en est plus aussi certain. Pour la \(1\)-ère prédiction, le score pour la \(9\)-ième classe n'est plus le même.
Si l'on fait la moyenne sur la première dimension, on voit que le modèle n'est plus aussi certain que l'image appartienne à la classe \(9\).
D'ailleurs, on voit que l'écart type pour certaine classe semble assez important. Dans le cas où l'on développe des modèles pour des systèmes critiques (finance, santé), c'est important de prendre ces statistiques.
On voit d'ailleurs que en faisant cela, on gagne légèrement en précision (j'etais à accuracy: 0.7998
, lors de ce run).
Initilisation de Xavier et de He
Par défault, Keras utilise glorot_uniform
.
Optimisation de la SGD
LRD
Momentum
Nesterov
RMSProp
Adam
BatchNorm + He + Adam
Keras Tuner et HiPlot
Savoir
- quel optimiseur utiliser,
- quel taux d'apprentissage fixer,
- quel taux de dropout fixer,
- le nombre de neurones denses,
- ou de filtres dans une couche convolutive,
tout cela peut être submergeant.
On pout toutefois en automatiser une certaine partie, en espérant que le choix fait sera alors optimal.
L'objet de base dans Keras-Tuner est la classe HyperModel
, et sa variable hyperparamètre défini par la hp
. On a plusieurs façon de l'appeler.
-
Faire un choix entre plusieurs possibilités déjà fixées, avec une valeur par défaut.
-
Définir un intervalle de réels \([\mathrm{min \_ value}, \mathrm{max\_value}]\) avec un incrément
step
, et une valeur par défaut. -
Définir un intervalle d'entiers \([\mathrm{min\_value}, \mathrm{max\_value}]\) avec un incrément
step
, et une valeur par défaut.
Une fois notre hypermodèle défini, on instancie un tuner
en définissant :
- quelle méthode d'optimisation on utilisera( ici RandomSearch
),
- L'objectif d'optimisation,
- Le repertoire directory
où seront stockées les résultats.
-
Le paramètre
objective
est la fonction à optimiser. Le tuner déduit s'il s'agit d'un problème de maximisation ou de minimisation en fonction de sa valeur. -
Ensuite, la variable
max_trials
représente le nombre de combinaisons d'hyperparamètres qui seront testées par le tuner, tandis que la variableexecution_per_trial
est le nombre de modèles qui devraient être construits et adaptés à chaque essai pour des raisons de robustesse. -
project_name
lui est le nom du dossier dans lequel les données de visualisation seront enregistrées
Le nombre de tuners, ie de méthode de recherche prédéfinies, est au nombre de 3 (https://keras-team.github.io/keras-tuner/documentation/tuners/), on
RandomSearch
, qui effectue une recherche aléatoire,BayesianOptimization
, pour un optimisation Bayesienne,Hyperband
, qui utilise l'algorithme HyperBand, méthode d'optimisation via les bandits manchots à \(n\) bras.
L'espace des hyperparamètres est alors visualisable via la commande suivante.
De la même façon que l'on entraîne un modèle via la commande .fit()
, on lance la recherche des hyperparamètres optimaux via la commance .search()
.