Stilwell Brain Revisited, und mein erstes JavaScript-Programm

(8 Kommentare.)

Das letzte Neuronale Netz für eine Weile, VERSPROCHEN! Wer ihn nicht liest, könnte wenigstens ganz unten meine JavaScript-Künste bewundern und will umherklicken.

Ich habe kürzlich (Blogeintrag) ein Neuronales Netz in Calc nachgebaut und wollte das mal ganz konkret für eine überarbeitete Version des Stilwell Brain (Blogeintrag) einsetzen. Kurzfassung: Letzteres kann gezeichnete Ziffern in einer 5×5-Matrix erkennen, wobei jedes der 25 Felder schwarz oder weiß ist, also ohne Grautöne. Möglicherweise ist es dem menschlichen Sehen nachempfunden, dazu weiß ich zu wenig, tatsächlich ist es aber ein sehr einfaches Neuronales Netz mit 25 Eingangsneuronen, 10 Ausgangsneuronen, und dazwischen mehreren versteckten Schichten. Jeder Knoten ist nur mit wenigen anderen Knoten verbunden, heißt: als vollständig verbundenes Netz betrachtet ist die Gewichtung der Kanten meist 0; sonst ist sie immer 1; die Aktivierungsfunktion ist Hard Limit.

Ich habe das Netz etwas vereinfacht, insbesondere auf eine einzige versteckte Schicht reduziert, ohne semantisch irgend etwas zu ändern. Das habe ich in eine einzelne Tabellenseite gepackt, die sieht so aus (zum Vergrößern anklicken):

  • Links oben zeichnet man die Ziffer ein, indem man die Zellen mit 1 oder 0 befüllt (oder sie leer lässt).
  • Die gelben Zellen sind die daraus entstandenen 25 Eingangsknoten.
  • Die roten Zellen sind die 57 Knoten in der versteckten Schicht; links deren Bezeichner, gewählte Aktivierungsfunktion, Rechenschritte; rechts jeweils Schwellwert θ und 25 Gewichtungen. Das θ entspricht dem häufigeren Bias, nur mit umgekehrtem Vorzeichen; hier entspricht es immer einer logischen UND-Funktion, das heißt, alle beobachteten Neuronen der Input-Schicht müssen feuern, damit 1 ausgegeben wird.
  • Die grünen Zellen sind die 10 Knoten der Output-Schicht, ähnlich aufgebaut, nur dass der Schwellwert jeweils einer ODER-Funktion entspricht: wenn mindestens ein beobachtetes Neuron der roten Schicht feuert, wird 1 ausgegeben.

Die roten 57 Knoten der versteckten Schicht, nummeriert von 11 bis 247, beobachten jeweils folgende blau markierte Knoten der Input-Schicht, angeordnet als 5×5-Diagramm, weil man dann sieht, warum sie ausgerechnet diese Knoten beobachten:

Die Zahlen unter den 5×5-Zeichnungen sind die Nummern des jeweiligen Knotens in der versteckten Schicht. Diese Nummern stammen aus der ursprünglichen Python-Quelle, wo die Ziffern 1 und 7 anders behandelt werden; deshalb die merkwürdige Reihenfolge.

Es fallen vor allem zwei Dinge auf:

  • Wenn man die in den Knoten 216 bis 217 erkannte 7 um eine Zeile nach unten versetzt zeichnet, wird diese nicht erkannt. Wenn die 0 etwas breiter wird, ditto.
  • Dem könnte man leicht abhelfen durch die Einführung weiter Knoten; schön wäre das nicht, weil Neuronale Netze eben nicht dazu da sind, manuell alle möglichen Lösungen einzutragen, sondern im Gegenteil genau dann verwendet werden, wenn man als Mensch die Lösungen eben nicht so leicht vorhersagen kann.
  • Die Knoten 171 bis 172 sind überflüssig, weil die Knoten 174 bis 175, jeweils eine Teilmenge davon, bereits als 2 erkannt werden; ähnlich 181 bis 183 und 196 bis 198.
  • Wenn man die erste Zeichnung oben genau betrachtet, sieht man, dass bei den eingezeichneten Zellen nicht nur das 2-Neuron eine 1 meldet, sondern ebenso das 3- und das 7-Neuron. Klar: Die eingezeichneten 12 Pixel enthalten jeweils alle nötigen Pixel für eine der 3er oder 7er. Deshalb geben die auch Signal, und deshalb existiert beim Stilwell-Brain die Hilfsregel, dass bei mehreren potentiellen Ausgaben immer die erste Lösung nach einer bestimmten Reihenfolge gewählt wird, nämlich 8-9-0-2-3-7-6-4-5-1.
  • Auf die Spitze getrieben: Wenn ich alle 25 Pixel anmale, melden alle 10 Ausgangsneuronen ein Signal. Unbefriedigend.
  • Das lässt sich aber leicht verbessern, wenn man mit Calc arbeitet statt wie im Stilwell-Brain mit menschlichen Freiwilligen: Wir führen einfach negative Gewichtungen ein, und dafür reicht uns bereits die versteckte, rote, Schicht. Da heißt eine Gewichtung von 1, dass das Pixel gesetzt sein muss, eine Gewichtung von 0, dass – wie bisher – das Pixel einfach ignoriert wird, und eine Gewichtung von -1, dass das Pixel nicht gesetzt sein darf – weil dann der begrenzende Biaswert nicht mehr erreicht wird.

Das könnte ich mal Schüler und Schülerinnen machen lassen. Bei den 5×5-Minigrafiken oben wären dann wohl neben den blauen Pixeln (heißt: verlangt) einfach alle anderen orange (heißt: verboten). Immer noch ein naives System. Immerhin: Bei der 1 könnte man links oben, bei der 4 rechts in der Mitte eine Gewichtung mit 0 belassen, also ein Pixel optional machen, um Varianten zuzulassen.

