Ich möchte dieser Community eine andere Art von Golfherausforderung vorschlagen:
(Künstliche) Neuronale Netze sind sehr beliebte Modelle des maschinellen Lernens, die so entworfen und trainiert werden können, dass sie sich einer bestimmten (normalerweise unbekannten) Funktion annähern. Sie werden oft verwendet, um hochkomplexe Probleme zu lösen, die wir nicht algorithmisch lösen können, z. B. Spracherkennung, bestimmte Arten von Bildklassifizierungen, verschiedene Aufgaben in autonomen Fahrsystemen, ... Für eine Einführung in neuronale Netze ist dies hervorragend Wikipedia-Artikel .
Da dies die erste in meiner Hoffnung ist, eine Reihe maschineller Golfherausforderungen zu werden, möchte ich die Dinge so einfach wie möglich halten:
Entwerfen und trainieren Sie in der Sprache und dem Rahmen Ihrer Wahl ein neuronales Netzwerk, das unter Berücksichtigung von sein Produkt für alle ganzen Zahlen zwischen (und einschließlich) und berechnet .
Leistungsziel
Um sich zu qualifizieren, darf Ihr Modell bei keinem dieser Einträge um mehr als vom korrekten Ergebnis abweichen .
Regeln
Dein Modell
- muss ein "traditionelles" neuronales Netzwerk sein (der Wert eines Knotens wird als gewichtete lineare Kombination einiger Knoten in einer vorherigen Schicht berechnet, gefolgt von einer Aktivierungsfunktion),
- darf nur die folgenden Standard-Aktivierungsfunktionen verwenden:
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- muss entweder als Tupel / Vektor / Liste / ... von ganzen Zahlen oder als Gleitkommazahl als einzige Eingabe nehmen,
- Geben Sie die Antwort als Ganzzahl, Float (oder einen geeigneten Container, z. B. einen Vektor oder eine Liste, die diese Antwort enthält) zurück.
Ihre Antwort muss den gesamten Code enthalten (oder mit diesem verknüpft), der zur Überprüfung Ihrer Ergebnisse erforderlich ist - einschließlich der trainierten Gewichte Ihres Modells.
Wertung
Das neuronale Netz mit der geringsten Anzahl von Gewichten (einschließlich Bias-Gewichten) gewinnt.
Genießen!
quelle
f(x) = x
die Eingabe weiterleitet?Antworten:
21 13 119 gewichteDies basiert auf der Polarisationsidentität bilinearer Formen, die sich im eindimensionalen Realfall auf die polynomiale Identität reduziert:
y1
Berechne also einfach[x+y, x-y]
mit einer linearen Transformation undy3
ist nur der absolute Wert vony1
als Vorverarbeitungsschritt für den nächsten: Dann berechnet der "harte" Teil die Quadrate, die ich unten erläutere, und danach berechnet er einfach einen Unterschied und eine Skalierung, die ist wieder eine lineare Operation.W2
0.02
Probieren Sie es online!
quelle
abs
. Aber trotzdem ist alles in Ordnung.y0
braucht 4,y1
braucht 2,y3
braucht 2,y4
braucht 1,y5
braucht 1 undy6
braucht 2. Das ist 12?7 Gewichte
Probieren Sie es online!
eps
c
quelle
C = -B
(1 Gewicht) und dann haben[e_s, e_d] = conv([A,B,C], [eps, eps])
(2 Gewichte), um ein Gewicht zu sparen :) (Übrigens: Sehr kluger Ansatz!)exp
)3331 gewichteProbieren Sie es online!
Dies führt eine lange Multiplikation in (sorta) binär durch und gibt somit das genaue Ergebnis zurück. Es sollte möglich sein, das 0,5-Fehlerfenster zu nutzen, um dies noch weiter zu verbessern, aber ich bin mir nicht sicher, wie.
Die Schichten 1 bis 6 zerlegen die erste Eingabe in 5 "Bits". Aus Golfgründen verwenden wir keine eigentlichen Binärdateien. Das höchstwertige "Bit" hat eine Gewichtung von -15 anstelle von 16, und wenn die Eingabe 0 ist, sind alle "Bits" 0,5 (was immer noch gut funktioniert, da es die Identität beibehält
inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1
).quelle
43 Gewichte
Die beiden bisher veröffentlichten Lösungen waren sehr clever, aber ihre Ansätze funktionieren wahrscheinlich nicht für traditionellere Aufgaben im maschinellen Lernen (wie OCR). Daher möchte ich für diese Aufgabe eine "generische" (keine cleveren Tricks) Lösung vorschlagen, die hoffentlich andere Menschen dazu inspiriert, sie zu verbessern und in die Welt des maschinellen Lernens einzutauchen:
Mein Modell ist ein sehr einfaches neuronales Netzwerk mit 2 versteckten Schichten, die in TensorFlow 2.0 erstellt wurden (aber jedes andere Framework würde auch funktionieren):
Wie Sie sehen, sind alle Ebenen dicht (was mit Sicherheit nicht optimal ist). Die Aktivierungsfunktion ist hellbraun (was für diese Aufgabe möglicherweise in Ordnung ist), mit Ausnahme der Ausgabeebene, die aufgrund der Art dieser Aufgabe hat eine lineare Aktivierungsfunktion.
Es gibt 43 Gewichte:
Als nächstes habe ich sie verfeinert und für die maximale Abweichung bei einer der ganzzahligen Multiplikationsaufgaben optimiert. Leider zeigen meine Notizen nicht viel Feinabstimmung, die ich am Ende gemacht habe, aber es war sehr gering. In der Nähe von 100 Epochen auf diesen 441 Trainingsmustern mit einer Chargengröße von 441.
Dies sind die Gewichte, mit denen ich gelandet bin:
Mein Modell finden Sie hier und Sie können es auch online ausprobieren! in einer Google Colab-Umgebung.
quelle
2 Gewichte
Mit nur 1 Gewicht (!) Durchkommen
(Vielleicht sollten wir ändern, wie wiederverwendete Gewichte in zukünftigen Herausforderungen des Golfsports mit neuronalen Netzen gewertet werden.)
quelle