architecture de perceptron multicouche (MLP): critères de choix du nombre de couches cachées et de la taille de la couche cachée?

104

Si nous avons 10 vecteurs propres, nous pouvons avoir 10 nœuds neuronaux dans la couche d'entrée.Si nous avons 5 classes de sortie, nous pouvons avoir 5 nœuds dans la couche de sortie.Mais quels sont les critères pour choisir le nombre de couches cachées dans un MLP et combien de neurones nœuds dans 1 couche cachée?

Abhishek kumar
la source

Réponses:

217

combien de couches cachées ?

un modèle avec zéro calque caché résoudra les données séparables linéairement . Donc, à moins que vous ne sachiez déjà que vos données ne sont pas linéairement séparables, cela ne fait pas de mal de le vérifier - pourquoi utiliser un modèle plus complexe que la tâche ne l'exige? S'il est linéairement séparable, une technique plus simple fonctionnera, mais un Perceptron fera également l'affaire.

En supposant que vos données nécessitent une séparation par une technique non linéaire, commencez toujours par une couche cachée . C'est presque certainement tout ce dont vous aurez besoin. Si vos données sont séparables à l'aide d'un MLP, alors ce MLP n'a probablement besoin que d'une seule couche cachée. Il y a une justification théorique à cela, mais ma raison est purement empirique: de nombreux problèmes de classification / régression difficiles sont résolus à l'aide de MLP à une seule couche cachée, mais je ne me souviens pas avoir rencontré de MLP à plusieurs couches cachées utilisées pour modéliser les données avec succès. -que ce soit sur les babillards ML, les manuels ML, les articles académiques, etc. Ils existent, certes, mais les circonstances qui justifient leur utilisation sont empiriquement assez rares.


Combien de nœuds dans la couche cachée?

De la littérature académique MLP. ma propre expérience, etc., j'ai rassemblé et m'appuie souvent sur plusieurs règles empiriques ( RoT ), et que j'ai également trouvées comme des guides fiables (c.-à-d., les conseils étaient précis, et même quand ce n'était était généralement clair quoi faire ensuite):

RoT basé sur l'amélioration de la convergence:

Lorsque vous commencez la construction du modèle, placez-vous du côté de plusieurs nœuds dans la couche masquée.

