Die Herausforderung
Finden Sie das kleinste neuronale Feedforward-Netzwerk so, dass das Netzwerk bei einem beliebigen dreidimensionalen Eingabevektor mit ganzzahligen Einträgen in die größte (dh "positivste") Wurzel der ausgibt Polynom mit einem Fehler, der streng kleiner als .
Zulässigkeit
Der Begriff der Zulässigkeit in meiner vorherigen Herausforderung zum Golfspielen mit neuronalen Netzen schien etwas restriktiv zu sein. Daher verwenden wir für diese Herausforderung eine liberalere Definition des neuronalen Feedforward-Netzwerks:
Ein Neuron ist eine Funktion , die durch einen Vektor von Gewichten , eine Vorspannung und eine Aktivierungsfunktion auf folgende Weise:
Ein vorwärts gerichtetes neuronales Netzwerk mit Eingangsknoten ist eine Funktion von , die aus einer Sequenz von Neuronen, wobei jedes Eingaben von und gibt einen Skalar . Bei einer bestimmten Menge von Ausgabeknoten ist die Ausgabe des neuronalen Netzwerks der Vektor .
Da Aktivierungsfunktionen für eine bestimmte Aufgabe optimiert werden können, müssen wir die Klasse der Aktivierungsfunktionen einschränken, um diese Herausforderung interessant zu halten. Folgende Aktivierungsfunktionen sind zulässig:
Identität.
ReLU.
SoftPlus.
Sigmoid.
Sinus.
Insgesamt wird ein zulässiges neuronales Netz durch Eingangsknoten, eine Folge von Neuronen und Ausgangsknoten spezifiziert, während jedes Neuron durch einen Vektor von Gewichten, eine Vorspannung und eine Aktivierungsfunktion aus der obigen Liste spezifiziert wird. Beispielsweise ist das folgende neuronale Netz zulässig, obwohl es das Leistungsziel dieser Herausforderung nicht erfüllt:
Eingabeknoten:
Neuronen: für
:
Dieses Netzwerk besteht aus 8 Neuronen mit jeweils null Bias und Identitätsaktivierung. Mit anderen Worten, dieses Netzwerk berechnet die von und erzeugte verallgemeinerte Fibonacci-Sequenz und gibt dann die 5., 9. und 10. Zahl aus dieser Sequenz in dieser Reihenfolge aus.
Wertung
Bei einer reellen Zahl mit endender Dezimalerweiterung sei die kleinste nichtnegative ganze Zahl für die , und sei die kleinste nichtnegative ganze Zahl für welche ist eine ganze Zahl. Dann sagen wir, dass die Genauigkeit von .x
Zum Beispiel hat eine Genauigkeit von , während eine Genauigkeit von .
Ihre Punktzahl ist die Summe der Präzisionen der Gewichte und Verzerrungen in Ihrem neuronalen Netzwerk.
(ZB hat das obige Beispiel eine Punktzahl von 16.)
Nachprüfung
Während die Wurzeln in Form der kubischen Formel ausgedrückt werden können , ist die größte Wurzel möglicherweise am einfachsten mit numerischen Mitteln zugänglich. Nach @ Vorschlag des xnor, berechnet ich die größte Wurzel für jede Wahl der ganzen Zahlen , und die Ergebnisse können hier gefunden werden . Jede Zeile dieser Textdatei hat die Form . In der ersten Zeile wird beispielsweise angegeben, dass die größte Wurzel von ungefähr .x 3 - 10 x 2 - 10 x - 10 10.99247140445449a,b,c,root
Bearbeiten: Die Originaldatei, die ich gepostet habe, hatte Fehler in Fällen, in denen das Polynom eine Mehrfachwurzel aufwies. Die aktuelle Version sollte frei von solchen Fehlern sein.
quelle
a=0
und das Quadrat zwei komplexe Wurzeln hat?a
ungleich Null oder sogar nur 1 sein wird. Außerdem würde ich empfehlen, einige Testfälle einzufügen und die Wurzeln mit hoher Präzision zu versehen, damit wir überprüfen können, ob unsere innerhalb von 0,1 liegen. Es wäre auch gut, Ausgaben für alle möglichen Eingaben zu haben, wahrscheinlich in einem Link, da dies viel für den Beitrag ist.x -> a * sin(b * softplus(x) + c)
eine endliche Anzahl von Datenpunkten mit einer Ganzzahlx
mit beliebiger Genauigkeit und einer extrem großen und präzisen Frequenz überanpassen kann .Antworten:
14.674.000.6675.436.0505.403.44810.3855.9944.4473.806 Gesamtpräzision
Für eine Basislinie habe ich den folgenden Ansatz untersucht: Wählen Sie so dass, wenn wir das Polynom beiM,δ,ϵ>0 p(x)=x3+ax2+bx+c
dann existiert notwendigerweise der größte Abtastpunkt , der erfüllt , und liegt notwendigerweise innerhalb von der größten Wurzel von . Man kann zeigen, dass man für unsere Sammlung von Polynomen , und .s⋆∈S p(s⋆)<ϵ 0.1 p M=11 δ=0.1 ϵ=10−4
Um ein neuronales Netz zu entwerfen, das diese Logik implementiert, beginnen wir mit einer Schicht von Neuronen, die das Polynom auf . Für jedes nehmen wirS s∈S
Als nächstes identifizieren wir, welche davon kleiner als . Es stellt sich heraus , dass für , ist es das gilt nur dann , wenn . Daher können wir Relu-Aktivierungen verwenden, um unsere Proben genau zu identifizieren:ϵ=10−4 s∈S p(s)<10−4 p(s)≤0
Wir implementieren dies mit einigen Schichten von Neuronen:
Zu diesem Zeitpunkt haben wir wenn , und ansonsten ist . Denken Sie daran, dass wir den größten suchen, für den . Zu diesem Zweck bezeichnen wir als (zur Vereinfachung der Notation) und definieren für jedes iterativx4,s=1 p(s)<10−4 x4,s=0 s⋆ x4,s⋆=1 x4,M x5,M k≥1
Dank dieser Transformation ist jedes eine nichtnegative ganze Zahl, und ist das eindeutige für das . Wir können nun durch eine andere Anwendung von Relu-Aktivierungen identifizieren:x5,s s⋆ s x5,s=1 s⋆
Explizit definieren wir Neuronen durch
Dann ist wenn und ansonsten . Wir kombinieren diese linear, um unseren Ausgabeknoten zu erzeugen:x8,s=1 s=s⋆ x8,s=0
Für die Bewertung hat jede Schicht Neuronen mit unterschiedlichen Genauigkeitsstufen: (1) , (2) , (3) , (4) , (5) , (6) , (7) , (8) , (9). Darüber hinaus haben alle bis auf zwei Schichten Neuronen; Schicht 5 hat Neuronen und Schicht 9 hat Neuron.6+3+1+9=19 1+4=5 1 5+5=10 1+1=2 1+1=2 1+1=2 1+1+1=3 3|S| |S|=221 |S|−1 1
Bearbeiten: Verbesserungen: (1) Wir können das Polynom mit endlichen Differenzen viel effizienter abtasten. (2) Wir können die Schichten 2 bis 4 umgehen, indem wir stattdessen eine Sigmoid-Aktivierung verwenden. (3) Die Überlaufprobleme in Schicht 5 können durch sorgfältigeres Anwenden von Relu-Aktivierungen abgewendet werden (und nachfolgende Schichten können kombiniert werden). (4) die Endsumme ist billiger mit Summierung von Teilen .
Was folgt, ist der MATLAB-Code. Um klar zu sein,
prec
ist eine Funktion ( hier zu finden ), die die Genauigkeit eines Vektors von Gewichten oder Verzerrungen berechnet.quelle
53.26829.59629.306 GesamtpräzisionDie private Kommunikation mit @ A.Rex führte zu dieser Lösung, bei der wir ein neuronales Netz aufbauen, das die Antworten speichert. Die Kernidee ist, dass jede Funktion über eine endliche Menge die Zerlegung genießtf:S→R S
Als solches kann man eine neuronale Netzimplementierung von konstruieren, indem man zuerst die Eingabe in eine Indikatorfunktion der Eingabe umwandelt und dann unter Verwendung der gewünschten Ausgaben als Gewichte linear kombiniert. Darüber hinaus ermöglichen Relu-Aktivierungen diese Transformation:f
Was folgt, ist eine MATLAB-Implementierung dieses Ansatzes. Um es klar auszudrücken,
roots.txt
handelt es sich um die oben veröffentlichte Root-Datei ( hier zu finden ) undprec
um eine Funktion ( hier zu finden ), die die Gesamtgenauigkeit eines Vektors von Gewichten oder Verzerrungen berechnet.Edit 1: Zwei Verbesserungen gegenüber dem Original: (1) Ich habe einige Neuronen aus den for-Schleifen herausgerechnet. (2) Ich habe " Lebesgue-Integration " in der Endsumme implementiert, indem ich zuerst Begriffe aus derselben Ebene kombiniert habe. Auf diese Weise bezahle ich für den höherpräzisen Wert eines Ausgangs nur einmal pro eingestellter Stufe. Es ist auch sicher, Ausgaben durch den rationalen Wurzelsatz auf das nächste Fünftel zu runden .
Edit 2: Zusätzliche kleinere Verbesserungen: (1) Ich habe mehr Neuronen aus einer for-Schleife herausgerechnet. (2) Ich mache mir nicht die Mühe, den Term in der endgültigen Summe zu berechnen, für die die Ausgabe bereits Null ist.
quelle