loss function perte cout fonction dice jaccard iou binary categorical cross weighted entropy Cours théoriques - Deep learning

Fonctions de perte/coût (loss function)

Distribution-based Loss

Binary Cross-Entropy

Fonction la plus connue, définissant comme mesure de la différence entre deux probabilité de distribution pour une variable prise aléatoirement.

Quand l’utiliser ? 

Utilisé pour de la classification binaire, ou classification multi-classes ou l’on souhaite plusieurs label en sortie. Utilisable aussi pour de la segmentation sémantique. Fonction basé sur la distribution de Bernoulli.

Référence de base à utiliser comme première fonction pour tout nouveau réseau. Non adapté à des datasets biaisé/déséquilibré.

 

Categorical Cross-Entropy

Utilisé pour de la classification multi-classes, mais en souhaitant un seul label en sortie.

Quand l’utiliser ? 

Pour de la classification multi-class à simple label de sortie.

 

Weighted Cross-Entropy

C’est une variante de la Binary Cross-Entropy. Elle permet de rectifier la faiblesse de la BCE pour les datasets déséquilibrés, en ajoutant des poids selon des coefficients, pour les exemples positifs.

Quand l’utiliser ? 

Pour des datasets biaisé/déséquilibré.

 

Balenced Cross-Entropy

Elle est similaire à la Weighted Cross-Entropy.  A la différence prêt, qu’elle pénalise en plus des exemples positives, les exemples négatifs

Quand l’utiliser ? 

Pour des datasets biaisé/déséquilibré.

 

Focal 

Elle est similaire à la Binary Cross-Entropy. Elle excelle dans les datasets déséquilibrés pour la raison qu’elle diminue le poids lors de la prédiction d’exemples facile, pour permettre au réseau de se focaliser pour l’apprentissage des exemples complexes.

Quand l’utiliser ? 

Pour des datasets TRES biaisé/déséquilibré.

 

Region-based Loss

Pixel-Wise Cross-Entropy

Fonction la plus connue pour des tâches d’image segmentation. Celle-ci examine chaque pixel de façon individuelle. On compare la classe prédite du pixel par notre réseau à notre One Hot encoding de notre masque original.

Etant donnée que le calcul se fait selon la moyenne des pixels, on suppose d’avoir des classes en répartition égales sur nos images. Peut donc poser des problèmes si on a des classes non équilibré. Par exemple pour un algo ou l’on souhaite détecter piétons, ciel et route dans des photos, on sait déjà d’avance que les classes ciel et route seront bien plus présente que les piétons. Résultant ainsi dans un réseau avec des prédisposition à détecter d’avantage les classes les plus présentes.

Quand l’utiliser ? 

Référence de base à utiliser comme première fonction pour tout nouveau réseau de segmentation d’image. Non adapté à des datasets biaisé/déséquilibré.

 

Dice 

Inspiré des coefficients Dice, métriques utilisé pour évaluer la performance d’un réseau de segmentation sémantique d’image en mesurant le chevauchement entre deux objets.

Quand l’utiliser ? 

Très apprécié pour des problématiques de segmentation d’image.

 

Soft Dice

Calcul la probabilité de chaque classe de façon indépendante, pour ensuite donner un score final résultant d’une moyenne.

 

Tversky 

Similaire à la Dice. Elle ajoute un poids aux éléments FP (Faux Positif) et FN (Faux Négatif).

Quand l’utiliser ? 

Très apprécié pour des problématiques de segmentation d’image.

 

Focal Tversky

Mélange de la Focal, qui focus l’entrainement sur les exemples complexe en diminuant le poids des exemples simples, comme par exemple pour les petits ROI (Region of Interest) avec la Tversky.

Quand l’utiliser ? 

Très apprécié pour des problématiques de segmentation d’image.

 

BCE-Dice 

Mélange entre la Dice et la Binary Cross-Entropy.

Quand l’utiliser ? 

Très apprécié pour des problématiques de segmentation d’image.

 

Jaccard / Intersection Over Union (IoU)

Inspiré des coefficients IoU ou communement appelé index de Jaccard, métriques utilisé pour évaluer la performance d’un réseau de segmentation sémantique d’image.

Quand l’utiliser ? 

Très apprécié pour des problématiques de segmentation d’image.

 

 

classification localisation segmentation detection Cours théoriques - Deep learning

Différences entre classification d’image, localisation/détection & segmentation d’objets

Image classification

