Erstellen eines neuronalen Netzes für die xor-Funktion

8

Es ist eine bekannte Tatsache, dass ein 1-Schicht-Netzwerk die xor-Funktion nicht vorhersagen kann, da es nicht linear trennbar ist. Ich habe versucht, ein 2-Layer-Netzwerk mit der logistischen Sigmoid-Funktion und Backprop zu erstellen, um xor vorherzusagen. Mein Netzwerk hat 2 Neuronen (und eine Vorspannung) auf der Eingangsschicht, 2 Neuronen und 1 Vorspannung in der verborgenen Schicht und 1 Ausgangsneuron. Zu meiner Überraschung wird dies nicht konvergieren. Wenn ich eine neue Ebene hinzufüge, also ein 3-Ebenen-Netzwerk mit Eingabe (2 + 1), versteckt1 (2 + 1), versteckt2 (2 + 1) und Ausgabe habe, funktioniert es. Wenn ich ein 2-Schicht-Netzwerk behalte, aber die Größe der verborgenen Schicht auf 4 Neuronen + 1 Vorspannung erhöhe, konvergiert es ebenfalls. Gibt es einen Grund, warum ein 2-Schicht-Netzwerk mit 3 oder weniger versteckten Neuronen die xor-Funktion nicht modellieren kann?

Benutzer
quelle
2
Mit dieser Struktur können Sie XOR vorhersagen. Tatsächlich brauchen Sie nicht einmal Vorurteile (siehe hier ).
Krychu
Muss ich meine Gewichte auf besondere Weise initialisieren, um Konvergenz zu erzielen? Ich versuche ein einfaches neuronales Netz mit Gewichten zwischen (-1,1), das zufällig initialisiert wurde, aber ich kann es nicht dazu bringen, zu konvergieren (selbst wenn ich Vorurteile verwende)
Benutzer
Tatsächlich konvergiert das logistische Sigmoid manchmal, aber nicht immer, es hängt von der anfänglichen Wahl der Zufallsgewichte ab.
Benutzer
Ihr Bereich scheint ziemlich groß zu sein, versuchen Sie (-0,1, 0,1). Andernfalls besteht die Gefahr, dass das Eingangssignal für ein Neuron von Anfang an groß ist. In diesem Fall ist das Lernen für dieses Neuron langsam. Möglicherweise möchten Sie auch die Lernrate verringern und die Anzahl der Iterationen erhöhen.
Krychu
Im Gegenteil, größere Werte führen zu einer schnelleren Konvergenz. Ich habe versucht, kleinere Lernrate und viele Iterationen. Ich denke, Neil Slaters Antwort unten fasst die Probleme zusammen, obwohl ich immer noch nicht sicher bin, warum.
Benutzer

Antworten:

6

Ja, es gibt einen Grund. Es hängt damit zusammen, wie Sie Ihre Gewichte initialisieren.

Es gibt 16 lokale Minima mit der höchsten Konvergenzwahrscheinlichkeit zwischen 0,5 und 1.

Geben Sie hier die Bildbeschreibung ein

Hier ist ein Artikel, der das xor-Problem analysiert.

Emil
quelle
2
Anscheinend ist der Link unterbrochen.
Adam Kingsley
@Emil Also, wenn die Gewichte sehr klein sind, sagst du, dass es niemals konvergieren wird? Ich habe auch den Link für dich repariert.
Benutzer
@user Richtig.
Emil
6

Ein Netzwerk mit einer verborgenen Schicht, die zwei Neuronen enthält, sollte ausreichen, um das XOR-Problem zu trennen. Das erste Neuron fungiert als ODER-Gatter und das zweite als NICHT-UND-Gatter. Fügen Sie beide Neuronen hinzu und wenn sie die Schwelle überschreiten, ist dies positiv. Sie können hierfür einfach lineare Entscheidungsneuronen verwenden, indem Sie die Verzerrungen für die Schwellenwerte anpassen. Die Eingänge des NOT AND-Gatters sollten für die 0/1-Eingänge negativ sein. Dieses Bild sollte es klarer machen, die Werte auf den Verbindungen sind die Gewichte, die Werte in den Neuronen sind die Verzerrungen, die Entscheidungsfunktionen wirken als 0/1-Entscheidungen (oder nur die Vorzeichenfunktion funktioniert auch in diesem Fall).

XOR Neuronales Netz

Bild dank "Abhranil Blog"

Jan van der Vegt
quelle
Vielen Dank, dann ist es nicht möglich, dies mit einem logistischen Sigmoid zu tun, da es den Wert auf (0,1) beschränkt
Benutzer
Nein, es sollte immer noch möglich sein, dies mit einem logistischen Sigmoid zu lernen, es sollte nur die Schwellenwerte / Gewichte anders lernen
Jan van der Vegt
+1.5
4

Wenn Sie einen grundlegenden Gradientenabstieg (ohne andere Optimierung, wie z. B. Impuls) und ein minimales Netzwerk mit 2 Eingängen, 2 versteckten Neuronen und 1 Ausgangsneuron verwenden, ist es definitiv möglich, es zu trainieren, um XOR zu lernen, aber es kann durchaus sein knifflig und unzuverlässig.

  • Möglicherweise müssen Sie die Lernrate anpassen. Der häufigste Fehler besteht darin, ihn zu hoch einzustellen, damit das Netzwerk schwingt oder divergiert, anstatt zu lernen.

  • Es kann eine überraschend große Anzahl von Epochen dauern, um das minimale Netzwerk mithilfe von Batch- oder Online-Gradientenabstieg zu trainieren. Möglicherweise sind mehrere tausend Epochen erforderlich.

  • Bei einer so geringen Anzahl von Gewichten (nur 6) kann eine zufällige Initialisierung manchmal zu einer Kombination führen, die leicht hängen bleibt. Möglicherweise müssen Sie versuchen, die Ergebnisse zu überprüfen und dann neu zu starten. Ich schlage vor, dass Sie für die Initialisierung einen gesetzten Zufallszahlengenerator verwenden und den Startwert anpassen, wenn die Fehlerwerte hängen bleiben und sich nicht verbessern.

Neil Slater
quelle
Ja, das ist es, was ich beobachte, mit einigen Startwerten konvergiert es, andere nicht. Wenn ich anstelle von Sigmoid eine hyperbolische Tangente verwende, funktioniert dies immer ziemlich gut. Bei Sigmoid hängt dies, wie Sie beobachtet haben, vom Samen ab. Was ist der Grund dafür, dass es so schwierig ist?
Benutzer
Ich bin mir nicht ganz sicher, was der mathematische Grund ist. Dies ist nur aus meiner Erfahrung mit dem Schreiben einer Testsuite zum Lernen von xor. In meinem Fall hat das Hinzufügen von Schwung geholfen, aber ich denke, dass so ziemlich jede Anpassung vom einfachsten Netzwerk und / oder Optimierer weg hilft.
Neil Slater