76 votes

Estimation du nombre de neurones et du nombre de couches d'un réseau neuronal artificiel

Je cherche une méthode pour calculer le nombre de couches et le nombre de neurones par couche. En entrée, je n'ai que la taille du vecteur d'entrée, la taille du vecteur de sortie et la taille de l'ensemble d'apprentissage.

Généralement, le meilleur réseau est déterminé en essayant différentes topologies de réseau et en sélectionnant celle qui présente le moins d'erreur. Malheureusement, je ne peux pas faire cela.

0 votes

Un autre élément à prendre en compte lors de la structuration de votre réseau neuronal est le degré de redondance entre vos caractéristiques. Plus la redondance est importante, moins le nombre de nœuds choisis pour la couche cachée est élevé, afin que le réseau neuronal soit contraint d'extraire les caractéristiques pertinentes. Inversement, si vous ajoutez davantage de nœuds et de couches, vous permettez au réseau neuronal de recombiner les caractéristiques de manière non linéaire. En d'autres termes, vous permettez au réseau d'adopter une nouvelle perspective. PS : J'aurais bien ajouté ce commentaire, mais je n'ai pas assez de réputation.

103voto

Nate Kohl Points 11240

Il s'agit d'un problème très difficile.

Plus la structure interne d'un réseau est importante, plus ce réseau sera en mesure de représenter des solutions complexes. En revanche, une structure interne trop importante est plus lente, peut faire diverger l'apprentissage ou conduire à un surajustement, ce qui empêcherait votre réseau de bien se généraliser à de nouvelles données.

Traditionnellement, les gens ont abordé ce problème de différentes manières :

  1. Essayez différentes configurations et voyez ce qui fonctionne le mieux. Vous pouvez diviser votre ensemble de formation en deux parties - l'une pour la formation, l'autre pour l'évaluation - et ensuite former et évaluer différentes approches. Malheureusement, il semble que cette approche expérimentale ne soit pas disponible dans votre cas.

  2. Utilisez une règle empirique. De nombreuses personnes ont émis des hypothèses sur ce qui fonctionne le mieux. En ce qui concerne le nombre de neurones dans la couche cachée, les gens ont supposé (par exemple) qu'il devrait (a) être compris entre la taille de la couche d'entrée et celle de la couche de sortie, (b) être proche de (entrées+sorties) * 2/3, ou (c) ne jamais dépasser le double de la taille de la couche d'entrée.

    Le problème des règles empiriques est qu'elles ne tiennent pas toujours compte d'éléments d'information essentiels , comme le degré de "difficulté" du problème, la taille des ensembles d'apprentissage et de test sont, etc. Par conséquent, ces règles sont souvent utilisées comme points de départ approximatifs pour l'approche "essayons un tas de choses et voyons ce qui fonctionne le mieux".

  3. Utiliser un algorithme qui ajuste dynamiquement la configuration du réseau. Des algorithmes tels que Corrélation en cascade commencer par un réseau minimal, puis ajouter des nœuds cachés au cours de la formation. Cela peut simplifier quelque peu votre dispositif expérimental et (en théorie) se traduire par de meilleures performances (parce que vous n'utiliserez pas accidentellement un nombre inapproprié de nœuds cachés).

Ce sujet a fait l'objet de nombreuses recherches. Si vous êtes vraiment intéressé, il y a beaucoup à lire. Consultez les citations sur ce résumé en particulier :

4 votes

+1 très bonne réponse. Lorsque vous devez ajuster un paramètre du modèle, vous pouvez utiliser une technique de validation croisée comme dans la première approche. Cela devient plus difficile lorsque vous avez plusieurs paramètres à optimiser, un exemple de cela est libSVM qui effectue une recherche en grille sur l'espace de ses deux paramètres en utilisant la validation croisée. D'autres approches ont utilisé l'algorithme génétique pour apprendre la structure du réseau ainsi que les poids habituels.

44voto

doug Points 29567

En pratique, ce n'est pas difficile (pour avoir codé et entraîné des dizaines de MLP).

Au sens classique du terme, il est difficile d'obtenir une architecture "correcte", c'est-à-dire de régler l'architecture du réseau de telle sorte que les performances (résolution) ne puissent pas être améliorées par une optimisation plus poussée de l'architecture, ce qui est difficile, j'en conviens. Mais ce n'est que dans de rares cas que ce degré d'optimisation est nécessaire.

Dans la pratique, pour atteindre ou dépasser la précision de prédiction d'un réseau neuronal exigée par vos spécifications, vous n'avez presque jamais besoin de consacrer beaucoup de temps à l'architecture du réseau, et ce pour trois raisons :

  • la plupart des paramètres nécessaire pour spécifier l'architecture du réseau sont fixés d une fois que vous avez décidé de votre modèle de données (nombre d'enregistrements). caractéristiques dans le vecteur d'entrée, si la variable réponse souhaitée est numérique ou catégorielle et, dans ce dernier cas, le nombre d'étiquettes de classe uniques que vous avez choisies) classe unique que vous avez choisi) ;

  • les quelques paramètres d'architecture restants qui sont en fait réglables, sont presque toujours (100 % du temps selon mon expérience) très contraint par ces architectures fixes c'est-à-dire que les valeurs de ces paramètres sont étroitement limitées par une valeur maximale et une valeur minimale ; et

  • l'architecture optimale ne doit pas être déterminée au préalable avant le début de la formation. En effet, il est très courant que le code d'un réseau neuronal comprenne une petite modu un petit module permettant d'ajuster par programme l'architecture du réseau. l'architecture du réseau pendant la formation (en supprimant les nœuds dont les valeurs de poids s'approchent de zéro - généralement appelé " élagage .")