image segmentation object detection localization deep learning cnn keras tensorflow

Dans la tâche la plus courante lorsque l’on parle de traitement d’image, on parle de classification d’image. Cela résulte à identifier une classe au sein de l’image. 

 

 

Détection d’objet

image segmentation object detection localization deep learning cnn keras tensorflow

La détection d’objet se superpose à la simple classification d’image, en ajoutant de la localisation d’objet. Cela fonctionne encore avec une classe au sein de l’image, en plus d’avoir sa position. Celle-ci est souvent définie par des rectangles, appelés bounding box.

 

Segmentation d’objets

image segmentation object detection localization deep learning cnn keras tensorflow

Segmentation sémantique

C’est le processus permettant de classifier chaque pixel d’une image en un label particulier. On ne peut faire de différence entre deux instances d’un même objet. Par exemple, si on a deux voitures sur une image, ce type de segmentation donnera le même label sur l’ensemble des pixels des deux voitures.

Segmentation d’instance

La segmentation d’instance va attribuer un unique label sur chaque instance d’un même objet au sein de l’image. En reprenant le précédent exemple, si nous avons à nouveau deux voitures sur une image, chacune d’entre elles se verront attribuer une couleur différente. À l’inverse de la segmentation sémantique, qui aurait défini la même couleur pour les deux voitures.

 

optimisation hyper parametres gridsearch cv Cours théoriques - Deep learning

Réglages des hyper-paramètres

Workflow du CVGridSearch de SkLearn

Avoir un modèle qui fonctionne, c’est bien. Mais avoir un modèle optimisé, c’est mieux. Et il existe une multitude d’expérimentations et diverses techniques pour nous permettre de grappiller davantage de précision quant à la fiabilité de prédire de nouvelles données.

Je vous explique sans plus tarder comment régler au mieux l’ensemble des hyper paramètres de votre réseau de neurones. Je vous ai créé un dépôt sur Github (clique, clique 🙃) reprenant l’ensemble des bouts de code cités plus loin dans cet article.

 

Différence entre paramètres et hyper-paramètres

Un paramètre est interne au réseau de neurones. Il va évoluer durant l’ensemble du processus d’entrainement, lors de la backpropagation ( plus d’infos ici ).

Un hyper-paramètre est à l’inverse d’un paramètre, externe au processus d’entrainement, il en définit des propriétés. Il reste statique durant l’entrainement ( ex : batch size, epoch, learning rate…).

 

Optimisation des hyper-paramètres

Prenons un exemple simple. On souhaite optimiser deux hyper paramètres, qui sont le batch size et l’optimizer. On sait que le choix d’un hyper-param aura des conséquences sur l’apprentissage. On en connait les grandes lignes sur tel ou tel impacts qu’ils amènent, mais pour certains on ne sait pas d’avance quelles en sont les meilleures combinaisons entre eux.

 

Comment s’y prendre pour choisir les meilleures synergies ?

Le principe serait de tester diverses combinaisons. Vous avez la solution de créer autant de modèle que d’autant de combinaisons possibles. C’est redondant, lent, obligé de les lancer un à un ( si en plus vous en oubliez pas 😅 ). Ou vous avez la solution simple, rapide et efficace. Merci la GridSearchCV de Scikit-learn ! 😎

matrice hyper parametre
Tableaux contenant l’ensemble des combinaisons possible pour deux valeurs entre deux hyper-paramètres

Celle-ci va se charger toute seule d’effectuer autant d’entraînements que l’on à de combinaisons d’hyper-paramètres, et ce en quelques lignes de code.

 

La première chose à faire est de définir des listes de valeurs que l’on souhaite tester sur l’ensemble de nos hyper-paramètres :

 

On crée un dictionnaire regroupant l’ensemble de nos hyper-params précédent :

Vous pouvez cependant faire d’une pierre deux coups ces étapes précédente, je les dissocie pour bien expliquer 😉

 

Je vous passe l’ensemble des pré-process des données, ce n’est pas le but de ce chapitre aujourd’hui.

On va ensuite définir une fonction pour nous retourner un model construit :

Il se peut que vous ayez une erreur de paramètre non reconnu. Si cela vous arrive, vous devrez ajouter ce paramètre en argument de cette fonction, comme je l’ai fait dans l’exemple pour l’optimizer qui n’était pas reconnu.

 

On va ensuite wrapper notre modèle dans un KerasClassifier. Cette étape est primordiale, car c’est elle qui va nous permettre d’utiliser l’api de Scikit-Learn avec un modèle de Keras :

 

