Que calcule la couche cachée dans un réseau de neurones?

187

Je suis sûr que beaucoup de gens répondront avec des liens vers "laissez-moi google ça pour vous", alors je tiens à dire que j'ai essayé de comprendre cela, alors pardonnez mon manque de compréhension ici, mais je ne peux pas comprendre comment le La mise en œuvre pratique d'un réseau de neurones fonctionne réellement.

Je comprends la couche d'entrée et la façon de normaliser les données, mais aussi l'unité de biais, mais en ce qui concerne la couche cachée, le calcul réel de cette couche et la manière dont il est mappé sur la sortie sont un peu flous. J'ai vu des diagrammes avec des points d'interrogation dans la couche masquée, des fonctions booléennes comme AND / OR / XOR, des fonctions d'activation et des nœuds d'entrée mappés sur toutes les unités masquées et les nœuds d'entrée mappés sur quelques unités masquées uniquement, etc. J'ai juste quelques questions sur l'aspect pratique. Bien entendu, une explication simple du processus de réseau de neurones dans son ensemble, comme vous l'expliqueriez à un enfant, serait géniale.

Quels calculs sont effectués dans la couche cachée?

Comment ces calculs sont-ils mappés sur la couche en sortie?

Comment fonctionne la couche de sortie? Dénormaliser les données de la couche cachée?

Pourquoi certaines couches de la couche d'entrée sont-elles connectées à la couche masquée et d'autres pas?

FALLBALLON
la source
13
Les gens ici sont sympas, je n’ai jamais vu de réponse «laissez-moi google ça pour vous» mais de nombreuses réponses étonnamment complètes et perspicaces à ce qui semblait au début être des questions fondamentales. Malheureusement, je ne peux pas vous aider avec le vôtre, mais cela semble très pertinent, je suis heureux de le voter.
Gala
4
Merci pour le commentaire et le vote Gael, je suis probablement un peu blasé par la communauté SO car nous savons tous comment ces gens peuvent être :) heureux de voir plus d'esprit de collaboration ici plutôt que d'essayer de gagner des points en modifiant / questions de fermeture.
FAtBalloon
1
Je ne suis pas un expert des réseaux de neurones en particulier, bien que je sois impliqué dans leurs applications et leurs méthodes. Ma réponse peut-être moins utile serait que les calculs spécifiques dans le masqué dépendent de la «fonction de coût» que vous imposez à votre sortie, c'est-à-dire ce que vous essayez d'atteindre. Par exemple, si vous souhaitez grouper les éléments d'entrée dans des ensembles en cluster, vous calculerez les distances entre les éléments du calque masqué. Cela peut passer par diverses itérations et cycles d'optimisation au sein de cette couche, jusqu'à ce que vous remplissiez un critère d'erreur permettant au processus de "quitter" cette couche.
Lucozade

Réponses:

230

Version en trois phrases:

  • Chaque calque peut appliquer la fonction de votre choix au calque précédent (généralement une transformation linéaire suivie d'une non-linéarité réductrice).

  • Le travail des couches masquées consiste à transformer les entrées en un élément pouvant être utilisé par la couche en sortie.

  • La couche de sortie transforme les activations de la couche cachée à l’échelle souhaitée par votre sortie.

Comme si tu avais 5 ans:

Si vous voulez qu'un ordinateur vous dise s'il y a un bus dans une image, l'ordinateur aura peut-être plus de facilité s'il dispose des bons outils.

Donc, votre détecteur de bus peut être constitué d'un détecteur de roue (pour vous aider à dire que c'est un véhicule) et d'un détecteur de boîte (car le bus a la forme d'une grande boîte) et d'un détecteur de taille (pour vous dire que c'est trop grand pour être une voiture ). Ce sont les trois éléments de votre couche cachée: ils ne font pas partie de l'image brute, ce sont des outils que vous avez conçus pour vous aider à identifier les bus.

Si ces trois détecteurs s’allument (ou peut-être s’ils sont particulièrement actifs), il est fort probable que vous ayez un bus devant vous.

