Frage: Ist es möglich, eine NN zu trainieren, um zwischen ungeraden und geraden Zahlen zu unterscheiden, indem nur die Zahlen selbst als Eingabe verwendet werden?
Ich habe folgenden Datensatz:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Ich trainierte eine NN mit zwei Eingangsneuronen (eine ist die variable Zahl, die andere ist ein Bias-Neuron), neun Neuronen in der verborgenen Schicht und einem Ausgangsneuron unter Verwendung eines sehr einfachen genetischen Algorithmus: In jeder Epoche kämpfen zwei Sätze von Gewichten " gegen einander; Derjenige mit dem höchsten Fehler verliert und wird durch eine modifizierte Version des Gewinners ersetzt.
Das Skript löst problemlos einfache Probleme wie die Operatoren AND, OR und XOR, bleibt jedoch beim Kategorisieren von ungeraden und geraden Zahlen hängen. Momentan gelang es ihr am besten, 53 von 100 Nummern zu identifizieren, und das dauerte mehrere Stunden. Ob ich normalisiere oder nicht, scheint keinen Unterschied zu machen.
Wenn ich schummeln wollte, konnte ich die Daten einfach vorverarbeiten und% 2 als Eingabe an den NN weiterleiten, aber das möchte ich nicht. NN sollte in der Lage sein, jede Funktion zu approximieren, einschließlich des Modulo-Operators ( glaube ich ). Was mache ich falsch?
quelle
Antworten:
Wie bei jeder maschinellen Lernaufgabe spielt die Darstellung Ihrer Eingaben eine entscheidende Rolle für das Lernen und die Verallgemeinerung.
Ich denke, das Problem mit der Darstellung ist, dass die Funktion (Modulo) in der Eingabedarstellung, die Sie für dieses Problem gewählt haben, stark nichtlinear und nicht glatt ist.
Ich würde folgendes versuchen:
Versuchen Sie einen besseren Lernalgorithmus (Backpropagation / Gradientenabstieg und seine Varianten).
Versuchen Sie, die Zahlen in Binärform mit einer festen Längengenauigkeit darzustellen.
Wenn Ihre Eingabedarstellung eine B-Bit-Zahl ist, würde ich sicherstellen, dass Ihr Trainingssatz nicht auf kleine oder große Zahlen ausgerichtet ist. Zahlen haben, die einheitlich und unabhängig voneinander zufällig aus dem Bereich .[ 0 , 2b- 1 ]
Verwenden Sie, wie Sie es getan haben, ein mehrschichtiges Netzwerk (versuchen Sie zuerst 2 Schichten: dh versteckte + Ausgabe, bevor Sie mehr Schichten verwenden).
Verwenden Sie ein separates Training + Test-Set. Bewerten Sie nicht Ihre Leistung auf dem Trainingssatz.
quelle
Das Klassifizieren von ungeraden und geraden Zahlen ist ein schwieriges Problem. Ein einfaches Muster wiederholt sich unendlich oft. 2,4,6,8 ..... 1,3,5,7 .....
Nichtlineare Aktivierungsfunktionen wie sin (x) und cos (x) verhalten sich ähnlich. Wenn Sie also Ihre Neuronen so ändern, dass sie sin und cos anstelle beliebter Aktivierungsfunktionen wie tanh oder relu implementieren, können Sie dieses Problem vermutlich ziemlich einfach mit einem einzigen Neuron lösen.
Lineare Transformationen gehen immer nichtlinearen Transformationen voraus. Daher lernt ein einzelnes Neuron am Ende sin (ax + b), das für die richtige Kombination von a & b alternativ Nullen und Einsen in der gewünschten Frequenz ausgibt, die in diesem Fall 1 ist.
Ich habe noch nie zuvor Sünde oder Lattich in meinen neuronalen Netzen versucht. Also, entschuldigen Sie, wenn es am Ende eine sehr schlechte Idee ist.
quelle
Also arbeite ich gerade mit neuronalen Netzen und bin auf dasselbe Problem gestoßen wie Sie. Am Ende habe ich die eingegebene Zahl als Array mit Werten dargestellt, die der binären Darstellung der Zahl entsprechen. Seit wir klassifizieren, habe ich meine Ausgabe als Array dargestellt, nicht als einzelner Wert. Ex:
Hoffe das hilft!
quelle
Ich komme hierher, wo ich mit ähnlichen Problemen zu kämpfen hatte. Also schreibe ich, was ich geschafft habe.
Soweit ich weiß, kann Perceptron mit einer Schicht jedes Problem lösen, das am Ende vereinfacht werden kann, um Objekte in einer beliebigen Geometrie mit Hilfe einer geraden Linie zu unterteilen. Und das ist ein solches Problem. Wenn Sie das letzte Bit der Binärdarstellung auf Papier zeichnen, können Sie auch eine Linie zeichnen, und alle ungeraden Zahlen befinden sich auf der einen Seite und die geraden auf der anderen Seite. Aus dem gleichen Grund ist es unmöglich, ein Problem mit einem einschichtigen Netzwerk zu lösen.
In Ordnung. Dieses Problem sieht sehr einfach aus, nehmen wir also den Heaviside-Schritt als Aktivierungsfunktion. Nachdem ich ein bisschen mit meiner Nummer gespielt hatte, wurde mir klar, dass das Problem hier voreingenommen ist. Ich google ein wenig, und was ich festgestellt habe, ist, dass, wenn Sie bei der Geometriedarstellung bleiben, die Abweichung es Ihnen ermöglicht, den Aktivierungsort im Koordinatensystem zu ändern.
Sehr pädagogisches Problem
quelle
Es ist bekannt, dass Logikgatter NICHT, UND, ODER alle mit sehr einfachen neuronalen Netzen (NN) durchgeführt werden können und dass Sie einen vollständigen arithmetischen Taschenrechner mit Logikgattern unter Verwendung von Binärzahlen als Eingabe erstellen können. Daher sollten Sie in der Lage sein, eine NN zu erstellen, um n modulo k für alle in Basis 2 ausgedrückten n- und k-Zahlen zu berechnen.
Wenn Sie n modulo k für eine feste k-Zahl berechnen möchten (zum Beispiel k = 4), können Sie tatsächlich eine äußerst einfache NN erstellen, die dies bewirkt: Drücken Sie die Eingabezahl n in der Basis k aus und ignorieren Sie alle Ziffern mit Ausnahme des niedrigsten Rangs Ziffer, und Sie haben die Antwort!
quelle
Eine Idee, die der Verwendung von explizitem "mod 2" in der Eingabe entgeht, könnte darin bestehen, die Zahl als eine Folge von Pixeln zu codieren, wobei das Problem darin besteht, zu erkennen, ob das Segment in zwei gleiche Segmente aufgeteilt werden kann. Dies ist ein Bildverarbeitungsproblem, das von herkömmlichen Netzwerken gelernt werden kann.
Wenn die Zahl hingegen als Gleitkommazahl gespeichert ist, wird die Frage reduziert (oder verallgemeinert), um zu erkennen, wann eine Gleitkommazahl ungefähr eine Ganzzahl ist.
quelle
Ich habe ein solches Netzwerk in hier .
Die Vertretung von William Gottschalk war die Grundlage.
Es wird nur 1 Neuron in der ersten ausgeblendeten Ebene mit 32 Eingängen verwendet. Die Ausgabeschicht hat nur 2 Neuronen für die One-Hot-Codierung von 0 und 1.
quelle
Meine Lösung
Darüber hinaus ist auch eine Division durch andere Zahlen (z. B. 7) gut:
Erläuterung:
Ich bekomme 2 verschiedene Lösungen. Sie sind beide gut:
1. Sünde als Aktivierung
2. Etage (oder int) als Aktivierung
Es ist unmöglich, die besten Gewichte mit einem Gefälle zu finden, und ich verwende einen genetischen Algorithmus (von scikit-opt ).
quelle