Le défi
Trouver le plus petit réseau neuronal à action directe de telle sorte que, étant donné tout vecteur d'entrée en trois dimensions avec des entrées entières dans , le réseau génère la racine la plus grande (c'est-à-dire "la plus positive") de polynôme avec une erreur strictement inférieure à .
Admissibilité
La notion d'admissibilité dans mon précédent défi de golf de réseau neuronal semblait un peu restrictive, donc pour ce défi, nous utilisons une définition plus libérale du réseau neuronal à action directe:
Un neurone est une fonction qui est spécifiée par un vecteur de poids , un biais et une fonction d'activation de la manière suivante:
Un réseau neuronal à action directe avec des nœuds d'entrée est fonction de qui peut être construit à partir d'une séquence de neurones, où chaque prend les entrées de et produit un scalaire . Compte tenucertains ensemble spécifiédenoeuds de sortie, la sortie du réseauneurones est le vecteur .
É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.
Sigmoïde.
Sinusoïde.
Dans l'ensemble, un réseau neuronal admissible est spécifié par des nœuds d'entrée, une séquence de neurones et des nœuds de sortie, tandis que chaque neurone est spécifié par un vecteur de poids, un biais et une fonction d'activation de la liste ci-dessus. Par exemple, le réseau neuronal suivant est admissible, bien qu'il n'atteigne pas l'objectif de performance de ce défi:
Noeuds d'entrée:
Neurones: pour
Noeuds de sortie:
Ce réseau se compose de 8 neurones, chacun avec un biais nul et une activation d'identité. En termes, ce réseau calcule la séquence de Fibonacci généralisée générée par et , puis émet les 5e, 9e et 10e nombres de cette séquence, dans cet ordre.
Notation
Étant donné un nombre réel avec une expansion décimale terminale, soit le plus petit entier non négatif pour lequel , et que soit le plus petit entier non négatif pour lequel est entier. Ensuite, nous disons que est la précision de .
Par exemple, a une précision de , tandis que a une précision de .
Votre score est la somme des précisions des poids et des biais dans votre réseau neuronal.
(Par exemple, l'exemple ci-dessus a un score de 16.)
Vérification
Alors que les racines peuvent être exprimées en termes de formule cubique , la plus grande racine est peut-être la plus facilement accessible par des moyens numériques. Suivant la suggestion de @ xnor, j'ai calculé la racine la plus grande pour chaque choix d'entiers , et les résultats peuvent être trouvés ici . Chaque ligne de ce fichier texte est de la forme a,b,c,root
. Par exemple, la première ligne indique que la racine la plus grande de est environ .
Edit: le fichier d'origine que j'ai publié comportait des erreurs dans les cas où le polynôme présentait une racine multiple. La version actuelle devrait être exempte de telles erreurs.
la source
a=0
et le quadratique a deux racines complexes?a
non nulle, ou même juste 1. De plus, je recommanderais de mettre dans certains cas de test, en donnant les racines à une haute précision afin que nous puissions vérifier que les nôtres sont à 0,1. Il serait également bon d'avoir des sorties pour toutes les entrées possibles, probablement dans un lien, car c'est beaucoup pour la publication.x -> a * sin(b * softplus(x) + c)
peut surcharger n'importe quel nombre fini de points de données avec un entierx
à une précision arbitraire en utilisant une fréquence extrêmement grande et précise.Réponses:
146740006675436050540344810385599444473806 précision totale
Pour une ligne de base, j'ai étudié l'approche suivante: SélectionnezM, δ,ϵ>0 telle sorte que si nous échantillonnons le polynôme p(x)=x3+ax2+bx+c à
alors le plus grand point d'échantillons⋆∈S satisfaisant p(s⋆)<ϵ existe nécessairement et réside nécessairement à 0.1 de la plus grande racine de p . On peut montrer que pour notre collection de polynômes, on peut prendre M=11 , δ=0.1 et ϵ=10−4 .
Pour concevoir un réseau de neurones qui implémente cette logique, nous commençons par une couche de neurones que l' échantillon polynôme surS . Pour chaque s∈S , on prend
Ensuite, nous identifions ceux qui sont inférieurs àϵ=10−4 . Il s'avère que pour s∈S , il considère que p(s)<10−4 uniquement si p(s)≤0 . À ce titre, nous pouvons utiliser les activations relu pour identifier exactement nos échantillons:
Nous l'implémentons avec quelques couches de neurones:
À ce stade, nous avonsx4,s=1 lorsque p(s)<10−4 , et sinon x4,s=0 . Rappelons que l'on cherche le plus grand s⋆ pour lequel x4,s⋆=1 . À cette fin, nous étiquetons x4,M comme x5,M (pour la commodité de la notation), et pour chaque k≥1 , nous définissons itérativement
Grâce à cette transformation, chaquex5,s est un entier non négatif, et s⋆ est l'unique s pour lequel x5,s=1 . On peut maintenant identifier s⋆ par une autre application d'activations relu:
De manière explicite, nous définissons les neurones par
Alorsx8,s=1 si s=s⋆ et sinon x8,s=0 . Nous les combinons linéairement pour produire notre nœud de sortie:
Pour le score, chaque couche a des neurones avec différents niveaux de précision: (1)6 + 3 + 1 + 9 = 19 , (2) 1 + 4 = 5 , (3) 1 , (4) 5 + 5 = 10 , (5) 1 + 1 = 2 , (6) 1 + 1 = 2 , (7) 1 + 1 = 2 , (8) 1 + 1 + 1 = 3 , (9) 3 | S| . De plus, toutes les couches sauf deux ont| S| =221 neurones; la couche 5 a| S| -1 neurone et la couche 9 a1 neurone.
Edit: Améliorations: (1) Nous pouvons échantillonner le polynôme beaucoup plus efficacement en utilisant des différences finies. (2) Nous pouvons contourner les couches 2 à 4 en utilisant plutôt une activation sigmoïde. (3) Les problèmes de débordement dans la couche 5 peuvent être évités (et les couches suivantes peuvent être combinées) en appliquant plus soigneusement les activations de relu. (4) La somme finale est moins chère avec addition par parties .
Ce qui suit est le code MATLAB. Pour être clair,
prec
est une fonction (trouvée ici ) qui calcule la précision d'un vecteur de poids ou de biais.la source
532682959629306précision totaleUne communication privée avec @ A.Rex a conduit à cette solution, dans laquelle nous construisons un réseau neuronal qui mémorise les réponses. L'idée centrale est que chaque fonctionF: S→ R sur un ensemble fini S bénéficie de la décomposition
Ce qui suit est une implémentation MATLAB de cette approche. Pour être clair,
roots.txt
est le fichier racine affiché ci-dessus (trouvé ici ), etprec
est une fonction (trouvée ici ) qui calcule la précision totale d'un vecteur de poids ou de biais.Edit 1: Deux améliorations par rapport à l'original: (1) J'ai factorisé certains neurones des boucles for. (2) J'ai implémenté «l' intégration de Lebesgue » dans la somme finale en combinant d'abord les termes du même ensemble de niveaux. De cette façon, je ne paie pour la valeur de précision supérieure d'une sortie qu'une seule fois à chaque niveau défini. En outre, il est sûr d'arrondir les sorties au cinquième près par le théorème de la racine rationnelle .
Edit 2: améliorations mineures supplémentaires: (1) J'ai factorisé plus de neurones d'une boucle for. (2) Je ne me donne pas la peine de calculer le terme dans la somme finale pour laquelle la sortie est déjà nulle.
la source