Entwickler-Ecke
Sonstiges (Delphi) - Neuronales Netz - Backpropagation
RUNNER - Di 19.07.05 21:53
Titel: Neuronales Netz - Backpropagation
Hi,
dies ist mein erster Post hier in diesem Forum und ich habe sofort ein einigermaßen "exotisches" Problem. Auf
dieser [
http://rfhs8012.fh-regensburg.de/~saj39122/jfroehl/diplom/e-13-text.html#Backpropagation] Internet-Seite habe ich eine kleine Einführung in den Aufbau und die Funktionsweise von neuronalen Netzen gefunden. Habe in Delphi sowohl das abgebildete Forwardpropagation- als auch das Backpropagation-Netz programmiert. Ersteres hat funktioniert, aber beim Backpropagation-Netz haperts. Da der Autor für den ersten Lernvorgang mit Input 1 0 die Veränderungen der Neuronen-Outputs und Änderungen in den Gewichtunen angegeben hat, konnte ich dies nachprüfen. Für den ersten Durchlauf des Inputs 1 0 erzielt mein Programm auch genau die angegebenen Änderungen. Nur wenn ich das Netz abwechselnd mit den Inputs 1 0 und 1 1 trainiere, dann strebt der Output für beide Inputs auf 0 zu.
(Nur mit 1 0 trainieren klappt auch nicht, strebt auf 0,5 zu)
Quelltext auszugsweise mit Kommentaren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| lernrate := 0.25; i1_i := strtofloat(Edit1.Text); ----------------- Eingang des 1. Neurons im input layer i2_i := strtofloat(Edit2.Text); ----------------- Eingang des 2. Neurons im input layer i1_o := i1_i; ----------------------------------- output = input i2_o := i2_i; ----------------------------------- output = input h1_i := i1_o * w1 + i2_o * w3 + bias * wb1; ----- Berechnung des inputs hidden layer1 h2_i := i1_o * w2 + i2_o * w4 + bias * wb2; ----- Berechnung des inputs hidden layer2 h1_o := 1/(1+exp(-h1_i)); ----------------------- sigmoid activation h2_o := 1/(1+exp(-h2_i)); ----------------------- sigmoid activation o1_i := h1_o * w5 + h2_o * w6; ------------------ input des output layer neurons o1_o := 1/(1+exp(-o1_i)); ----------------------- output des output layer neurons gewuenscht := strtofloat(Edit6.Text); ----------- gewünschter output fehler := gewuenscht - o1_o; -------------------- Fehler des outputs c5 := lernrate * fehler * h1_o * (-fehler) * (1+fehler); Änderung Gewichtung h1 -> o c6 := lernrate * fehler * h2_o * (-fehler) * (1+fehler); Änderung Gewichtung h2 -> o cb3:= lernrate * fehler * bias * (-fehler) * (1+fehler); Änderung Gewichtung Bias -> o w5 := w5 + c5; ---------------------------------- Gewichtung h1 -> o ändern w6 := w6 + c6; ---------------------------------- Gewichtung h2 -> o ändern wb3:= wb3 + cb3; -------------------------------- Gewichtung Bias -> o ändern c1 := lernrate * fehler * i1_o * h1_o * (1-h1_o); Änderung Gewichtung i1 -> h1 c2 := lernrate * fehler * i1_o * h2_o * (1-h2_o); Änderung Gewichtung i1 -> h2 c3 := lernrate * fehler * i2_o * h1_o * (1-h1_o); Änderung Gewichtung i2 -> h1 c4 := lernrate * fehler * i2_o * h2_o * (1-h2_o); Änderung Gewichtung i2 -> h2 cb1 := lernrate * fehler * bias * h1_o * (1-h1_o);Änderung Gewichtung Bias -> h1 cb2 := lernrate * fehler * bias * h2_o * (1-h2_o);Änderung Gewichtung Bias -> h2 w1 := w1 + c1; ---------------------------------- Gewichtung i1 -> h1 ändern w2 := w2 + c2; ---------------------------------- Gewichtung i1 -> h2 ändern w3 := w3 + c3; ---------------------------------- Gewichtung i2 -> h1 ändern w4 := w4 + c4; ---------------------------------- Gewichtung i2 -> h2 ändern wb1 := wb1 + cb1; ---------------------------------- Gewichtung Bias -> h1 ändern wb2 := wb2 + cb2; ---------------------------------- Gewichtung Bias -> h2 ändern |
Ich weiß, dass der Code ziemlich dahingeschludert ist, aber da er ja für den ersten Durchgang funktioniert, finde ich den Fehler nicht, der anscheinend später auftritt.
Vielleicht findet sich ja hier jemand, der sich ein wenig mit neuronalen Netzen auskennt.
Vielen Dank schonmal,
Peter
jaenicke - Mi 20.07.05 13:34
:welcome: hier im Forum.
Das muss ich zu Hause mal ausprobieren. So nur durch Ansehen wird das nix.
Allerdings habe ich den Eindruck, dass es eventuell gar nicht an dem angegebenen Quelltext liegt. Denn das Problem macht für mich Sinn, wenn einfach irgendwo noch ein Wert vom alten Training da ist und dann für das neue Training mit benutzt wird.
Schließlich basieren ja neuronale Netze darauf, dass der kleinste Fehler gesucht wird (wir haben zum Beispiel den Gradientenabstieg benutzt). Und wenn man andere Zwischenwerte hat findet man eventuell nicht dasselbe Minimum. Und das neue Minimum kann dann schlechter sein.
RUNNER - Mi 20.07.05 19:13
Hi,
leider ist diese Internet-Seite eine der wenigen die ich gefunden habe, die nicht nur mathematische Formeln aufzählt, sondern anhand eines praktischen Beispiels die Funktionsweise zeigt. Da die Seite Teil der Diplomarbeit des Autors ist, gehe ich von der Richtigkeit der Beispiele aus. Ich habe heute mal das Netz in Excel nachgebaut und durch Probieren Gewichtungen gefunden, bei denen das Netz eine Fehlerrate hatte, die mit 20 Nachkommastellen nicht mehr angezeigt werden konnte.
Daher denke ich, dass irgendwas mit meinem Backpropagation-Berechnungen nicht stimmt, obwohl der erste Durchgang mit 1 0 wie gesagt funktioniert.
Falls es weiterhilft, kann ich dir das gesamte Projekt zusenden. Bin ja schon froh, dass überhaupt jemand geantwortet hat. Habe auch den Autor angeschrieben, aber da die Seite schon fast 10 Jahre alt ist, weiss ich nicht ob ich von ihm eine Antwort bekomme.
Gruß,
Peter
sango - Mi 20.07.05 19:43
RUNNER hat folgendes geschrieben: |
Bin ja schon froh, dass überhaupt jemand geantwortet hat. |
Nicht das du vom DF enttäuscht bist, hier wird dir schon normalerweise schneller und umfangreicher geholfen, aber ich glaube dein problem ist (zumindest bei mir) :eyes: :gruebel: :nixweiss: :nut: weit über dem was man eben so mal kurz durchdenken kann. nicht umsonst ist das teil einer diplomarbeit.
bin fasziniert von dem thema, und auch von dem gezeigten applet, nur darauf zu antworten trau ich mich nicht. bzw. was dazu zu sagen. Das ist wie bei einer wunderhübschen schönen frau, die traut sich auch kaum einer anzusprechen :roll:
also nicht verzagen DF weiterfragen :)
jaenicke - Do 21.07.05 11:23
Das gesamte Projekt wäre vielleicht sinnvoll, dann könnte ich das mal mit meinem eigenen in C geschriebenen Programm vergleichen (eine einfache Spracherkennung, bisher allerdings nur für Vokale).
Denn da sollte ja beim Vergleich herauskommen, WO die Werte falsch werden, sofern ich die Netze kompatibel bekomme, aber das sollte kein Problem sein.
Einfach direkt ins Forum als Attachment oder per Mail an
projects@jaenicke.wir-berlin.de...
RUNNER - Do 21.07.05 18:55
Hi,
@ jaenicke: Hab dir das Projekt als eMail geschickt.
@ Jürgen70: Vielen Dank für den Link, da könnte ich mir ein eigenes Programm ja eigentlich sparen, aber wo bleibt dann der Spass...
Gruß,
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!