In einem kürzlichen Gespräch mit Joscha Bach , einem der originellsten Denker dieser Generation, stellte er die verblüffende Behauptung auf, dass mobile Parallelität im Widerspruch zur künstlichen allgemeinen Intelligenz stehe. In diesem Zusammenhang bedeutet mobile Parallelität die Art von Parallelität, die man findet, wenn Agenten (auch bekannt als Rechenprozesse) einander entdecken können. Dabei handelt es sich um die Kommunikationstopologie (wer weiß, wen und wer mit wem spricht), die sich weiterentwickelt. Dieses Modell unterscheidet sich stark von einem Modell, bei dem Rechenelemente wie Komponenten auf einem Motherboard zusammengelötet sind. Mobile Parallelität ähnelt eher dem Internet oder den Telefonnetzen, bei denen Menschen, die sich gerade zum ersten Mal getroffen haben, die Websites, E-Mail-Adressen und Telefonnummern des anderen erfahren. Joschas Argument ist, dass Gehirne nur plastisch sind, das heißt, die Verbindungen zwischen Neuronen ändern sich nur beim Lernen, nicht aber beim allgemeinen Rechnen.
Joscha Bach , einer der originellsten Denker seiner Generation, stellte die verblüffende Behauptung auf, dass mobile Parallelität im Widerspruch zur künstlichen allgemeinen Intelligenz stehe
Meine Antwort auf diesen Vorschlag ist, dass er davon ausgeht, dass der Geist nicht in einem logischen Rechenmodell untergebracht ist, das auf der Hardware des Gehirns läuft. Schließlich ist die Java Virtual Machine (JVM) ein ganz anderes Rechenmodell als die Hardware, auf der sie läuft. Haskells Berechnungsmodell ist eine noch dramatischere Variante der Berechnungsidee als diejenige, die in der Hardware verkörpert ist, auf der der glorreiche Haskell-Compiler ( GHC ) normalerweise gehostet wird. Warum sollte der Geist nicht so organisiert sein? Um Joschas anschauliche Metapher zu verwenden: Warum sollte der Geist nicht als kolonisierendes Rechenmodell entstehen, das sich auf der Hardware des Gehirns hostet? Wenn ja, dann wird Rholang, eine Implementierung des Rho-Kalküls, zunächst auf Intel- und AMD-Chips gehostet, und ihre Rechenmodelle unterscheiden sich stark von denen, die vom Rho-Kalkül erfasst werden.
Insbesondere bietet der Rho-Kalkül direkte Unterstützung für mobile gleichzeitige Berechnungen. Die Kommunikationstopologie innerhalb einer Gesellschaft von Prozessen, die im Rho-Kalkül ausgeführt werden, ist dynamisch. Wer weiß wen und mit wem in dieser Gesellschaft reden kann, ändert sich im Laufe der Berechnung. Diese Denkweise über den Rho-Kalkül lässt meine Argumentation ahnen, dass es sehr gute Gründe für die Annahme gibt, dass sich ein Modell wie der Rho-Kalkül auf der Hardware des menschlichen Gehirns angesiedelt und kolonisiert haben könnte, und zwar auf jedem Gehirn, das a unterstützt Theorie des Geistes.
Um dieses Argument vorzubringen, möchte ich einige Unterscheidungen treffen, die nicht jeder Informatiker, geschweige denn jeder Entwickler, trifft. Ich unterscheide zwischen Code, Daten und Berechnung. Beliebiger Code kann als Daten behandelt werden, bei denen es sich um eine Instanz einer Datenstruktur handelt, in der das Berechnungsmodell ausgedrückt oder gehostet wird. Sie können beispielsweise ein Turing-vollständiges Rechenmodell wie Haskell in einer Begriffssprache hosten, die durch eine kontextfreie Grammatik ausgedrückt wird, z. B. die Grammatik für wohlgeformte Haskell-Programme. Wir wissen jedoch, dass kontextfreie Grammatiken nicht Turing-vollständig sind. Wie kann das sein? Wie kann etwas nachweislich weniger Aussagekräftiges als Turing-vollständige Modelle eine Turing-vollständige Berechnung darstellen?
Es trifft den Kern der Unterscheidung zwischen Syntax und Semantik. Die Grammatik des Begriffs Sprache drückt die Syntax von Programmen aus, nicht die Dynamik von Berechnungen , also die Semantik von Code. Stattdessen entsteht die Dynamik der Berechnung durch die Interaktion von Regeln (die mit der Syntax arbeiten) mit einem bestimmten Teil der Syntax, dh einem Code, der die Berechnung darstellt, die man durchführen möchte. Im Lambda-Kalkül (dem Rechenmodell, auf dem Haskell basiert) ist das Arbeitspferd der Berechnung eine Regel namens Beta-Reduktion. Diese Regel stellt die Operation einer Funktion auf Daten dar, indem im Code vorkommende Variablen durch die Daten ersetzt werden. Die Daten, mit denen es arbeitet, sind eine syntaktische Darstellung der Anwendung einer Funktion auf Daten, aber es ist nicht die Berechnung, die der Anwendung der Funktion auf die Daten entspricht. Diese Berechnung erfolgt, wenn die Beta-Reduktion die Syntax bearbeitet und sie in einen neuen Teil der Syntax umwandelt. Durch diese Unterscheidung können Modelle, die weniger aussagekräftig als Turing-vollständig sind (z. B. kontextfreie Grammatiken), Turing-vollständige Berechnungen durchführen können.
Wie kann etwas nachweislich weniger Aussagekräftiges als Turing-vollständige Modelle eine Turing-vollständige Berechnung darstellen? Es trifft den Kern der Unterscheidung zwischen Syntax und Semantik. Die Grammatik des Begriffs Sprache drückt die Syntax von Programmen aus, nicht die Dynamik von Berechnungen, dh die Semantik von Code.
Um den Punkt nicht näher zu erläutern, gibt es den gleichen Unterschied in Java und JVM. Die Berechnungsdynamik in der JVM erfolgt durch Regeln, die auf einer Kombination von Registern in der virtuellen Maschine zusammen mit einer Darstellung des Codes arbeiten. Ein Java-Programmierer, der auf einen Teil des Java-Codes starrt, schaut nicht auf die Berechnung. Weit davon entfernt. Die Syntax eines Java-Programms ist ein Fenster in eine ganze Reihe möglicherweise unterschiedlicher Berechnungen, die abhängig vom Status der Register der JVM zum Zeitpunkt der Codeausführung durchgeführt werden. Der Unterschied zwischen diesen beiden Bewertungsformen, der Beta-Reduktion im Lambda-Kalkül und den Übergängen der JVM, ist sehr wichtig, und wir werden darauf zurückkommen.
Eine Möglichkeit, über diese Unterscheidung zwischen Code und Berechnung nachzudenken, ist vorerst jedoch eine Analogie zur Physik. Traditionell werden die Gesetze der Physik durch drei Dinge ausgedrückt: eine Darstellung physikalischer Zustände (stellen Sie sich das als die Syntax von Programmen vor), Bewegungsgesetze, die sagen, wie sich Zustände im Laufe der Zeit ändern (stellen Sie sich das als die Regeln vor, die auf der Syntax basieren). ; und Anfangsbedingungen (stellen Sie sich dies als einen bestimmten Codeabschnitt vor, den Sie ausführen möchten). Vor diesem Hintergrund wird die Physik als eine spezielle Programmiersprache betrachtet, deren Ausführung in besonderer Weise der Art und Weise entspricht, wie sich die physische Welt aufgrund unserer Beobachtungen entwickelt. Die Physik ist überprüfbar, weil wir damit ein Programm ausführen und sehen können, ob die Entwicklung eines Anfangszustands zu einem Zustand, den er über die Bewegungsgesetze erreicht, mit unseren Beobachtungen übereinstimmt. Wenn wir insbesondere die physische Welt in einer Konfiguration sehen, die unserem Ausgangszustand entspricht, durchläuft sie dann einen Evolutionsprozess, der unseren Bewegungsgesetzen entspricht, und landet sie in einem Zustand, den unsere Bewegungsgesetze vorgeben? es sollte? Die Tatsache, dass die Physik diese Form hat, ist der Grund, warum wir sie effektiv im Code darstellen können.
Die physikalische Analogie stellt Rechenmodelle wie den Lambda-Kalkül, den π-Kalkül oder den Rho-Kalkül in deutlichem Gegensatz zu Modellen wie den Übergängen der JVM. Wenn Sie einen Java-Code betrachten, verfügen Sie nicht über alle notwendigen Informationen, um zu verstehen, wie er sich verhält. Abhängig vom Status der JVM kann sich derselbe Teil des Java-Codes sehr unterschiedlich verhalten. Im Gegensatz dazu vereinen die oben erwähnten Rechenkalküle Form und Funktion. Was Sie in einem Ausdruck sehen, ist das, was Sie erhalten. Aus physikalischer Sicht müssen Sie als Wissenschaftler nur die Bewegungsgesetze, also die Rechenregeln, rückentwickeln. Sie müssen nicht über eine Reihe verborgener Zustände raten.
Sobald wir den Unterschied zwischen Code und Berechnung erkennen, ist der Unterschied zwischen Code und Daten relativ intuitiv, wenn auch etwas subtil. Daten in einem Computerprogramm sind ebenfalls nur Syntax. In diesem Sinne unterscheidet es sich nicht von Code, der ebenfalls nur Syntax ist. Jeder Lisp-Programmierer versteht die Idee, dass Code irgendwie Daten und Daten Code sind. Sogar Java unterstützt eine Art Metaprogrammierung, bei der Java-Code als Java-Objekte manipuliert werden kann. Die Frage ist: Gibt es eine echte Trennlinie zwischen Code und Daten?
Die Antwort ist ein klares Ja. Daten sind Code, der sehr spezifische Eigenschaften hat; Beispielsweise läuft der Code immer nachweislich bis zur Beendigung. Dies ist nicht bei jedem Code der Fall. Tatsächlich zeigt uns Turings berühmte Lösung des Entscheidungsproblems , dass wir im Allgemeinen nicht wissen können, wann ein Programm für eine Sprache anhalten wird, die eine bestimmte Ausdrucksqualität aufweist, dh Turing-Vollständigkeit. Es gibt jedoch weniger ausdrucksstarke Sprachen, und Turing-vollständige Sprachen verfügen über geeignete Untersprachen oder Fragmente, die weniger ausdrucksstark sind als die gesamte Sprache. Daten befinden sich in einer Syntax, die den Nachweis ermöglicht, dass die mit einem Teil der Syntax verbundene Berechnung angehalten wird. Ebenso befinden sich die Daten in einer Syntax, die den Nachweis ermöglicht, dass die Berechnung nur endliche Verzweigungen aufweist.
Programmierer denken nicht über solche Daten nach, sie erkennen Daten einfach, wenn sie sie sehen. Aber in Rechenmodellen wie der Lambda-Kalküle, die nicht über integrierte Datentypen verfügen, wird alles, sogar Dinge wie die Zählzahlen oder die booleschen Werte wahr und falsch, als Code dargestellt. Bei der Auswahl, welcher Code Daten und welcher Allzweckprogramme darstellt, geht es darum, erkennen zu können, ob Code die oben besprochenen Eigenschaften aufweist. Im Allgemeinen gibt es Arten von Systemen, die solche Eigenschaften erkennen können. Auch hier handelt es sich um ein subtiles Problem, aber glücklicherweise müssen wir nicht alle Feinheiten verstehen und auch nicht genau verstehen, wo die Trennlinie zwischen Daten und Code verläuft, sondern nur, dass es eine gibt.
Zusammenfassend lässt sich sagen, dass es sich bei Code und Daten lediglich um Syntax handelt, die einen Zustand darstellt, auf den eine oder mehrere Regeln angewendet werden. Daten werden in einem weniger ausdrucksstarken Fragment der Syntax ausgedrückt als Code, was ihnen einen eindeutigen oder endlichen Charakter verleiht, den Code nicht immer genießt. Berechnung ist der Evolutionsprozess, der entsteht, wenn einige Regeln mit einer Darstellung eines Zustands interagieren. Was hat das alles nun mit der KI oder dem Verstand oder sogar dem Rho-Kalkül zu tun?
Der Rho-Kalkül verfügt über eine syntaktische Darstellung der Unterscheidung zwischen Berechnung und Code. Es verfügt über eine Operation, die ausdrückt, dass eine Berechnung als Codestück verpackt wird, damit sie bearbeitet und in neuen Code umgewandelt werden kann. Es verfügt auch über eine Operation, um einen Codeabschnitt wieder in eine Berechnung umzuwandeln. Whoah, könnte man sagen, das ist ein Scheiß der nächsten Stufe. Aber wie bereits erwähnt, betreiben Lisp-Programmierer und Java-Programmierer diese Art der Metaprogrammierung schon seit langem. Sie müssen. Der Grund liegt in der Größe. Es ist für menschliche Teams unmöglich, Codebasen mit Millionen und Abermillionen von Codezeilen ohne automatisierte Unterstützung zu verwalten. Sie verwenden Computerprogramme, um Computerprogramme zu schreiben. Sie verwenden Computerprogramme, um Computerprogrammbereitstellungen zu erstellen. Metaprogrammierung ist in der heutigen Welt eine Notwendigkeit.
Smith argumentiert, dass Selbstbeobachtung, die Fähigkeit des Geistes, den eigenen Prozess zu betrachten, ein Schlüsselmerkmal der Intelligenz ist. Für manche ist dies sogar das bestimmende Merkmal der Intelligenz.
Aber schon in den 80er Jahren, noch in den Anfängen der KI, machte ein Forscher namens Brian Cantwell Smith eine Beobachtung, die bei mir und vielen anderen Menschen aus der KI und KI-nahen Bereichen Anklang fand. Smith argumentiert, dass Selbstbeobachtung, die Fähigkeit des Geistes, den eigenen Prozess zu betrachten, ein Schlüsselmerkmal der Intelligenz ist. Für manche ist dies sogar das entscheidende Merkmal der Intelligenz. Um diese Idee der Selbstbeobachtung, die er rechnerische Reflexion nannte, zu konkretisieren, entwarf Smith eine Programmiersprache namens 3-Lisp , die dieselben Operatoren wie die Rho-Kalküle hat. Insbesondere verfügt 3-Lisp über eine Syntax zur Darstellung der Verdinglichung einer Berechnung in Code und eine Syntax zur Rückspiegelung des Codes in die laufende Berechnung.
Nun gibt es gute Gründe für die Annahme, dass es einen Zusammenhang zwischen dem Skalenproblem, mit dem heutige Entwickler konfrontiert sind, und dem Problem der Modellierung unserer reflektierenden, introspektiven Fähigkeit als denkende Wesen gibt. Insbesondere wird die Bewältigung der Komplexität der Darstellung unserer eigenen Argumentation durch rechnerische Reflexion beherrschbar. Wir können alle unsere algorithmischen Tricks auf Darstellungen unserer eigenen Argumentation anwenden, um eine bessere Argumentation zu erhalten. Diese Beobachtung wird im Kontext dessen, was Evolutionsbiologen die Theorie des Geistes nennen, noch verstärkt.
Insbesondere ergibt sich die Introspektion aus dem evolutionären Vorteil, der dadurch entsteht, dass man das Verhalten anderer, insbesondere der Mitglieder der eigenen Spezies, rechnerisch modellieren kann. Wenn Alice die Fähigkeit entwickelt, Barbaras Verhalten zu modellieren, und Barbara Alice bemerkenswert ähnlich ist (wie bei derselben Art, demselben Stamm, sogar derselben erweiterten Familienstruktur), dann ist Alice sehr nahe daran, Alices Verhalten zu modellieren. Und wenn Alice Barbaras Verhalten modellieren muss, wenn Barbara mit Alice interagiert, dann ist Alice direkt an der Modellierung von Alices Verhalten beteiligt. Wenn man dies auf eine Skala bringt, in der Alice ihre Familieneinheit oder das Verhalten ihres Stammes modellieren kann, werden die Dinge wirklich interessant. Mehr dazu in Kürze, aber vorerst können wir sehen, dass es bei der rechnerischen Reflexion um die Verbesserung des Denkens auf der Skala geht, und zwar im zweifachen Sinne dieses Wortes: (auf der Komplexitätsskala) Verbesserung des Denkens durch die Anwendung des Denkens auf sich selbst und (auf der sozialen Skala). ) Verbesserung des Denkens über eine große Anzahl von Argumentationsagenten.
Tatsächlich waren Smiths Vorstellungen über rechnerische Reflexion und ihre Rolle bei der Intelligenz und dem Design von Programmiersprachen eine Inspiration für den Entwurf des Rho-Kalküls, der Verdinglichung und Reflexion als primitive rechnerische Operatoren ansieht. Wo 3-Lisp und der Rho-Kalkül jedoch zusammenpassen, ist 3-Lisp entschieden sequentiell. Es gibt keine Möglichkeit, eine Gesellschaft autonomer Rechenprozesse, die unabhängig voneinander ablaufen und dabei interagieren und koordinieren, vernünftig darzustellen. Aber im Kontext einer Theorie des Geistes ist dies genau das, was ein Denker tun muss. Sie benötigen ein explizites Modell ihres sozialen Kontexts, der aus autonomen Akteuren besteht, die unabhängig agieren und gleichzeitig kommunizieren und koordinieren.
Ungefähr zur gleichen Zeit, als Smith seine Ideen der rechnerischen Reflexion entwickelte, entwickelte Marvin Minsky seine berühmte Society of Mind-These. Meine Meinung zu Minskys Vorschlag ist, dass der Geist so etwas wie der US-Kongress oder ein anderes beratendes Gremium ist. Es besteht aus einer Gruppe unabhängiger Agenten, die alle um unterschiedliche Ressourcen konkurrieren (z. B. Finanzierung aus der Steuerbemessungsgrundlage). Was wir als bewusste Entscheidung betrachten, ist eher das Ergebnis eines langen Überlegungsprozesses in einer Schar unabhängiger, autonomer Akteure, der oft weit unterhalb der bewussten Erfahrung verläuft. Aber der Beratungsprozess führt zu einer verbindlichen Abstimmung, und diese verbindliche Abstimmung wird als bewusste Entscheidung erlebt.
Wie kann diese Sichtweise, die den Großteil der Berechnungen außerhalb des bewussten Denkens verortet, mit der Sichtweise des Geistes als im Wesentlichen und tatsächlich definitorisch reflektierend in Einklang gebracht werden? Der Rho-Kalkül wurde mit Blick auf eine Antwort auf diese Frage entwickelt.
Der Rho-Kalkül besagt, dass es Rechenagenten in nur sechs Formen gibt:
Beachten Sie, dass drei dieser Konstrukte das Symbol x verwenden. Zwei von ihnen verwenden x, als wäre es ein Kanal für die Kommunikation zwischen Agenten, und einer von ihnen verwendet x, als wäre es ein Verweis auf einen Code. Der einzige Zaubertrick, den die Rho-Kalküle im Ärmel hat, besteht darin, dass Kanäle Verweise auf einen Codeabschnitt sind. Es ist etwas gewöhnungsbedürftig, aber es kommt mit der Zeit.
Als externe Beobachter des sozialen Kontexts von Alice können wir ihr Verhalten als eine parallele Zusammensetzung des Verhaltens jedes Einzelnen beschreiben. In Symbolen ist das P1 | P2 | … | Pn, wobei Pi das Modell des i-ten Individuums in Alices sozialem Kontext ist. Nun benötigt ein Modell von Alices Verhalten eine Darstellung dieser parallelen Komposition, damit ihr eigenes Verhalten eine Schlussfolgerung darüber darstellen kann. In Symbolen ist das @( P1 | P2 | … | Pn ).
Ausgestattet mit genau so vielen Informationen über das Rho-Kalkül können wir zu unserer Erzählung über Alice zurückkehren und sparsame Darstellungen aller Herausforderungen finden, denen sich ihre Entwicklung sozialer und introspektiver Intelligenz gegenübersieht. Als externe Beobachter des sozialen Kontexts von Alice können wir ihr Verhalten als eine parallele Zusammensetzung des Verhaltens jedes Einzelnen beschreiben. In Symbolen ist das P1 | P2 | … | Pn, wobei Pi das Modell des i-ten Individuums in Alices sozialem Kontext ist. Nun benötigt ein Modell von Alices Verhalten eine Darstellung dieser parallelen Komposition, damit ihr eigenes Verhalten eine Schlussfolgerung darüber darstellen kann. In Symbolen ist das @( P1 | P2 | … | Pn ). Damit Alice diese Daten an einem Ort hat, an dem sie Zugriff darauf hat, platziert sie das Modell auf einem Kanal x!( P1 | P2 | … | Pn ) und führt es aus, wenn sie es abrufen muss
for( y <- x )AliceThinkingAboutHerColleagues( y ) | x!( P1 | P2 | … | Pn )
Die Arbeitsregel der Berechnung im Rho-Kalkül, die im Geiste der Beta-Reduktion des Lambda-Kalküls sehr ähnlich ist, besteht darin, dass sich ein Ausdruck wie dieser zu entwickelt
AliceThinkingAboutHerColleagues( @( P1 | P2 | … | Pn ) )
Somit steht Alice jetzt eine explizite Darstellung ihres Verhaltens über Alices Gedanken über ihre Kollegen zur Verfügung. Damit kann sie das Verhalten ihrer Kollegen simulieren, indem sie das Verhalten von P1 | simuliert P2 | ... | Pn durch Operationen auf @( P1 | P2 | ... | Pn ). Wir können Alice modellieren, wie sie das tatsächliche Verhalten ihrer Kollegin mit einem Ausdruck wie „Alice |“ beobachtet P1 | P2 | ... | Pn. Alice kann ihre Simulation mit ihren Beobachtungen vergleichen. Tatsächlich steht Alice alles, was wir modellieren können, auch zur Verfügung, sowohl zum Ausführen als auch zum Verdinglichen in Daten und zum Vergleichen des Codes und ihrer Simulationen davon mit dem, was sie am tatsächlichen Verhalten ihres sozialen Kontexts beobachtet. Dazu gehört auch Alices eigenes Verhalten.
Das ist vielleicht etwas schnell vergangen, aber denken Sie darüber nach. Dies ist der kleinste Satz von Operationen, die Alice benötigt, um gleichzeitig ihren sozialen Kontext und sich selbst darin zu modellieren. Insbesondere sind Threads für Alice „bewusst verfügbar“, wenn ihr eigenes Verhalten diese Threads in Daten umwandelt und ihre Verarbeitung mit diesen Daten interagiert. Dieses Argument ist Teil dessen, was in die Entwurfsüberlegungen für den Rho-Kalkül eingeflossen ist. Es ist das kleinste Berechnungsmodell, das Smiths Argumente für die rechnerische Reflexion mit Minskys Argumenten für eine Gesellschaft des Geistes in Einklang bringt, die mit der Darstellung der Evolutionsbiologie von Organismen mit einer Theorie des Geistes übereinstimmt. Alles, was kleiner ist, verfehlt eine Schlüsselkomponente der Situation.
Dieses Argument ist der Grund, warum es plausibel ist, dass ein Rechenmodell wie der Rho-Kalkül in der Hardware in Alices Gehirn Eingang findet. Sie benötigt alle Elemente dieses Modells, um mit anderen Mitgliedern ihrer Spezies zu konkurrieren, die ebenfalls darum kämpfen, das Verhalten ihres sozialen Kontexts zu modellieren. Aus diesem Grund würde ich, ganz im Gegensatz zu Joschas Position, argumentieren, dass mobile Parallelität das Herzstück der künstlichen allgemeinen Intelligenz ist.
Vielen Dank an Ralph Benko für seine unfehlbar scharfsinnigen redaktionellen Kommentare!