Benutzer-Werkzeuge

Webseiten-Werkzeuge


ss15:neuronale_netze

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ss15:neuronale_netze [2015/07/24 22:18]
mr.lazy [Wie programmiert man ein Neuronales Netz?]
ss15:neuronale_netze [2016/05/10 14:46] (aktuell)
Zeile 4: Zeile 4:
 ====Was ist ein Neuronales Netz?==== ====Was ist ein Neuronales Netz?====
 Ein Neuronales Netz besteht aus Schichten von Neuronen. Jedes Neuron hat eine gewisse Zahl an Inputs und Gewichten. Die Inputs werden mit den Gewichten verrechnet und in die Sigmoid-Funktion((Diese sorgt lediglich dafür, dass der Output zwischen 0 und 1 liegt und sieht so aus: $\frac{1}{1+e^{-x}}$)) eingesetzt. Dies ist der Output des Neurons. Ein Neuronales Netz besteht aus Schichten von Neuronen. Jedes Neuron hat eine gewisse Zahl an Inputs und Gewichten. Die Inputs werden mit den Gewichten verrechnet und in die Sigmoid-Funktion((Diese sorgt lediglich dafür, dass der Output zwischen 0 und 1 liegt und sieht so aus: $\frac{1}{1+e^{-x}}$)) eingesetzt. Dies ist der Output des Neurons.
 +
 Ein Neuronales Netz besteht nun aus mehreren Schichten solcher Neuronen, wobei die Outputs der einen Schicht die Inputs der nächsten Schicht sind. Ein Neuronales Netz besteht nun aus mehreren Schichten solcher Neuronen, wobei die Outputs der einen Schicht die Inputs der nächsten Schicht sind.
 Wenn man nun ein Neuronales Netz anlegt, so werden die Gewichte zunächst zufällig besetzt. Allerdings werden diese im Trainingsprozess angepasst. Das funktioniert folgendermaßen:​ Wenn man nun ein Neuronales Netz anlegt, so werden die Gewichte zunächst zufällig besetzt. Allerdings werden diese im Trainingsprozess angepasst. Das funktioniert folgendermaßen:​
Zeile 9: Zeile 10:
   * Dann berechnet man den quadratischen Fehler zwischen dem Output, den das Netz bei einem Input liefert und dem dabei erwarteten Output.   * Dann berechnet man den quadratischen Fehler zwischen dem Output, den das Netz bei einem Input liefert und dem dabei erwarteten Output.
   * Nun kann man mittels //​Backtracking//​ die einzelnen Gewichte nacheinander updaten. Dazu bildet man die partielle Ableitung der Fehlerfunktion nach jedem Gewicht und updatet jedes einzelne Gewicht mithilfe des Gradientenabstiegs.   * Nun kann man mittels //​Backtracking//​ die einzelnen Gewichte nacheinander updaten. Dazu bildet man die partielle Ableitung der Fehlerfunktion nach jedem Gewicht und updatet jedes einzelne Gewicht mithilfe des Gradientenabstiegs.
-Nachdem man diesen Prozess einige Male wiederholt hat, sollte das Netz in der Lage sein, ähnliche Probleme zu lösen. Es gibt hier jedoch einige Dinge zu beachten: Das Netzwerk kann //​overfitten//​. Das bedeutet, dass das Netzwerk nicht mehr die Struktur des Problems lernt, sondern die Trainingsmenge. Das Netz ist dann zwar in der Lage, in der Trainingsmenge unglaublich gute Vorhersagen zu treffen, allerdings fallen die Lösungen für neue Daten sehr schlecht aus. Es gibt allerdings ein paar Möglichkeiten,​ dieses Problem zu lösen:+Nachdem man diesen Prozess einige Male wiederholt hat, sollte das Netz in der Lage sein, ähnliche Probleme zu lösen. Es gibt hier jedoch einige Dinge zu beachten: Das Netzwerk kann //​overfitten//​. ​ 
 + 
 +Das bedeutet, dass das Netzwerk nicht mehr die Struktur des Problems lernt, sondern die Trainingsmenge. Das Netz ist dann zwar in der Lage, in der Trainingsmenge unglaublich gute Vorhersagen zu treffen, allerdings fallen die Lösungen für neue Daten sehr schlecht aus. Es gibt allerdings ein paar Möglichkeiten,​ dieses Problem zu lösen:
   * Einführung einer Lernrate: Indem man die einzelnen Updateschritte nur ziemlich klein hält, kann man verhindern, dass das Netz zu schnell //​overfittet//​   * Einführung einer Lernrate: Indem man die einzelnen Updateschritte nur ziemlich klein hält, kann man verhindern, dass das Netz zu schnell //​overfittet//​
   * //​Weightdecay//:​ Hierbei laufen ungenutzte Gewichte langsam gegen 0; Das verhindert ebenfalls //​Overfitting//​ des Netzes   * //​Weightdecay//:​ Hierbei laufen ungenutzte Gewichte langsam gegen 0; Das verhindert ebenfalls //​Overfitting//​ des Netzes
