Biasneuron im neuronalem Netz
-
Ich habe ein neuronales Netz in der Entwicklung, aber ich verstehe eine Sache nicht ganz. Warum sollte ein zusätzliches Biasneuron funktionieren?
Bisher zeichnet sich das Netz dadurch aus, dass man praktisch jegliche Vernetzung realisieren kann. Als übertragungsfunktion diente eine sigmoide Funktion.
Das Biasneuron habe ich bisher so implementiert:
1.) Jeder Schicht bis auf die Ausgabeschicht habe ich ein Biasneuron hinzugefügt.
2.) Dann weise ich jedem Neuron der nächsten Schicht den Bias aus dem Produkt aus dem Wert des Biasneurons und der Verbindung zu den Neuronen der nächsten Schicht
3.) Wenn ich jetzt für die Neuronen den Wert ausrechnen will, dann prüfe ich den Wert der Neuronen in der vorhergehenden Schicht jedemal darauf, dass sie ihren Bias überschreiten sonst gehe ich einfach zum nächten Neuron weiter.Neuron *from; for(unsigned int i = 0; i < m_lIncomingConnections.size(); i++) { from = m_lIncomingConnections[i]->GetDestination(this); if(from->Type == IS_STDNEURON) { if(from->GetNeuronValue() > from->GetNeuronBias() ) { m_fValue += from->GetNeuronValue() * m_lIncomingConnections[i]->GetValue(); } } else if(from->Type == IS_BIASNEURON) { m_fBias = m_lIncomingConnections[i]->GetValue() * from->GetNeuronValue(); } }
Die Verbindung zwischen Biasneuron und den anderen Neuronen wird mit der regulären Trainingsfunktion angepasst. Allerdings bemerke ich keinen Lernunterschied mit oder ohne Biasneuron...
-
Das Biasneuron ist eigentlich dazu da, den Bias eines Neuronen zu ersetzen.
-
Wie man das jetzt dreht oder wendet. Es macht bei mir keinen Unterschied ob ich einen Schwellwert habe oder nicht.
-
Das Biasneuron sollte den Schwellwert ersetzen. D.h. ob du es doppelt drin hast oder nicht, sollte nichts aendern. Bei Vorhandensein eines Biasneuron sollte der Aufruf from->GetNeuronBias() als auch der Vergleich mit der Erregung ueberfluessig sein. Du haust einfach 2 verschiedene Ansaetze fuer ein und die selbe Sache zusammen. Du hast das Prinzip noch nicht durchdrungen.
Desweiteren was meinst du mit Lernunterschied?
-
Ok, anscheinend habe ich das Prinzip wirklich noch nicht ganz verstanden. Könntest du es erklären?
-
würde diese Funktion demnach reichen? Der Wert des Neuron ist Die Summe aus:
Neuron(vorhergehende Schicht)*Gewicht + Gewicht(dieses Neuron zu Biasneuron) und dann über die Übertragungsfunktion.Neuron *from; for(unsigned int i = 0; i < m_lIncomingConnections.size(); i++) { from = m_lIncomingConnections[i]->GetDestination(this); unsigned int biasIndex = m_lIncomingConnections.size()-1; m_fValue += from->GetNeuronValue() * m_lIncomingConnections[i]->GetValue() + m_lIncomingConnections[biasIndex]->GetValue(); }
-
Also das Biasneuron ist dazu da, den Bias genauso zu trainieren wie die anderen Verbindungen. Mein Formalismus fuer back propagation Netzwerke hat sich auf Matrixmultiplikation reduziert, deswegen kann ich zu deinem Code nichts sagen.
Bei solchen Fragen verweise ich gern auf den Klassiker: Theorie der neuronalen Netze. Eine systematische Einführung von Raul Rojas. Vielleicht hast du das Glueck in einer (Uni)Bibliothek noch eine deutsche Ausgabe zu ergattern.
-
Evtl. wärst du so nett deinen code-ausschnitt zu posten. ich pass den dann schon an, oder gucke ob das meinem entspricht. Wenn nicht, muss ich wohl wirklich mal nach nem Buch gucken.
Thx
-
http://www.willamette.edu/~gorr/classes/cs449/backprop.html
Ganz unten. So aehnlich habe ich es damal auch gemacht. Mein Code hat leider keine netten Pfeile oder Transponiertzeichen. Das Beispiel dort ist fuer die Variante ohne Biasneuron. Es behandelt genau einemal Input -> Output -> back propagation. D.h. eine Schleife ueber alle Trainingsdaten und Lernschritte wuerde das ganze umschliessen. Das Buch gibt es auch Online, leider nur Englisch: Neural Networks - A Systematic Introduction. Meinen alten Code werde ich jetzt nicht mehr suchen ..
-
Hello! cbagfab interesting cbagfab site!
-
Hallo zusammen,
was haltet ihr von der Idee die Bias einfach als Aktivierungsfunktion zu definieren, die dann konstant alle Inputs missachtet und 1,0 ausgibt? Hab ich schon immer so gemacht, und vereinfacht vieles. Für das bessere Verständnis hier mal ein Link auf meine Website, die sich mit dem Thema befasst:http://compositedevtec.square7.ch/NNBuilder.html Wenn ihr mit .NET programmiert, könnt ihr euch auch meine Bibliothek von meinem Blog runterladen, die alle Arbeit verrichtet, und solche Sachen wie Units und so als Klassen mit sich bringt. Es muss dann nur noch TrainingStarten aufgerufen werden, und die entsprechenden input/target Werte müssen definiert werden, den Rest erledigt die Bibliothek. Noch einfacher gehts natürlich mit dem Programm. Einfach dann die Datei als .nnet abspeichern, mit eigener Anwendung laden(s. mein Artikel neural nets extendet..), und fertig. Ganz ohne Programmieraufwand.Gruß
Winfried Lötzsch
-
a) Die Idee ist alt. Siehe verlinktes Buch!
b) Der Thread ist 1 Jahr alt.
c) Wikipedia will normalerweise nicht Erstreferenz sein. Auch finde ich Backpropagation gar nich kompliziert.Backpropagation ... (s. http://de.wikipedia.org/wiki/Backpropagation). Dieses Verfahren ist eines der mächtigsten und kompliziertesten Lernverfahren in der Geschichte der neuronalen Netze.
d) Es empfiehlt sich Latex fuer das Setzen von Formeln in Dokumenten wie deines.
e) Aehm?Diese Sigmoidfunktion hat sich in der Praxis als am tauglichsten erwiesen , da sie ebenfalls einen positiven Einfluss auf die Fehlerfunktion hat, indem sie diese glättet , und die Entstehung lokaler Minima forciert, und so den Gradientenabstieg erleichtert. Das heißt der Abstieg findet wirklich das absolute Minimum, und nicht irgend ein lokales
-
Sorry, was gefällt dir an meinen Formeln nicht? Und das mit der Fehlerfunktion, ok vielleicht blöd formuliert, soll heißen: Fehlerfunktion hat nur an einer Stelle(einem Minimum) eine waagerechte Tangente. Gibt es einen aufwendigeren Algorithmus als die Backprop zum Training neuronaler Netze?
Ok, Dokumentation ist Nebensache, was sagst du zu dem Programm?
-
Ich hake da auch nochmal ein
Backpropagation ... (s. http://de.wikipedia.org/wiki/Backpropagation). Dieses Verfahren ist eines der mächtigsten und kompliziertesten Lernverfahren in der Geschichte der neuronalen Netze.
Ausser, dass schon vor ca 10 jahren abschließend herausgefunden wurde, dass Backpropagation zusammen mit Gradientenabstieg alles in allem ziemlich bescheiden funktioniert(weil Gradientenabstieg allgemein eine schlechte Idee ist). Und dabei ist es sehr trivial.
Vergleich das mal mit zum Beispiel deep belief networks. DIE sind kompliziert zu lernen...und mächtig.Diese Sigmoidfunktion hat sich in der Praxis als am tauglichsten erwiesen , da sie ebenfalls einen positiven Einfluss auf die Fehlerfunktion hat, indem sie diese glättet , und die Entstehung lokaler Minima forciert, und so den Gradientenabstieg erleichtert. Das heißt der Abstieg findet wirklich das absolute Minimum, und nicht irgend ein lokales
Von vorne bis hinten falsch. Die Sigmoidfunktion wird nur verwendet, weil sie die Eigenschaft hat, in einem neuronalen Netz einen universellen Approximator für jede Funktion liefern zu können(man hätte auch Gaussfunktionen nehmen können und würde bei Radiale-Basisfunktions-Netzwerken landen). Und weil sie biologisch motiviert ist. Was sie nicht macht, ist die Fehlerfunktion vereinfachen. Im Gegenteil. Die sieht nämlich ziemlich bescheiden aus und hat schon bei kleinen Problemen viele lokale Minima.
Das es mehr als ein globales Minimum gibt, kann man sogar sehr schnell sehen. Angenommen, wir haben ein neuronales Netz mit 2 Sigmoiden auf der mittleren Schicht. Angenommen, du hast die optimale Lösung. Dann kannst du einfach die Gewichte der Ein- und Ausgaben der Knoten miteinander tauschen und du erhälst ein neues globales Minimum. Ebenso (bei symmetrischen Sigmoiden) einfach bei einem Knoten alle Ein-und Ausgänge mit -1 multiplizieren. Die Sache mit dem lokalen Minimum lässt sich leider nicht so leicht zeigen(zumindest nicht ohne Fehlerfunktion), aber man sieht sehr schnell, dass sobald es ein lokales Minimum gibt, es auch verdammt viele andere gibt.
-
Ok, ich rede das ja auch nur von hier nach http://www.math.uni-muenster.de/SoftComputing/lehre/material/wwwnnscript/backprop1.html
Aber auch die Fehlerfunktion wird durch die Wahl einer sigmoiden Ausgabefunktion beeinflußt.
Die Fehlerkurve wird geglättet.
Die Fehlerkurve besitzt nur in einem Minimum oder Maximum eine waagerechte Tangente.
zeigt immer in Richtung des Minimums.
Sigmoide Ausgabefunktionen forcieren die Entstehung lokaler Minima.. Selber nicht wirklich getestet. Werd ich den Abschnitt wohl noch mal Überarbeiten. Vielen Dank euch beiden für die Info.
An otze:
Hast du schon mal was mit diesen deep belief networks gemacht, was mich interessieren würde wäre die Geauigkeit, und wie ich das zeug in meine Anwendung einbauen kann, also target und inputs gegben, und dann Algorithmus.. vielleicht mal ein Codebeispiel? Mein Rekord für XOR mit Backprop und 10 000 Lerndurchläufen wird (C# double) aufgerundet auf 1, oder eben ab auf 0. Vielen Dank, dass ihr euch mit meinem Mist befasst nochmal!
-
Entstehung lokaler Minima forciert
Heisst: Es gibt (viele) lokale Minima!
der Abstieg findet wirklich das absolute Minimum, und nicht irgend ein lokales
Diese Schlussfolgerung ist falsch.
-
Ähm ok, war eine blöde Reihenfolge, wird geändert, was ist mit der Tangente? Hat das denn nicht zur Folge, dass er mit (zumindest hoher Wahrscheinlichkeit) ein absolutes Minimum findet?
-
@lownd
Die Dinger lösen prinzipiell keine Regressions oder Klassifikationsaufgaben alleine. Am Ende steht immer eine ganz normale Klassifikation oder Refression mit nem einfachen Netzwerk. Codebeispiele habe ich nicht, weil ich die Dinger selbst noch nie implementiert hab, und am Institut auch nichts finales existiert.Sie sind aber auch für völlig andere Probleme designt, als ein einfaches xor Problem.
Wenn du geht englisch kannst, hier ist ein Talk darüber:
http://www.youtube.com/watch?v=AyzOUbkUf3M
Der Redner ist der Mann, der quasi das ganze machine learning Feld wiederbelebt hat, nachdem man mit den linearen Techniken gescheitert ist. Am Ende gibts ne unglaublich krasse Anwendung - die man so gar nicht mehr mit xor vergleichen kann.@Tangente: jedes lokale Minimum ist dadurchd efiniert, dass die Steigung Null ist und damit die Tangente Wagerecht. Und Sattelpunkte gibts auch noch, sind genau so definiert. Oh, und wenn du Gültigkeitsbereiche hast, zum Beispiel dass eine Variable nicht größer als 10 werden kann, dann benötigt das lokale Minimum nicht unbedingt eine Steigung von 0.
Beispiel: Funktion f(x)=-x Nebenbedingung x<=5
globales Minimum: x=5
Aber: f'(5)=-1
-
Danke dir! Werden die Teile denn in der Praxis schon angewendet? Natürlich mach ich nicht nur XOR mit meiner Backprop, hast du die schon mal den PatternRecognizer angeschaut? Ganz kleine Datei mit einem simplen Netz im Hintergrund, was darauf trainiert ist die Zahlen 1 bis 5 der Schriftart Arial zu erkennen. Ich denke doch, dass die Backprop in einigen Richtungen zumindest ganz gute Arbeit leistet. Wenn ich das richtig versteh entspricht das ja auch nicht ganz dem Anwendungsgebiet von diesen Dingern, oder?
-
Spul mal auf ca Minute 22 vor und staune.