paint-brush
Le cas de Rho-Calcul en IApar@f1r3flyceo
2,508 lectures
2,508 lectures

Le cas de Rho-Calcul en IA

par Lucius Meredith13m2023/02/03
Read on Terminal Reader

Trop long; Pour lire

La théorie de l'esprit dicte-t-elle qu'un modèle particulier de calcul a colonisé l'architecture de nos cerveaux ?
featured image - Le cas de Rho-Calcul en IA
Lucius Meredith HackerNoon profile picture


La conscience comme colonisation du cerveau

Lors d'une récente conversation avec Joscha Bach , l'un des penseurs les plus originaux de cette génération, il a fait l'affirmation surprenante que la concurrence mobile est en contradiction avec l'intelligence artificielle générale . Dans ce contexte, la simultanéité mobile signifie le type de simultanéité que l'on trouve lorsque des agents (c'est-à-dire des processus de calcul) peuvent se découvrir, ce qui est la topologie de la communication (qui sait qui et qui parle à qui) évolue. Ce modèle est très différent d'un modèle où les éléments de calcul sont soudés ensemble comme des composants sur une carte mère. La simultanéité mobile ressemble plus à Internet ou aux réseaux de téléphonie où les personnes qui viennent de se rencontrer pour la première fois apprennent les sites Web, les adresses e-mail et les numéros de téléphone des autres. L'argument de Joscha est que les cerveaux ne sont que plastiques, c'est-à-dire que les connexions entre les neurones ne changent que pendant l'apprentissage mais pas pendant le calcul général.


Joscha Bach , l'un des penseurs les plus originaux de sa génération, a fait l'affirmation surprenante que la concurrence mobile est en contradiction avec l'intelligence artificielle générale


Ma réponse à cette proposition est qu'elle suppose que l'esprit n'est pas hébergé dans un modèle logique de calcul qui s'exécute sur le matériel du cerveau. Après tout, la machine virtuelle Java (JVM) est un modèle de calcul très différent du matériel sur lequel elle s'exécute. Le modèle de calcul de Haskell est une variation encore plus spectaculaire de l'idée de calcul que celle incarnée dans le matériel sur lequel le glorieux compilateur Haskell ( GHC ) est généralement hébergé. Pourquoi l'esprit ne serait-il pas organisé comme ça ? Pour utiliser la métaphore graphique de Joscha, pourquoi l'esprit n'apparaîtrait-il pas comme un modèle de calcul colonisateur qui s'héberge sur le matériel du cerveau ? Si c'est le cas, eh bien, rholang, une implémentation du rho-calcul, est hébergé sur les puces Intel et AMD pour commencer, et leurs modèles de calcul sont très différents de celui capturé par le rho-calcul.


En particulier, le rho-calcul fournit un support direct pour le calcul concurrent mobile. La topologie de communication au sein d'une société de processus s'exécutant dans le rho-calcul est dynamique. Qui connaît qui et peut parler à qui dans cette société change au cours du calcul. Cette façon de penser le rho-calcul préfigure mon argument selon lequel il y a de très bonnes raisons de supposer qu'un modèle comme le rho-calcul peut s'être hébergé et colonisé le matériel du cerveau humain, en fait, tout cerveau qui supporte un théorie de l'esprit.


Code, données et calcul

Pour faire valoir cet argument, je veux faire quelques distinctions que tous les informaticiens, et encore moins tous les développeurs, ne font pas. Je fais une distinction entre le code, les données et le calcul. Le code arbitraire peut être traité comme des données, qui sont une instance d'un certain type de structure de données dans laquelle le modèle de calcul est exprimé ou hébergé. Par exemple, vous pouvez héberger un modèle de calcul complet de Turing , comme Haskell , dans un langage terminologique exprimé via une grammaire sans contexte, par exemple, la grammaire des programmes Haskell bien formés. Pourtant, nous savons que les grammaires sans contexte ne sont pas Turing-complètes. Comment se peut-il? Comment quelque chose de manifestement moins expressif que les modèles complets de Turing peut-il représenter le calcul complet de Turing ?


Photo de Walkator sur Unsplash