Zeile 28: Zeile 31:
 Nun noch etwas zum Problem, auf das ich mein Netz angesetzt habe: Nun noch etwas zum Problem, auf das ich mein Netz angesetzt habe:
 Jeden Tag werden Millionen von Briefen und Paketen verschickt. Dabei ist es nicht sehr effizient, wenn jede Postleitzahl von Postbeamten eingelesen werden müssten. Stattdessen wäre ein Computerprogramm,​ dass diese Aufgabe löst, sehr praktisch. Zwar wurde dieses Problem schon unzählige Male gelöst, ist aber ein sehr dankbares Anfängerproblem,​ weil es genügend Testdatensätze und Dokumentationen gibt. In meinem Datensatz liegt dabei jede Zahl als $16\cdot{}16$ Pixel Graustufenbild vor.  Jeden Tag werden Millionen von Briefen und Paketen verschickt. Dabei ist es nicht sehr effizient, wenn jede Postleitzahl von Postbeamten eingelesen werden müssten. Stattdessen wäre ein Computerprogramm,​ dass diese Aufgabe löst, sehr praktisch. Zwar wurde dieses Problem schon unzählige Male gelöst, ist aber ein sehr dankbares Anfängerproblem,​ weil es genügend Testdatensätze und Dokumentationen gibt. In meinem Datensatz liegt dabei jede Zahl als $16\cdot{}16$ Pixel Graustufenbild vor. 
 +
 +Im Datensatz ist jedes Bild folgendermaßen gespeicher: Zunächst hat man 256 Werte zwischen -1 und 1, die die Graustufe reprästentieren und zum Schluss eine Zahl, die angibt, welches Zahl das Bild tatsächlich darstellt. Um das Netz zu trainieren, übergebe ich also einen Vektor mit 256 Einträgen und einen Vektor mit 10 Einträgen, wobei alle 0 sind, außer demjenigen, der der Zahl entspricht, die das Bild darstellt. Dieser ist auf 1 gesetzt. Dies alles ist im Modul [[nncode#​readfile|readfile.py]] gespeichert.
  
 Das verwendete Netz ist recht einfach; es hat 3 Schichten mit 256, 12, und 10 Neuronen. Mein Netz hat es dabei geschafft, etwas mehr als 90% richtig zuzuordnen. Komplexer aufgebaute Netze mit mehr Schichten, in dem Neuronen von zwei aufeinanderfolgenden Schichten auch nicht immer miteinander verbunden sind, haben es geschafft, mehr als 99,5% korrekt zuzuordnen. Das verwendete Netz ist recht einfach; es hat 3 Schichten mit 256, 12, und 10 Neuronen. Mein Netz hat es dabei geschafft, etwas mehr als 90% richtig zuzuordnen. Komplexer aufgebaute Netze mit mehr Schichten, in dem Neuronen von zwei aufeinanderfolgenden Schichten auch nicht immer miteinander verbunden sind, haben es geschafft, mehr als 99,5% korrekt zuzuordnen.
ss15/neuronale_netze.1437769120.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)