The Stilwell Brain
Das ist eine Episode der Serie „Mind Field“, von der ich ansonsten nichts weiß. In dieser Episode geht es darum, wie automatische Erkennung von handschriftlichen Ziffern durch ein Neuronales Netz funktioniert, jedenfalls ansatzweise. Menschliche Teilnehmer übernehmen dabei auf einem Football-Platz die Rolle von Neuronen in einem fertig trainierten kleinen Neuronalen Netz. Ab Minute 11:30 etwa geht es richtig los:
Das Stilwell-Gehirn in der Tabellenkalkulation
Bei Github gibt es den Code dazu in Python, den habe ich für einen Nachbau benutzt.
Ein Neuronales Netz in einem Tabelldokument abzubilden ist gar nicht schwer. Vorne kommen Zahlen rein, hinten kommen – abhängig von Rechen-Parametern dazwischen – Zahlen heraus. Dieses Prinzip heißt Forward Propagation (von vorne nach hinten durch), und es geht dann nur noch darum, am Ende die Zahlen zu interpretieren.
Was schwieriger nachzubauen wäre: wie man ursprünglich auf diese Parameter kommt. Das geschieht mit dem gleichen Neuronalen Netz während des Trainings: Man vergleicht das gewünschte Ergebnis anhand der vorhanden Lösung („supervised learning“) mit dem tatsächlichen Ergebnis und verändert danach automatisiert abhängig von dem Fehler, also der Abweichung von der gewünschten Lösung, diese Parameter. Das Prinzip heißt Backward Propagation (von hinten nach vorne), weil man bei der Abweichung anfängt und nach und nach alle Parameter von den hinteren bis in die vorderen Schichten anpasst. Aber um das Lernen geht es hier ja nicht, das Stilwell-Gehirn ist ja schon fertig.
In Calc sieht das so aus:

- Links oben sieht man die Zeichnung, die den Ausgangspunkt bildet. In jede Zelle gibt man 0 oder 1 ein, der Rest geschieht automatisch.
- Die orange Schicht ist die Eingangsschicht, sie entspricht den orange Gekleideten im Film. Es gibt 25 Neuronen, für jeden Pixel der Zeichung eines (nummeriert 1 bis 25).
- Die gelbe Schicht heißt im Film V1 und deren Mitglieder sind gelb gekleidet (Nummer 26 bis 76 mit ein paar Lücken). Jedes Mitglied beobachtet 3 Knoten aus der Eingangsschicht und ignoriert alle anderen. Wenn alle drei beobachteten Knoten den Wert 1 ausgeben, gibt das gelbe Neuron ebenfalls 1 aus (im Film: hebt die Fahne und steht auf).
- Die blaue Schicht heißt im Film V2 und deren Mitglieder sind blau gekleidet (Nummer 77 bis 155, mit Lücken). Jedes Mitglied beobachtet 2 Knoten aus der gelben Schicht auf die gleiche Weise wie oben.
- Die grüne Schicht heißt im Film V4 und deren Mitglieder sind grün gekleidet. Für die meisten davon (171 bis 247) gilt: Jedes Mitglied beobachtet 2 oder 3 Knoten aus der blauen Schicht und ignoriert alle anderen. Wenn alle beobachteten Knoten den Wert 1 gaben, gibt das grüne Neuron ebenfalls 1 aus. – Außerdem gibt es noch 3 Neuronen, die im Film „complex“ genannt werden (291 bis 293), die 5 bis 6 Neuronen der Vorgängerschicht beobachten und dann feuern, wenn mindestens eines davon feuert. Das ist dann eine ODER- statt einer UND-Verknüpfung wie bisher.
- Die violette Schicht heißt im Film „IT“ (für Inferior Temporal Cortexc), jedes Mitglied beobachtet 5 bis 7 Neuronen der grünen Vorgängerschicht und feuert ebenfalls bei einem ODER. Dem Ausgabewert der violetten Schicht kann man entnehmen, welches Zeichen erkannt worden ist, hier entweder eine 1 oder eine 6 und deshalb eine 6 – siehe unten.
- (Die rechts grün markierten Nummern sind geplante, aber fehlende Neuronen, einfach ignorieren, man könnte sie auch löschen.)
Wo beim Stilwell Brain geschummelt wird
Die letzte, violette Schicht wird so ausgewertet: Für jedes potentiell mögliche Neuron steht eine 1 im Ausgang. Wenn das bei mehr als einem Neuron der Fall ist, dann werden diese potentiellen Neuronen in folgender Reihenfolge durchgegangen: 8, 9, 0, 2, 3, 7, 6, 4, 5, und das erste passende davon ist dann das richtige.
Wo das Stilwell Brain vereinfacht
In einem tatsächlichen vollständig verbundenen Neuronalen Netz würde ohnehin jedes Neuron jedes Neuron der Vorgängerschicht beobachten und derer zwei oder drei . Außerdem wären nicht alle Neuronen gleich wichtig, sondern jede Verbindung erhielte eine eigene Gewichtung. Man kann sich das Stilwell Brain als reduziertes echtes Netz vorstellen, wobei die Verbindungen zu den jeweils beobachteten Neuronen alle die gleiche Gewichtung haben (nämlich 1) und die Verbindungen zu den jeweils nicht beobachteten Neuronen alle die Gewichtung 0, was heißt, dass diese Neuronen ignoriert werden.
Was die einzelnen Neuronen bedeuten
Ich habe den Python-Code von Stilwell genommen und um einen Visualisierungscode ergänzt, denn ich aus einem Fortbildungsprojekt übernommen habe. Damit kann man anschaulich machen, was die Neuronen eigentlich interessiert. Jedes der 45 Neuronen von Layer V1 interessiert sich für 3 Neuronen der Eingangsschicht, und zwar jeweils für genau die in der folgenden Grafik abgebildeten.
Jedes Kästchen steht für ein Neuron aus V1, jedes Kästchen besteht aus 5×5 Pixeln, das sind die 25 Pixel der Eingangswerte. Das Pixel links oben in einem Kästchen ist ausgefüllt, wenn dieses Neuron diesen Pixel beobachtet:

