Une introduction douce à l'unité linéaire rectifiée (ReLU)
Dans un réseau neuronal, la fonction d'activation est chargée de transformer l'entrée pondérée additionnée du nœud en activation du nœud ou en sortie pour cette entrée.
La fonction d'activation linéaire rectifiée ou ReLU en abrégé est une fonction linéaire par morceaux qui produira directement l'entrée si elle est positive, sinon elle produira zéro. Elle est devenue la fonction d'activation par défaut pour de nombreux types de réseaux de neurones, car un modèle qui l'utilise est plus facile à entraîner et obtient souvent de meilleures performances.
Dans ce tutoriel, vous découvrirez la fonction d'activation linéaire rectifiée pour les réseaux de neurones de deep learning.
Après avoir terminé ce tutoriel, vous saurez :
- Les fonctions d'activation de tangente sigmoïde et hyperbolique ne peuvent pas être utilisées dans des réseaux comportant plusieurs couches en raison du problème de gradient de disparition.
- La fonction d'activation linéaire rectifiée surmonte le problème du gradient de disparition, permettant aux modèles d'apprendre plus rapidement et de mieux fonctionner.
- L'activation linéaire rectifiée est l'activation par défaut lors du développement de réseaux de neurones multicouches Perceptron et convolutifs.
Démarrez votre projet avec mon nouveau livre Better Deep Learning, comprenant des tutoriels étape par étape et les fichiers code source Python pour tous les exemples .
Commençons.
- Juin/2019 : Correction d'une erreur dans l'équation pour l'initialisation du poids He (merci Maltev).
Présentation du didacticiel
Ce didacticiel est divisé en six parties ; ils sont:
- Limites des fonctions d'activation sigmoïde et Tanh
- Fonction d'activation linéaire rectifiée
- Comment implémenter la fonction d'activation linéaire rectifiée
- Avantages de l'activation linéaire rectifiée
- Conseils d'utilisation de l'activation linéaire rectifiée
- Extensions et alternatives à ReLU
Limites des fonctions d'activation sigmoïde et Tanh
Un réseau neuronal est composé de couches de nœuds et apprend à mapper des exemples d'entrées vers des sorties.
Pour un nœud donné, les entrées sont multipliées par les poids dans un nœud et additionnées. Cette valeur est appelée l'activation sommée du nœud. L'activation sommée est ensuite transformée via une fonction d'activation et définit la sortie spécifique ou « activation » du nœud.
La fonction d'activation la plus simple est appelée activation linéaire, dans laquelle aucune transformation n'est appliquée. Un réseau composé uniquement de fonctions d'activation linéaires est très facile à former, mais ne peut pas apprendre de fonctions de cartographie complexes. Les fonctions d'activation linéaire sont toujours utilisées dans la couche de sortie pour les réseaux qui prédisent une quantité (par exemple, les problèmes de régression).
Les fonctions d'activation non linéaires sont préférées car elles permettent aux nœuds d'apprendre des structures plus complexes dans les données. Traditionnellement, deux fonctions d'activation non linéaires largement utilisées sont les fonctions d'activation sigmoïde et tangente hyperbolique.
La fonction d'activation sigmoïde, également appelée fonction logistique, est traditionnellement une fonction d'activation très populaire pour les réseaux de neurones. L'entrée de la fonction est transformée en une valeur comprise entre 0,0 et 1,0. Les entrées bien supérieures à 1,0 sont transformées en valeur 1,0, de même, les valeurs bien inférieures à 0,0 sont ramenées à 0,0. La forme de la fonction pour toutes les entrées possibles est une forme en S de zéro jusqu'à 0,5 jusqu'à 1,0. Pendant longtemps, jusqu’au début des années 1990, c’était l’activation par défaut utilisée sur les réseaux de neurones.
La fonction tangente hyperbolique, ou tanh en abrégé, est une fonction d'activation non linéaire de forme similaire qui génère des valeurs comprises entre -1,0 et 1,0. À la fin des années 1990 et au cours des années 2000, la fonction tanh a été préférée à la fonction d'activation sigmoïde, car les modèles qui l'utilisaient étaient plus faciles à entraîner et avaient souvent de meilleures performances prédictives.
… la fonction d’activation tangente hyperbolique fonctionne généralement mieux que la sigmoïde logistique.
— Page 195, Apprentissage profond, 2016.
Un problème général avec les fonctions sigmoïde et tanh est qu’elles saturent. Cela signifie que les grandes valeurs s'alignent sur 1,0 et les petites valeurs s'alignent sur -1 ou 0 pour le tanh et le sigmoïde respectivement. De plus, les fonctions ne sont vraiment sensibles qu'aux changements autour de leur point médian de leur entrée, tels que 0,5 pour le sigmoïde et 0,0 pour le tanh.
La sensibilité limitée et la saturation de la fonction se produisent indépendamment du fait que l'activation sommée du nœud fourni en entrée contienne ou non des informations utiles. Une fois saturé, il devient difficile pour l’algorithme d’apprentissage de continuer à adapter les poids pour améliorer les performances du modèle.
… Les unités sigmoïdales saturent sur la majeure partie de leur domaine : elles saturent à une valeur élevée lorsque z est très positif, saturent à une valeur faible lorsque z est très négatif et ne sont fortement sensibles à leur entrée que lorsque z est proche de 0.
— Page 195, Apprentissage profond, 2016.
Enfin, à mesure que les capacités du matériel augmentaient grâce aux réseaux neuronaux très profonds des GPU utilisant les fonctions d’activation sigmoïde et tanh, il n’était pas facile de s’entraîner.
Les couches profondes des grands réseaux utilisant ces fonctions d'activation non linéaires ne parviennent pas à recevoir des informations de gradient utiles. L'erreur est propagée à nouveau via le réseau et utilisée pour mettre à jour les poids. La quantité d'erreur diminue considérablement avec chaque couche supplémentaire à travers laquelle elle se propage, compte tenu de la dérivée de la fonction d'activation choisie. C'est ce qu'on appelle le problème du gradient de disparition et empêche les réseaux profonds (multicouches) d'apprendre efficacement.
La disparition des gradients rend difficile la détermination de la direction dans laquelle les paramètres doivent évoluer pour améliorer la fonction de coût.
— Page 290, Apprentissage profond, 2016.
Pour un exemple de la façon dont ReLU peut résoudre le problème des dégradés qui disparaissent, consultez le didacticiel :
- Comment corriger les dégradés qui disparaissent à l'aide de la fonction d'activation linéaire rectifiée
Bien que l’utilisation de fonctions d’activation non linéaires permette aux réseaux de neurones d’apprendre des fonctions de cartographie complexes, elles empêchent effectivement l’algorithme d’apprentissage de fonctionner avec des réseaux profonds.
Des solutions de contournement ont été trouvées à la fin des années 2000 et au début des années 2010 en utilisant d'autres types de réseaux tels que les machines Boltzmann et une formation par couche ou une pré-formation non supervisée.
Fonction d'activation linéaire rectifiée
Afin d'utiliser la descente de gradient stochastique avec rétropropagation des erreurs pour entraîner des réseaux neuronaux profonds, une fonction d'activation est nécessaire qui ressemble et agit comme une fonction linéaire, mais qui est, en fait, une fonction non linéaire permettant d'apprendre des relations complexes dans les données.
La fonction doit également offrir plus de sensibilité à l’entrée de la somme d’activation et éviter une saturation facile.
La solution faisait son chemin dans le domaine depuis un certain temps, même si elle n’a été mise en avant que lorsque des articles de 2009 et 2011 l’ont mise en lumière.
La solution consiste à utiliser la fonction d'activation linéaire rectifiée, ou ReL en abrégé.
Un nœud ou une unité qui implémente cette fonction d'activation est appelé unité d'activation linéaire rectifiée, ou ReLU en abrégé. Souvent, les réseaux qui utilisent la fonction redresseur pour les couches cachées sont appelés réseaux redressés.
L'adoption de ReLU peut facilement être considérée comme l'une des rares étapes de la révolution de l'apprentissage profond, par ex. les techniques qui permettent désormais le développement routinier de réseaux neuronaux très profonds.
[un autre] changement algorithmique majeur qui a grandement amélioré les performances des réseaux à action directe a été le remplacement des unités cachées sigmoïdes par des unités cachées linéaires par morceaux, telles que les unités linéaires rectifiées.
— Page 226, Apprentissage profond, 2016.
La fonction d'activation linéaire rectifiée est un calcul simple qui renvoie directement la valeur fournie en entrée, ou la valeur 0,0 si l'entrée est de 0,0 ou moins.
Nous pouvons décrire cela en utilisant une simple instruction if :
if input > 0:
return input
else:
return 0
Nous pouvons décrire cette fonction g() mathématiquement en utilisant la fonction max() sur l'ensemble de 0,0 et l'entrée z ; Par exemple:
g(z) = max{0, z}
La fonction est linéaire pour les valeurs supérieures à zéro, ce qui signifie qu'elle possède de nombreuses propriétés souhaitables d'une fonction d'activation linéaire lors de la formation d'un réseau neuronal par rétropropagation. Pourtant, il s’agit d’une fonction non linéaire car les valeurs négatives sont toujours renvoyées à zéro.
Étant donné que les unités linéaires rectifiées sont presque linéaires, elles préservent de nombreuses propriétés qui rendent les modèles linéaires faciles à optimiser avec des méthodes basées sur le gradient. Ils préservent également bon nombre des propriétés qui permettent une bonne généralisation des modèles linéaires.
— Page 175, Apprentissage profond, 2016.
Étant donné que la fonction rectifiée est linéaire pour la moitié du domaine d’entrée et non linéaire pour l’autre moitié, elle est appelée fonction linéaire par morceaux ou fonction charnière.
Cependant, la fonction reste très proche du linéaire, dans le sens où il s’agit d’une fonction linéaire par morceaux comportant deux morceaux linéaires.
— Page 175, Apprentissage profond, 2016.
Maintenant que nous connaissons la fonction d’activation linéaire rectifiée, voyons comment nous pouvons l’implémenter en Python.
Comment coder la fonction d'activation linéaire rectifiée
Nous pouvons facilement implémenter la fonction d’activation linéaire rectifiée en Python.
L’implémentation la plus simple consiste peut-être à utiliser la fonction max() ; Par exemple:
# rectified linear function
def rectified(x):
return max(0.0, x)
Nous nous attendons à ce que toute valeur positive soit renvoyée inchangée, tandis qu'une valeur d'entrée de 0,0 ou une valeur négative sera renvoyée sous la forme de valeur 0,0.
Ci-dessous quelques exemples d'entrées et de sorties de la fonction d'activation linéaire rectifiée.
# demonstrate the rectified linear function
# rectified linear function
def rectified(x):
return max(0.0, x)
# demonstrate with a positive input
x = 1.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
x = 1000.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
# demonstrate with a zero input
x = 0.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
# demonstrate with a negative input
x = -1.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
x = -1000.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
En exécutant l'exemple, nous pouvons voir que les valeurs positives sont renvoyées quelle que soit leur taille, tandis que les valeurs négatives sont alignées sur la valeur 0,0.
rectified(1.0) is 1.0
rectified(1000.0) is 1000.0
rectified(0.0) is 0.0
rectified(-1.0) is 0.0
rectified(-1000.0) is 0.0
Nous pouvons avoir une idée de la relation entre les entrées et les sorties de la fonction en traçant une série d'entrées et les sorties calculées.
L'exemple ci-dessous génère une série d'entiers de -10 à 10 et calcule l'activation linéaire rectifiée pour chaque entrée, puis trace le résultat.
# plot inputs and outputs
from matplotlib import pyplot
# rectified linear function
def rectified(x):
return max(0.0, x)
# define a series of inputs
series_in = [x for x in range(-10, 11)]
# calculate outputs for our inputs
series_out = [rectified(x) for x in series_in]
# line plot of raw inputs to rectified outputs
pyplot.plot(series_in, series_out)
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire montrant que toutes les valeurs négatives et les entrées nulles sont ramenées à 0,0, tandis que les sorties positives sont renvoyées telles quelles, ce qui entraîne une pente linéairement croissante, étant donné que nous avons créé une série linéairement croissante de valeurs positives (par ex. 1 à 10).
La dérivée de la fonction linéaire rectifiée est également facile à calculer. Rappelons que la dérivée de la fonction d'activation est requise lors de la mise à jour des poids d'un nœud dans le cadre de la rétropropagation d'erreur.
La dérivée de la fonction est la pente. La pente pour les valeurs négatives est de 0,0 et la pente pour les valeurs positives est de 1,0.
Traditionnellement, le domaine des réseaux de neurones a évité toute fonction d'activation qui n'était pas complètement différentiable, retardant peut-être l'adoption de la fonction linéaire rectifiée et d'autres fonctions linéaires par morceaux. Techniquement, nous ne pouvons pas calculer la dérivée lorsque l’entrée est 0,0, nous pouvons donc supposer qu’elle est nulle. Ce n'est pas un problème dans la pratique.
Par exemple, la fonction linéaire rectifiée g(z)=max{0, z} n'est pas dérivable à z=0. Cela peut sembler invalider g pour une utilisation avec un algorithme d'apprentissage basé sur le gradient. En pratique, la descente de gradient fonctionne encore suffisamment bien pour que ces modèles puissent être utilisés pour des tâches d'apprentissage automatique.
— Page 192, Apprentissage profond, 2016.
L'utilisation de la fonction d'activation linéaire rectifiée offre de nombreux avantages ; Jetons un coup d'œil à quelques-uns dans la section suivante.
Avantages de la fonction d'activation linéaire rectifiée
La fonction d'activation linéaire rectifiée est rapidement devenue la fonction d'activation par défaut lors du développement de la plupart des types de réseaux neuronaux.
Il est donc important de prendre un moment pour passer en revue certains des avantages de cette approche, soulignés pour la première fois par Xavier Glorot et al. dans leur article marquant de 2012 sur l'utilisation de ReLU intitulé « Deep Sparse Rectifier Neural Networks ».
1. Simplicité de calcul.
La fonction redresseur est triviale à implémenter, nécessitant une fonction max().
Ceci est différent des fonctions d'activation tanh et sigmoïde qui nécessitent l'utilisation d'un calcul exponentiel.
Les calculs sont également moins chers : il n'est pas nécessaire de calculer la fonction exponentielle dans les activations
— Réseaux de neurones à redresseur profond et clairsemé, 2011.
2. Rareté de la représentation
Un avantage important de la fonction redresseur est qu’elle est capable de fournir une valeur zéro réelle.
Ceci est différent des fonctions d'activation tanh et sigmoïde qui apprennent à se rapprocher d'une sortie nulle, par ex. une valeur très proche de zéro, mais pas une vraie valeur zéro.
Cela signifie que les entrées négatives peuvent produire de vraies valeurs zéro, permettant l'activation de couches cachées dans les réseaux neuronaux pour contenir une ou plusieurs vraies valeurs zéro. C'est ce qu'on appelle une représentation clairsemée et constitue une propriété souhaitable dans l'apprentissage représentationnel car elle peut accélérer l'apprentissage et simplifier le modèle.
Un domaine dans lequel des représentations efficaces telles que la parcimonie sont étudiées et recherchées est celui des auto-encodeurs, où un réseau apprend une représentation compacte d'une entrée (appelée couche de code), telle qu'une image ou une série, avant d'être reconstruite à partir de la représentation compacte.
Une façon d'obtenir des zéros réels en h pour les auto-encodeurs clairsemés (et débruitants) […] L'idée est d'utiliser des unités linéaires rectifiées pour produire la couche de code. Avec un a priori qui pousse effectivement les représentations à zéro (comme la pénalité en valeur absolue), on peut ainsi contrôler indirectement le nombre moyen de zéros dans la représentation.
— Page 507, Apprentissage profond, 2016.
3. Comportement linéaire
La fonction redresseur ressemble et agit principalement comme une fonction d’activation linéaire.
En général, un réseau de neurones est plus facile à optimiser lorsque son comportement est linéaire ou proche de la linéaire.
Les unités linéaires rectifiées […] reposent sur le principe selon lequel les modèles sont plus faciles à optimiser si leur comportement est plus proche du linéaire.
— Page 194, Apprentissage profond, 2016.
La clé de cette propriété est que les réseaux formés avec cette fonction d'activation évitent presque complètement le problème de la disparition des gradients, car les gradients restent proportionnels aux activations des nœuds.
En raison de cette linéarité, les gradients s'écoulent bien sur les trajets actifs des neurones (il n'y a pas d'effet de disparition du gradient dû aux non-linéarités d'activation des unités sigmoïdes ou tanh).
- Réseaux de neurones à redresseur clairsemés profonds, 2011.
4. Former des réseaux profonds
Il est important de noter que la (re)découverte et l’adoption de la fonction d’activation linéaire rectifiée ont permis d’exploiter les améliorations apportées au matériel et de former avec succès des réseaux multicouches profonds avec une fonction d’activation non linéaire utilisant la rétropropagation.
En retour, des réseaux encombrants tels que les machines Boltzmann pourraient être laissés pour compte, ainsi que des programmes de formation fastidieux tels que la formation par couches et la pré-formation non étiquetée.
… Les réseaux de redresseurs profonds peuvent atteindre leurs meilleures performances sans nécessiter de formation préalable non supervisée sur des tâches purement supervisées avec de grands ensembles de données étiquetées. Par conséquent, ces résultats peuvent être considérés comme une nouvelle étape dans les tentatives visant à comprendre la difficulté de former des réseaux de neurones profonds mais purement supervisés, et à combler l'écart de performance entre les réseaux de neurones appris avec et sans pré-entraînement non supervisé.
— Réseaux de neurones à redresseur profond et clairsemé, 2011.
Conseils d'utilisation de l'activation linéaire rectifiée
Dans cette section, nous examinerons quelques conseils lors de l'utilisation de la fonction d'activation linéaire rectifiée dans vos propres réseaux de neurones d'apprentissage en profondeur.
Utiliser ReLU comme fonction d'activation par défaut
Pendant longtemps, l’activation par défaut à utiliser était la fonction d’activation sigmoïde. Plus tard, ce fut la fonction d'activation du tanh.
Pour les réseaux neuronaux modernes d’apprentissage profond, la fonction d’activation par défaut est la fonction d’activation linéaire rectifiée.
Avant l'introduction des unités linéaires rectifiées, la plupart des réseaux de neurones utilisaient la fonction d'activation logistique sigmoïde ou la fonction d'activation tangente hyperbolique.
— Page 195, Apprentissage profond, 2016.
La plupart des articles qui obtiennent des résultats de pointe décriront un réseau utilisant ReLU. Par exemple, dans l’article de 2012 d’Alex Krizhevsky et al. Intitulé « Classification ImageNet avec des réseaux neuronaux à convolution profonde », les auteurs ont développé un réseau neuronal à convolution profonde avec des activations ReLU qui a obtenu des résultats de pointe sur l'ensemble de données de classification de photos ImageNet.
… nous appelons les neurones présentant cette non-linéarité unités linéaires rectifiées (ReLU). Les réseaux neuronaux convolutifs profonds avec ReLU s'entraînent plusieurs fois plus rapidement que leurs équivalents avec des unités tanh.
En cas de doute, commencez par ReLU dans votre réseau neuronal, puis essayez peut-être d'autres fonctions d'activation linéaire par morceaux pour voir comment leurs performances se comparent.
Dans les réseaux de neurones modernes, la recommandation par défaut est d'utiliser l'unité linéaire rectifiée ou ReLU
— Page 174, Apprentissage profond, 2016.
Utilisez ReLU avec des MLP, des CNN, mais probablement pas des RNN
Le ReLU peut être utilisé avec la plupart des types de réseaux de neurones.
Il est recommandé par défaut pour le Perceptron multicouche (MLP) et les réseaux de neurones convolutifs (CNN).
L'utilisation de ReLU avec les CNN a été étudiée de manière approfondie et entraîne presque universellement une amélioration des résultats, de manière surprenante au début.
… comment les non-linéarités qui suivent les bancs de filtres influencent-elles la précision de la reconnaissance. La réponse surprenante est que l’utilisation d’une non-linéarité rectificative est le facteur le plus important pour améliorer les performances d’un système de reconnaissance.
— Quelle est la meilleure architecture multi-étapes pour la reconnaissance d'objets ?, 2009
Les travaux d'enquête sur ReLU avec les CNN sont ce qui a provoqué leur utilisation avec d'autres types de réseaux.
[d'autres] ont exploré diverses non-linéarités rectifiées […] dans le contexte de réseaux convolutifs et ont découvert qu'elles amélioraient les performances discriminantes.
— Les unités linéaires rectifiées améliorent les machines Boltzmann restreintes, 2010.
Lors de l'utilisation de ReLU avec des CNN, ils peuvent être utilisés comme fonction d'activation sur les cartes de filtre elles-mêmes, suivies ensuite d'une couche de pooling.
Une couche typique d'un réseau convolutif se compose de trois étapes […] Dans la deuxième étape, chaque activation linéaire passe par une fonction d'activation non linéaire, telle que la fonction d'activation linéaire rectifiée. Cette étape est parfois appelée étape du détecteur.
— Page 339, Apprentissage profond, 2016.
Traditionnellement, les LSTM utilisent la fonction d'activation tanh pour l'activation de l'état cellulaire et la fonction d'activation sigmoïde pour la sortie du nœud. Compte tenu de leur conception soignée, on a pensé que ReLU n'était pas approprié par défaut pour les réseaux de neurones récurrents (RNN) tels que le réseau de mémoire à long terme et à court terme (LSTM).
À première vue, les ReLU semblent inappropriés pour les RNN car ils peuvent avoir des sorties très importantes et on peut donc s'attendre à ce qu'ils soient beaucoup plus susceptibles d'exploser que les unités ayant des valeurs limitées.
— Un moyen simple d'initialiser des réseaux récurrents d'unités linéaires rectifiées, 2015.
Néanmoins, des travaux ont été menés pour étudier l'utilisation de ReLU comme activation de sortie dans les LSTM, dont le résultat est une initialisation minutieuse des pondérations du réseau pour garantir que le réseau est stable avant la formation. Ceci est décrit dans l'article de 2015 intitulé « Un moyen simple d'initialiser des réseaux récurrents d'unités linéaires rectifiées ».
Essayez une valeur d'entrée de biais plus petite
Le biais est l'entrée sur le nœud qui a une valeur fixe.
Le biais a pour effet de décaler la fonction d'activation et il est traditionnel de définir la valeur d'entrée du biais sur 1,0.
Lorsque vous utilisez ReLU dans votre réseau, envisagez de définir le biais sur une petite valeur, telle que 0,1.
… il peut être judicieux de définir tous les éléments de [le biais] sur une petite valeur positive, telle que 0,1. Cela rend très probable que les unités linéaires rectifiées seront initialement actives pour la plupart des entrées de l'ensemble d'apprentissage et permettront aux dérivées de passer.
— Page 193, Apprentissage profond, 2016.
Il existe des rapports contradictoires quant à savoir si cela est nécessaire, alors comparez les performances à un modèle avec une entrée de biais de 1,0.
Utilisez « L'initialisation du poids »
Avant de former un réseau de neurones, les poids du réseau doivent être initialisés à de petites valeurs aléatoires.
Lorsque vous utilisez ReLU dans votre réseau et initialisez les poids sur de petites valeurs aléatoires centrées sur zéro, alors par défaut la moitié des unités du réseau produiront une valeur nulle.
Par exemple, après une initialisation uniforme des poids, environ 50 % des valeurs de sortie continues des unités cachées sont des zéros réels.
— Réseaux de neurones à redresseur profond et clairsemé, 2011.
Il existe de nombreuses méthodes heuristiques pour initialiser les poids d'un réseau neuronal, mais il n'existe pas de meilleur schéma d'initialisation des poids et peu de relations au-delà des directives générales pour mapper les schémas d'initialisation des poids au choix de la fonction d'activation.
Avant l'adoption généralisée de ReLU, Xavier Glorot et Yoshua Bengio ont proposé un schéma d'initialisation dans leur article de 2010 intitulé « Comprendre la difficulté de former des réseaux neuronaux à réaction profonde » qui est rapidement devenu le schéma par défaut lors de l'utilisation des fonctions d'activation sigmoïde et tanh, généralement appelées « Initialisation Xavier ». Les poids sont définis sur des valeurs aléatoires échantillonnées uniformément dans une plage proportionnelle à la taille du nombre de nœuds dans la couche précédente (en particulier +/- 1/sqrt(n) où n est le nombre de nœuds dans la couche précédente).
Kaiming He, et coll. dans leur article de 2015 intitulé « Delving Deep into Rectifiers : Surpassing Human-Level Performance on ImageNet Classification » suggérait que l'initialisation de Xavier et d'autres schémas n'étaient pas appropriés pour ReLU et les extensions.
Glorot et Bengio ont proposé d'adopter une distribution uniforme correctement dimensionnée pour l'initialisation. C'est ce qu'on appelle l'initialisation « Xavier » […]. Son calcul repose sur l’hypothèse que les activations sont linéaires. Cette hypothèse n'est pas valide pour ReLU
— Plonger en profondeur dans les redresseurs : surpasser les performances au niveau humain sur la classification ImageNet, 2015.
Ils ont proposé une petite modification de l'initialisation Xavier pour la rendre adaptée à une utilisation avec ReLU, désormais communément appelée « He initialisation » (plus précisément +/- sqrt(2/n) où n est le nombre de nœuds dans la couche précédente connue sous le nom de fan-in). En pratique, des versions gaussiennes et uniformes du schéma peuvent être utilisées.
Données d'entrée d'échelle
Il est recommandé de mettre à l'échelle les données d'entrée avant d'utiliser un réseau neuronal.
Cela peut impliquer de standardiser les variables pour avoir une moyenne nulle et une variance unitaire ou de normaliser chaque valeur sur une échelle de 0 à 1.
Sans mise à l'échelle des données sur de nombreux problèmes, le poids du réseau neuronal peut devenir important, rendant le réseau instable et augmentant l'erreur de généralisation.
Cette bonne pratique de mise à l'échelle des entrées s'applique que vous utilisiez ou non ReLU pour votre réseau.
Utiliser une pénalité de poids
De par sa conception, la sortie de ReLU est illimitée dans le domaine positif.
Cela signifie que dans certains cas, la production peut continuer à croître. En tant que tel, il peut être judicieux d’utiliser une forme de régularisation du poids, telle qu’une norme vectorielle L1 ou L2.
Un autre problème pourrait survenir en raison du comportement illimité des activations ; on peut donc vouloir utiliser un régulariseur pour éviter d'éventuels problèmes numériques. Par conséquent, nous utilisons la pénalité L1 sur les valeurs d’activation, ce qui favorise également une parcimonie supplémentaire.
— Réseaux de neurones à redresseur profond et clairsemé, 2011.
Cela peut être une bonne pratique pour à la fois promouvoir des représentations clairsemées (par exemple avec la régularisation L1) et réduire l'erreur de généralisation du modèle.
Extensions et alternatives à ReLU
Le ReLU a certaines limites.
L'une des principales limitations de ReLU réside dans le cas où des mises à jour de poids importantes peuvent signifier que l'entrée additionnée à la fonction d'activation est toujours négative, quelle que soit l'entrée dans le réseau.
Cela signifie qu'un nœud présentant ce problème affichera toujours une valeur d'activation de 0,0. C’est ce qu’on appelle un « ReLU mourant ».
le gradient est de 0 lorsque l'unité n'est pas active. Cela pourrait conduire à des cas où une unité ne s'active jamais, car un algorithme d'optimisation basé sur le gradient n'ajustera pas les poids d'une unité qui ne s'active jamais initialement. De plus, comme pour le problème des gradients de disparition, nous pourrions nous attendre à ce que l'apprentissage soit lent lors de la formation de réseaux ReL avec des gradients constants de 0.
— Les non-linéarités du redresseur améliorent les modèles acoustiques des réseaux neuronaux, 2013.
Certaines extensions populaires de ReLU assouplissent la sortie non linéaire de la fonction pour autoriser de petites valeurs négatives d'une manière ou d'une autre.
Le Leaky ReLU (LReLU ou LReL) modifie la fonction pour autoriser de petites valeurs négatives lorsque l'entrée est inférieure à zéro.
Le redresseur qui fuit permet un petit gradient non nul lorsque l'unité est saturée et inactive
— Les non-linéarités du redresseur améliorent les modèles acoustiques des réseaux neuronaux, 2013.
L'unité linéaire exponentielle, ou ELU, est une généralisation du ReLU qui utilise une fonction exponentielle paramétrée pour passer des valeurs positives aux petites valeurs négatives.
Les ELU ont des valeurs négatives, ce qui rapproche la moyenne des activations de zéro. Les activations moyennes plus proches de zéro permettent un apprentissage plus rapide car elles rapprochent le gradient du gradient naturel
— Apprentissage de réseau profond rapide et précis par unités linéaires exponentielles (ELU), 2016.
Le Parametric ReLU, ou PReLU, apprend les paramètres qui contrôlent la forme et l'étanchéité de la fonction.
… nous proposons une nouvelle généralisation de ReLU, que nous appelons Unité Linéaire Rectifiée Paramétrique (PReLU). Cette fonction d'activation apprend de manière adaptative les paramètres des redresseurs
— Plonger en profondeur dans les redresseurs : surpasser les performances au niveau humain sur la classification ImageNet, 2015.
Maxout est une fonction linéaire alternative par morceaux qui renvoie le maximum d'entrées, conçue pour être utilisée en conjonction avec la technique de régularisation par abandon.
Nous définissons un nouveau modèle simple appelé maxout (ainsi nommé parce que sa sortie est le maximum d'un ensemble d'entrées et parce qu'il est un compagnon naturel de l'abandon) conçu pour à la fois faciliter l'optimisation par abandon et améliorer la précision de la moyenne approximative rapide du modèle d'abandon. technique.
— Réseaux Maxout, 2013.
Lectures complémentaires
Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.
Messages
- Comment corriger les dégradés qui disparaissent à l'aide de la fonction d'activation linéaire rectifiée
Livres
- Section 6.3.1 Unités linéaires rectifiées et leurs généralisations, Deep Learning, 2016.
Papiers
- Quelle est la meilleure architecture multi-étapes pour la reconnaissance d'objets ?, 2009
- Les unités linéaires rectifiées améliorent les machines Boltzmann restreintes, 2010.
- Réseaux de neurones redresseurs clairsemés profonds, 2011.
- Les non-linéarités du redresseur améliorent les modèles acoustiques des réseaux neuronaux, 2013.
- Comprendre la difficulté de former des réseaux de neurones à rétroaction profonde, 2010.
- Plonger en profondeur dans les redresseurs : surpasser les performances au niveau humain selon la classification ImageNet, 2015.
- Réseaux Maxout, 2013.
API
- API maximale
Articles
- FAQ sur les réseaux neuronaux
- Fonction d'activation, Wikipédia.
- Problème de gradient de disparition, Wikipédia.
- Redresseur (réseaux de neurones), Wikipédia.
- Fonction linéaire par morceaux, Wikipédia.
Résumé
Dans ce tutoriel, vous avez découvert la fonction d'activation linéaire rectifiée pour les réseaux de neurones d'apprentissage profond.
Concrètement, vous avez appris :
- Les fonctions d'activation de tangente sigmoïde et hyperbolique ne peuvent pas être utilisées dans des réseaux comportant plusieurs couches en raison du problème de gradient de disparition.
- La fonction d'activation linéaire rectifiée surmonte le problème du gradient de disparition, permettant aux modèles d'apprendre plus rapidement et de mieux fonctionner.
- L'activation linéaire rectifiée est l'activation par défaut lors du développement de réseaux de neurones multicouches Perceptron et convolutifs.
Avez-vous des questions ?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.