Hallo ich bin das erste Mal hier auf dem Forum. Ich hätte hier gerne einen Thread erstellt für Neuronale Netze, Ideen dazu und so weiter. Da ich selber mich an einem probieren beziehungsweise schon damit angefangen habe. Dabei benutze ich die Psprache C++, aber ich möchte hier nur theoretische Fragen stellen.
Eine Frage dazu ob ich das mit dem Backpropagation Funktion verstanden habe. Man hat das Ergebnis und gibt ihm als Input das verfälschte Ergebnis und lässt es dann lernen (Gewichte durch Maxima Funktionen verändern). Kann ich dann theoretisch dem Netz alles lernen. (Hindernisse ausweichen, usw.)
Weiters würde ich mich über gute Quellen zu diesem Gebiet freuen vor allem wo die Herleitung der Funktionen genau und einfach beschrieben ist, denn die habe ich nicht ganz verstanden
mir erscheint dieses Thema sehr interessant! Gibts vielleicht irgendwo eine Anleitung/Buch, in welchem beschrieben wird, wie man diese Netze in C/C++ umsetzt?
Wie hast du damit angefangen?
mich würde schonmal ein kleines basiswissen interessieren.. am besten eine seite wo recht simpel erklärt wird wie soetwas funktioniert... oder aufgebaut ist.
Mich würde es auch interessieren wie du ein Neuronales Netz in C++ programmierst.
@Bammel: Ein guter Einstieg liefert D. Kriesel. Ist mit fast 200 Seiten sehr umfangreich, aber auch so ziemlich das Beste was es im deutschsprachigen Raum gibt Mich stört blos die zweispaltige Schreibweise... Aber sonst sehr informativ. (Bin noch selber nicht ganz durch, ist an manchen Stellen doch seehhhrr mathematisch das Ganze )
Das ist ein sehr schönes Skript. Man muß nicht gleich alles von vorne bis hinten verstehen.
Für das angesprochene Backpropagation ist meine Meinung nach von Interesse:
das Perzeptron
das SingleLagenPerzeptron
das MultilagenPerzeptron
die Aktivierungsfunktion
Deltaregel
Zum Verständniss der linearen Separierbarkeit helfen die graphischen Darstellung wie Abb. 5.10
Es hilft sehr sich das geometrisch vorzustellen bzw. zu visualisieren.
Die Programmiersprache ist eigentlich total egal. In einer objektorientierten Sprache wie C++ lässt es sich eben leichter strukturieren. Wenn man das NN im Prinzip verstanden, sollten zur Implementierung kaum Fragen offen sein.
Das Thema ist auch für mich interessant. Die theoretischen Grundlagen hab ich soweit verstanden, aber: Worauf niemand irgendwo eingeht, ist, wie man sich die Geometrie eines Netzes für ein bestimmtes Problem herleiten kann.
Weiß jemand Rat?
Von irgendwelchen Faustregeln, wie man bestimmte Problemstellungen geometrisch auflöst, habe ich eigentlich noch nirgends etwas gesehen. Das beruht ansich mehr auf Erfahrung und Durchprobieren.
In den meisten Fällen wird man im üblichem Aufbau in der Eingabeschicht für jeden sensorischen Input ein Neuron nehmen, in der Ausgabeschicht für jeden Output jeweils eines, und in einer Mittelschicht auch ein paar, wobei man nicht sagen könnte, ob das Netz mit 20 oder erst mit 21 Neuronen funktioniert... könnte auch mit 30 oder nur 10 noch gehen (Hausnummern).
Mindestens gleich wichtig wie die Auswahl der Neuronenverteilung und Synapsen ist auch die Auswahl der Trainingsdaten sowie eine ausreichende Menge davon.
Mein neuronales Netz funktioniert noch nicht, bzw. wahr ich in letzter Zeit ein wenig faul. Mein eigentliches Prinzip wäre aber folgendes:
1.) Grundlegend ist das Perzeptron. (mehrere Eingänge, einen Output)
2.) Weiters kommen die Schichten die aus Perzeptronen in einer Schicht bestehen. Die Schichten dienen dazu, dass (das Programm, Mensch, Formel) weiß welches Perzeptron zu welcher Schicht gehört. Da ja Neuronale Netze normalerweiße Schichtweiße arbeiten.
3.) Als letztes verbinde ich die Schichten zu einer Neuronenmatrix. Damit ich weiß in welcher Reihenfolge die Schichten kommen.
Bild dazu im Anhang.
Die Verbindung stelle ich durch Zeiger her. Beispiel zur Grafik: Wir nehmen Perzeptron 1 und 2. Nun hat Perzeptron 1 als Input die Werte der Neuronen 1, 2 und 3 und als Output den Wert von Neuron 4. Das Perzeptron 2 hat als Input den Wert der Neuronen 4, 5 und 6. Der Wert von Neuron 4 ist somit sowohl Output von Perzeptron 1 und Input von Perzeptron 2.
Programmiertechnisch habe ich das mit Zeiger gelöst. Das heißt das das Perzeptron 1 einen Zeiger (Output) auf den Wert von Neuron 4 hat und Perzeptron einen Zeiger (Input) auf das Neuron 4 hat.
Hoffe das war verständlich geschrieben. Weitere Schritte sollten ziemlich logisch sein wenn man das Prinzip seines Lernalgorythmus verstanden hat. (Backpropagation, usw.)
Nehmt Euch das einfache Prezeptron vor, das ist quasi ein Neuron.
Eine weitere Annahme: unsere Training/Erkennungsdaten bestehen aus 2 Dimensionen, und könnten somit in ein Koordinatensystem auf Millimeterpapier eingezeichnet werden, wie Positionen auf einer Landkarte.
Es definiert sich aus dem Eingabevektor multipliziert mit dem Gewichtsvektor und addiert bzw. vermindert um eine Schwelle. Diese Formel findet Ihr überall.
Damit definiert es eine Gerade die die senkrecht zum Gewichtsvektor steht.
Die Gerade selber trennt unsere Trainings/Erkennungsdatenfläche in 2 Zonen, nämliche die links und rechts davon. Alle Elemente die auf der einen Seite liegen erkennt das Perzeptron, alle auf der anderen verwirft es. Durch die Änderung der Gewichte schafft Ihr es diese Trennebene rotieren zu lassen. Damit könnte ihr mehr oder weniger gut erreichen, die guten von den schlechten Testeingaben zu trennen, nichts anderes macht das Perzeptron. Mit der Änderung des Schwellenwertes schafft Ihr es diese Trenngerade zu verschieben. Damit kann man also die Gerade recht gut positionieren, die Guten ins Kröpfchen, die Schlechten Ihr wisst schon...
Nun kann es aber vorkommmen, dass trotz bester Ausrichtung der Gerade nicht alle Trainingsdaten korrekt klassifiziert werden können, weil etwa schlechteund gute Daten zu sehr aneinander liegen. Die Daten sind dann nur schwer oder vielleicht gar nicht separierbar. Deswegen muss man dafuer sorgen, dass diese breiter gefächert sind. Das kann man schaffen indem man weitere Merkmale hinzunimmt. Das Perzeptron, welches eine Trenngerade bildet, hat nämlich nur 2 Eingänge, wie die x und y Koordinate. Möchte man eine weitere Dimension, wie die z Koordinate hinzufügen, wird die Gerade, die die Fläche teilt, zu einer Trennebene im Raum. Nimmt man noch weitere Dimensionen hinzu wie vielleicht Farbe, Geschmack spricht man von Hyperebenen im Hyperraum. Für mehr als 3D gibt es wohl keine Begriffe mehr. Das kann man sich schlecht vorstellen, also bleibt man zur Veranschaulichung meist in 2D. Trotzdem kann man sich locker in 4,5 oder 6 Dimensionen (also Eingabewerte) bewegen.
Wenn man aber nun nicht mehr Eingabewerte als 2 hat und die Daten trotzdem durch ein Perzeptron schlecht separierbar sind, liegt es nahe, ein weiteres Perzeptron hinzuzunehmen und diese beiden zu verknüpfen. So kann man die beiden Trenngeraden der Perzeptrone so ausrichten , dass sie besser die Daten separieren.
Nehmen wir mal 3 Gearden also 3 Perzeptrone, diese 3 Geraden bilden ein Dreieck. Wir nehmen mal an sie sind nicht parallele. Man kann sich jetzt vorstellen dass alle Testdaten in diesem Dreieck einer Klasse angehören und alle anderen ausserhalb. Damit hätten wir schon unser Ziel der Klassifizierung erreicht. Natürlich kann die Problematik komplexer sein und die Daten lassen sich nicht von einem Dreieck eingrenzen, dann nimmt man weitere Perzeptrone um Vielecke zu bilden. Reicht das nicht und man findet in diesem Vieleck immernoch falsch klassifizierte Daten, kann man nun eine Neue Schicht Perzeptrone hinzufügen. Mit ihnen kann man dann auch definierte Vielecke,Dreiecke oder.... umklassifizieren, da man sie in der zweiten Schicht mit negativen Gewichten verknüpfen kann. So könnten in Dreieck 1 alle Daten gute sein, aber dafuer muessen sie ausserhalb des Dreiecks 2 sein. So arbeitet man sich schrittweise an die Lösung heran und umzingelt quasi die Daten.
Zum Glück muss man das nicht selber machen, dafür gibt es beispielweise den Backpropagationalgo. Auch die Netzarchitektur kann man bei komplexeren Problemen nicht vorhersehen, man nimmt einfach ein paar Schichten mit einigen Neuronen pro schicht und probiert ein bisschen. Es ist etwa wie Backen, man muss ein bisschen spielen um das passende Rezept zu finden.
Lesezeichen