Trier avec un réseau neuronal

15

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 (une,b,c,) avec des entrées entières dans [-dix,dix] , les sorties du réseau Trier(une,b,c,) avec une erreur de coordonnées strictement inférieure à 0,5 .

Admissibilité

Pour ce défi, un réseau neuronal à action directe est défini comme une composition de couches . Une couche est une fonction L:RnRm qui est spécifiée par une matrice UNERm×n de poids , un vecteur bRm de biais et une fonction d'activation F:RR qui est appliquée en coordonnée- sage:

L(X): =F(UNEX+b),XRn.

É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é. F(t)=t

  • ReLU. F(t)=max(t,0)

  • Softplus. F(t)=ln(et+1)

  • Tangente hyperbolique. F(t)=tanh(t)

  • Sigmoïde. F(t)=etet+1

Dans l'ensemble, un réseau neuronal admissible prend la forme LkLk-1L2L1 pour certains k , où chaque couche Lje est spécifiée par les poids UNEje , les biais bje et une fonction d'activation Fje 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):

[min(une,b)max(une,b)]=[1-1-12-121-11212]ReLU[1212-12-121-1-11][uneb]

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.)

Dustin G. Mixon
la source
2
@ Close-voter: Qu'est-ce qui n'est pas clair exactement? Je ne pense pas que l'un des défis NN précédents ait été si bien spécifié.
flawr
1
Non - les connexions par sauts ne sont pas autorisées.
Dustin G. Mixon
1
@ DustinG.Mixon Je viens de trouver une approche pour le max / min qui n'utilise que 15 poids au lieu de 16, mais elle est considérablement moins élégante :)
flawr
3
Il s'agit d'un défi bien spécifié qui, je pense, pourrait servir de modèle pour les futurs défis du réseau neuronal.
2019
1
Personnellement, j'ai du mal à optimiser sans sauter les connexions. En effet, un tri NN est nécessaire pour sortir des nombres suffisamment proches des entrées. Il semble donc nécessaire de «mémoriser» / «reconstruire» les entrées entre les couches. Je ne vois pas comment cela pourrait être fait facilement une fois que est impliqué car il n'y a pas d'inverses de ces fonctions autorisées comme activations. Il ne nous reste donc que les ReLU pour lesquels la ligne de base (avec des améliorations mineures comme indiqué dans la réponse de flawr) est déjà presque optimale. et
Joel

Réponses:

13

Octave , 96 88 87 84 76 54 50 poids et biais

Ce 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:

min=aReLU(ab)max=b+ReLU(ab)

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!

function z = net(u)
a1 = [100;100;0;100;100;0];
A1 = [1 0 0 0;0 0 1 0;1 0 -1 0;0 1 0 0;0 0 0 1;0 1 0 -1];
B1 = [1 0 -1 0 0 0;0 0 0 1 0 -1;0 1 1 0 0 0;0 0 0 0 1 1];
A2 = [1 0 0 0;0 1 0 0;1 -1 0 0;0 0 1 0;0 0 0 1;0 0 1 -1];
A3 = [1 0 -1 0 0 0;0 1 1 0 0 0;0 0 0 1 0 -1;0 1 1 -1 0 1;0 0 0 0 1 1];
B3 = [1 0 0 0 0;0 1 0 -1 0;0 0 1 1 0;0 0 0 0 1];
b3 = -[100;100;100;100];
relu = @(x)x .* (x>0);
id = @(x)x;
v = relu(A1 * u + a1);
w = id(B1 * v) ;
x = relu(A2 * w);
y = relu(A3 * x);
z = id(B3 * y + b3);
% disp(nnz(a1)+nnz(A1)+nnz(B1)+nnz(A2)+nnz(A3)+nnz(B3)+nnz(b3)); %uncomment to count the total number of weights
end

Essayez-le en ligne!

flawr
la source
1
Les décalages constants sont essentiellement utilisés pour rendre les entrées non négatives. Une fois effectué dans la première couche, toutes les sorties intermédiaires des blocs de comparaison ne sont pas négatives et il suffit de les modifier uniquement dans la dernière couche.
Joel
1
Pourriez-vous obtenir un gadget min-max plus court avec (a - relu(a-b), b + relu(a-b))?
2019
@joel Oh maintenant je vois, ça a beaucoup de sens :)
flawr
@xnor Merci beaucoup qui fait une énorme différence !!!!
flawr
1
Piqûre non consécutive: le score du premier biais est nnz (A1 * a0), pas nnz (a0). (Ou bien nous devons payer le prix d'une matrice d'identité.) Ces chiffres sont les mêmes dans ce cas.
Dustin G. Mixon