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:
Mais la plupart du temps que je l'essaye, il reste bloqué dans un minimum local et ne parvient pas à trouver la bonne forme:
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?
Réponses:
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+iy x≫y abs(x+iy)≈x
la source
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 weights
Ah, je n'y avais pas pensé; J'ai juste supposé qu'ils étaient morts.