On va pouvoir associer un modèle avec notre dictionnaire englobant l’ensemble de nos combinaisons que l’on souhaite tester, et lancer l’entrainement sur notre jeu de données :

Vous pouvez lui passer en paramètre deux arguments qui peuvent être utile selon moi :

  • n_jobs : int or None, optional (default=None) : nombre de jobs à faire tourner en parallèle. Il est à défaut à 1. Pour utiliser l’ensemble des cœurs de votre processeur, mettez-le à -1.
  • cv : int, cross-validation generator or an iterable, optional :  détermine la stratégie de cross validation à utiliser. Par défaut à 3.

 

Une fois entraîné, on va pouvoir récupérer :

  • La combinaison d’hyper-paramètres qui nous a donné le meilleur score ( ligne 1 )
  • Le score de la meilleure combinaison ( ligne 2 )
  • Ou encore l’ensemble ( ligne 3 )

 

Petite astuce si vous souhaitez tester le meilleur modèle sur un nouveau jeu de données, de test par exemple. Vous devrez récupérer dans un premier temps le modèle généré par les meilleurs hyper-paramètres, puis ensuite l’évaluer sur le jeu de donnée souhaité.

resultat metriques
Résultats des métriques définit dans le code source précédent

 

Recherche quadrillage ou recherche aléatoire ?

On penserait qu’une recherche par quadrillage nous permet d’essayer l’ensemble des combinaisons possible, et donc forcément d’obtenir les meilleures valeurs. Cependant, un entrainement d’un tel réseau nécessitant du temps et une puissance de calcul importante, cela reste une solution techniquement très lente à mettre en place, et donc étant finalement une solution peu efficace contre rendu de nos diverses contraintes.

 

Exemple : Tester 3 hyper-paramètres, de range 1 à 100

Exemple d’une recherche par quadrillage : (padding de 1)

  •                 100 x 100 x 100 = 1 million de possibilités

Exemple d’une recherche aléatoire : (padding de 10)

  •                10 x 10 x 10 = 1 000 possibilités

 

On se rends facilement compte avec cet exemple, que la recherche aléatoire de variables prise aléatoirement dans une fourchette donnée, nous permet de tester bien plus de valeur sur un même temps donné. Si c’est plus rapide, on sera donc plus efficace via ces sauts de valeurs.

 

De plus, des articles scientifiques ont démontré qu’une recherche aléatoire donnait de meilleurs résultats, car certains paramètres ont d’avantages d’impact par rapport à d’autre concernant l’optimisation de la fonction de perte. En effet, ceux-ci ne sont pas tous équivalent à paramétrer.

cv gridsearch scikit learn
Comparaison entre une recherche par quadrillage et aléatoire pour optimiser une fonction

 

Références 

Random Search for Hyper-Parameter Optimization, James bergstra & Yoshua Bengio

 

transfer learning Cours théoriques - Deep learning

Transfer learning

En rédigeant mon dernier cours sur comment réaliser un recommandeur de hashtag pour image, j’ai utilisé une nouvelle approche pour me permettre de déployer mon projet de data science bien plus rapidement et efficacement ( du moins pour une première version ). Cela a dû être une nécessité pour la simple et bonne raison que c’est la première fois que je vous propose un cours avec un jeu de données bien plus conséquent que les autres fois.

Je vous présente de ce pas, le transfer learning 😏

Schéma du fonctionnement du transfer learning

Généralité

Définition

Le transfer learning comme son nom l’indique, est une approche permettant de transférer le savoir d’un modèle, à un autre. En l’occurrence, transférer les poids d’un modèle pré entraîné à une tâche précise, pour les associer à un autre modèle.

Dans des problématiques réelles ou l’on traite de data science, la vrai, vous allez vous taper le nez contre des dataset gigantesque pour permettre d’avoir un modèle qui couvre le maximum de cas possible, permettant de réaliser les meilleures généralisations sur de nouvelles variables. Le soucis étant que vous n’aurez peut-être pas ( comme moi à l’heure actuelle 😅 ) la puissance de calcul nécessaire pour réaliser ces opérations, vous obligeant à rester sur des inputs soit en quantité réduite, soit en qualité réduite. L’un comme l’autre a un effet nuisant à la bonne performance de votre modèle.

