Im ersten Teil der Reihe zu den künstlichen neuronalen Netzen haben wir uns die Grundlagen dieses Konzeptes – konkret: die Funktionsweise der künstlichen Neuronen – angeschaut; im zweiten Teil haben wir gesehen, wie mit Hilfe der künstlichen Neuronen ein real existierender von-Neumann-Rechner nachgebaut werden könnte. Im heutigen Artikel soll es nun darum gehen, wie künstliche Neuronen am besten vernetzt werden, um bestimmte Aufgaben, etwa zur Mustererkennung, geeignet lösen zu können.

Die Neuronen in einem echten Gehirn sind mit zahlreichen anderen Neuronen ihrer Umgebung verbunden, sind also relativ stark miteinander vernetzt. Bei der Verwendung künstlicher neuronaler Netze hat sich dagegen gezeigt, dass eine zu starke und “ungeordnete” Vernetzung der künstlichen Neuronen zur Lösung vieler Probleme nicht geeignet ist (über das “Warum” kann man nun diskutieren – ich würde ja darauf tippen, dass es unter anderem daran liegt, dass künstliche neuronale Netze über viel weniger Neuronen als echte Gehirne verfügen und dass die Abläufe eines echten Gehirns nur in Teilen nachgebildet werden). Daher ist es üblich, KNNs in einer eher strukturierten Form aufzubauen (wenngleich es auch Projekte gibt, die versuchen, sich dem Aufbau eines echten Gehirns etwas mehr anzunähern – mit viel mehr Neuronen dann natürlich).

Die übliche Form eines künstlichen neuronalen Netzes ist die Schichtenarchitektur; die künstlichen Neuronen werden dabei, wie es der Name sagt, in verschiedenen Schichten (engl. Layer) hintereinander angeordnet. Eine wichtige Schicht ist dabei die letzte, die sogenannte Ausgabeschicht (engl. output layer): die Ausgabesignale der Neuronen dieser Schicht werden “nach außen geleitet”, sie bilden gewissermaßen die Ausgabe des KNN (im echten Gehirn wären sie mit den Neuronen vergleichbar, welche Impulse auf vom Gehirn wegführende Nerven leiten). Die restlichen Schichten des KNN sind im Allgemeinen verborgen und werden daher als verdeckte Schichten (engl. hidden layer) bezeichnet. Die folgende Abbildung zeigt ein einfaches zweischichtiges Netz mit einer verdeckten Schicht und der Ausgabeschicht; zudem verfügt es über 3 mögliche Eingaben, die an die Neuronen der verdeckten Schicht angelegt werden:

i-668762e4beb3c4b4b429f531bd0658da-two_layered_net.png

Sehr gebräuchliche Netztypen sind die einschichtigen und die zweischichtigen Netze. Das widerspricht vielleicht etwas der Erwartung, dass neuronale Netze doch eigentlich etwas komplexes sind und daher möglichst viele Schichten haben sollten; in der Praxis hat sich aber für viele Aufgaben gezeigt, dass derart “einfach” aufgebaute Netze vollkommen genügen, um die gestellten Aufgaben zu lösen.

Sind die Neuronen einer Schicht alle nur mit denjenigen der darauffolgenden Schicht verbunden, spricht man von einem Feedforward-Netz. Ein derartiges Netz ist relativ einfach zu programmieren, hat jedoch einen “Nachteil” (Nachteil in Anführungszeichen, da er in der Praxis nicht immer von Bedeutung ist): Signale werden in derartigen Netzen immer “vorwärts” (daher der Name) von einer Schicht in die nächste gegeben; einmal “errechnete” Informationen werden also weitergegeben und sind dann verloren.