Pourquoi? Premièrement, quelques nœuds supplémentaires dans la couche cachée ne feront probablement aucun mal - votre MLP continuera de converger. D'un autre côté, trop peu de nœuds dans la couche cachée peuvent empêcher la convergence. Pensez-y de cette façon, des nœuds supplémentaires fournissent une capacité excédentaire - des poids supplémentaires pour stocker / libérer le signal vers le réseau pendant l'itération (formation ou création de modèle). Deuxièmement, si vous commencez avec des nœuds supplémentaires dans votre couche masquée, il est facile de les élaguer plus tard (pendant la progression de l'itération). Ceci est courant et il existe des techniques de diagnostic pour vous aider (par exemple, le diagramme de Hinton, qui est juste une représentation visuelle des matrices de poids, une «carte thermique» des valeurs de poids,).

RoT basés sur la taille de la couche d'entrée et la taille de la couche de sortie:

Une règle de base est que la taille de ce calque [caché] se situe quelque part entre la taille du calque d'entrée ... et la taille du calque de sortie ...

Pour calculer le nombre de nœuds cachés, nous utilisons une règle générale de: (Nombre d'entrées + sorties) x 2/3

RoT basé sur les principaux composants:

En général, nous spécifions autant de nœuds masqués que de dimensions [composants principaux] nécessaires pour capturer 70 à 90% de la variance de l'ensemble de données d'entrée .

Et pourtant, l' auteur de la FAQ NN appelle ces règles "absurdes" (littéralement) parce qu'elles: ignorent le nombre d'instances d'entraînement, le bruit dans les cibles (valeurs des variables de réponse) et la complexité de l'espace des fonctionnalités.

À son avis (et il m'a toujours semblé qu'il savait de quoi il parlait), choisissez le nombre de neurones dans la couche cachée en fonction du fait que votre MLP comprend une forme de régularisation ou un arrêt précoce .

La seule technique valide pour optimiser le nombre de neurones dans la couche cachée:

Pendant la construction de votre modèle, testez de manière obsessionnelle; les tests révéleront les signatures d'une architecture réseau "incorrecte". Par exemple, si vous commencez avec un MLP ayant une couche cachée composée d'un petit nombre de nœuds (que vous augmenterez progressivement au besoin, en fonction des résultats des tests), votre erreur d'entraînement et de généralisation sera à la fois élevée causée par un biais et un sous-ajustement.

Ensuite, augmentez le nombre de nœuds dans la couche cachée, un par un, jusqu'à ce que l'erreur de généralisation commence à augmenter, cette fois en raison d'un surajustement et d'une variance élevée.


En pratique, je le fais de cette façon:

couche d'entrée : la taille de mon facteur de données (le nombre de fonctionnalités dans mon modèle) + 1 pour le nœud de biais et sans inclure la variable de réponse, bien sûr

couche de sortie : uniquement déterminée par mon modèle: régression (un nœud) versus classification (nombre de nœuds équivalent au nombre de classes, en supposant softmax)

couche cachée : pour commencer , une couche cachéeavec un nombre de nœuds égal à la taille de la couche d'entrée. La taille «idéale» est plus susceptible d'être plus petite (c'est-à-dire, un certain nombre de nœuds entre le nombre dans la couche d'entrée et le nombre dans la couche de sortie) plutôt que plus grande - encore une fois, il ne s'agit que d'une observation empirique, et le volume de cette observation est ma propre expérience. Si le projet justifiait le temps supplémentaire requis, alors je commence par une seule couche cachée composée d'un petit nombre de nœuds, puis (comme je l'ai expliqué juste ci-dessus) j'ajoute des nœuds à la couche cachée, un à la fois, tout en calculant la généralisation erreur, erreur d'apprentissage, biais et variance. Lorsque l'erreur de généralisation a diminué et juste avant qu'elle ne recommence à augmenter, le nombre de nœuds à ce stade est mon choix. Voir la figure ci-dessous.

entrez la description de l'image ici

doug
la source
1
Je voudrais ajouter quelques résultats connexes concernant le RoT n ° 1: dans les SVM réussis, vous mappez en fait votre entrée à un espace dimensionnel plus élevé (plus de nœuds cachés que de nœuds dans la couche d'entrée dans le langage NN). Le travail de la couche de sortie est d'obtenir la décision à partir de cette représentation trop complète. Il peut également y avoir un lien avec les projections aléatoires. Le brillant article d'Adam Coates et Andrew Y. Ng (2011) aborde des sujets connexes.
Vladislavs Dovgalecs
Belle explication. Une idée sur la façon dont je pourrais tracer une figure comme celle ci-dessus en utilisant sklearn et MLPClassifier?
seralouk
1
@sera vous voulez dire le style xkcd?
denfromufa
En principe, pourriez-vous automatiser le processus d'optimisation du nombre de neurones dans la couche cachée? De plus, pourriez-vous optimiser automatiquement le nombre de couches cachées?
Addison
2

Il est très difficile de choisir le nombre de neurones dans une couche cachée, et de choisir le nombre de couches cachées dans votre réseau de neurones.

Habituellement, pour la plupart des applications, une couche cachée suffit. De plus, le nombre de neurones dans cette couche cachée doit être compris entre le nombre d'entrées (10 dans votre exemple) et le nombre de sorties (5 dans votre exemple).

Mais la meilleure façon de choisir le nombre de neurones et de couches cachées est l'expérimentation. Entraînez plusieurs réseaux de neurones avec différents nombres de couches cachées et de neurones cachés, et mesurez les performances de ces réseaux à l'aide de la validation croisée . Vous pouvez vous en tenir au nombre qui donne le réseau le plus performant.

Ove
la source
2

Pour automatiser la sélection du meilleur nombre de couches et du meilleur nombre de neurones pour chacune des couches, vous pouvez utiliser l'optimisation génétique .

Les éléments clés seraient:

  1. Chromosome : Vecteur qui définit le nombre d'unités dans chaque couche cachée (par exemple [20,5,1,0,0] signifiant 20 unités dans la première couche cachée, 5 dans la seconde, ..., avec les couches 4 et 5 manquantes). Vous pouvez définir une limite sur le nombre maximum de couches à essayer et le nombre maximum d'unités dans chaque couche. Vous devez également placer des restrictions sur la façon dont les chromosomes sont générés. Par exemple, [10, 0, 3, ...] ne devrait pas être généré, car toute unité après une couche manquante (le «3, ...») serait sans intérêt et gaspillerait des cycles d'évaluation.
  2. Fonction de remise en forme : une fonction qui renvoie l'inverse de l'erreur d'entraînement la plus faible dans l'ensemble de validation croisée d'un réseau défini par un chromosome donné. Vous pouvez également inclure le nombre d'unités totales ou le temps de calcul si vous souhaitez trouver le "réseau le plus petit / le plus rapide et le plus précis".

Vous pouvez également envisager:

  • Élagage : commencez avec un grand réseau, puis réduisez les couches et les unités cachées, tout en gardant une trace des performances de l'ensemble de validation croisée.
  • Croissance : commencez avec un très petit réseau, puis ajoutez des unités et des couches, et gardez à nouveau une trace des performances de l'ensemble de CV.
Tout comme
la source
0

Récemment, il y a eu des travaux théoriques sur ce https://arxiv.org/abs/1809.09953 . En supposant que vous utilisez un RELU MLP, toutes les couches cachées ont le même nombre de nœuds et votre fonction de perte et votre vraie fonction que vous rapprochez avec un réseau de neurones obéissent à certaines propriétés techniques (dans l'article), vous pouvez choisir votre profondeur pour être de order $ \ log (n) $ et votre largeur de couches cachées doit être d'ordre $ n ^ {d / (2 (\ beta + d))} \ log ^ 2 (n) $. Ici, $ n $ est la taille de votre échantillon, $ d $ est la dimension de votre vecteur d'entrée et $ \ beta $ est un paramètre de lissage pour votre vraie fonction. Puisque $ \ beta $ est inconnu, vous voudrez probablement le traiter comme un hyperparamètre.

En faisant cela, vous pouvez garantir qu'avec une probabilité qui converge vers 1 $ en fonction de la taille de l'échantillon, votre erreur d'approximation converge vers 0 $ en fonction de la taille de l'échantillon. Ils donnent le taux. Notez qu'il n'est pas garanti que ce soit la «meilleure» architecture, mais cela peut au moins vous donner un bon point de départ. De plus, ma propre expérience suggère que des choses comme le décrochage peuvent encore aider dans la pratique.

mlétudiant
la source