Les réseaux de neurones sont utiles car il existe de bons outils (comme la rétropropagation) pour construire et assembler de nombreux détecteurs.


Comme si tu étais un adulte

Un réseau de neurones à feed-forward applique une série de fonctions aux données. Les fonctions exactes dépendent du réseau de neurones que vous utilisez: le plus souvent, ces fonctions calculent chacune une transformation linéaire du calque précédent, suivie d'une non-linéarité réduite. Parfois, les fonctions font autre chose (comme le calcul de fonctions logiques dans vos exemples, ou la moyenne sur des pixels adjacents dans une image). Ainsi, les rôles des différentes couches pourraient dépendre des fonctions calculées, mais je vais essayer d'être très général.

Appelons le vecteur d'entrée , les activations de couche masquée et l'activation de sortie . Vous avez une fonction qui mappe de à et une autre fonction qui mappe de à . h y f x h g h yxhyfxhghy

Donc, l'activation de la couche cachée est et la sortie du réseau est .g ( f ( x ) )f(x)g(f(x))

Pourquoi avoir deux fonctions ( et ) au lieu d’une seule?gfg

Si le niveau de complexité par fonction est limité, alors peut calculer des choses que et ne peuvent pas faire individuellement. f gg(f(x))fg


Un exemple avec des fonctions logiques:

Par exemple, si nous autorisons uniquement et à être de simples opérateurs logiques tels que "AND", "OR" et "NAND", vous ne pouvez pas calculer d'autres fonctions telles que "XOR" avec un seul d'entre eux. D'autre part, nous pourrions calculer "XOR" si nous voulions superposer ces fonctions les unes sur les autres:gfg

Fonctions de la première couche:

  • Assurez-vous qu'au moins un élément est "TRUE" (en utilisant OR)
  • Assurez-vous qu'ils ne sont pas tous "VRAI" (en utilisant NAND)

Fonction de deuxième couche:

  • Assurez-vous que les deux critères de la première couche sont satisfaits (en utilisant AND)

La sortie du réseau n'est que le résultat de cette seconde fonction. La première couche transforme les entrées en quelque chose que la seconde couche peut utiliser pour que tout le réseau puisse exécuter XOR.


Un exemple avec des images:

La diapositive 61 de cette présentation - également disponible ici en tant qu’image unique - montre (un moyen de visualiser) ce que les différentes couches cachées d’un réseau neuronal particulier recherchent.

La première couche recherche des arêtes courtes dans l'image: elles sont très faciles à trouver à partir de données de pixels brutes, mais elles ne sont pas très utiles en elles-mêmes pour vous indiquer si vous regardez un visage, un bus ou un éléphant. .

La couche suivante compose les bords: si les bords de la couche cachée inférieure s’emboîtent d’une certaine manière, l’un des détecteurs d’œil situé au milieu de la colonne la plus à gauche peut s’allumer. Il serait difficile de créer un seul calque qui permette de trouver quelque chose d'aussi spécifique à partir des pixels bruts: les détecteurs oculaires sont beaucoup plus faciles à construire à partir de détecteurs de contour que de pixels bruts.

La couche suivante compose les détecteurs oculaires et les détecteurs nasaux en visages. En d'autres termes, ils s'allumeront lorsque les détecteurs oculaires et les détecteurs nasaux de la couche précédente s'allumeront avec les bons motifs. Celles-ci sont très efficaces pour rechercher des types de visages particuliers: si un ou plusieurs d'entre eux sont allumés, votre couche de sortie doit alors signaler la présence d'un visage.

Ceci est utile car les détecteurs de visage sont faciles à construire à partir de détecteurs oculaires et de nez, mais vraiment difficiles à construire à partir d'intensités de pixels.

Ainsi, chaque couche vous éloigne de plus en plus des pixels bruts et se rapproche de votre objectif ultime (détection de visage ou de bus, par exemple).


Réponses à d'autres questions

"Pourquoi certaines couches de la couche d'entrée sont-elles connectées à la couche masquée et d'autres pas?"