In der Praxis ist das nicht immer von Bedeutung, da genügend Probleme auch ohne die Speicherung von Informationen gelöst werden können. Ab und zu ist es aber doch nötig, dem Netz eine Art von Gedächtnis zu geben. Das Vorgehen hierfür ist ähnlich zu dem, welches ich bereits im letzten Artikel bei der Speicherung von Bits mit Hilfe von Neuronen erläutert habe: es werden zusätzlich zu den vorwärtsgerichteten auch rückwärtsgerichtete Kanten, also Kanten zurück auf ein Neuron selber, auf ein Neuron der gleichen Schicht oder sogar auf Neuronen vorheriger Schichten, eingeführt. Derartige Netze werden folgerichtig als rekurrente Netze bezeichnet und stellen eine Möglichkeit dar, Informationen zu speichern (sie haben also eine Art Gedächtnis), aber auch, zeitlich ausgedehnte Eingaben zu verarbeiten und darin Muster zu erkennen. Obiges Netz erweitert um alle drei Arten von rückwärtsgerichteten Kanten könnte also so aussehen:

i-f414b238ac17a41a4943280cb9bf30de-two_layered_recurrent_net.png

Besitzt jedes Neuron eine Verbindung zu jedem anderen Neuron, so spricht man übrigens von einem vollständig vernetzten oder verbundenem KNN.

Welche Art von Netz (mit wie vielen Schichten) und Vernetzung (Feedforward, rekurrent oder vollständig vernetzt) letztendlich für die Lösung eines Problems verwendet werden kann, hängt in der Regel vom Problem selber ab. Mittlerweile gibt es für viele Problemarten best practise-Erfahrungen (ich suche immer noch nach einer vernünftigen deutschen Übersetzung dafür – Vorschläge?), die angewendet werden können. Leider trifft das natürlich nicht auf sämtliche Probleme zu – die Suche nach dem richtigen Netz ist also bereits ein kleines Problem für sich und kann etwa durch ein trial-and-error-Verfahren oder aber auch durch evolutionäre Algorithmen (oder andere Optimierungsalgorithmen) gelöst werden.

Neben der passenden Netzstruktur muss übrigens auch dafür gesorgt werden, dass die möglichen Eingaben auf eine Art und Weise codiert werden, dass sie möglichst günstig in das Netz gefüttert werden können. Oftmals ist diese Aufgabe nicht trivial, da die Codierung der Daten erheblichen Einfluss auf die Effektivität des Netzes hat. Leider können automatisierte Algorithmen dies kaum übernehmen, so dass es in der Regel dem Entwickler eines Netzes überlassen bleibt, eine geeignete Codierung zu finden. Um es noch schwieriger zu machen, muss natürlich auch die Ausgabe des Netzes entsprechend interpretiert werden. Hier gibt es zwei Möglichkeiten: entweder wird versucht, die Ausgaben so zu interpretieren, dass sie einen Sinn ergeben (nichts anderes tun wir im täglichen Leben mit den teils haarsträubenden verbalen Auswürfen diverser Personen des öffentlichen Interesses [die Bissigkeit musste jetzt einmal sein – bitte nicht zu ernst nehmen]), oder das Netz wird dazu gebracht, seine Ausgaben so zu formulieren, wie es der Programmierer erwartet.

Die Findung der richtigen Netzstruktur und die korrekte Codierung der Eingaben reichen allerdings noch nicht aus, um ein KNN auch erfolgreich zur Problemlösung zu verwenden; mindestens ebenso wichtig ist es natürlich, das Netz entsprechend zu konfigurieren, sprich, die Gewichte der Verbindungen zwischen den Neuronen sowie die Schwellwerte und die Aktivierungsfunktionen der einzelnen Neuronen korrekt einzustellen. Hier durch raten, probieren oder “errechnen” auf Anhieb die richtige Konfiguration zu finden, ist sehr schwierig und wird umso schwerer, je größer das Netz ist – es wird also auch hierfür ein Algorithmus benötigt, welcher die richtigen Einstellungen bestimmt. Evolutionäre Algorithmen können auch hier helfen, öfter jedoch wird sich wieder einmal am echten Gehirn orientiert und ein anderes Verfahren verwendet: das Lernen. Ziel dabei ist es, dem KNN durch verschiedene Methoden ein bestimmtes Verhalten anzuerziehen, ganz so, wie Lebewesen im Laufe ihrer Entwicklung neue Dinge lernen können; es soll also dazu gebracht werden, die Ausgaben zu generieren, die erwartet werden. Doch dazu beim nächsten mal ein wenig mehr (und als kleine Vorwarnung: es könnte etwas mathematischer werden).

