Wo liegen die Grenzen künstlicher Intelligenz? Könnte sie eines Tages Menschen übertreffen? Diesen dramatischen Fragen nähern wir uns mit einem interaktiven Artikel über das sogenannte Universal Approximation Theorem und schaffen so hoffentlich ein bisschen mehr Klarheit über das Potential von KI.

Seit ein paar Jahren wird ganz viel über künstliche Intelligenz (KI) geredet. Je nachdem, wen man fragt, hat man es dabei mit der größten Gefahr für die Menschheit zu tun, die man sich ausdenken könnte oder mit der größten Chance. Oder es wird betont, dass diese Superlative völlig unangemessen sind und KI ja nur einen Hype erfährt.

Du hast wahrscheinlich auch eine Meinung zu dieser Frage. Aber was weißt du eigentlich über KI selbst? Wenn deine Antwort irgendwo in der Gegend von “wenig” liegt, solltest du weiter lesen. Wenn du dir nach dem Lesen nochmal die gleiche Frage stellst, ist die Antwort hoffentlich: “Immer noch ziemlich wenig, aber ein bisschen mehr”.

Wir wollen nämlich gemeinsam klären, warum KI so enorm viel Potential hat. Zugegebenermaßen heißt KI erstmal nur, dass man “intelligentes Verhalten” nachbauen möchte, meistens in Form eines Computerprogramms. Das sagt jetzt noch nichts darüber aus, was KI können kann. Deswegen schauen wir uns nur sogenannte “neuronale Netze” an. Das klingt erstmal super fancy, besonders weil Informatiker gerne erklären, dass diese “vom menschlichen Gehirn” inspiriert sind. 

Ehrlicherweise haben die meisten neuronale Netze aber nur sehr wenig damit zu tun, wie ein menschliches Gehirn funktioniert. Neuronale Netze sind an sich einfach “nicht-lineare Funktions-Approximatoren”. Das klingt aber nicht halb so cool, deswegen wird meistens lieber über’s Gehirn geredet. Um aber zu verstehen, was neuronale Netze—und damit KI können könnte—ist die uncoole Definition viel hilfreicher.

Was ist eine Funktion?

Eine Funktion im mathematischen Sinne bekommt irgendeine Eingabe, macht damit irgendwas und gibt irgendetwas wieder raus. Zum Beispiel ist eine Saftpresse in dem Sinne eine Funktion, als dass sie aus einer Orange Orangensaft macht. 

Für Ingenieure und Mathematiker sind natürlich solche Funktionen interessanter, die Zahlen als Eingabe bekommen und andere Zahlen wieder ausgeben. Zum Beispiel ist f(x) = 2x eine Funktion, die eine Zahl bekommt und sie verdoppelt. 

Was ist eine lineare Funktion?

Man kann Funktionen natürlich in unterschiedliche Kategorien einteilen. Einer der wichtigsten Kategorie ist die der “linearen” Funktionen. Eine Funktion ist dann linear, wenn eine Verdopplung oder Verdreifachung der Eingabe, dazu führt, dass sich die Ausgabe ebenso verdoppelt bzw. verdreifacht. 

Zum Beispiel ist f(x)=2x linear: Vervielfacht man x um einen beliebigen Faktor, z. B. dreißig, erhält man auch die dreißigfache Ausgabe, oder was auch immer das Vielfache ist. Ist x zum Beispiel 21, erhält man als Ausgabe 42. Verdreifacht man x, erhält man als Ausgabe 126=3*42. Halbiert man x, halbiert man auch das Ergebnis und so weiter. 

Eine nicht-lineare Funktion hat diese Eigenschaft nicht. Einer super-einfaches Beispiel ist f(x)=2x+1. Ist x=1, gilt f(1)=3. Verdoppelt man x aber, hat man 5 als Ergebnis, 5 ist aber nicht das doppelte von drei. 

Wann ist eine Funktion linear?

Originaleingabe x=

Vervielfachungsfaktor v=

