Comment définir le nombre de neurones et de couches dans les réseaux de neurones

26

Je suis un débutant dans les réseaux de neurones et j'ai eu du mal à saisir deux concepts:

  1. Comment décide-t-on du nombre de couches intermédiaires d'un réseau neuronal donné? 1 contre 10 ou autre chose.
  2. Comment décide-t-on du nombre de neurones dans chaque couche intermédiaire? Est-il recommandé d'avoir un nombre égal de neurones dans chaque couche intermédiaire ou varie-t-il selon l'application?
Snaggletooth
la source

Réponses:

19

La prise en compte du nombre de neurones pour chaque couche et du nombre de couches dans les réseaux entièrement connectés dépend de l'espace caractéristique du problème. Pour illustrer ce qui se passe dans les cas bidimensionnels afin de représenter, j'utilise un espace 2D. J'ai utilisé des images des travaux d' un scientifique . Pour comprendre d'autres filets comme CNNje vous recommande de jeter un œil ici .

Supposons que vous n'ayez qu'un seul neurone, dans ce cas, après avoir appris les paramètres du réseau, vous aurez une limite de décision linéaire qui peut séparer l'espace en deux classes individuelles.

entrez la description de l'image ici

entrez la description de l'image ici

Supposons que l'on vous demande de séparer les données suivantes. Vous aurez besoin de d1spécifier la limite de décision supérieure et de faire en quelque sorte une ANDopération pour déterminer si les données d'entrée sont du côté gauche ou du côté droit. Line d2effectue une autre ANDopération qui examine si les données d'entrée sont supérieures d2ou non. Dans ce cas, d1essaie de comprendre si l'entrée est sur le côté gauche de la ligne pour classer l'entrée en cercle , d2essaye également de déterminer si l'entrée est sur le côté droit de la ligne pour classer l'entrée en cercle . Maintenant, nous avons besoin d'un autreANDopération pour récapituler les résultats des deux lignes qui sont construites après la formation de leurs paramètres. Si l'entrée se trouve à gauche d1et à droite de d2, elle doit être classée comme cercle .

entrez la description de l'image ici

Supposons maintenant que vous rencontrez le problème suivant et que l'on vous demande de séparer les classes. Dans ce cas, la justification est exactement comme celle ci-dessus.

entrez la description de l'image ici

Pour les données suivantes:

entrez la description de l'image ici

la frontière de décision n'est pas convexe et est plus complexe que les frontières précédentes. Vous devez d'abord avoir un sous-réseau qui trouve les cercles intérieurs. Ensuite, vous devez avoir un autre sous-réseau qui trouve la frontière de décision rectangulaire intérieure qui décide que les entrées qui sont à l'intérieur du rectangle ne sont pas cercle et si elles sont à l'extérieur, elles sont cercle. Après cela, vous devez récapituler les résultats et dire que si les données d'entrée se trouvent à l'intérieur du plus grand rectangle et à l'extérieur du rectangle intérieur, elles doivent être classées comme cercle . Vous avez besoin d'une autre ANDopération à cet effet. Le réseau serait comme ceci:

entrez la description de l'image ici


Supposons que l'on vous demande de trouver la limite de décision encerclée suivante .

entrez la description de l'image ici

Dans ce cas, votre réseau serait comme le réseau suivant auquel il a été fait référence mais avec beaucoup plus de neurones dans la première couche cachée.

entrez la description de l'image ici

Médias
la source
11

Très bonne question, car il n'existe pas encore de réponse exacte à cette question. Il s'agit d'un domaine de recherche actif.

Au final, l'architecture de votre réseau est liée à la dimensionnalité de vos données. Étant donné que les réseaux de neurones sont des approximateurs universels, tant que votre réseau est suffisamment grand, il a la capacité d'adapter vos données.

La seule façon de savoir vraiment quelle architecture fonctionne le mieux est de les essayer toutes, puis de choisir la meilleure. Mais bien sûr, avec les réseaux de neurones, c'est assez difficile car chaque modèle prend un certain temps à s'entraîner. Ce que certaines personnes font, c'est d'abord former un modèle qui est «trop grand» exprès, puis l'élaguer en supprimant les poids qui ne contribuent pas beaucoup au réseau.

Et si mon réseau est "trop ​​grand"

Si votre réseau est trop volumineux, il peut soit être surchargé, soit avoir du mal à converger. Intuitivement, ce qui se passe, c'est que votre réseau essaie d'expliquer vos données d'une manière plus compliquée qu'il ne devrait. C'est comme essayer de répondre à une question à laquelle on pourrait répondre en une phrase avec un essai de 10 pages. Il peut être difficile de structurer une réponse aussi longue, et il peut y avoir beaucoup de faits inutiles. ( Voir cette question )

Et si mon réseau est "trop ​​petit"

En revanche, si votre réseau est trop petit, il équipera vos données et donc. Ce serait comme répondre avec une phrase alors que vous auriez dû rédiger un essai de 10 pages. Aussi bonne que soit votre réponse, certains des faits pertinents vous manqueront.

Estimation de la taille du réseau