Kommentare (9)

  1. #1 Christian
    April 20, 2012

    (nichts anderes tun wir im täglichen Leben mit den teils haarsträubenden verbalen Auswürfen diverser Personen des öffentlichen Interesses)

    Das ist Quark.

  2. #2 Engywuck
    April 20, 2012

    theoretisch sollte doch ein feedforward-Netz einem voll vernetzten entsprechen, bei dem alle Verknüpfungen, die nicht nach vorn gerichtet sind auf “0” stehen.

    Dann sollte – rein theoretisch – durch “Lernen” ein Problem, das am besten feedforward (und mit weniger Neuronen als vorhanden) bestimmt werden kann, eben diese rückwärtsgerichteten Verbindungen (sowie die Verbndungen zu unbenötigten “Neuronen”) auf “0” setzen.

    Lass mich raten: dem ist (im Allgemeinen) nicht so? 😉
    Liegt das an lokalen Maxima der Fitness, zu geringer aufgewendeter Zeit oder anderen Ursachen?

  3. #3 ulfi
    April 20, 2012

    Ein Prof von mir hat dazu einen Spruch:

    “Gradientenabstieg auf einem rekurrenten Netzwerk ist Optimierung im Raum der touring-vollständigen Programme”

    Auch wenn das natürlich echt fluffig klingt, bedeutet das auch, dass das Lernen von rekurrenten Netzwerken in der Praxis nicht funktioniert.

  4. #4 Marcus Frenkel
    April 20, 2012

    @Engywuck

    > theoretisch sollte doch ein feedforward-Netz einem voll vernetzten entsprechen, bei dem alle Verknüpfungen, die nicht nach vorn gerichtet sind auf “0” stehen.

    Richtig. 🙂

    > Dann sollte – rein theoretisch – durch “Lernen” ein Problem, das am besten feedforward (und mit weniger Neuronen als vorhanden) bestimmt werden kann, eben diese rückwärtsgerichteten Verbindungen (sowie die Verbndungen zu unbenötigten “Neuronen”) auf “0” setzen.

    Das wäre in der Tat theoretisch möglich.

    > Lass mich raten: dem ist (im Allgemeinen) nicht so? 😉

    Auch richtig. 😉

    > Liegt das an lokalen Maxima der Fitness, zu geringer aufgewendeter Zeit oder anderen Ursachen?

    Das liegt hauptsächlich daran, dass die verfügbaren Lernverfahren stark vom verwendeten Netztyp abhängen. So gibt es Lernverfahren, die nur auf feedforward-Netzen arbeiten, sogar solche, die nur mit einschichtigen Netzen funktionieren. Allgemein ist es schwierig, rekurrente anzulernen; ein bisschen was ist da wohl auch mit evolultionären Algorithmen möglich, aber das dauert und ist auch nicht optimal. Deswegen werden die reinen Feedforward-Netze auch teilweise bevorzugt, einfach, weil sie viel leichter anzulernen sind. Dazu aber beim nächsten mal hoffentlich etwas.

    @ulfi
    Das war schön ausgedrückt. ^^

  5. #5 Marcus Frenkel
    April 20, 2012

    @Christian
    Das war auch nicht ernst gemeint, sondern mit leicht ironischem Unterton, falls das nicht herüberkam…
    Habe im Text noch einen Hinweis darauf platziert.

  6. #6 Maximilian
    April 20, 2012

    Schöner Artikel.

    Nur ein Kritikpunkt: Das Facets-Projekt, auf das du verweist, ist schon seit über einem Jahr ausgelaufen und durch das Nachfolge-Projekt BrainScales abgelöst worden. Vielleicht wäre es deshalb sinnvoller, zumindest zusätzlich auch auf das aktuelle Projekt zu verweisen?

  7. #7 Marcus Frenkel
    April 20, 2012

    @Maximilian
    Haaa…so sehr kann man nicht mehr auf dem aktuellen Stand sein. Danke für den Hinweis, ich habe einen zusätzlichen Verweis eingebaut.

  8. #8 HF
    April 26, 2012

    Tschuldigung für den Rant.
    “die Suche nach dem richtigen Netz ist also bereits ein kleines Problem für sich und kann etwa durch ein trial-and-error-Verfahren oder aber auch durch evolutionäre Algorithmen (oder andere Optimierungsalgorithmen) gelöst werden.”
    Hochdimensionale Optimierung, Evolution, das klingt immer wie “schwierig” und “langsam”.
    Wieso ist das Lernen im Gehirn so unglaublich schnell? Man sagt ja, das Rehkitze von Geburt an laufen können. Sicher ist die Entwicklung des Gehirns bei der Geburt weit fortgeschritten, aber es gibt nicht genug Bits in den Genen, um die Verschaltung oder die Synapsenstärken festzulegen. Das Rehkitz lernt in wenigen Minuten Sehen und Laufen, und das Trainingsprozess gelingt praktisch immer.
    Irgendwie kann mit den langsamen Neuronen nicht nur eine schnelle Verarbeitung, sondern auch ebenso schnelles Lernen realisiert werden. Ist der Unterschied wirklich nur durch den Unterschied “massiv parallel” und “seriell” bedingt? In Lehrbüchern sieht das immer so toll aus, was man nicht alles weiss! Aber warum kann man dann, nach über sechzig Jahren Forschung, immer noch nichts nachbauen? Die Computer sind in dieser Zeit millionenmal schneller geworden, die Speicherkapazität ist ebenfalls millionenfach größer geworden. Nur die Ausreden sind dieselben geblieben.

  9. #9 Quacki
    April 29, 2012

    @HF:

    Hochdimensionale Optimierung, Evolution, das klingt immer wie “schwierig” und “langsam”. Wieso ist das Lernen im Gehirn so unglaublich schnell?

    Der Vergleich ist nicht fair 😀 Das eine sind technische Anwendungen, das andere ist ein System, welches in mehreren hundert Millionen Jahren entstanden ist, unter einem großen Druck besser zu werden.

    Man sagt ja, das Rehkitze von Geburt an laufen können. […] Das Rehkitz lernt in wenigen Minuten Sehen und Laufen, und das Trainingsprozess gelingt praktisch immer.

    Davon gibts noch viel mehr. Neugeborene Wale z.B. können von sofort an schwimmen, ansonsten würden sie ja ertrinken. Neurone sind schon im Mutterleib aktiv, und daher werden wohl schon Synapsen gelernt (ganz abgesehen von Hören und Tasten, zwei Sinne die im Mutterleib schon angeregt werden (können)). Es gibt z.B. sogenannte retinal waves, das sind Aktivitätswellen, die auf der Retina von ungeborenen Tieren spontan entstehen und über die Retina ziehen. Auch wenn die retinal wave dem Tier nicht vermitteln kann, was ein Baum ist, so ist vorstellbar, dass die retinal waves an der Bildung von rezeptiven Feldern in den visuellen Arealen beteiligt sind (ich drück das mal vorsichtig aus, weil ich nicht weiß, was der Stand dazu ist).

    In Lehrbüchern sieht das immer so toll aus, was man nicht alles weiss! Aber warum kann man dann, nach über sechzig Jahren Forschung, immer noch nichts nachbauen? Die Computer sind in dieser Zeit millionenmal schneller geworden, die Speicherkapazität ist ebenfalls millionenfach größer geworden.

    Jetzt bin ich etwas überrascht. Was erwartest du? In den 60ern, so in der ersten Hochzeit der KI-Forschung, da waren die Leute eben euphorisch, dass sie das Perzeptron entdeckt haben, und wirkliche KI schien in Reichweite zu sein. So what? Sie haben sich verschätzt. Ist das deswegen eine Ausrede? Das ist doch grad das lustige an der Sache. Trotz der ganzen schon gemachten Entdeckungen ist die Funktion des Gehirns immer noch schlecht verstanden. Andererseits denke ich, dass man den Stand der Forschung nicht überschätzen sollte. Zum Beispiel ist synaptische Plastiztät immer noch sehr schlecht verstanden. Die Synapse ändert sich in Abhängigkeit der vergangenen neuronalen Aktivität. Aber wie genau, ist nur in ganz groben Zügen bekannt. Da gibts zwar so eine hübsche Lernregel wie die Spike Timing Dependent Plasticity, aber es ist sehr gut möglich dass in den entsprechenden Experimenten viel Mist gemessen wurde.