Il touche au cœur de la distinction entre syntaxe et sémantique. La grammaire du terme langage exprime la syntaxe des programmes, non la dynamique du calcul , c'est-à-dire la sémantique du code. Au lieu de cela, la dynamique du calcul résulte de l'interaction de règles (qui opèrent sur la syntaxe) avec un morceau particulier de syntaxe, c'est-à-dire un code, représentant le calcul que l'on veut effectuer. Dans le calcul lambda (le modèle de calcul sur lequel Haskell est basé), le cheval de bataille du calcul est une règle appelée réduction bêta. Cette règle représente l'opération d'une fonction sur des données en remplaçant les données par des variables apparaissant dans le code. Les données sur lesquelles il opère sont une représentation syntaxique de l'application d'une fonction aux données, mais ce n'est pas le calcul qui correspond à l'application de la fonction aux données. Ce calcul se produit lorsque la réduction bêta opère sur la syntaxe, la transformant en un nouveau morceau de syntaxe. Cette distinction est de savoir comment les modèles qui sont moins expressifs que Turing-complet (par exemple, les grammaires sans contexte) peuvent héberger le calcul Turing-complet.


Comment quelque chose de manifestement moins expressif que les modèles complets de Turing peut-il représenter le calcul complet de Turing ? Il touche au cœur de la distinction entre syntaxe et sémantique. La grammaire du terme langage exprime la syntaxe des programmes, et non la dynamique du calcul, c'est-à-dire la sémantique du code.


Sans vouloir insister sur ce point, mais la même distinction se produit dans Java et JVM. La dynamique de calcul dans la JVM passe par des règles qui fonctionnent sur une combinaison de registres dans la machine virtuelle avec une représentation du code. Un programmeur Java qui regarde un morceau de code Java ne regarde pas le calcul. Loin de là. La syntaxe d'un programme Java est une fenêtre sur toute une gamme de calculs éventuellement différents qui se produisent en fonction de l'état des registres de la JVM au moment où le code est exécuté. La différence entre ces deux formes d'évaluation, la réduction bêta dans le lambda calcul versus les transitions de la JVM, est très importante, et nous y reviendrons.


Pour l'instant, cependant, une façon de penser à cette distinction entre code et calcul consiste à faire une analogie avec la physique. Traditionnellement, les lois de la physique sont exprimées à travers trois choses : une représentation des états physiques (considérez cela comme la syntaxe des programmes), les lois du mouvement qui indiquent comment les états changent au fil du temps (considérez cela comme les règles qui opèrent sur la syntaxe) ; et les conditions initiales (considérez cela comme un morceau de code particulier que vous souhaitez exécuter). Dans cette optique, la physique est considérée comme un langage de programmation spécialisé dont l'exécution correspond de manière particulière à la façon dont le monde physique évolue en fonction de nos observations. La physique est testable car elle nous permet d'exécuter un programme et de voir si l'évolution d'un état initial vers un état atteint via les lois du mouvement correspond à nos observations. En particulier, lorsque nous voyons le monde physique dans une configuration qui correspond à notre état initial, passe-t-il par un processus d'évolution qui correspond à ce que nos lois du mouvement disent qu'il devrait, et atterrit-il dans un état que nos lois du mouvement disent cela devrait? Le fait que la physique ait cette forme est la raison pour laquelle nous pouvons la représenter efficacement dans le code.


L'analogie physique met les modèles de calcul comme le lambda calcul, le π-calcul ou le rho-calcul en relief par rapport à des modèles comme les transitions de la JVM. Lorsque vous regardez un morceau de code Java, vous ne disposez pas de toutes les informations nécessaires pour comprendre comment il se comportera. Selon l'état de la JVM, le même morceau de code Java peut se comporter très différemment. En revanche, les calculs informatiques mentionnés ci-dessus marient la forme à la fonction. Ce que vous voyez dans une expression est ce que vous obtenez. D'un point de vue physique, en tant que scientifique, la seule chose que vous devez désosser, ce sont les lois du mouvement, c'est-à-dire les règles de calcul. Vous n'avez pas à deviner un tas d'états cachés.


Une fois que nous voyons la distinction entre le code et le calcul, la distinction entre le code et les données est relativement intuitive, quoique quelque peu subtile. Les données d'un programme informatique ne sont que de la syntaxe. En ce sens, ce n'est pas différent du code, qui n'est aussi que de la syntaxe. Chaque programmeur Lisp comprend cette idée que le code est en quelque sorte des données et que les données sont du code. Même Java prend en charge une sorte de métaprogrammation dans laquelle le code Java peut être manipulé comme des objets Java. La question est, existe-t-il une véritable ligne de démarcation entre le code et les données ?