Eine lineare Funktion: f(x)=2*x

f() = 2* =

f(*) = = *f()

Eine nicht-lineare Funktion f(x)=2*x+1

f() = 2*+1 =

f(*) = = *f()

Eine tolle nicht-lineare Funktion

Offensichtlich kann man sich beliebig viele nicht-lineare Funktionen ausdenken, eine ist aber besonders toll: Sie gibt 0 zurück, falls die Eingabe kleiner als 0 ist und sonst 1. Gibt man also -3 ein, erhält man 0 zurück. Genau das gleiche Ergebnis erhält man auch für -237043, -0.000001, -1 und so weiter. Gibt man aber 0, 1, 2, 0.001, 104370 oder irgendeine andere positive Zahl ein, erhält man 1 zurück.

Weil wir diese Funktion später noch brauchen, nennen wir sie s(x). Das “s” steht für “Stufe”, weil die Funktion ein bisschen aussieht wie eine.

Die Stufenfunktion

Ausgabe s()=

Ein genialer, dummer Trick: Teil 1

Jetzt machen wir folgendes: Wir multiplizieren s(x) mit irgendeiner Zahl s_0. Dann gibt uns s(x) 0 zurück, wenn x kleiner als 0 ist und sonst s_0.

Außerdem möchten wir womöglich, dass die Grenze, an der x die Ausgabe verändert nicht unbedingt bei 0 liegen muss, sondern an einer Stelle x_0. Dazu rechnen wir einfach immer x-x_0, bevor wir uns entscheiden, ob wir 0 oder s_0 zurückgeben. 

Ein einfaches Beispiel: s_0*s(x-x_0) gibt s_0 zurück, falls x größer oder gleich x_0 ist. Ist s_0=3 und x_0=5, erhalten wir also 3 zurück, wenn x mindestens 5 ist.

Die Stufenfunktion verschieben und skalieren

Verschiebung x_0=

Skalierung s_0=

Ein genialer, dummer Trick: Teil 2

Soweit Teil 1 unseres dummen Tricks. Jetzt kommt Teil 2. Wir bauen eine Treppe aus mehreren Stufen. Dazu zählen wir einfach die Ergebnisse von mehreren Stufen zusammen. 

Fangen wir erstmal mit zwei Stufen an. Die eine Stufe hat zum Beispiel die Skalierung 1.3 und ihre Grenze bei -3.7. Die zweite Stufe könnte dagegen die Skalierung -2.0 haben und ihre Grenze bei 2,4. Die entstandene "Treppe" sieht dann folgendermaßen so aus:

Eine kleine Treppe

Verschiebung der ersten Stufe x_01=

Skalierung der ersten Stufe s_01=

Verschiebung der zweiten Stufe x_02=

Skalierung der zweiten Stufe s_02=

Beliebig große Treppen

Was ist aber, wenn wir beliebig viele Stufen nehmen? Hunderte, Tausende oder auch Millionen von Stufen? Dann können wir praktisch jede beliebige Form erschaffen!

Aufmerksame Leser:innen schauen jetzt vermutlich gerade kritisch auf den Bildschirm. Tatsächlich gibt es nämlich zwei Einschränkungen für die Formen:

  1. Unsere Form kann nicht unendlich breit sein. Aber solange sich x in einem gewissen Bereich aufhält, also z. B. immer zwischen 0 und 1 liegt, haben wir kein Problem.
  2. Wir können nur Treppen bauen—unsere Formen sind immer eckig. Auch das ist aber kein richtiges Problem: Wenn wir nur weit genug wegzoomen, erscheint diese eckige Form auch wieder rund.

Was ist ein Funktions-Approximator?

"Funktions-Approximator" klingt super kompliziert, aber eigentlich ist das nur eine Funktion, die versucht eine andere Funktion nachzuahmen. Das heißt, sie gibt ähnliche Ausgaben zurück, wie die "Originalfunktion". So etwas braucht man eigentlich immer, wenn die Originalfunktion zu kompliziert ist, als dass man sie aufschreiben könnte. Dann begnügt man sich damit, eine Funktion zu haben, die man aufschreiben kann und zumindest so ähnlich ist. 

