web-dev-qa-db-fra.com

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

Je recherche 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'entraînement.

Habituellement, le meilleur réseau est déterminé en essayant différentes topologies de réseau et en sélectionnant celle avec le moins d'erreur. Malheureusement, je ne peux pas faire ça.

73
ladi

C'est un problème vraiment difficile.

Plus le réseau est structuré en interne, meilleur sera ce réseau pour représenter des solutions complexes. D'un autre côté, trop de structure interne est plus lente, peut entraîner une divergence de la formation ou conduire à un surajustement - ce qui empêcherait votre réseau de bien se généraliser aux nouvelles données.

Les gens ont traditionnellement abordé ce problème de plusieurs manières différentes:

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

  2. Utilisez une règle empirique. Beaucoup de gens ont trouvé beaucoup de suppositions sur ce qui fonctionne le mieux. En ce qui concerne le nombre de neurones dans la couche cachée, les gens ont émis l'hypothèse que (par exemple) il devrait (a) être entre la taille de la couche d'entrée et de sortie, (b) fixé à quelque chose de proche (entrées + sorties) * 2/3, ou (c) jamais plus de deux fois la taille de la couche d'entrée.

    Le problème avec les règles de base est qu'elles ne prennent pas toujours en compte les informations essentielles, comme la difficulté du problème, la nature du taille des ensembles de formation et de test sont, etc. Par conséquent, ces règles sont souvent utilisées comme points de départ approximatifs pour le "essayons un tas de choses et voyons ce qui fonctionne le mieux" approche.

  3. Utilisez un algorithme qui ajuste dynamiquement la configuration du réseau. Des algorithmes tels que Cascade Correlation commencent avec un réseau minimal, puis ajoutent des nœuds cachés pendant formation. Cela peut rendre votre configuration expérimentale un peu plus simple et (en théorie) peut entraîner de meilleures performances (car vous n'utiliserez pas accidentellement un nombre inapproprié de nœuds masqués).

Il y a beaucoup de recherches sur ce sujet - donc si vous êtes vraiment intéressé, il y a beaucoup à lire. Consultez les citations sur ce résumé , en particulier:

102
Nate Kohl

En pratique, cela n'est pas difficile (basé sur le codage et la formation de dizaines de MLP).

Dans le sens d'un manuel, il est difficile d'obtenir une architecture "correcte" - c'est-à-dire que régler votre architecture réseau de telle sorte que les performances (résolution) ne puissent pas être améliorées par une optimisation supplémentaire de l'architecture est difficile, je suis d'accord. Mais ce n'est que dans de rares cas que ce degré d'optimisation est requis.

En pratique, pour atteindre ou dépasser la précision de prédiction d'un réseau de neurones requis par vos spécifications, vous n'avez presque jamais besoin de passer beaucoup de temps avec l'architecture du réseau - trois raisons pour lesquelles cela est vrai:

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

  • 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 paramètres d'architecture fixes - c'est-à-dire que les valeurs de ces paramètres sont étroitement délimité par une valeur max et min; et

  • il n'est pas nécessaire de déterminer l'architecture optimale avant le début de la formation.En effet, il est très courant que le code du réseau neuronal inclue un petit module pour régler par programmation l'architecture du réseau pendant la formation (en supprimant les nœuds dont les valeurs de poids approchent de zéro - généralement appelés " élagage.")

enter image description here

Selon le tableau ci-dessus, l'architecture d'un réseau de neurones est complètement spécifiée par six paramètres (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 un et un - les réseaux de neurones ont une seule couche d'entrée et une seule couche de sortie. Votre NN doit avoir au moins une couche d'entrée et une couche de sortie - ni plus, ni moins. Deuxièmement, le nombre de nœuds comprenant chacune de ces deux couches est fixe - 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 de plus est presque toujours ajouté à la couche d'entrée en tant que noeud de polarisation).

De même, la taille de la couche de sortie est fixée par la variable de réponse (nœud unique pour la variable de réponse numérique et (en supposant que softmax est utilisé, 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'unique unique). étiquettes de classe).

Cela laisse juste deux paramètres pour lesquels il y a une quelconque discrétion - le nombre de couches cachées et le nombre de nœuds comprenant chacune de ces couches.

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 absolument pas besoin de couches cachées. (Si c'est en fait le cas, je n'utiliserais pas de NN pour ce problème - choisissez un classificateur linéaire plus simple). Le premier d'entre eux - le nombre de couches cachées - est presque toujours un. Il y a beaucoup de poids empirique derrière cette présomption - en pratique très peu de problèmes qui ne peuvent pas être résolus avec une seule couche cachée deviennent solubles en ajoutant une autre couche cachée. De même, il existe un consensus sur la différence de performances par rapport à l'ajout de couches cachées supplémentaires: les situations dans lesquelles les performances s'améliorent avec une deuxième (ou troisième, etc.) couche cachée sont très faibles. Une couche cachée suffit pour la grande majorité des problèmes.

Dans votre question, vous avez mentionné que pour une raison quelconque, vous ne pouvez pas trouver l'architecture de réseau optimale par essais et erreurs. Une autre façon de régler votre configuration NN (sans utiliser d'essai et d'erreur) est ' é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 retirés du réseau, n'affecteraient pas sensiblement 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 regardant votre matrice de poids après l'entraînement; recherchez des poids très proches de zéro - ce sont les nœuds à chaque extrémité de ces poids qui sont souvent supprimé lors de l'élagage.) Évidemment, si vous utilisez un algorithme d'élagage pendant la formation, commencez par une configuration réseau qui est plus susceptible d'avoir des nœuds en excès (c'est-à-dire `` élagage '') - en d'autres termes, lors du choix d'une architecture réseau, pécher par excès 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 être beaucoup plus proche d'une configuration de réseau optimisée que toute théorie a priori ne pourrait jamais vous donner.

Le nombre de nœuds comprenant la couche cachée

mais qu'en est-il du nombre de nœuds composant la couche cachée? Étant donné que cette valeur est plus ou moins sans contrainte, c'est-à-dire qu'elle peut être plus petite ou plus grande que la taille de la couche d'entrée. Au-delà de cela, comme vous le savez probablement, il y a une montagne de commentaires sur la question de la configuration des couches cachées dans les NN (voir le fameux NN FAQ pour un excellent résumé de ce commentaire). Il existe de nombreuses règles empiriques dérivées empiriquement, mais parmi celles-ci, la plus couramment utilisée est la taille de la couche cachée se situe entre les couches d'entrée et de sortie. Jeff Heaton, auteur de " Introduction to Neural Networks in Java " en propose quelques autres, qui sont récités sur la page que je viens de relier. De même, une analyse de la littérature sur les réseaux de neurones orientée application, révélera presque certainement que la taille de couche cachée est généralement entre les tailles de couche d'entrée et de sortie. Mais entre ne signifie pas au milieu; en fait, il est généralement préférable de définir la taille de couche cachée plus près de la taille du vecteur d'entrée. La raison en est que si la couche cachée est trop petite, le réseau peut avoir des difficultés à converger. Pour la configuration initiale, optez pour la plus grande taille - une couche cachée plus grande donne au réseau plus de capacité, ce 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 grande que (plus de nœuds) la couche d'entrée - c'est-à-dire commencer par une architecture initiale qui encouragera une convergence rapide, après quoi vous pourrez Taillez les nœuds "en excès" (identifiez les nœuds dans la couche cachée avec des valeurs de poids très faibles et éliminez-les de votre réseau remanié).

43
doug

J'ai utilisé un MLP pour un logiciel commercial qui n'a qu'une seule couche cachée qui n'a qu'un seul nœud. Comme les nœuds d'entrée et les nœuds de sortie sont fixes, je n'ai jamais pu changer le nombre de couches cachées et jouer avec la généralisation obtenue. Je n'ai jamais vraiment fait une grande différence dans ce que je faisais avec une seule couche cachée et un seul nœud en changeant le nombre de couches cachées. Je viens d'utiliser une couche cachée avec un nœud. Cela a très bien fonctionné et les calculs réduits étaient très tentants dans mon logiciel.

0
Pooja Narayan