La réponse est un oui définitif. Les données sont du code qui a des propriétés très spécifiques ; par exemple, le code s'exécute toujours de manière prouvée jusqu'à la fin. Tous les codes ne font pas cela. En fait, la fameuse résolution de Turing du problème d' Entscheidungsproblem nous montre que nous ne pouvons pas, en général, savoir quand un programme s'arrêtera pour une langue jouissant d'une certaine qualité d'expressivité, c'est-à-dire la complétude de Turing. Mais il existe des langages moins expressifs et les langages complets de Turing bénéficient de sous-langages ou de fragments appropriés qui sont moins expressifs que le langage entier. Les données résident dans une syntaxe qui permet de prouver que le calcul associé à un morceau de syntaxe va s'arrêter. De même, les données résident dans une syntaxe qui permet de prouver que le calcul ne bénéficiera que d'un branchement fini.


Les programmeurs ne pensent pas à des données comme celles-ci, ils connaissent simplement les données lorsqu'ils les voient. Mais dans les modèles de calcul comme le calcul lambda qui ne sont pas équipés de types de données intégrés, tout, même des choses comme les nombres comptés ou les valeurs booléennes, vrai et faux, sont représentés sous forme de code. Choisir quel code constitue des données et lequel constitue des programmes à usage général consiste à être capable de détecter quand le code a les types de propriétés dont nous avons discuté ci-dessus. En général, il existe des types de systèmes qui peuvent détecter des propriétés comme celle-ci. Encore une fois, c'est un problème subtil, mais heureusement, nous n'avons pas besoin de comprendre toutes les subtilités, ni de comprendre exactement où se trouve la ligne de démarcation entre les données et le code, juste qu'il y en a une.

En résumé, le code et les données ne sont que de la syntaxe qui représente un état sur lequel une règle, ou plusieurs règles, fonctionneront. Les données sont exprimées dans un fragment moins expressif de la syntaxe que le code, ce qui lui donne un caractère défini ou fini que le code n'apprécie pas toujours. Le calcul est le processus d'évolution qui survient lorsque certaines règles interagissent avec une représentation d'un état. Maintenant, qu'est-ce que tout cela a à voir avec l'IA ou l'esprit ou même le rho-calcul ?


La réflexion comme caractéristique déterminante de l'intelligence

Le rho-calcul a une représentation syntaxique de la distinction entre calcul et code. Il a une opération qui exprime le conditionnement d'un calcul sous la forme d'un morceau de code afin qu'il puisse être exploité, le transformant en nouveau code. Il a également une opération pour transformer un morceau de code en un calcul. Whoah, vous pourriez dire, c'est une merde de niveau supérieur. Mais, comme nous l'avons mentionné, les programmeurs Lisp et les programmeurs Java pratiquent ce type de métaprogrammation depuis longtemps. Ils doivent. La raison est liée à l'échelle. Il est impossible pour des équipes humaines de gérer des bases de code impliquant des millions et des millions de lignes de code sans support automatisé. Ils utilisent des programmes informatiques pour écrire des programmes informatiques. Ils utilisent des programmes informatiques pour créer des déploiements de programmes informatiques. La métaprogrammation est une nécessité dans le monde d'aujourd'hui.


L'argument de Smith est que l'introspection, la capacité de l'esprit à regarder son propre processus, est une caractéristique clé de l'intelligence. Pour certains, c'est même la caractéristique déterminante de l'intelligence.


Mais dans les années 80, encore aux débuts de l'IA, un chercheur du nom de Brian Cantwell Smith a fait une observation qui m'a touché, ainsi que de nombreuses autres personnes dans les domaines de l'IA et des domaines adjacents à l'IA. L'argument de Smith est que l'introspection, la capacité de l'esprit à observer son propre processus, est une caractéristique clé de l'intelligence. Pour certains, c'est même la caractéristique déterminante de l'intelligence. Pour concrétiser cette idée d'introspection, qu'il a appelée réflexion computationnelle, Smith a conçu un langage de programmation appelé 3-Lisp qui a les mêmes opérateurs que le rho-calcul. Plus précisément, 3-Lisp a une syntaxe pour représenter la réification d'un calcul en code et une syntaxe pour refléter le code dans le calcul en cours.


