Neuronale Netze und die Suche nach dem Minimum

Christoph Pöppe

In meinem letzten Beitrag hatte ich Ihnen erzählt, wie man das Minimum einer Funktion von mehreren Variablen finden kann. Wenn es nur zwei Variable sind, dann kann man die als Koordinaten auf einer Landkarte interpretieren. Der Funktionswert ist dann die Höhe über dem Meeresspiegel, und es geht darum, den tiefsten Punkt in der Landschaft zu finden.

Wenn es mehr als zwei Variable sind, versagt jedoch die Anschauung. Aus der Landkarte wird ein N-dimensionaler Raum, und der wäre selbst dann sehr unübersichtlich, wenn man sich ihn vorstellen könnte. Aber die Mathematik funktioniert im Wesentlichen genauso wie beim Wandern in der Landschaft. Es stellt sich heraus, dass es auf die Ableitungen der Funktion nach allen ihren Variablen ankommt. Diese so genannten partiellen Ableitungen bilden einen Vektor, den man den Gradienten der Funktion nennt, genauer: den Gradienten dieser Funktion in dem speziellen Punkt im N-dimensionalen Raum, an dem man die Funktion gerade auswertet. Der Gradient weist in die Richtung, in der es am steilsten abwärts geht – nicht unbedingt der kürzeste Weg zum Ziel, aber für den ersten zaghaften Schritt eine gute Idee.

Und wenn die Anzahl der Variablen in die Millionen oder gar Milliarden geht? Dann bleibt die Theorie immer noch unverändert. Aber in der Praxis ist es bereits ein erheblicher Aufwand, den Gradienten überhaupt auszurechnen. Um den Aufwand in Grenzen zu halten, muss man sich schon Mühe geben.

Gibt es überhaupt Minimierungsprobleme mit dieser aberwitzigen Variablenzahl? Allerdings, und sie sind sogar im Moment in aller Munde. Maschinelles Lernen, das, was ChatGPT und seinesgleichen zu derart erstaunlichen Leistungen befähigt, läuft nämlich im Grunde auf die Lösung eines Minimierungsproblems hinaus. Dessen Variable sind die Eigenschaften der Komponenten eines neuronalen Netzes, und deren Anzahl geht bei den großen Modellen in der Tat in die Milliarden.

Um es gleich vorweg zu sagen: Erwarten Sie bitte keine Erklärung, wie ChatGPT funktioniert. Mal abgesehen davon, dass selbst die Konstrukteure dieser Systeme damit ihre Schwierigkeiten haben: Ein Large Language Model (LLM) ist sehr viel mehr als ein (sehr großes) neuronales Netz. Beschränken wir uns hier auf die Basisversion, die – wenn auch ziemlich abstrakt – dem Sehsystem in unserem Gehirn nachempfunden ist. 

Schema eines einfachen neuronalen Netzes. Die Neuronen der untersten Schicht (blau) nehmen Information in Gestalt eines Zahlenwerts aus der Außenwelt auf und reichen sie (schwarze Striche) an die Neuronen der nächsthöheren Schicht weiter. Diese verrechnen das, was aus verschiedenen Neuronen von unten kommt, zu einem neuen Zahlenwert, den sie nach oben weiterreichen, und so weiter. Die Neuronen der obersten Schicht (grün) liefern die Ergebnisse dieses Verarbeitungsprozesses. Information fließt immer nur von einer Schicht zur nächsthöheren, insbesondere immer nur von unten nach oben. Echte neuronale Netze haben Millionen von Neuronen in der untersten Ebene und zahlreiche Ebenen („tiefe Netze“).

Aus diesem Grund heißen die Elemente eines solchen Netzes Neuronen. Unter denen der untersten Schicht darf man sich die Sehzellen in unserer Netzhaut vorstellen. Jede von ihnen gibt ein Signal ab, das ungefähr proportional zur Menge des eingefallenen Lichtes ist, und übermittelt diese Zahl an verschiedene Neuronen eine Schicht höher. Jedes von diesen nimmt Signale von mehreren Neuronen der nächsttieferen Schicht entgegen und macht aus diesen Zahlen eine neue: Es berechnet den Wert einer Funktion, deren Variablen die eingehenden Signale sind. Zum Beispiel multipliziert es jeden dieser Inputs mit einem gewissen Faktor (dem „synaptischen Gewicht“ der Verbindung), addiert alle diese Produkte zusammen und verarbeitet diese Summe noch weiter. 