Si vous connaissez la dimensionnalité de vos données, vous pouvez savoir si votre réseau est suffisamment grand. Pour estimer la dimensionnalité de vos données, vous pouvez essayer de calculer son classement. C'est une idée fondamentale dans la façon dont les gens essaient d'estimer la taille des réseaux.

Cependant, ce n'est pas aussi simple. En effet, si votre réseau doit être en 64 dimensions, construisez-vous une seule couche cachée de taille 64 ou deux couches de taille 8? Ici, je vais vous donner une idée de ce qui se passerait dans les deux cas.

Aller plus loin

Aller plus loin signifie ajouter plus de couches cachées. Ce qu'il fait, c'est qu'il permet au réseau de calculer des fonctionnalités plus complexes. Dans les réseaux de neurones convolutifs, par exemple, il a été souvent démontré que les premières couches représentent des caractéristiques "de bas niveau" telles que les bords, et les dernières couches représentent des caractéristiques "de haut niveau" telles que les visages, les parties du corps, etc.

Vous devez généralement approfondir si vos données sont très non structurées (comme une image) et doivent être traitées un peu avant de pouvoir en extraire des informations utiles.

Aller plus loin

Aller plus loin signifie créer des fonctionnalités plus complexes, et «élargir» signifie simplement créer plus de ces fonctionnalités. Il se peut que votre problème puisse être expliqué par des fonctionnalités très simples, mais il doit y en avoir beaucoup. Habituellement, les couches deviennent plus étroites vers la fin du réseau pour la simple raison que les fonctionnalités complexes transportent plus d'informations que les simples, et donc vous n'en avez pas besoin d'autant.

Valentin Calomme
la source
Vous pouvez utiliser le concept de dimension intrinsèque pour connaître le nombre de dimensions pertinentes pour votre problème. Les dimensions intrinsèques tentent de répondre au nombre de variables nécessaires pour décrire complètement un signal et elles sont liées au nombre de variables dans la source aléatoire de ce signal.
Pedro Henrique Monforte
8

Réponse courte: elle est très liée aux dimensions de vos données et au type d'application.

Le choix du bon nombre de couches ne peut être atteint qu'avec la pratique. Il n'y a pas encore de réponse générale à cette question . En choisissant une architecture de réseau, vous limitez votre espace de possibilités (espace d'hypothèses) à une série spécifique d'opérations de tenseur, en mappant les données d'entrée aux données de sortie. Dans un DeepNN, chaque couche ne peut accéder qu'aux informations présentes dans la sortie de la couche précédente. Si une couche supprime des informations pertinentes au problème en question, ces informations ne peuvent jamais être récupérées par des couches ultérieures. Ceci est généralement appelé « goulot d'étranglement de l'information ».

Information Bottleneck est une épée à double tranchant:

1) Si vous utilisez un certain nombre de couches / neurones, le modèle apprendra simplement quelques représentations / caractéristiques utiles de vos données et perdra certaines importantes, car la capacité des couches moyennes est très limitée (sous- ajustement ).

2) Si vous utilisez un grand nombre de couches / neurones, le modèle apprendra trop de représentations / fonctionnalités spécifiques aux données d'entraînement et ne généralisera pas aux données dans le monde réel et en dehors de votre ensemble d'entraînement (sur- ajustement ).

Liens utiles pour des exemples et d'autres recherches:

[1] https: //livebook.manning.com#! / Book / deep-learning-with-python / chapter-3 / point-1130-232-232-0

[2] https://www.quantamagazine.org/new-theory-cracks-open-the-black-box-of-deep-learning-20170921/

moh
la source
4

Travailler avec des réseaux de neurones depuis deux ans, c'est un problème que j'ai toujours à chaque fois que je ne veux pas modéliser un nouveau système. La meilleure approche que j'ai trouvée est la suivante:

  1. Recherchez des problèmes similaires qui ont également été modélisés avec des réseaux à action directe et étudiez leurs architectures.
  2. Commencez par cette configuration, entraînez l'ensemble de données et évaluez l'ensemble de test.
  3. Effectuez l' élagage dans votre architecture et comparez les résultats de l'ensemble de données avec les résultats précédents. Si la précision de votre modèle n'est pas affectée, vous pouvez en déduire que le modèle d'origine sur-adapte les données.
  4. Sinon, essayez d'ajouter plus de degrés de liberté (c'est-à-dire plus de couches).

L'approche générale consiste à essayer différentes architectures, comparer les résultats et prendre la meilleure configuration. L'expérience vous donne plus d'intuition dans la première estimation de l'architecture.

Federico Caccia
la source
1

En plus des réponses précédentes, il existe des approches où la topologie du réseau neuronal émerge de manière endogène, dans le cadre de la formation. Plus important encore, vous avez Neuroevolution of Augmenting Topologies (NEAT) où vous commencez avec un réseau de base sans couches cachées, puis utilisez un algorithme génétique pour «complexifier» la structure du réseau. NEAT est implémenté dans de nombreux cadres ML. Voici un article assez accessible sur une implémentation pour apprendre Mario: CrAIg: Utiliser les réseaux de neurones pour apprendre Mario

Frédéric Schneider
la source