Maintenant, il y a une bonne raison de soupçonner qu'il existe un lien entre le problème d'échelle auquel les développeurs d'aujourd'hui sont confrontés et le problème de la modélisation de notre capacité réflexive et introspective en tant qu'êtres raisonnants. En particulier, la gestion de la complexité de la représentation de notre propre raisonnement devient traitable en présence de la réflexion computationnelle. Nous pouvons appliquer toutes nos astuces algorithmiques aux représentations de notre propre raisonnement pour obtenir un meilleur raisonnement. Cette observation est amplifiée dans le contexte de ce que les biologistes évolutionnistes appellent la théorie de l'esprit .


Plus précisément, l'introspection découle de l'avantage évolutif obtenu en étant capable de modéliser par ordinateur les comportements des autres, en particulier des membres de votre propre espèce. Si Alice développe la capacité de modéliser le comportement de Barbara, et que Barbara est remarquablement similaire à Alice (comme dans la même espèce, la même tribu, même la même structure familiale élargie), alors Alice est très proche de pouvoir modéliser le comportement d'Alice. Et quand Alice a besoin de modéliser le comportement de Barbara lorsque Barbara interagit avec Alice, alors Alice est directement impliquée dans la modélisation du comportement d'Alice. Porter cela à une échelle où Alice peut modéliser son unité familiale ou le comportement de sa tribu est là où les choses deviennent vraiment intéressantes. Plus à ce sujet sous peu, mais pour l'instant, nous pouvons voir que quelque chose à propos de la réflexion computationnelle a à voir avec l'amélioration du raisonnement à l'échelle dans les deux sens de ce mot : (l'échelle de complexité) améliorer le raisonnement en appliquant le raisonnement à lui-même, et (l'échelle sociale ) améliorant le raisonnement sur un grand nombre d'agents de raisonnement.


En fait, les idées de Smith sur la réflexion informatique et son rôle dans l'intelligence et la conception des langages de programmation ont inspiré la conception du rho-calcul, qui prend la réification et la réflexion comme des opérateurs informatiques primitifs. Cependant, là où 3-Lisp et le rho-calcul font partie, c'est que 3-Lisp est résolument séquentiel. Il n'a aucun moyen de représenter raisonnablement une société de processus de calcul autonomes fonctionnant indépendamment tout en interagissant et en se coordonnant. Mais dans le contexte d'une théorie de l'esprit, c'est exactement ce qu'un raisonneur doit faire. Ils ont besoin d'un modèle explicite de leur contexte social, composé d'agents autonomes agissant indépendamment tout en communiquant et en se coordonnant.


Le Rho-Calcul : du 3-Lisp à la Society of Mind

À peu près au même moment où Smith développait ses idées de réflexion computationnelle, Marvin Minsky développait sa célèbre thèse sur la Society of Mind. Mon point de vue sur la proposition de Minsky est que l'esprit est quelque chose comme le Congrès américain ou tout autre organe délibérant. Il se compose d'un groupe d'agents indépendants qui rivalisent tous pour différentes ressources (telles que le financement de l'assiette fiscale). Ce que nous considérons comme une décision consciente ressemble plus au résultat d'un long processus délibératif entre un groupe d'agents indépendants et autonomes qui se déroule souvent bien en dessous de l'expérience consciente. Mais le processus délibératif aboutit à un vote contraignant, et ce vote contraignant est ce qui est vécu comme une décision consciente.


Photo de Simon Kadula sur Unsplash


Comment concilier cette vision, qui place la plupart des calculs en dehors du raisonnement conscient, avec une vision de l'esprit comme essentiellement, voire par définition, réflexif ? Le rho-calcul a été conçu avec une réponse à cette question à l'esprit.


Le rho-calcul indique que les agents de calcul se présentent sous six formes :


  • 0 - l'agent arrêté ou nul qui ne fait rien ;
  • for( y <- x )P - l'agent qui écoute sur le canal x attend des données qu'il liera à la variable y avant de devenir l'agent P ;
  • x!( Q ) - l'agent qui envoie un morceau de code/données sur le canal x ;
  • P|Q - l'agent qui est en réalité la composition parallèle de deux agents, P et Q, fonctionnant simultanément, de manière autonome ;
  • *x - l'agent qui reflète le code référencé par x dans un calcul en cours