So wird das Bild, das die unterste Schicht gesehen hat, Schicht für Schicht weiterverarbeitet, bis die Neuronen der obersten (Output-)Schicht das Ergebnis bekanntgeben. Die heißen zum Beispiel „Hund“, „Katze“, „Mensch“, „Elster“, „Schwertwal“ und so weiter, und wenn das vorgelegte Bild eine Katze zeigt, dann soll das Neuron namens „Katze“ das Signal 1 abgeben und alle anderen das Signal null. (Der besseren Vergleichbarkeit zuliebe werden die Outputs normiert, das heißt, mit einem gemeinsamen Faktor multipliziert, so dass ihre Quadratsumme gleich 1 ist.)

Das passiert im Urzustand des Netzes natürlich nicht; denn die synaptischen Gewichte haben „ab Werk“ irgendwelche zufälligen Werte. Vielmehr soll das Netz erst lernen, wie – zum Beispiel – eine Katze aussieht, und zwar an Beispielen. 

Ein Schritt des Lernprozesses besteht darin, dass ein Computerprogramm (der „Lehrer“) dem Netz ein Bild einer Katze vorlegt, zusammen mit der Auskunft „Das ist eine Katze“. Daraufhin verändert das Netz seine synaptischen Gewichte ein kleines Stück in Richtung des erwünschten Zustands: Nur das Outputneuron „Katze“ liefert den Wert 1 und alle anderen den Wert 0. 

Wie macht es das? Indem es ein Minimierungsproblem löst. Man definiert zunächst die zu minimierende Funktion. In diesem Fall ist es die sogenannte Fehlerfunktion: Man nimmt den vorliegenden Output minus den erwünschten Output, das zum Quadrat, und summiert über alle Outputneuronen. Wenn das System perfekt ist, hat die Fehlerfunktion den Wert 0, und in jedem anderen Fall ist sie positiv. Also ist es eine gute Idee, die Variablen der Funktion – die in diesem Fall die synaptischen Gewichte sind – so abzuändern, dass die Fehlerfunktion kleiner wird. Und das geht wie bei der Geschichte mit dem Bergwandern in die Richtung, in der es am steilsten abwärts geht („steepest descent“), also in Richtung des Gradienten.

Das letzte Mal hatte ich noch wortreich argumentiert, dass es geschicktere Wege zum Ziel gibt als den steilsten Abstieg. Stattdessen sollte man die Funktion in der Nähe des aktuellen Punktes durch einen verallgemeinerten elliptischen Eierbecher annähern und dann sogleich auf den Grund dieses Eierbechers springen. Das ist zwar nach wie vor richtig, aber im Fall eines neuronalen Netzes völlig witzlos. Die Konstruktion des Eierbechers läuft auf die Lösung eines linearen Gleichungssystems hinaus, und darüber braucht man bei Millionen bis Milliarden von Variablen gar nicht erst nachzudenken.

Bereits die Berechnung des Gradienten ist nicht einfach. Dass sie überhaupt gelingt, verdanken wir einem der nützlichsten Sätze der Analysis, der Kettenregel. In ihrer einfachsten Form lautet sie \[(f \circ g)’ (x) = f’(g(x))g’(x) \; .\] Wenn f nur vermittels g von x abhängt, dann ist die Ableitung von f nach x gleich der Ableitung von f nach g an der Stelle g(x) mal der Ableitung von g nach x. In der leibnizschen Schreibweise \[{df \over dx}= {df \over dg}{dg \over dx} ] sieht das besonders elegant aus, so als müsste man nur den Bruch df / dx mit dg erweitern, um zur Kettenregel zu kommen. Nur sind das alles keine Brüche, sondern Grenzwerte von Brüchen, so dass die Eleganz ein bisschen in die Irre führt.

