tflearn / Tensorflow lernt nicht xor

8

Der folgende Code wurde geschrieben, um die XOR-Funktion zu lernen, aber ungefähr die Hälfte der Zeit lernt das Netzwerk nicht und der Verlust nach jeder Epoche bleibt derselbe.

%Vor%

Manchmal bekomme ich korrekte Ergebnisse wie folgt:

%Vor%

Aber oft das:

%Vor%

Mein 2x2x1-Netzwerk sollte in der Lage sein, XOR durchzuführen, und es gibt sogar Hinweise darauf, dass dieses Netzwerk immer konvergieren sollte Ссылка

Ich habe auch versucht, die Relukt-Ebenen in Sigmoide zu ändern, 2048 Iterationen durchzuführen und 4x4x1- und 6x6x1-Netzwerke zu erstellen, aber manchmal tritt immer noch das gleiche Problem auf.

Könnte etwas nicht damit zusammenhängen, wie die Gewichte initialisiert werden? Wie benutze ich tflearn, um ein neuronales Netz die xor-Funktion lernen zu lassen?

    
rdezbolcom 11.05.2016, 14:52
quelle

3 Antworten

7

Ich habe beschlossen, eine weitere Antwort hinzuzufügen: Ich habe etwas mehr Nachforschungen angestellt und habe einige grundlegend andere Ratschläge zu geben.

Nachdem ich dieses Papier abgeschöpft hatte, dämmerte es mir, dass die Der Grund, warum Sie Konvergenz nicht sehen, könnte mit den anfänglichen Gewichten zu tun haben. Das Dokument bezieht sich spezifisch auf einige Arbeiten von Hirose et al. (Hirose, Yamashita und Huiya 1991), die gefunden haben, dass die Initialisierung mit einem begrenzten Bereich von Gewichten zu einer sehr geringen Konvergenzwahrscheinlichkeit führt. Der "Sweet Spot" schien im Durchschnitt zwischen 0.5 und 1 zu liegen, um zuverlässig zu konvergieren.

Es stellt sich heraus, dass tflearn standardmäßig eine abgeschnittene normale Initialisierung mit einer stddev von 0.02 verwendet. Die Gewichte haben also eine sehr begrenzte Reichweite. Ich habe festgestellt, dass ich einigermaßen zuverlässige Ergebnisse mit zufälliger einheitlicher Initialisierung von -1.0 bis 1.0 erhalten kann.

Außerdem stellt sich heraus, dass Sie eine dritte Ebene hinzugefügt haben. XOR benötigt nur eine versteckte Ebene, sodass Sie die zweite entfernen können. Hier ist der Code, der für mich funktioniert:

%Vor%

Beachten Sie, dass ich mittleren quadratischen Fehler verwende. Zu meiner Überraschung scheint es für dieses Problem am besten zu funktionieren. Die Kreuz-Entropie scheint zu bewirken, dass der Optimierer in relativ flachen Bereichen des Problemraums schmachtet. Ich hätte das Gegenteil erwartet; vielleicht kann jemand, der besser in der Mathematik versiert ist, das besser erklären.

    
Aenimated1 14.05.2016, 01:06
quelle
9

Es wird erwartet, dass das Netzwerk mit relu s (wie es im Code-Snippet geschrieben ist) oft nicht trainiert. Der Grund dafür ist, dass, wenn die Eingabe für Relust kleiner als Null ist, die Ausgabe Null ist und daher der zurückgehende Gradient ebenfalls Null ist.

Da Sie zwei Schichten haben, von denen jede nur zwei Reluktanzeinheiten hat, mit zufälliger Initialisierung, hat jede dieser zwei Schichten 25% von allen Neuronen, die Null zurückgeben und daher Nullgradienten haben, die zurückgehen = & gt; Neuronales Netzwerk wird überhaupt nicht lernen. In einem solchen Netzwerk ist der Ausgang der letzten Schicht (vor dem letzten Sigmoid) Null, Sigmoid ist 0,5 - genau das, was Sie bei den Versuchen beobachten, auf die Ihr Netzwerk nicht konvergiert hat.

Da jede Ebene eine Chance von 25% hat, diesen Schaden zu verursachen, hat das gesamte Netzwerk eine Gesamtchance von etwa 45% ( 1 - (1 - 0.25)^2 ), von Anfang an nicht trainieren zu können. Es gibt auch eine Chance von Null, dass das Netzwerk zu Beginn nicht in einem solchen Zustand ist, aber es passiert, dass es sich während des Trainings in einen solchen Zustand versetzt, was wiederum die Wahrscheinlichkeit von Divergenzen erhöht.

Bei vier Neuronen ist die Chance deutlich geringer, aber immer noch nicht gleich Null.

Nun, das einzige, was ich nicht beantworten kann, ist, warum Ihr Netzwerk nicht konvergiert, wenn Sie relu durch sigmoid ersetzen - ein solches Netzwerk sollte immer "xor" lernen können. Meine einzige Hypothese ist, dass Sie nur ein relu durch sigmoid ersetzt haben, nicht beide.

Können Sie relu s durch sigmoid s ersetzen und bestätigen, dass Sie immer noch Abweichungen beobachten?

    
Ishamael 11.05.2016 15:33
quelle
3

Berücksichtigen Sie zusätzlich zu Ishamaels Ratschlag die Verwendung einer anderen Verlustfunktion. Der mittlere quadratische Fehler ist im Allgemeinen keine gute Wahl für sigmoide Aktivierungen, da der Gradient aufgrund der Sättigung zu klein werden kann, um für das Lernen nützlich zu sein.

    
Aenimated1 11.05.2016 15:44
quelle