Das heißt, das Neuron links oben (es hat die Nummer 26), überprüft, ob links oben ein vertikaler Strich ist. Alle anderen Positionen spielen für die Verarbeitung keinerlei Rolle. Technisch sieht das Neuron im Modell so aus: [1, 2, 3], weil es sich nur für diese drei Pixel interessiert; man könnte das auch anders ausdrücken, nämlich als [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].
Die 55 Neuronen der nächsten Ebene, V2, kombinieren jeweils 2 Neuronen von V1, überprüfen also indirekt jeweils 6 Neuronen der Eingangsschicht. (Manche sind doppelt.) Ich habe das dergestalt visualisiert, dass ich die indirekt beobachteten Eingangspixel zusammengefasst habe:

Die 41 einfachen Neuronen von V4, also ohne die komplexen Knoten, kombinieren jeweils 2 bis 3 Neuronen von V3, auch die kann man zusammenfassen, und das sieht dann so aus:

Ah, langsam lichtet sich der Dschungel! Und es wird… banaler? Tatsächlich sind es nur diese 41 Neuronen, plus die 3 komplexen Neuronen mit der ODER-Verknüpfung (die sich nicht so gut für die Visualisierung eignen), die die eigentlich Auswertungsarbeit übernehmen. Anders gesagt: Eigentlich würde die grüne Schicht (Layer 4) völlig ausreichen für die Auswertung. Denn statt dass die Grünen die Blauen beobachten, die wiederum die Gelben beobachten, die wiederum die Orangen beobachten, könnten die Grünen doch gleich die Orangen beobachten. Dann müsste aber jedes Neuron mehr als 2 oder 3 andere beobachten, und das wäre mit Menschen im Experiment schwer zu machen. Vermutlich deshalb hat man das für das Experiment auf mehrere Schichten aufgeteilt – und weil es dramatischer darzustellen ist. (Vielleicht soll das auch wirkliche Schichten bei der menschlichen Bildverarbeitung repräsentieren?)
Die letzte Schicht mit ihren 10 Ergebnis-Neuronen dient der Auswertung. Für den 2er-Knoten gilt zum Beispiel: Wenn mindestens ein Neuron von 171 bis 179 (das sind die Nummern der ersten sechs Neuronen in der letzten Abbildung) feuert, dann setze deinen Wert auf 1, sonst 0.
Wer übrigens die 1 vermisst: Die steckt in den den Knoten 291 und 292, den komplexen Neuronen der V4-Schicht. Wenn mindestens einer davon feuert, feuert auch das 1er-Neuron.
Tatsächlich enthält das verwendete Python-Modell ein paar Lücken, und etliche Knoten spielen – zum Beispiel gerade für die 1 – eine Rolle, existieren aber gar nicht. Ich nehme an, dass das auch damit zu tun hat, dass das Stilwell-Modell im Experiment immer wieder angepasst werden musste auf eine wechselnde Anzahl an Teilnehmenden. Und natürlich ist das Modell nur rudimentär, wenn ich zum Beispiel alle Pixel ausmale, feuern auch alle Neuronen, auch am Ende, so dass nach der Schummel-Regel eine 8 ausgegeben wird. Echte Netze würden für jede Zahl eine unterschiedlich hohe Wahrscheinlichkeit ausgeben, die dann halt bei allen Zahlen sehr niedrig wäre (siehe Blogeintrag zur Ziffernerkennung und Fortsetzungen davon).
Wichtiger Unterschied: Menschengemacht
Diese Neuronen-Bedeutungen oben hat sich natürlich ein Mensch ausgedacht, also dass etwa nach Quer- und Längsstrichen gesucht wird, oder eigentlich: nach den vorgegebenen 41 Mustern. Die entsprechenden Gewichtungen – also wo intern eine 0 und wo eine 1 ist und damit: wer wen beobachtet oder nicht – sind nicht maschinengemacht, sondern von Hand ausgeklügelt. Das gilt ebenso für den Bias-Wert, der entscheidet, ob die Eingäng durch logisches UND oder ODER verknüpft werden. Echte Netze arbeiten nicht mit solch kruden Verküpfungen, sondern… eigenen.
Bei einem automatisch trainierten Neuronalen Netz lässt sich dafür nicht so einfach, oder eigentlich meist gar nicht, nachvollziehen, was ein Neuron eigentlich überprüft, also nach welchen Eigenschaften es sucht – horizontale Linien, vertikale, Kurven? Die folgenden 30 Neuronen überprüfen handschriftliche Ziffern (MNIST-Datensatz) in etwas größerer Auflösung, nämlich 28×28 Pixel. Hier bedeutet Blau, dass ein Pixel eine hohe Gewichtung hat (bis zu 1) und Orange bedeutet einen negativen Wert (bis -1); mit solchen negativen Werten hat das Stilwell-Gehirn gar nicht gearbeitet.

