Les défis de golf neuronaux précédents ( ceci et cela ) m'ont inspiré à poser un nouveau défi:
Le défi
Trouver le plus petit réseau neuronal à action directe tel que, étant donné tout vecteur d'entrée à 4 dimensions avec des entrées entières dans , les sorties du réseau avec une erreur de coordonnées strictement inférieure à .
Admissibilité
Pour ce défi, un réseau neuronal à action directe est défini comme une composition de couches . Une couche est une fonction qui est spécifiée par une matrice de poids , un vecteur de biais et une fonction d'activation qui est appliquée en coordonnée- sage:
Étant donné que les fonctions d'activation peuvent être réglées pour une tâche donnée, nous devons restreindre la classe des fonctions d'activation pour garder ce défi intéressant. Les fonctions d'activation suivantes sont autorisées:
Identité.
ReLU.
Softplus.
Tangente hyperbolique.
Sigmoïde.
Dans l'ensemble, un réseau neuronal admissible prend la forme pour certains , où chaque couche est spécifiée par les poids , les biais et une fonction d'activation de la liste ci-dessus. Par exemple, le réseau neuronal suivant est admissible (bien qu'il ne satisfasse pas l'objectif de performance de ce défi, il peut être un gadget utile):
Cet exemple présente deux couches. Les deux couches n'ont aucun biais. La première couche utilise l'activation ReLU, tandis que la seconde utilise l'activation d'identité.
Notation
Votre score est le nombre total de poids et de biais différents de zéro .
(Par exemple, l'exemple ci-dessus a un score de 16 car les vecteurs de biais sont nuls.)
la source
Réponses:
Octave ,
96 88 87 84 76 5450 poids et biaisCe réseau neuronal à 6 couches est essentiellement un réseau de tri en 3 étapes construit à partir d'un très simple
min
/max
réseau en tant que composant. Il s'agit essentiellement de l'exemple de réseau de wikipedia comme indiqué ci-dessous, avec une petite modification: Les deux premières comparaisons sont effectuées en parallèle. Pour contourner les nombres négatifs via le ReLU, nous ajoutons simplement 100 d'abord, puis soustrayons à nouveau 100 à la fin.Donc, cela devrait simplement être considéré comme une référence car il s'agit d'une implémentation naïve. Il trie cependant tous les nombres possibles qui n'ont pas une magnitude trop grande parfaitement. (Nous pouvons ajuster la plage en remplaçant 100 par un autre nombre.)
Essayez-le en ligne!
composant max / min
Il existe un moyen (
beaucoup moins élégant, plus élégant maintenant, merci @xnor!) De trouver le minimum et le maximum de deux nombres en utilisant moins de paramètres:Cela signifie que nous devons utiliser beaucoup moins de poids et de biais.
Merci à @Joel d'avoir souligné qu'il suffit de rendre tous les nombres positifs dans la première étape et de les inverser dans la dernière, ce qui fait -8 pondérations. Merci @xnor d'avoir indiqué une méthode max / min encore plus courte qui fait -22 poids! Merci @ DustinG.Mixon pour l'astuce de combiner certaines matrices qui donnent un autre -4 poids!
Essayez-le en ligne!
la source
(a - relu(a-b), b + relu(a-b))
?