Sommerferien: Neuronenzirkus

(0 Kommentare.)

Wie versprochen habe ich die Sommerferien über weitgehend die Klappe gehalten bei Neuronalen Netzen. Aber ich konnte die Finger davon nicht lassen, und so habe ich alle meine bisherigen Projekte – Netz in Tabellenkalkulation, Stilwell-Brain, und 2020 Neuronenvisualisierung in Java – zusammengefasst in einer einzigen Webseite: neuronenzirkus.de. Hier habe ich diese Webseite, die man natürlich auch separat ansteuern kann, eingebettet:

Erklärungen gibt es nicht viel dazu; das richtet sich an fortgeschrittene Einsteiger und Schüler und Schülerinnen. Es gibt folgende aufeinander aufbauende Teile;

1. Was ein Neuron ist: Ein Neuron ist von außen ein Ding, da gehen Eingangswerte rein und ein Ausgangswert kommt heraus. Vorbild bei der Erfindung war die Vorstellung, die man damals von der Wirkungsweise einer biologischen Nervenzelle hatte:

Von innen besteht ein Neuron aus Gewichtungen (für jeden Eingang eine) und einem Schwellenwert. Die Eingangswerte werden mit den Gewichtungen multipliziert und diese Produkte addiert, wovon noch der Schwellenwert abgezogen wird.

Da kommt eine Zahl heraus, die in die Aktivierungsfunktion geht, im einfachsten Fall: es kommt 1 heraus bei positiven Werten und 0, und 0 bei negativen Werten. In diesem Fall gibt das Neuron dann eben nur 1 oder 0 aus, je nach den Eingangswerten. Bei unterschiedlichen Eingangswerten kann ein gegebenes Neuron dann eben feuern oder nicht feuern. Man erkennt beim Herumspielen: ein Neuron kann Eingabedaten linear separieren, quasi bei zwei Dimensionen einen geraden Strich ziehen zwischen der Menge an Eingabewerten, die zu einem Feuern führen, und den anderen.

2. Was ein Neuron kann: Hier kann man verschiedene Aufgaben laden und schauen, ob man Lösungen findet, indem man Schwellenwert und Gewichte manuell ändert. Das sind weitgehend Aufgaben, die ein einzelnes Neuron mit 2 Eingängen lösen kann: einen Strich ziehen zwischen links/rechts, oben/unten, linksoben/rechtsunten, und überall sonst. Was genau ein Neuron macht, hängt nur von den Gewichtungen und dem Schwellenwert ab. (Und der Aktivierungsfunktion.)

3. Ein Neuron lernt: Man kann die Lösungen auch automatisch finden lassen. Das heißt „überwachtes Lernen“, supervised learning. Wenn man Aufgaben mit Lösungen hat, kann man anhand derer das Neuron trainieren. Dann muss man nicht mühsam selber die richtigen Einstellungen für Gewichtungen und Schwellenwert suchen.

4. Was beim Lernen geschieht: Hier kann man Details des Lernalgorithmus anschauen und den wiederholt auf denselben Eingabedatensatz anwenden und beobachten, wie sich Schwellenwert und Gewichte ändern, bis sie passen. Das funktioniert bei einem einzelnen Neuron noch recht einfach: Wenn 1 herauskommen soll, aber tatsächlich 0 herauskommt, dann ist der Ausgangswert zu niedrig. Wenn der höher werden soll, muss man lediglich ein oder mehrere Gewichte erhöhen oder den Schwellenwert verringern. Und das macht man immer nur um ein kleines bisschen, abhängig von der errechneten Abweichung, von der Lernrate, und vom jeweiligen Eingangswert. Wenn man das für genug Werte macht, pendelt es sich früher oder später bei einer Lösung ein (sofern es überhaupt eine gibt).

5. Aktivierungsfunktionen: Hier kann man die Aktivierungsfunktionen Sigmoid (beziehungsweise eine beispielhafte Form davon) und Hard Limit (es gibt verschiedene Namen dafür) vergleichen. Das spielt noch keine Rolle, wenn man mit einem einzelnen Neuron arbeitet.

6. Was 1 Neuron nicht kann: Aufgaben lösen, bei denen lineares Separieren nicht reicht, hier XOR. Wenn die Aufgabe nicht so ist, dass die Lösung mit einem Strich angezeigt werden kann, dann kann das Neuron sie nicht Lösung. Im Beispiel geht es darum, dass der x-Wert groß sein muss, wenn der y-Wert klein ist, oder umgekehrt, aber eben nicht beide groß und nicht beide klein. Das geht mit nur einem Neuron nicht einmal näherungsweise.

7. Was n+1 Neuronen können: Das geht aber dann, wenn man nicht nur ein Neuron arbeiten lässt, sondern diesem weitere Neuronen vorschaltet. Das heißt Hidden Layer, eine versteckte Neuronenschicht. Damit hat man nicht mehr nur ein einzelnes Neuron, sondern hinterinander geschaltetete. Eine Aufgabe aus dem Muster-Abitur ist hier ein Beispiel. Das XOR kann man mit zwei Neuron halbwegs und mit drei richtig lösen. Es gibt jetzt auch eine Art Lupe, um sich die Neuronen einzeln anzuschauen.

Allerdings funktioniert das automatische Lernen jetzt erst einmal nicht mehr. Wenn hier wieder 1 herauskommen soll und tatsächlich 0 herauskommt, wie soll die Abweichung in der Ausgabeschicht dann auf die Vorgängerschicht verteilt werden? Das geht nicht gut, wenn man nur mit 0 und 1 arbeitet.

8. Neuronale Netze: Jetzt sind wir endlich beim Kern! Es gibt wieder eine versteckte Schicht vor der Ausgabeschicht. Aber jetzt wird eine Sigmoid-Aktivierungsfunktion verwendet und man kann dadurch die Regel für das automatische Lernen anpassen. (Wenn 1 herauskommen soll und 0 herauskommt, wird die Abweichung, wieder durch die Lernrate modifiziert, auf die Gewichtung des Neurons der Ausgabeschicht angewendet, und von da aus in abgeschwächter Form dann auch auf die versteckte Schicht zuvor. Wie das genau geht, ist nicht mehr Stoff in der Schule).

Es gibt wieder verschiedene Aufgaben, teilweise mit Lösung. Für manche reichen 2 Knoten im Hiden Layer, andere brauchen mehr. Manche haben mehr als 2 Eingangswerte (was eine andere Art der grafischen Darstellung nötig macht), andere haben mehr als 1 Ausgangswert.

9. Stilwell: Das Stilwell-Projekt. Blogeintrag.

10. MNIST: Zahlen erkennen. 28×28 Pixel Eingangswerte, 30 versteckte Knoten – aber nur ein einziger Datensatz zum Ausprobieren. Ich müsste überlegen, wie ich das mit dem Laden und Speichern gerne hätte. Der ganze MNIST-Datensatz ist mehr als 100 MB groß.

Die Nummern 1 bis 6 und vielleicht 7 passen zur 11. Jahrgangsstufe, 7 bis 10 zur 13. Jahrgangsstufe. Es ist leicht, weitere Datensätze einzubauen, wenn es denn mal nötig sein sollte. Und natürlich könnte ich noch viel am Design ändern, wenn ich wollte, irgendwann.

Außerdem konnte ich dabei weiter JavaScript lernen und CSS verfluchen. Aber jetzt ist das mal gut genug, das lasse ich so stehen, auch wenn der Code nicht sehr sauber ist.


Beitrag veröffentlicht am

in

Kommentare: 0

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert