Mon réseau de neurones ne peut même pas apprendre la distance euclidienne


9

J'essaie donc de m'enseigner les réseaux de neurones (pour les applications de régression, pas pour classer les photos de chats).

Mes premières expériences ont été la formation d'un réseau pour implémenter un filtre FIR et une transformée de Fourier discrète (formation sur les signaux "avant" et "après"), car ce sont deux opérations linéaires qui peuvent être mises en œuvre par une seule couche sans fonction d'activation. Les deux ont bien fonctionné.

Alors j'ai voulu voir si je pouvais ajouter un abs()et lui faire apprendre un spectre d'amplitude. J'ai d'abord pensé au nombre de nœuds dont il aurait besoin dans la couche cachée, et j'ai réalisé que 3 ReLU sont suffisants pour une approximation grossière de abs(x+jy) = sqrt(x² + y²), alors j'ai testé cette opération par elle-même sur des nombres complexes isolés (2 entrées → 3 nœuds ReLU couche cachée → 1 production). Parfois, cela fonctionne:

3 ReLU implémentant la distance euclidienne en pyramide hexagonale inversée

Mais la plupart du temps que je l'essaye, il reste bloqué dans un minimum local et ne parvient pas à trouver la bonne forme:

3 ReLU formant un réseau en forme de vallée

perte vs époques

J'ai essayé tous les optimiseurs et variantes ReLU de Keras, mais ils ne font pas beaucoup de différence. Y a-t-il autre chose que je peux faire pour que des réseaux simples comme celui-ci convergent de manière fiable? Ou suis-je en train d'approcher cela avec la mauvaise attitude, et vous êtes censé jeter bien plus de nœuds que nécessaire au problème et si la moitié d'entre eux meurent, ce n'est pas considéré comme un gros problème?


1
Votre intrigue montre ce qui semble être plusieurs expériences différentes, dont certaines fonctionnent et d'autres non. Qu'est-ce qui explique les différences?
Sycorax dit Réintégrer Monica

@Sycorax Ce ne sont que des essais répétés de la même chose. Parfois, il trouve une solution pyramidale hexagonale, mais ce n'est généralement pas le cas.
endolith

Avez-vous essayé avec deux couches cachées et un tanh comme fonction d'activation?
Ketan

@KetanNo, pourquoi? J'ai posté une variation plus simple ici: stats.stackexchange.com/q/379884/11633
endolith

vous voudrez peut-être regarder celui-ci. stats.stackexchange.com/q/375655/27556 . Mais pouvez-vous expliquer pourquoi vous pensez que vous n'avez besoin que de 3 relus? la décomposition «naturelle» serait une couche cachée pour faire l'approximation quadratique avec relus et une autre couche pour faire la racine carrée - fondamentalement, les relus font des approximations linéaires par morceaux.
seanv507

Réponses:


6

La sortie semble suggérer fortement qu'un ou plusieurs de vos neurones sont morts (ou peut-être que l'hyperplan de poids de deux de vos neurones a fusionné). Vous pouvez voir qu'avec 3 Relu, vous obtenez 3 divisions ombrées au centre lorsque vous convergez vers la solution la plus raisonnable. Vous pouvez facilement vérifier si cela est vrai en vérifiant les valeurs de sortie de chaque neurone pour voir s'il reste mort pour une grande majorité de vos échantillons. Alternativement, vous pouvez tracer tous les poids de neurones 2x3 = 6, groupés par leur neurone respectif, pour voir si deux neurones s'effondrent à la même paire de poids.

Je soupçonne que l'une des causes possibles de cela est lorsque est biaisé vers une coordonnée, par exemple , auquel cas vous essayez de reproduire l'identité, comme alors . Il n'y a vraiment pas grand-chose que vous puissiez faire ici pour y remédier. Une option consiste à ajouter plus de neurones que vous avez essayé. La deuxième option est d'essayer une activation continue, comme un sigmoïde, ou peut-être quelque chose sans limite comme une exponentielle. Vous pouvez également essayer l'abandon (avec une probabilité de 10%, par exemple). Vous pouvez utiliser l'implémentation de décrochage régulière dans les keras, qui est, espérons-le, assez intelligente pour ignorer les situations où les 3 de vos neurones abandonnent.x y a b s ( x + i y ) xx+iyxyabs(x+iy)x


1
+1, presque certainement cela. Lorsque vous utilisez ReLU avec un si petit nombre de poids, les neurones morts entrent presque toujours en jeu.
kbrose

1
C'est une supposition plausible dans le cas de ReLU. Mais OP écrit qu'ils ont essayé quelques variantes différentes de ReLU - les neurones morts se produisent-ils également dans des variantes comme ELU ou Leaky Relu ou PReLU?
Sycorax dit Réintégrer Monica

3 shadowy splits in the center when you converge to the more reasonable solution.Oui, c'est l'approximation grossière que je voulais dire; une pyramide hexagonale inversée. or perhaps something unbounded like an exponential J'ai essayé elu et selu, qui ne fonctionnaient pas beaucoup mieux. two neurons collapse to the same pair of weightsAh, je n'y avais pas pensé; J'ai juste supposé qu'ils étaient morts.
endolith

J'ai accédé à la sortie de la couche cachée lors de l'utilisation de ReLU et j'ai confirmé que généralement l'un des neurones est mort. Moins souvent, deux se chevauchent et font la même chose. Je me demande s'il y a un moyen de faire en sorte que les neurones se "repoussent" pour ne pas s'installer dans des rôles redondants.
endolith

1
@endolith Dropout est explicitement conçu autour de la construction de neurones indépendants. Les ELU ne "meurent" jamais, mais elles ont un gradient de fuite à gauche.
Sycorax dit Réintégrer Monica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.