On peut se poser la question comment un réseau pourrait fonctionner sur un nouveau jeu de données, si celui-ci n’a rien à voir par rapport à celui sur lequel il a appris. Et bien il va falloir le ré-entraîner sur les nôtres, et pas de n’importe quelle façon, puisque que si on le ré-entraîne de la plus simple des manières, cela reviendrait au même de faire notre propre modèle à partir de zéro. On souhaite qu’il garde les plus grandes notions qu’il a appris durant son entrainement bien plus long que l’on ne pourrait le faire, et surtout sur l’importante quantité d’images que l’on ne pourrait rassembler sur un projet personnel, ou du moins sur un projet qui débute.

On va alors geler les couches basses du réseau, celle qui sont responsable de la détection de caractéristiques simples. On pourrait parler de formes géométriques simple dans le cas d’une classification d’image, pour vous donner une idée, tel que des traits horizontaux et verticaux. Ces formes simples étant la base de la constitution de n’importe quelles formes et structures, nous n’aurons pas besoin de les modifier. En d’autres termes, ce gel se traduit par l’impossibilité pour ces couches de neurones, de changer leurs poids.

Pour adapter le réseau à nos données, on va devoir ajouter notre propre classificateur qui va être adapté à nos données. Pour cela, on va supprimer les couches décisionnelles ( les couches dîtes hautes, qui servent à classifier correspondant aux couches de neurones entièrement connecté, appelé dense layer ou fully connected layer) du réseau pré-entraîné afin de pouvoir les remplacer par les nôtres, qui elles vont pouvoir apprendre les formes de plus en plus complexe, et donc pouvoir s’adapter à nos données qu’il n’aura jamais vu auparavant lors de son entrainement de base. C’est donc cette dernière étape qui va nous permettre d’adapter n’importe quel modèle sur un autre cas d’utilisation

 

Les grandes lignes de votre workflow pour mettre en place cette stratégie vont être les suivantes :

  • Récupération d’un modèle pré entraîné,
  • Adaptation de la structure du modèle à vos propres données d’entrées, et surtout à vos données de sortie souhaités,
  • Ré-entrainement partiel du modèle pré entraîné sur votre propre jeu de données.

 

Quand l’utiliser et pour quels avantages

  • Modèle déjà existant : il peut exister qu’une personne ait déjà rencontré la même problématique que vous. Il se peut donc qu’un modèle existe déjà pour la tâche que l’on essaye de traiter.
  • Pas assez de data : il se peut aussi que vous n’ayez pas assez de données pour pouvoir entraîner un modèle de A à Z
  • Pas assez de puissance de calcul : entraîner qu’une infime partie des couches d’un réseau de neurones va pouvoir accélérer son apprentissage

On peut alors traduire l’ensemble des points précédent par une diminution des contraintes techniques, ainsi qu’un gain de temps général.

 

Mise en place du code

La première chose va donc être de récupérer un modèle pré entraîné. Vous avez quelques choix concernant le traitement d’images sur le site de Keras. Mais vous avez des zoo, qui sont des répertoires entier de modèles pré-entraînés et gracieusement partagés par la communauté. Vous aurez donc peut être des chances d’avoir des personnes ayant travaillés sur des projets relativement proche du votre. Du moins, ça vaut le coup d’y jeter un coup d’œil. Une fois trouvé, téléchargé le modèle au format .hdf5 et chargez le.

Dans mon cas je vais en récupérer un directement depuis le site de Keras. Extrêmement pratique puisque on a le choix de vouloir ou non les couches de décisions. On ne les souhaite pas, afin d’adapter ce modèle à nos données.

 

Ensuite on gèle les couches basses du réseau :

 

On ajoute nos couches de décisions composée de fully connected :

 

On instancie un nouveau model en concaténant l’entrée du model de base, et la sortie de la dernière couche que nous venons d’ajouter à précédemment, ce qui nous donne :

 

Je ne vous joins pas le reste du code, mais vous n’avez plus qu’à compiler le modèle et l’entraîner avec les mêmes fonctions et argument que vous avez l’habitude d’utiliser, à savoir :

  • model.compile(…);
  • model.fit(…);
convolution et pooling Cours théoriques - Deep learning

Convolution, Pooling & Classification

Les réseaux de neurones à convolution, ou ConNets sont utilisés pour analyser des images. Leurs architectures sont basé sur le système de vision et d’analyse des animaux. C’est Yan LeCun, un chercheur français qui est à l’origine d’une grande partie de ces travaux sur la convolution. Il avait déjà réalisé en 1993 un système permettant à une camera de filmer et de reconnaître des chiffres écrit à la main.