Les noeuds déconnectés du réseau sont appelés noeuds "en biais". Il y a une très belle explication ici . La réponse courte est qu'ils sont comme des termes d'interception dans la régression.

"D'où proviennent les images" détecteur d'œil "de l'exemple d'image?"

Je n'ai pas vérifié deux fois les images spécifiques auxquelles j'ai lié, mais en général, ces visualisations montrent l'ensemble des pixels du calque d'entrée qui maximisent l'activité du neurone correspondant. Donc, si nous considérons le neurone comme un détecteur d’œil, il s’agit de l’image que le neurone considère comme très semblable à l’œil. Les gens trouvent généralement ces ensembles de pixels avec une procédure d'optimisation (alpinisme).

Dans cet article de Google utilisant l'un des plus grands réseaux de neurones au monde, ils montrent un neurone "détecteur de visage" et un neurone "détecteur de chat" de cette manière, ainsi qu'un deuxième moyen: ils montrent également les images réelles qui activent la neurone le plus fortement (figure 3, figure 16). La deuxième approche est intéressante car elle montre à quel point le réseau est flexible et non linéaire - ces "détecteurs" de haut niveau sont sensibles à toutes ces images, même s’ils ne se ressemblent pas particulièrement au niveau des pixels.


Faites-moi savoir si quelque chose n'est pas clair ou si vous avez d'autres questions.

