|
Klasse neuron Die Neuronen werden zu einer Liste zusammengefasst. Zu jedem Neuron gibt es eine Liste anfli von Vorgängerneuronen, die an das Neuron Daten liefern. Die Methode wert bestimmt einen Ausgabewert: Dabei werden die Ausgabewerte der Vorgängerneuronen mit einem Faktor multipliziert und dann aufaddiert. Abhängig von der Summe schaltet ein Schalter einen Wert zwischen 0 und 1 auf den Ausgang. Die Empfindlichkeit des Schalters hängt dabei von dem Wert gr ab. Um das Programm zu vereinfachen, werden die Bestandteile der Eingangsmuster in "Pseudo"-Neuronen gespeichert, die am Ausgang den zugehörigen Wert des Eingangsmusters liefern. Ein Pseudoneuron unterscheidet sich von einem normalen durch den Wert true in der Variablen inf. Die Methode inneur liest den Musterwert in das Neuron ein. Die Methode listin baut die Liste aller Neuronen auf.
Die Methode lernen erhält über den Parameter d einen Differenzwert, wie weit die berechnete Ausgabe von der Ausgabenvorgabe abweicht.
Die Vorgängerliste wird durchlaufen und für jedes Vorgängerneuron der Lernvorgang mit dem Parameter d gestartet. Die Variable dfa enthält den bisher besten d-Betrag,
gra den bisher besten Wert für die Steuerzahl gr.
Beim Aufruf des Lernprozesses für die Vorgängerneuronen ist zu beachten, dass die Faktoren für ihre Werte abhängig sind von den Neuronen, an die sie Werte liefern. Hierzu wird eine neue Klasse eineur definiert, deren Objekte aus der Klasse neuron stammen, dazu der Faktor für den Ausgangswert. Die Liste der Vorgängerneuronen besteht dann aus Objekten dieser neuen Klasse. | |
|
Klasse eineur Die Klasse dient zum Aufbau der Vorgängerliste eines Neuron (vgl. Klasse neuron). nxt speichert einen Verweis auf das nächste Listenelement, neuron auf das aktuelle Vorgängerneuron. fk enthält den Faktor, mit dem der Ausgangswert dieses Neuron multipliziert wird, we das zugehörige Produkt. Die Methode wert berechnet das Produkt von Ausgangswert und Faktor. Die Methode lernen verändert den Faktor entsprechend der Abweeichung d von berechnetem und vorgegebenen Ausgangsmuster. | |
|
Klasse neurtest
Zu neurtest gehören die Methoden input, output zur Ein- und Ausgabe von Daten und die Startmethode main. Die Startmethode erwartet entsprechende Eingaben zum Aufbau der Neuronenliste und Ein- und Ausgangsmustern. Danach erfolgt ein sich wiederholender Lernprozess, bei dem zu den Eingangsmustern Ausgangsmuster berechnet werden, die dann mit den Vorgaben verglichen werden. Lässt sich die Abweichung zwischen berechnetem und vorgegebenem Ausgangsmuster nicht weiter verbessern, wird der Lernprozess abgebrochen. Anschließend kann man in einer Testphase Eingangsmuster eingeben (auch neue), um die Reaktion des Netzes zu kontrollieren. | |
Das Verfahren, die Abweichung d direkt zur Anpassung des Netzes zu verwenden, ist als "Deltaregel" bekannt. Es zeigen sich Grenzen für den Lernprozess, die durch weitere Neuronenebenen durchbrochen werden können. Die Deltaregel ist dann so nicht mehr verwendbar. Eine einfache Möglichkeit besteht darin, dass die Anpassung der Variablen fk und gr nicht direkt über d realisiert wird, sondern über einen zwischengeschalteten Zufallsgenerator, z.B.
statt gr = gra - d modifiziert zu gr = gra + Math.abs(d)*(2*Math.random()-1)*lr, wobei lr als Lernrate fest vorgegeben wird.
Diese Variante lässt sich in dem Programm neurtest.java einfach umsetzen, um dann die Ergebnisse bei unterschiedlichen lr-Werten mit denjenigen der Deltaregel zu vergleichen.
Auch die Deltaregel lässt sich so modifizieren, dass mehrere Neuronenschichten möglich sind. Beide Möglichkeiten und weitere Varianten können mit dem Paket neurapp.zip
getestet werden. Dabei stellt man fest, dass das Netz nicht immer so reagiert, wie man sich das vorstellt.
Will man die Deltaregel für mehrere Ebenen modifizieren, so sollte man die Gesamtabweichung d für tiefere Ebenen durch Faktoren so anpassen, dass Neuronen, die schon "optimal" eingestellt sind, sich kaum noch ändern.
Ebenso ist für Neuronen zu verfahren, die nur eine geringe Wirkung auf das Ausgabemuster haben. Insgesamt gesehen, organisiert sich das Neuronennetz autonom ohne Steuerungsmöglichkeiten von außen. Gerade dies
unterscheidet KI-Programme von herkömmlichen Programmen.
Da stellt sich die Frage: Inwieweit kann man das Netz kontrollieren, so dass nur gewünschte Reaktionen zustande kommen. Eine frühzeitige Kontrolle von Wichtungen, Schaltgrenzen und deren Wirkung auf das Ergebnis wäre nötig,
was allerdings dem Konzept der KI-Programmierung widerspricht.
[2.10.2026]