On peux en distinguer plusieurs couches spécifiques :

Convolution

Architecture d'un réseau de neurones utilisant la convolution
Architecture d’un réseau de neurones utilisant la convolution

Ces couches vont permettre d’extraire des données, des caractéristiques de l’image. On va se servir de filtres, pour détecter des formes. Au fur et à mesure des couches, on va détecter des formes de plus en plus complexe. Par exemple à la première, les filtres vont mettre en évidence des courbes simple, traits et pixel. La suivante, en utilisant les filtres précédents, va apprendre à reconnaître des superpositions de courbes et de traits, pour détecter des formes plus complexe, et ainsi de suite, jusqu’aux couches les plus haute qui vont pouvoir détecter des visages, pour ne citer qu’un exemple.

 

Pooling

Cette étape permet de réduire la taille des images d’entrées, de réduire la charge de travail en diminuant les paramètres du réseau et donc la charge de calcul, tout en gardant les principales caractéristiques de l’image. Cela se passe via une fenêtre, qui va glisser pas à pas sur l’ensemble de l’image, et récupérer que certaines valeurs de l’image. Soit en prenant une moyenne des valeurs de pixels de la région analysée par cette fenêtre (meanPool), ou encore le maximum de celles-ci (maxPool), car il existe une multitude de type de pooling.

Explication d'une couche de pooling
Action de la couche de pooling

Classification

 

Extrait du dataset CIFAR-10
Extrait du dataset CIFAR-10

Le but de cette étape est de classer les images entrantes dans telle ou telle classe, en fonction des caractéristiques extraite durant les couches successives de convolution et pooling, via les couches de neurones entièrement connectés. Par exemple pour reconnaître un chat, ces couches vont permettre d’accentuer les caractéristique d’avoir 4 pattes, ou encore des poils. Elles vont donc en contrepartie diminuer les poids des caractéristiques qui représenterait une autre classe, tel que la présence de plume. Nous en ferons de même concernant nos mel-spectrogramme, nous allons classer ces images en fonction des phonèmes reconnue, et donc des mots.

constitution audio spectrogramme image Cours théoriques - Deep learning

Conversion d’un audio en spectre

Pour comprendre mon cours pratique quant à la réalisation d’une reconnaissance vocale de mots clés via un réseau de neurones utilisant de la convolution, vous devez comprendre les différentes étapes de transformations, entre notre fichier audio de base, vers un tenseur d’ordre 3 compréhensible et utilisable par notre modèle.

 

Mais, c’est quoi le son ?

Les sujets autour du son et des ondes étant plus proche du domaine de la physique que de l’informatique, je vais simplifier au mieux. Un son est une variation de pression qui va entrainer une vibration dans nos molécules d’air, se propageant ainsi sous forme d’ondes. On peut définir et analyser ce signal qui est en faîte une amplitude en fonction du temps. Cette amplitude sonore nous donne une indication concernant la puissance de celle-ci, puisqu’elle représente la valeur de la pression la plus haute attend par l’onde. Concrètement, plus on produit un son fort, plus son amplitude est forte, et inversement.

amplitude d'un son
Src : poitauc

Ces enchaînements de montées et de descentes que l’on peut observer sur la courbe, représente les surpression et dépression du milieu, engendré par le déplacement de l’onde.

Nous venons de voir comment les signaux sont défini dans l’espace temporel, on va maintenant s’attarder sur ces signaux dans un espace fréquentiel.

 

Fréquence et spectre

La fréquence va nous permettre de définir et de classer si un son est aigu ou grave, nous donnant des informations supplémentaires qui vont être importante pour la suite. Elle se définit en hertz, et représente le nombre d’oscillations (période) par seconde.

frequence d'un son
Src : illusions-sonores

 

Types d’images utilisable

Je vais parler des 3 plus connues pour vous donner quelques pistes d’utilisations pour alimenter vos réseaux de neurones. On va utiliser des spectrogramme, qui sont calculés selon le type, via une transformation discrète de Fourrier, une transformation rapide de Fourrier, ou encore une transformation discrète de cosinus. Ce sont des photographies représentent le spectre d’un son. Ces type de spectrogramme vont nous permettre d’analyser des sons et de nous renvoyer :

  • Un temps
  • Une fréquence
  • Une intensité