David J. Harris
la source
2
Donc, y a-t-il un seul algorithme défini pour chaque nœud sur une couche donnée et les poids sont ce qui rend les sorties différentes? Ou pouvez-vous programmer chaque nœud de la couche pour qu'il soit différent?
Buffalo
3
@GeorgeMcDowd cela nous amène à la question clé: examiner les pixels et identifier les bus est difficile, comme vous l'avez suggéré. Heureusement, il est facile de rechercher des pixels et de trouver des contours. C'est le premier calque caché à essayer. Le calque suivant tente de faire des déductions basées sur des arêtes, ce qui est beaucoup plus facile que d'essayer de le faire en utilisant des pixels.
David J. Harris
4
SO devrait donc vous donner une autre récompense (que des points) pour le temps et les efforts que vous avez consacrés à cette réponse!
Samsamara
1
@JoshuaEnfield Je pense que la logique dans les années 1980 était une combinaison de la façon dont les gens pensaient que le cerveau fonctionnait, qu'il était différentiable partout et que les valeurs étaient liées comme vous l'avez mentionné. Depuis lors, les gens ont constaté que f(x) = max(x, 0)(l'unité linéaire rectifiée) fonctionne souvent mieux, même si elle ne possède pas beaucoup de ces propriétés.
David J. Harris
2
L'exemple de bus et la chaîne de fonctions l'ont tout simplement clouée. Je ne comprends pas pourquoi les manuels ne peuvent pas être aussi descriptifs.
drécute
12

Je vais essayer d'ajouter à la description opérationnelle intuitive ...

Un bon moyen intuitif de penser à un réseau de neurones est de penser à ce qu'un modèle de régression linéaire tente de faire. Une régression linéaire prend certaines entrées et produit un modèle linéaire qui prend chaque valeur d'entrée multipliée par certains coefficients de pondération optimaux du modèle et tente de mapper la somme de ces résultats sur une réponse en sortie qui correspond étroitement à la sortie réelle. Les coefficients sont déterminés en recherchant les valeurs qui minimiseront une mesure d'erreur entre la valeur de sortie souhaitée et la valeur apprise par le modèle. Une autre façon de le dire est que le modèle linéaire essaiera de créer des multiplicateurs de coefficients pour chaque entrée et de les additionner tous pour essayer de déterminer la relation entre les valeurs d'entrée (multiples) et (généralement simples). Ce même modèle peut presque être considéré comme la pierre angulaire d’un réseau de neurones;

Mais le perceptron à unité unique a encore une pièce qui traitera la somme des données pondérées de manière non linéaire. Il utilise généralement une fonction de compression (sigmoïde ou tanh) pour accomplir cela. Donc, vous avez l'unité de base de la couche cachée, qui est un bloc qui va additionner un ensemble d'entrées pondérées. Il passe ensuite la réponse sommée à une fonction non linéaire pour créer une réponse de noeud de sortie (couche cachée). L'unité de biais est, comme dans la régression linéaire, un décalage constant qui est ajouté à chaque noeud à traiter. En raison du bloc de traitement non linéaire, vous n'êtes plus limité aux réponses uniquement linéaires (comme dans le modèle de régression linéaire).

Bien, mais lorsque plusieurs unités de perceptron uniques travaillent ensemble, chacune peut avoir différents multiplicateurs de pondération d’entrée et différentes réponses (même si ALL traite le même ensemble d’entrées avec le même bloc non linéaire décrit précédemment). Ce qui différencie les réponses, c’est que chacune a des coefficients de pondération différents qui sont appris par le réseau de neurones par le biais de la formation (certaines formes incluent la descente de gradient). Le résultat de tous les perceptrons est ensuite traité à nouveau et transmis à une couche de sortie, tout comme les blocs individuels ont été traités. La question est alors de savoir comment les poids corrects sont déterminés pour tous les blocs?

Une méthode courante pour apprendre les poids corrects consiste à commencer par des poids aléatoires et à mesurer la réponse d'erreur entre la sortie réelle réelle et la sortie du modèle apprise. En règle générale, l’erreur est renvoyée à travers le réseau et l’algorithme de retour augmente ou diminue individuellement ces poids de manière proportionnelle à l’erreur. Le réseau effectuera plusieurs itérations en passant en avant, en mesurant la réponse en sortie, puis en mettant à jour (en ajustant en arrière les pondérations) et en corrigeant les pondérations jusqu'à ce qu'un niveau d'erreur satisfaisant soit atteint. À ce stade, vous disposez d'un modèle de régression qui peut être plus flexible qu'un modèle de régression linéaire. Il s'agit de ce que l'on appelle communément un approximateur universel.

L'une des manières qui m'a vraiment aidé à comprendre le fonctionnement réel d'un réseau de neurones consiste à étudier le code de son implémentation et à le construire. Vous trouverez une des meilleures explications de base sur le code dans le chapitre sur les réseaux de neurones de (le guide disponible gratuitement) "Guide du scientifique et de l'ingénieur pour le DSP", ch. 26. Il est principalement écrit dans un langage très basique (je pense que c’était fortran) qui vous aide vraiment à voir ce qui se passe.

tapoter
la source
12

Je vais décrire ma vision de cette opération en deux étapes: l’étape de saisie-masquage et l’étape de masquage-sortie. Je vais d'abord faire l'étape cachée-sortie parce que cela me semble moins intéressant.

Caché à la sortie

La sortie de la couche cachée peut être différente, mais pour le moment, supposons qu’elles proviennent de fonctions d’activation sigmoïdale . Donc, ce sont des valeurs comprises entre 0 et 1, et pour de nombreuses entrées, elles peuvent simplement être des 0 et des 1.

J'aime penser que la transformation entre les sorties de ces neurones cachés et la couche de sortie n'est qu'une traduction (au sens linguistique, pas géométrique). Cela est certainement vrai si la transformation est inversible et sinon, quelque chose a été perdu dans la traduction. Mais vous ne voyez que les sorties des neurones cachés sous un angle différent.

Entrée cachée

Supposons que vous avez 3 neurones d'entrée (juste pour que je puisse facilement écrire quelques équations ici) et des neurones cachés. Chaque neurone caché reçoit en entrée une somme pondérée d’entrées, alors par exemple peut-être

hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)

Cela signifie que la valeur de hidden_1est très sensible à la valeur de input_1, pas du tout sensible input_2et seulement légèrement sensible à input_3.

Vous pouvez donc dire qu'il hidden_1s'agit de capturer un aspect particulier de l'entrée, que vous pourriez appeler l' input_1aspect " est important".

La sortie de hidden_1est généralement formée en passant l’entrée par une fonction, disons que vous utilisez une fonction sigmoïde . Cette fonction prend des valeurs comprises entre 0 et 1; alors considérez-le comme un interrupteur qui dit que input_1c'est important ou non.