Zur Sicherheit: Unterschiede zu einem richtigen Neuronalen Netz

Bei einem richtigen Netz wählt man Bias und Gewichtung nicht von Hand aus, sondern lässt das durch Training automatisch geschehen. Damit das geschehen kann, gibt es da auch nicht nur 0 und 1 oder -1, sondern beliebige Zahlen, insbesondere Kommazahlen, und eine Aktivierungsfunktion, die eben nicht nur 0 oder 1 ausspuckt, sondern Kommazahlen, oft zwischen 0 und 1.

Ausprobieren!

Zum Ausprobieren habe ich Online-Tabellendokumente erstellt, einfach auf den Link klicken und das Passwort eingeben:

  1. In dieser Variante kann man nur die 25 Pixel der zu erkennenden Ziffer einzeichnen, und zwar als 0, 1 oder leer. Einfach ein paar Pixel einzeichnen oder löschen und schauen, was passiert!
    https://0186.drive.bycs.de/s/MjvtPiNTfcOwUbv
    Passwort: Ernsthaft1!11
  2. Wie oben, aber man kann zusätzlich Bias und Gewichte anpassen und damit die ganze Semantik des Netzes verändern. Einfach mal eine erfolgreich erkannte Zahl einzeichnen und ein zusätzliches, störendes Pixel ergänzen, und für dieses die entsprechende Gewichtung auf -1 setzen. (Nach Änderungen evtl. wieder aufräumen?)
    https://0186.drive.bycs.de/s/NLqnsiReakeGbrk
    Passwort: Ernsthaft1!11
  3. Völlig ungeschützt, aber man kann die Datei nur als Kopie herunterladen und sie nicht online bearbeiten:
    https://0186.drive.bycs.de/s/OYLbILxZmoPGcIL
    Passwort: Ernsthaft1!11

Wenn ich endlich JavaScript lernte, könnte ich das als Webseite nachbauen.

(Eine Woche später)

Also gut, habe ich halt ein bisschen JavaScript gelernt und mein erstes Programm geschrieben und hier unten als Seite eingebettet. Heißt: Das ist keine Grafik, sondern eine HTML-Seite, auf der man viel anklicken und eingeben kann. Das hat die Tabellenkalkulationsdatei überflüssig gemacht. CSS und JS sind in der HTML-Seite enthalten, beide nicht schön. (Code-Dopplungen, Magic Numbers. Aber schön, mal nur verhalten objektorientiert zu programmieren.) Das Prinzip ist wie oben. Im Bereich mit der versteckten Schicht kann man vertikal scrollen, in der Ausgabeschicht horizontal. Die Modi:

  • Nur Zeichnen (Startmodus): Zum Einstieg. Da kann man nur die 25 großen Pixel anklicken und schauen, was sich in der Ausgabeschicht dann so tut.
  • Freie Eingabe: Zum Ausprobieren. Da kann man zusätzlich alle Biases und Gewichte verändern. Und man kann in der versteckten Schicht auf eine Zelle klicken, am besten in der Bias-Spalte, dann sieht man eine Vorschau auf den gewählten Knoten. Auch Kommazahlen sind natürlich möglich.
  • Toggle und Cycle: Für Eilige. Man kann weiterhin alles Veränderbare mit der Tastatur verändern, aber ein Mausklick auf die Gewichte (nicht: Bias) ändert den Wert darin automatisch – das ist ungünstig, wenn man sich die Knoten nur mal eben visualisieren möchte, aber praktisch, um sie schnell zu verändern.

Irgendwann könnte ich den Code zu Codeberg tun, mit Beispielaufgaben dazu und Erweiterung auf auswählbar viele Knoten in den verschiedenen Schichten, also auch für andere Aufgaben, und dann vielleicht doch mit Backpropagation?


Beitrag veröffentlicht am

in

Kommentare: 8

Schlagwörter:

Kommentare

8 Antworten zu „Stilwell Brain Revisited, und mein erstes JavaScript-Programm“

  1. Norman

    Da sind JavaScript-Kommentarzeichen in den CSS-Klassen.

    Es funktioniert (leider), eigene Attribute wie „markierung-pixel“ zu vergeben, das erzeugt aber nicht-valides HTML-Markup. Dafür sind individuelle dataset-Attribute vorgesehen.

  2. Kommentarzeichen inm CSS sind eine schlechte Angewohnheit von mir, noch von Alters her. Danke für den Hinweis auf diese Attribute, deren Verwendung oder Nichtverwendung ist mir noch überhaupt nicht klar. Die ganze Seite ist nur ein Prototyp, organisch gewachsen; bei der nächsten Version weiß ich dann schon, was ich überhaupt haben will.

  3. Norman

    Das Einfügen der jeweils passenden Kommentarzeichen erledigt doch der Code-Editor?

  4. Wie, Editor? :-) Ich habe das in Notepad++ und im Windows-Editor im Büro geschrieben. – Aber das kommt ursprünglich vom CSS-Herumbasteln in rohen WordPress-Installationen.

  5. Norman

    Visual Studio Code macht das alles ganz wunderbar. Hat Emmet eingebaut.
    Gibt’s auch online. Lässt sich lokal als ZIP installieren und ausführen und ohne Admin-Rechte Plugins installieren.

  6. Ist jetzt auf dem USB-Stick!

  7. […] Rau, der Jean Pütz der Heim-KI beendet seine Serie: Stilwell Brain Revisited, und mein erstes JavaScript-Programm „Das letzte Neuronale Netz für eine Weile, VERSPROCHEN! Wer ihn nicht liest, könnte […]

  8. […] 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: […]

Schreibe einen Kommentar

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