Vous devriez vous demander d’où provient ce besoin de passer sur des spectres… Et bien pour pouvoir reconnaître des phonèmes ! Un phonème est la plus petite entité phoniques, un élément sonore du langage parlé, pour faire simple : un son, qui peut correspondre à plusieurs sons. C’est cette association de phonème entre eux qui permettent de constituer les mots. Il en existe dans la langue Française 16 de voyelles, 17 de consommes, et 3 de semi consonnes/voyelles.

mfcc spectrogramme mel phoneme

En prenant l’exemple ci-dessus, je vous montre une comparaison entre notre 3 types de spectrogrammes différents, sur le mot ‘bonbon’. Il est constitué de deux phonèmes de voyelle et de deux phonèmes de consonne.

 

Références

Un article extrêmement intéressant que je vous recommande est celui-ci, ‘Comparison of time frequency representations for environmental sound classification using convolutional neural networks’. Il va bench jusqu’à 8 types d’images d’entrée pour réaliser de la classification de son en utilisant un CNN.

fonction d activation Cours théoriques - Deep learning

Fonction d’activation

Description

Une fonction d’activation est une fonction mathématique utilisé sur un signal. Elle va reproduire le potentiel d’activation que l’on retrouve dans le domaine de la biologie du cerveau humain. Elle va permettre le passage d’information ou non de l’information si le seuil de stimulation est atteint. Concrètement, elle va avoir pour rôle de décider si on active ou non une réponse du neurone. Un neurone ne va faire qu’appliquer la fonction suivante :

X = ∑ ( entrée * poids ) + biais

C’est sur cette sortie que la fonction d’activation va s’appliquer.

 

Exemple de fonctions

Voici les principales fonctions d’activations que l’on peut trouver dans le domaine des réseaux de neurones :

 

  • Linear : Utilisé en couche de sortie pour une utilisation pour une régression. On peut la caractériser de nulle, puisque les unités de sortie seront identiques à leur niveau d’entré. Intervalle de sortie (-∞;+∞).

 

  • Step : Elle renvoi tout le temps 1 pour un signal positif, et 0 pour un signal négatif.

step heavyside

 

  • Sigmoid (logistic) : Fonction la plus populaire depuis des décennies. Mais aujourd’hui, elle devient beaucoup moins efficace par rapport à d’autre pour une utilisation pour les couches cachées. Elle perd de l’information due à une saturation que cela soit pour la phase de feed forward ou de backpropagation, en donnant des effets non linéaires au réseau due à un paramètre unique. Elle a aussi des soucis de gradient 0 avec des entrées étant très large, même si le soucis est minimalisé avec les système utilisant des batch par lots (mini batch). Utilisé en couche de sortie pour de la classification binaire. Intervalle de sortie : {0,1}logistic sigmoid

 

  • TanH : Utilisé pour des LSTM pour des données en continue. Intervalle de sortie : (-1,1)
    tanh

 

  • Softmax : Utilisé pour de la multi classification en couche de sortie. Intervalle de sortie (-∞;+∞).softmax

 

  • ReLU ( Rectified Linear Unit ) : Ce sont les fonctions les plus populaires de nos jours. Elles permettent un entrainement plus rapide comparé aux fonctions sigmoid et tanh, étant plus légères. Attention au phénomène de ‘Dying ReLU’, auquel on préférera les variations de ReLU. Plus d’informations en fin d’article. Très utilisé pour les CNN, RBM, et les réseaux de multi perceptron. Intervalle de sortie (0;+∞).rectified linear unit

 

  • Leaky ReLU : La Leakey Relu permet d’ajouter une variante pour les nombres négatifs, ainsi les neurones ne meurent jamais. Ils entrent dans un long coma mais on toujours la chance de se réveiller à un moment donné. Intervalle de sortie (-∞;+∞).leaky ReLU

 

  • PReLU (Parametric ReLU) : La paramétrique Leaky Relu permet quant à elle de définir alpha comme paramètre du modelé et non plus comme hyper paramètre. Il sera alors apprentis sable. Il sera ainsi modifié durant la rétro propagation du gradient. Le top pour de large datasheet, moins bon sur de petit, causant d’éventuelle sur ajustement. Intervalle de sortie (-∞;+∞).Parametric ReLU

 

  • TReLU (Thresholded ReLU) : Elle est identique à la simple ReLU. Mais la localisation de son seuil d’activation va être décalé, il n’est plus à 0, mais selon un paramètre theta.

 

  • RRELU (Randomized Leaky ReLU) : La Randomise Leakey Relu permet de choisir le hyper paramètre ALPHA. Durant l’entrainement alpha est choisi aléatoirement. Puis durant les tests, il est calculé via une moyenne. Intervalle de sortie (-∞;+∞).randomized leaky ReLU

 

  • ELU ( Exponential Linear Unit ) : Autre dérivé de la ReLU. Celle-ci va approcher les valeurs moyenne proche de 0, ce qui va avoir comme impact d’améliorer les performances d’entrainements. Elle utilise exponentiel pour la partie négative et non plus une fonction linéaire. Elle parait plus performante en expérimentation que les autres Relu. Pas de soucis de neurone mort (dying ReLU). Intervalle de sortie (-∞;+∞).exponential ReLU

 

  • SeLU (Scaled ELU) : C’est comme ELU en redimensionné mais avec en plus un paramètre ALPHA pré définit. Bon résultat, bonne vitesse, et évite les problèmes d’explosion et disparition de gradients en s’auto normalisant et gardant les mêmes variances pour les sorties de chaque couche, et ce tout au long de l’entrainement.

 

 