C'est ce que fait la couche cachée! Il extrait des aspects ou des caractéristiques de l'espace d'entrée.

Maintenant, les poids peuvent être négatifs aussi! Ce qui signifie que vous pouvez obtenir des aspects tels que " input_1est important MAIS AUSSI input_2enlève cette importance":

hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)

ou input_1et input_3ont une importance "partagée":

hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)

Plus de géométrie

Si vous connaissez une algèbre linéaire, vous pouvez penser géométriquement en termes de projection dans certaines directions. Dans l'exemple ci-dessus, j'ai projeté dans la input_1direction.

Regardons à hidden_1nouveau, d'en haut. Une fois que la valeur at input_1est assez grande, la sortie de la fonction d'activation sigmoïde restera à 1, elle ne deviendra pas plus grande . En d'autres termes, de plus en plus input_1ne changera rien à la sortie. De même, si elle se déplace dans la direction opposée (c'est-à-dire négative), la sortie ne sera pas affectée après un point.

OK bien. Mais supposons que nous ne voulons pas de sensibilité dans le sens de l'infini dans un certain sens et que nous souhaitons qu'elle ne soit activée que pour une certaine plage sur une ligne. Signification pour les valeurs très négatives, il n'y a pas d'effet, et pour les valeurs très positives, il n'y a pas d'effet, mais pour les valeurs comprises entre, disons, 5 et 16, vous voulez que le réveil soit activé. C'est ici que vous utiliseriez une fonction de base radiale pour votre fonction d'activation.

Sommaire

La couche masquée extrait les caractéristiques de l'espace d'entrée et la couche de sortie les traduit dans le contexte souhaité. Il y a peut-être beaucoup plus que cela, avec des réseaux multicouches et autres, mais c'est ce que j'ai compris jusqu'à présent.

EDIT: Cette page avec ses merveilleux graphiques interactifs fait un meilleur travail que ma longue et lourde réponse ci-dessus ne pourrait jamais faire: http://neuralnetworksanddeeplearning.com/chap4.html

Rohit Chatterjee
la source
1
À l'instar du PO, je suis un peu confus au sujet de la couche cachée dans les réseaux de neurones. Dans votre exemple, comment l'algorithme NN trouve-t-il les poids pour les neurones hidden_1, hidden_2 et hidden_3? Et puisque hidden_1, hidden_2 et hidden_3 sont dérivés des mêmes variables d'entrée, les poids ne convergeraient-ils pas vers la même solution?
RobertF
5

Prenons le cas de la classification. Ce que la couche en sortie tente de faire, c'est d'estimer la probabilité conditionnelle que votre échantillon appartienne à une classe donnée, c'est-à-dire quelle est la probabilité que cet échantillon appartienne à une classe donnée. En termes géométriques, la combinaison de couches de manière non linéaire via les fonctions de seuil permet aux réseaux de neurones de résoudre des problèmes non convexes (reconnaissance de la parole, reconnaissance d'objet, etc.), qui sont les plus intéressants. En d'autres termes, les unités de sortie sont capables de générer des fonctions de décision non convexes telles que celles décrites ici .

On peut voir les unités dans les couches cachées comme des entités complexes apprenant à partir de données permettant à la couche en sortie de mieux distinguer une classe d'une autre, afin de générer des limites de décision plus précises. Par exemple, dans le cas de la reconnaissance faciale, les unités des premières couches apprennent les caractéristiques des contours (détecter les contours à des orientations et des positions données) et les couches supérieures apprennent à les combiner pour devenir des détecteurs des traits du visage tels que le nez, la bouche ou les yeux. Les poids de chaque unité masquée représentent ces entités et son résultat (en supposant qu'il s'agisse d'un sigmoïde) représente la probabilité que cette entité soit présente dans votre échantillon.

En général, la signification des sorties des couches de sortie et cachées dépend du problème que vous essayez de résoudre (régression, classification) et de la fonction de perte que vous utilisez (entropie croisée, erreurs du moindre carré, ...)

jpmuc
la source