Remarquez comment trois de ces constructions utilisent le symbole x. Deux d'entre eux utilisent x comme s'il s'agissait d'un canal de communication entre agents, et l'un d'eux utilise x comme s'il s'agissait d'une référence à un morceau de code. Le seul tour de magie que le rho-calcul a dans sa manche est que les canaux sont des références à un morceau de code. Il faut un peu de temps pour s'y habituer, mais cela vient avec le temps.


En tant qu'observateurs extérieurs du contexte social d'Alice, nous pouvons écrire son comportement comme une composition parallèle du comportement de chaque individu. Dans les symboles c'est P1 | P2 | … | Pn où Pi est le modèle du ième individu dans le contexte social d'Alice. Maintenant, un modèle du comportement d'Alice a besoin d'une représentation de cette composition parallèle pour que son propre comportement représente le raisonnement à ce sujet. Dans les symboles, c'est @( P1 | P2 | … | Pn ).


Armés de cette quantité d'informations sur le rho-calcul, nous pouvons revenir à notre récit sur Alice et trouver des représentations parcimonieuses de tous les défis auxquels elle est confrontée pour développer son intelligence sociale et introspective. En tant qu'observateurs extérieurs au contexte social d'Alice, nous pouvons écrire son comportement comme une composition parallèle du comportement de chaque individu. En symboles, c'est P1 | P2 | … | Pn, où Pi est le modèle du ième individu dans le contexte social d'Alice. Maintenant, un modèle du comportement d'Alice a besoin d'une représentation de cette composition parallèle pour que son propre comportement représente le raisonnement à ce sujet. Dans les symboles, c'est @( P1 | P2 | … | Pn ). Pour qu'Alice ait ces données localisées quelque part où elle y a accès, elle place le modèle sur un canal x!( P1 | P2 | … | Pn ), et lorsqu'elle a besoin de les récupérer, elle exécute


for( y <- x )AliceThinkingAboutHerColleagues( y ) | x!( P1 | P2 | … | Pn )


La règle de cheval de bataille du calcul dans le rho-calcul, qui est très similaire dans l'esprit à la réduction bêta du calcul lambda, est qu'une expression comme celle-ci évolue vers


Alicepensantàsescollègues( @( P1 | P2 | … | Pn ) )


Ainsi, maintenant, les pensées d'Alice sur ses collègues ont une représentation explicite de leur comportement à la disposition d'Alice. Avec lui, elle peut simuler le comportement de ses collègues en simulant le comportement de P1 | P2 | ... | Pn par des opérations sur @( P1 | P2 | ... | Pn ). Nous pouvons modéliser Alice observant le comportement réel de son collègue avec une expression comme Alice | P1 | P2 | ... | PN. Alice peut comparer sa simulation avec ses observations. En fait, tout ce que nous pouvons modéliser est également disponible pour Alice à la fois pour exécuter et réifier en données et comparer le code et ses simulations à ce qu'elle observe du comportement réel de son contexte social. Cela inclut le propre comportement d'Alice.


C'est peut-être passé un peu vite, mais réfléchissez-y. C'est le plus petit ensemble d'opérations nécessaires pour qu'Alice modélise simultanément son contexte social et elle-même dans celui-ci. En particulier, les threads sont "consciemment disponibles" pour Alice juste au moment où son propre comportement réifie ces threads en données, et son traitement interagit avec ces données. Cet argument fait partie de ce qui est entré dans les délibérations sur la conception du rho-calcul. C'est le plus petit modèle de calcul qui réconcilie les arguments de Smith pour la réflexion computationnelle avec les arguments de Minsky pour une société de l'esprit qui correspond à l'explication de la biologie évolutionniste des organismes avec une théorie de l'esprit. Tout ce qui est plus petit passe à côté d'un élément clé de la situation.


Nous avons rencontré l'ennemi, et c'est nous.

Cet argument est la raison pour laquelle il est plausible pour un modèle de calcul comme le rho-calcul de trouver prise sur le matériel dans le cerveau d'Alice. Elle a besoin de tous les éléments de ce modèle pour rivaliser avec les autres membres de son espèce qui sont également en course pour modéliser le comportement de leur contexte social. C'est pourquoi, contrairement à la position de Joscha, je dirais que la concurrence mobile est au cœur de l'intelligence artificielle générale.


Une grande gratitude à Ralph Benko pour ses commentaires éditoriaux infailliblement astucieux !