Problèmes récurrents

Les fonctions standards amènent au réseau la disparition ou l’explosion de gradient, et donc une saturation et entraîne un ralentissement de la back propagation dans les couches basses du réseau. Voici une liste d’éventuels problèmes que vous pouvez rencontrer concernant ce chapitre :

  • Problème de disparition de gradient : L’algorithme progresse vers les couches inférieures du réseau, rendant les gradients de plus en plus petits. La mise à jour donc par descente de gradient ne modifie que très peu les poids des connexions de la couche inférieur, empêchant une bonne convergence de l’entrainement vers la solution.

 

  • Problème d’explosion du gradient : Dans ce cas-ci, les gradients deviennent de plus en plus grands. Les couches reçoivent alors de trop gros poids, faisant diverger l’algorithme.

 

  • Dying ReLU : La Relu souffre d’un souci : saturation pour les nombres négatifs, ce qui entraîne la mort de certains neurones, ils arrêtent de produire autre chose que des 0. Dans certains cas, la moitié des neurones peuvent mourir durant un entrainement. Il est peu probable qu’il reprenne vie en cours d’entrainement, rendant le réseau passif. C’est là que les variantes sont utiles puisque leur principal idée est d’empêcher pour la partie négative d’avoir des gradient égale à zéro.

 

 

Recommandation personnel

Sur le papier, les ReLU fonctionnent bien mieux en pratiques que les fonctions standard. Mais ce n’est pas pour autant la peine d’en mettre à toute les sauces. Il faudra choisir la bonne fonction selon votre type de problème à résoudre. Mais si vous débuter et que votre choix n’est pas sûr, commencer par expérimenter alors avec la ReLU pour avoir un premier retour. Celle-ci fonctionnera très bien dans la plupart des cas.

Me concernant, les résultats de ELU sont meilleurs que les autres Relu pour avoir comparé personnellement l’ensemble des fonctions lors de mon stage sur un cas précis de NLP/CNN. Mais les calculs seront plus lents car on utilise exponentiel pour la partie négative, en ajoutant de la non-linéarité. Donc si vous avez le temps et la puissance de calcul nécessaire, je vous conseille l’ordre suivant d’utilisation :

 

  1. ELU
  2. SeLU
  3. PReLU
  4. Variante de ReLU ( Leaky ReLU, Randomized ReLU, Thresholded ReLU )
  5. ReLU
  6. TanH
  7. Sigmoid

Source image : wikipedia, stackexchange

regularisation du réseau Cours théoriques - Deep learning

Régularisation du réseau