Nach welcher Eigenschaft sucht also zum Beispiel das erste Neuron links oben? Vermutlich so etwas wie vage kreisförmig, aber auf der rechten Seite eingedellt; außerdem soll rechts oben und rechts unten ein bisschen frei sein, ebenso die linke Mitte; der Rand ist mir weitgehend egal. Für den Rechner ist das eine Eigenschaft, genauso wie hat oben links einen Querstrich eine ist.
Welche Rolle dieses Neuron dann bei der Auswertung spielt (UND, ODER; eher: ganz etwas anderes), wird wohl ebenso wenig klar werden. Dafür kommt dieses vollständig verbundene Netz aber mit nur 30 Knoten aus und ist sehr, sehr viel besser im Erkennen von Ziffern als das handgestrickte Stilwell Brain oben. Das liegt auch an der wesentlich größeren Anzahl an Verbindungen zwischen den Neuronen.
(Das Bild und den Code dazu habe ich übrigens aus der wirklich sehr guten Fortbildungsreihe des ISB zum neuen Thema „KI in der 13. Jahrgangsstufe.“ Kann ich nur empfehlen.)
Der nächste Schritt
Der nächste natürliche Schritt wäre, das Gehirn mit einem visuellen Editor für Neuronale Netze nachzubauen, wie es sie da und dort gibt. Dann erst versteht man Bias und Gewichtung. Aber ich kenne kein System, mit dem man so große Netze visualisieren kann.
Und natürlich…
…muss ich bei „Stilwell“ an „Stillman’s Gym“ denken, auch wenn der Name nur ähnlich ist, aus jener sensationellen Nummer aus It’s Always Fair Weather (Stanley Donen/Gene Kelly 1955) mit Cyd Charisse, die zu posten ich nie eine Gelegenheit versäume:
(Weil ich das beim Tippen nebenbei immer gesummt habe, muss das rein.)
Nachtrag: Gerade anhand der vorletzten Grafik, der mit den erkennbaren Ziffern, gesehen, dass es einen Fehler im Code geben muss. Bei Github hat das auch schon jemand angemerkt und eine Verbesserung vorgeschlagen, die aber bislang nicht übernommen worden ist..
Links
- Youtube-Video: https://www.youtube.com/watch?v=rA5qnZUXcqo
- Github-Projekt dazu: https://github.com/celiasmith/mind_field_stilwell_brain
- Ein Visualierungsprojekt dazu (in Java): https://github.com/usuleymanov/VisualCortex
Schreibe einen Kommentar