enter image description here

Selon le tableau ci-dessus, l'architecture d'un réseau neuronal est entièrement spécifiée par six (les six cellules de la grille intérieure). Deux d'entre eux (nombre de types de couches pour les couches d'entrée et de sortie) sont toujours égaux à un et un - les réseaux neuronaux ont une seule couche d'entrée et une seule couche de sortie. Votre NN doit comporter au moins une couche d'entrée et une couche de sortie, ni plus ni moins. Deuxièmement, le nombre de nœuds composant chacune de ces deux couches est fixé - la couche d'entrée, par la taille du vecteur d'entrée - c'est-à-dire que le nombre de nœuds dans la couche d'entrée est égal à la longueur du vecteur d'entrée (en fait, un neurone supplémentaire est presque toujours ajouté à la couche d'entrée en tant qu'élément de la couche d'entrée). nœud de polarisation ).

De même, la taille de la couche de sortie est fixée par la variable de réponse (un seul nœud pour une variable de réponse numérique, et (en supposant que la méthode softmax soit utilisée, si la variable de réponse est une étiquette de classe, le nombre de nœuds dans la couche de sortie est simplement égal au nombre d'étiquettes de classe uniques).

Il reste donc deux seulement Le nombre de couches cachées et le nombre de nœuds composant chacune de ces couches sont des paramètres pour lesquels il existe une certaine marge de manœuvre.

Le nombre de couches cachées

si vos données sont linéairement séparables (ce que vous savez souvent au moment où vous commencez à coder un NN), vous n'avez pas besoin de couches cachées du tout. (Si c'est effectivement le cas, je n'utiliserais pas de NN pour ce problème - choisissez un classificateur linéaire plus simple). Le premier de ces éléments - le nombre de couches cachées - est presque toujours un. Dans la pratique, très peu de problèmes qui ne peuvent être résolus avec une seule couche cachée sont résolus par l'ajout d'une autre couche cachée. De même, il existe un consensus sur la différence de performance résultant de l'ajout de couches cachées supplémentaires : les situations dans lesquelles la performance s'améliore avec une deuxième (ou troisième, etc.) couche cachée sont très limitées. Une seule couche cachée suffit pour la grande majorité des problèmes.

Dans votre question, vous indiquez que, pour une raison ou une autre, vous ne pouvez pas trouver l'architecture de réseau optimale par tâtonnement. Une autre façon d'ajuster la configuration de votre NN (sans avoir recours à l'essai-erreur) est de ' élagage '. L'essentiel de cette technique consiste à supprimer des nœuds du réseau pendant la formation en identifiant les nœuds qui, s'ils étaient supprimés du réseau, n'affecteraient pas de manière notable les performances du réseau (c'est-à-dire la résolution des données). (Même sans utiliser une technique d'élagage formelle, vous pouvez avoir une idée approximative des nœuds qui ne sont pas importants en examinant votre matrice de poids après l'apprentissage ; recherchez les poids très proches de zéro - ce sont les nœuds situés aux deux extrémités de ces poids qui sont souvent supprimés lors de l'élagage). Évidemment, si vous utilisez un algorithme d'élagage pendant la formation, commencez par une configuration de réseau qui est plus susceptible d'avoir des nœuds excédentaires (c'est-à-dire "élaguables") - en d'autres termes, lorsque vous décidez de l'architecture d'un réseau, privilégiez l'augmentation du nombre de neurones, si vous ajoutez une étape d'élagage.

En d'autres termes, en appliquant un algorithme d'élagage à votre réseau pendant la formation, vous pouvez vous rapprocher d'une configuration de réseau optimisée que n'importe quelle théorie a priori n'est jamais susceptible de vous donner.

Nombre de nœuds constituant la couche cachée

mais qu'en est-il du nombre de nœuds composant la couche cachée ? Il est vrai que cette valeur est plus ou moins libre, c'est-à-dire qu'elle peut être plus petite ou plus grande que la taille de la couche d'entrée. En outre, comme vous le savez probablement, il existe une montagne de commentaires sur la question de la configuration de la couche cachée dans les NNs (voir le fameux NN FAQ pour un excellent résumé de ce commentaire). Il existe de nombreuses règles empiriques, mais la plus couramment utilisée est la suivante la taille de la couche cachée se situe entre les couches d'entrée et de sortie . Jeff Heaton, auteur de " Introduction aux réseaux neuronaux en Java "Il y en a d'autres, qui sont récitées sur la page que je viens de citer. De même, un examen de la littérature sur les réseaux neuronaux orientés vers les applications révélera presque certainement que la taille de la couche cachée est généralement de entre la taille des couches d'entrée et de sortie. Mais entre ne signifie pas au milieu ; en fait, il est généralement préférable de fixer la taille de la couche cachée plus près de la taille du vecteur d'entrée. En effet, si la couche cachée est trop petite, le réseau risque d'avoir des difficultés à converger. Pour la configuration initiale, il est préférable d'opter pour la taille la plus grande : une couche cachée plus grande donne au réseau une plus grande capacité qui l'aide à converger, par rapport à une couche cachée plus petite. En effet, cette justification est souvent utilisée pour recommander une taille de couche cachée plus grand que (plus de nœuds) la couche d'entrée - c'est-à-dire commencer par une architecture initiale qui favorisera une convergence rapide, après quoi vous pourrez élaguer les nœuds "excédentaires" (identifier les nœuds de la couche cachée avec des valeurs de poids très faibles et les éliminer de votre réseau remanié).

1 votes

"Une couche cachée est suffisante pour la grande majorité des problèmes" - donc... des tâches arbitraires de régression et de classification ? Avez-vous des preuves de cette affirmation ? S'agit-il d'une référence à une couche cachée théorique avec un nombre infini de neurones ?

1 votes

De même, avez-vous une référence pour l'affirmation selon laquelle la taille de la couche cachée n'est pas contrainte ? 1 nœud ? 300 000 nœuds ? Je suis facétieux, mais il y a beaucoup d'affirmations dans cette réponse pour lesquelles j'aimerais avoir des explications.

0voto

Pooja Narayan Points 1

J'ai utilisé un MLP pour un logiciel commercial qui n'a qu'une couche cachée avec un seul nœud. Comme les nœuds d'entrée et de sortie sont fixes, je n'ai jamais pu que modifier le nombre de couches cachées et jouer avec la généralisation obtenue. En modifiant le nombre de couches cachées, je n'ai jamais constaté de grande différence par rapport à ce que j'obtenais avec une seule couche cachée et un seul nœud. Je n'ai utilisé qu'une seule couche cachée et un seul nœud. Cela fonctionnait assez bien et la réduction des calculs était très tentante pour mon logiciel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X