La régularisation du réseau a pour principal objectif de prévenir le sur apprentissage (overfitting). Celle ci, va pouvoir via différentes techniques, permettre de gérer les éventuels débordements des paramètres du réseau au cours de l’entrainement.

  • Dropout : On va souhaiter favoriser l’extraction de caractéristique de façon indépendante, afin d’apprendre des caractéristique plus général et plus diverse. Cela va consister à ‘éteindre’, à désactiver certains neurones du modèle, et ce de façon aléatoire d’une même couche, qui ne contribuera donc ni à la phase de feedforward, ni à la phase de backpropagation. D’un point de vue du réseau, cela revient à instancier la valeur en sortie d’une fonction d’activation à 0.
    Schéma du DropOut
    Schéma du DropOut. Source : StackExchange, @Matt Krause

     

  • DropConnect : On va reprendre le même principe que précédemment. Mais au lieu de désactiver des neurones, on va simplement désactiver les connexions entrantes (toujours de façon aléatoire) sur une couche depuis la précédente. D’un point de vue du réseau , cela revient à instancier les valeurs des poids des connexions à 0.
    Schéma du DropConnect
    Schéma du DropConnect. Source : StackExchange, @Matt Krause

     

  • L1 regularization (lasso regression) :  Cette méthode ci va plutôt avoir une action de prévention , pour contenir les variables du réseau dans des intervalles spécifique, afin que celle-ci ne deviennent au cours de l’entrainement trop extrêmes. Pour ce cas là, cette régularisation va ajouter un terme de régularisation à notre fonction de perte, correspond à la somme des valeurs absolues de nos poids. Approche les poids vers 0. Fonctionne bien lorsque on est dans un cas avec énormément de caractéristiques. Utile pour des réseaux dont les données sont espacés.

 

  • L2 regularization (ridge regression) : Celle ci va aussi ajouter une pénalité à notre fonction de perte, de sorte que l’ensemble des erreurs soient minimal, ou maximal, mais pas entre les deux. En effet, il correspond à la somme des valeurs au carré de nos poids. Utile pour des réseaux dont les données sont rapprochés.

 

  • Max-Norm regularization : Empêche les poids d’exploser lorsque on utilise de haut taux d’apprentissage. Très utile lorsque l’on utilise des optimizer avec decay ( optimizer avec un learning rate haut au départ, et qui diminue au fil des entraînements, ex : Adagrad, etc.), sans même l’utilisation de drop-out.

 

On peut combiner l’utilisation simultané de la régulation L1 et L2. Cependant en pratique, on note un avantage pour la L2 qui donne de meilleurs résultats.

neurone biologique et artificiel Cours théoriques - Deep learning

Fonctionnement du neurone artificiel

Représentation mathématique/informatique d’un neurone biologique
Représentation mathématique/informatique d’un neurone biologique

Le neurone artificiel va recevoir plusieurs entrées d’informations, plusieurs valeurs, qui vont être attaché à un poids qui peut être ajusté. Ces entrées correspondent aux dendrites, et les poids qui leurs sont associés, correspondent aux actions excitatrices ou inhibitrices des synapses, ils vont pouvoir amplifier ou minimiser un signal d’entrée. Le neurone dans sa forme basique, va effectuer une somme de l’ensemble de ces variables en fonction de leurs poids, correspondant au soma. Cette valeur passe ensuite par une fonction d’activation, qui en sera l’unique sortie. Celle-ci correspond au point de départ de l’axone qui est le cône d’émergence.

Le principe de ces réseaux va donc être d’assembler de grande quantité de neurone entre eux pour former des couches.

Il existe une grande variété de type de neurone, qui engendre selon leur agencement, différents type d’architecture.

overfitting underfitting Cours théoriques - Deep learning

Comprendre overfitting et underfitting

Schéma représentant l'underfitting, le cas idéal et l'overfitting
Schéma représentant l’underfitting, le cas idéal et l’overfitting

On souhaite avoir un réseau qui puisse effectuer des prédictions sur de nouvelles données. Selon la façon dont est entrainé le model, on peut se heurter à 2 problèmes :

  • Sur apprentissage :

Cela représente un modèle qui a appris par cœur ses données d’entrainement, qui fonctionne donc bien sur le jeu d’entrainement mais pas de validation. Il effectue alors de mauvaise prédiction sur de nouvelles, car elles ne sont pas exactement les mêmes que celle du jeu d’entrainement. Pour y remédier, il faut améliorer la flexibilité du modèle, et donc jouer sur des concept de régularisation par exemple, ou encore d’early stopping.

  • Sous apprentissage :

Ce cas-ci représente un modèle qui n’arrive pas à déduire des informations du jeu de données. Il n’apprend donc pas assez et réalise de mauvaise prédiction sur le jeu d’entrainement. Il faut donc complexifier le réseau, car il ne taille pas bien par rapport aux types de données d’entrées. En effet, il n’arrive pas à capter la relation entre les données d’entrées et leur label.

 

Dans le cas où la précision du réseau n’est ni bonne sur le jeu d’entrainement, ni sur celui de validation, c’est que le réseau n’a pas eu assez de temps pour apprendre des données. Il faut donc augmenter le nombre d’itération, ou augmenter la taille du jeu de donnée.