Und genau darin sind neuronale Netze super. Sie können jede* Funktion in einem gewissen Bereich so gut approximieren, wie man möchte, wenn man nur genug Stufen verwendet. 

Ein Funktions-Approximator - oder wie man kompliziertes mit einfachem nachmacht

Anzahl der Stufen N=

Die offene Frage

Die zentrale Frage ist nun, wie man diese Stufen anordnen muss. Und da wird die Sache richtig spannend: Genau das versuchen eigentlich alle zu beantworten, die an neuronalen Netzen forschen. In der Regel gibt man einen Wert in das neuronale Netz ein, schaut, was rauskommt und verschiebt die Stufen so, dass die Ausgabe näher am erwarteten Ergebnis liegt. Probiert man das mit genügend Stufen und Eingaben, erhält man am Ende hoffentlich einen guten Funktions-Approximator.

Außerdem überlegt man sich, wie man dieses Prinzip ausnützen kann, indem man zum Beispiel mehrere solcher Approximatoren hintereinander schaltet oder andere schlaue Strukturen wählt. Die grundlegende Idee des hier gezeigten neuronalen Netzes bleibt aber erhalten.

Was sagt das über das Potential neuronaler Netze?

Zugegebenermaßen war das jetzt nicht alles trivial. Wenn Du aber immer noch dabei bist, kann ich dich beruhigen: Keine weiteren Zahlen oder Formeln mehr. Stattdessen wollen wir uns lieber überlegen, was es über die Möglichkeiten neuronaler Netze aussagt, wenn wir jede* Funktion in einem gewissen Bereich beliebig gut approximieren können. 

Jetzt ist vielleicht ein guter Punkt, doch nochmal auf das menschliche Gehirn zurückzukommen. Denn eigentlich ist das ja auch nur eine Funktion, die Eingaben erhält, zum Beispiel was wir sehen und hören, und daraus Ausgaben generiert, nämlich was wir tun. Klar funktioniert unser Gehirn intern anders als dieser Funktions-Approximator, aber das ist nicht so wichtig: Zwei Funktionen sind gleich, wenn sie für gleiche Eingaben die gleichen Ausgaben liefern. Wie sie zu diesen Ausgaben kommen, ist pragmatischen Ingenieur:innen oder Mathematiker:innen eigentlich egal. 

Du möchtest ein neuronales Netz, dass besser Auto fährt als jeder Mensch? Kann man machen. Du möchtest ein neuronales Netz, das Gedichte schreibt wie Goethe? Möglich. Du möchtest ein neuronales Netz, das Lieder für den Eurovision Song Contest erstellt? Möglich. Du möchtest ein neuronales Netz, das für dich wählen geht? Könnte man sich vorstellen. 

Die Frage ist also weniger, was neuronale Netze prinzipiell könnten. Da sind die Möglichkeiten beinahe unendlich, solange wir es nur groß genug machen. Viel entscheidender ist die Frage, wie man ihnen das beibringt. Und auch da gibt es Grenzen, die die Möglichkeiten zumindest ausbremsen. Aber darum kümmern wir uns später mal.

*Damit die Mathematiker:innen hier keinen Herzinfarkt bekommen: Nicht jede Funktion, aber jede glatte Funktion, die von R^n nach R^m abbildet.

Text: Bastian Heinlein

Beitragsbild: Unsplash (Fakurian Design)

Mehr über KI erfahren

Von uns:

Zukunftskunst: KI als Kunstschaffende der Zukunft?

Von den Profis:

Approximation by superpositions of a sigmoidal function - George Cybenko

Machine Learning for Physicists - Florian Marquardt

Deep Learning's Diminishing Returns - Neil C. Thompson und andere  

AI and Consciousness: A New Look at an Age-Old Question - Andreas Maier