Angewandt auf unsere Fehlerfunktion weist die Kettenregel im Effekt jedem Outputneuron einzeln zu, welchen Beitrag es zur Minderung des Fehlers zu leisten hat. Und nicht nur das: Jedes Neuron wendet die Kettenregel auf die Funktion an, die es selbst ausrechnet, und findet dadurch den Beitrag, den es selbst zu leisten hat, und außerdem die Beiträge, die seine „Lieferanten“ zu leisten haben, also die Neuronen eine Schicht tiefer, deren Werte in seine eigene Berechnung eingegangen sind. Auf diese Weise erledigt jedes Neuron seine Pflichten zur Nachbesserung zum einen Teil selbst, zum anderen Teil reicht es sie an die Ebene eins tiefer weiter. Die arbeitet nach demselben Prinzip, und so weiter, bis schließlich die Information über den Fehler, und wie er zu mindern ist, von oben nach ganz unten durchgesickert ist.

Das Prinzip heißt backpropagation, Rückwärtsverbreitung. Es hat den Charme, dass jedes Neuron seine Pflichten lokal berechnen kann, das heißt, indem es nur die Information verwendet, die es selbst schon besitzt oder von unmittelbar oben durchgereicht bekommt. 

Das ist einerseits für die Leute wichtig, die ein neuronales Netz auf einem Computer programmieren wollen. Bei derart vielen Zahlenwerten, die das Gerät im Speicher halten muss, kommt es darauf an, dass die Kommunikation unter den Speicherplätzen sehr geregelt und vor allem lokal, das heißt möglichst nur zwischen benachbarten Plätzen stattfindet. Dann kann man nämlich die gewaltige Rechenarbeit auf viele parallel arbeitende Rechenwerke (Prozessoren) verteilen.

Andererseits interessiert das Prinzip der Backpropagation auch die Forschenden aus der Neurowissenschaft, die verstehen wollen, wie ein echtes Gehirn lernt – oder wenigstens dessen Sehsystem. Irgendwie muss auch dort die Information, mit der die Neuronen ihr Verhalten korrigieren, entgegen der allgemeinen Richtung „von oben nach unten“ fließen.

Mit einem Lernschritt ist es allerdings nicht getan – nicht entfernt. Die Richtung des steilsten Abstiegs ändert sich ja möglicherweise sehr rasch, wenn man sich in dem millionendimensionalen Raum der synaptischen Gewichte bewegt; also muss man die Schrittweite ziemlich klein wählen, damit das System nicht in die Irre läuft. Dadurch werden es sehr viele kleine Schritte.

Darüber hinaus, und noch wichtiger: Das nächste Mal ist die Zielfunktion eine ganz andere. Der „Lehrer“ legt dem Netz ein anderes Bild vor, sagt „Hund“ dazu, und schon versucht das Netz einen anderen Idealzustand anzustreben: 1 für das Outputneuron „Hund“, 0 für alle anderen.

Nach Millionen von Lernschritten mit ebenso vielen vorgelegten Bildern hat das Netz dann tatsächlich die Fähigkeit erworben, ein Bild, das es vorher noch nie gesehen hat, korrekt als „Hund“ oder „Katze“ oder sonst ein Tier aus dem Trainingsdatensatz zu identifizieren. 

Wie es das im Einzelnen macht? Das wissen weder die Erbauer des lernfähigen Systems noch sein Trainer. Im ausgelernten Zustand haben alle synaptischen Gewichte einen Wert angenommen; der ändert sich auch kaum noch beim Weiterlernen. Alle diese Zahlenwerte sind ohne weiteres zugänglich. Aber sie bringen nicht die geringste Erkenntnis – über das hinaus, was man erfährt, wenn man das Netz auf ein neues Bild ansetzt.

Das ist die – viel beschriebene – Heimtücke der neuronalen Netze: Sie können zwar Antworten geben, und die stimmen auch meistens, aber ihre Antworten nicht begründen.

The post Neuronale Netze und die Suche nach dem Minimum originally appeared on the HLFF SciLogs blog.