paint-brush
El caso de Rho-Calculus en IApor@f1r3flyceo
2,508 lecturas
2,508 lecturas

El caso de Rho-Calculus en IA

por Lucius Meredith13m2023/02/03
Read on Terminal Reader

Demasiado Largo; Para Leer

¿La teoría de la mente dicta que un modelo particular de computación ha colonizado la arquitectura de nuestros cerebros?
featured image - El caso de Rho-Calculus en IA
Lucius Meredith HackerNoon profile picture


La conciencia como colonización del cerebro

En una conversación reciente con Joscha Bach , uno de los pensadores más originales de esta generación, hizo la sorprendente afirmación de que la concurrencia móvil está reñida con la inteligencia artificial general . En este contexto, la concurrencia móvil significa el tipo de concurrencia que uno encuentra cuando los agentes (también conocidos como procesos computacionales) pueden descubrirse entre sí, que es la topología de comunicación (quién sabe quién y quién habla con quién) está evolucionando. Este modelo es muy diferente de un modelo en el que los elementos informáticos se sueldan entre sí como los componentes de una placa base. La concurrencia móvil se parece más a Internet oa las redes de telefonía, donde las personas que acaban de conocerse aprenden los sitios web, las direcciones de correo electrónico y los números de teléfono de los demás. El argumento de Joscha es que los cerebros son solo plásticos, es decir, las conexiones entre las neuronas solo cambian durante el aprendizaje, pero no durante la computación general.


Joscha Bach , uno de los pensadores más originales de su generación, hizo la sorprendente afirmación de que la concurrencia móvil está reñida con la inteligencia artificial general.


Mi respuesta a esta proposición es que asume que la mente no está alojada en un modelo lógico de computación que se ejecuta en el hardware del cerebro. Después de todo, la máquina virtual Java (JVM) es un modelo de computación muy diferente al hardware en el que se ejecuta. El modelo de computación de Haskell es una variación aún más dramática de la idea de computación que la incorporada en el hardware en el que normalmente se aloja el glorioso compilador de Haskell ( GHC ). ¿Por qué la mente no estaría organizada así? Para usar la metáfora gráfica de Joscha, ¿por qué no surgiría la mente como un modelo computacional colonizador que se hospeda en el hardware del cerebro? Si lo es, bueno, rholang, una implementación del rho-calculus, está alojado en chips Intel y AMD para empezar, y sus modelos computacionales son muy diferentes del capturado por el rho-calculus.


En particular, el cálculo rho proporciona soporte directo para el cálculo concurrente móvil. La topología de comunicación entre una sociedad de procesos que se ejecutan en el rho-cálculo es dinámica. Quién sabe quién y puede hablar con quién en esta sociedad cambia en el transcurso del cálculo. Esta forma de pensar sobre el rho-calculus presagia mi argumento de que hay muy buenas razones para suponer que un modelo como el rho-calculus puede haberse alojado y colonizado el hardware del cerebro humano, de hecho, cualquier cerebro que admita un teoria de la mente.


Código, datos y computación

Para presentar este argumento, quiero hacer algunas distinciones que no todos los informáticos, y mucho menos todos los desarrolladores, hacen. Hago una distinción entre código, datos y computación. El código arbitrario se puede tratar como algunos datos, que es una instancia de algún tipo de estructura de datos en la que se expresa o aloja el modelo de computación. Por ejemplo, puede hospedar un modelo computacional completo de Turing , como Haskell , en un lenguaje de términos expresado a través de una gramática libre de contexto, por ejemplo, la gramática para programas Haskell bien formados. Sin embargo, sabemos que las gramáticas independientes del contexto no son completas de Turing. ¿Cómo puede ser esto? ¿Cómo puede algo demostrablemente menos expresivo que los modelos completos de Turing representar la computación completa de Turing?


Foto de Walkator en Unsplash



Llega al corazón de la distinción entre sintaxis y semántica. La gramática del término lenguaje expresa la sintaxis de los programas, no la dinámica de la computación , es decir, la semántica del código. En cambio, la dinámica de la computación surge por la interacción de las reglas (que operan sobre la sintaxis) con una parte particular de la sintaxis, es decir, algún código, que representa la computación que se desea efectuar. En el cálculo lambda (el modelo de computación en el que se basa Haskell), el caballo de batalla de la computación es una regla llamada reducción beta. Esta regla representa la operación de una función sobre datos a través del acto de sustituir los datos por variables que ocurren en el código. Los datos sobre los que opera son una representación sintáctica de la aplicación de una función a los datos, pero no es el cálculo que corresponde a la aplicación de la función a los datos. Ese cálculo ocurre cuando la reducción beta opera en la sintaxis, transformándola en una nueva pieza de sintaxis. Esta distinción es cómo los modelos que son menos expresivos que Turing-completo (por ejemplo, gramáticas libres de contexto) pueden albergar el cálculo de Turing-completo.


¿Cómo puede algo demostrablemente menos expresivo que los modelos completos de Turing representar la computación completa de Turing? Llega al corazón de la distinción entre sintaxis y semántica. La gramática del término lenguaje expresa la sintaxis de los programas, no la dinámica de la computación, es decir, la semántica del código.


No quiero profundizar en el punto, pero la misma distinción ocurre en Java y JVM. La dinámica de cómputo en la JVM ocurre a través de reglas que operan sobre una combinación de registros en la máquina virtual junto con una representación del código. Un programador de Java que mira fijamente un fragmento de código Java no está mirando el cálculo. Lejos de ahi. La sintaxis de un programa Java es una ventana a toda una gama de cálculos posiblemente diferentes que se producen según el estado de los registros de la JVM en el momento en que se ejecuta el código. La diferencia entre estas dos formas de evaluación, la reducción beta en el cálculo lambda frente a las transiciones de la JVM, es muy importante y volveremos sobre ella.


Por ahora, sin embargo, una forma de pensar en esta distinción entre código y computación es a través de una analogía con la física. Tradicionalmente, las leyes de la física se expresan a través de tres cosas: una representación de estados físicos (piense en esto como la sintaxis de los programas), leyes de movimiento que dicen cómo cambian los estados con el tiempo (piense en esto como las reglas que operan en la sintaxis) ; y condiciones iniciales (piense en esto como una pieza particular de código que desea ejecutar). Desde este punto de vista, la física se ve como un lenguaje de programación de propósito especial cuya ejecución corresponde de una manera particular a la forma en que evoluciona el mundo físico en función de nuestras observaciones de él. La física es comprobable porque nos permite ejecutar un programa y ver si la evolución de un estado inicial a un estado que alcanza a través de las leyes del movimiento coincide con nuestras observaciones. En particular, cuando vemos el mundo físico en una configuración que coincide con nuestro estado inicial, ¿pasa por un proceso de evolución que coincide con lo que nuestras leyes de movimiento dicen que debería, y aterriza en un estado que nuestras leyes de movimiento dicen? ¿debería? El hecho de que la física tenga esta forma es la razón por la que podemos representarla de manera efectiva en el código.


La analogía de la física pone a los modelos de computación como el cálculo lambda, el cálculo π o el cálculo rho en marcado relieve frente a modelos como las transiciones de la JVM. Cuando observa un fragmento de código Java, no tiene toda la información necesaria para comprender cómo se comportará. Dependiendo del estado de la JVM, la misma pieza de código Java puede comportarse de manera muy diferente. Por el contrario, los cálculos computacionales mencionados anteriormente combinan la forma con la función. Lo que ves en una expresión es lo que obtienes. Desde el punto de vista de la física, como científico, lo único que tiene que hacer ingeniería inversa son las leyes del movimiento, también conocidas como las reglas de computación. No tienes que adivinar un montón de estados ocultos.


Una vez que vemos la distinción entre código y computación, entonces la distinción entre código y datos es relativamente intuitiva, aunque algo sutil. Los datos en un programa de computadora también son solo sintaxis. En este sentido, no es diferente al código, que también es solo sintaxis. Todos los programadores de Lisp entienden esta idea de que, de alguna manera, el código es información y la información es código. Incluso Java admite una especie de metaprogramación en la que el código Java puede manipularse como objetos Java. La pregunta es, ¿existe alguna línea divisoria real entre el código y los datos?


La respuesta es un sí definitivo. Los datos son código que tiene propiedades muy específicas; por ejemplo, es probable que el código siempre se ejecute hasta el final. No todo el código hace esto. De hecho, la famosa resolución del Entscheidungsproblem de Turing nos muestra que, en general, no podemos saber cuándo se detendrá un programa para un lenguaje que disfruta de cierta cualidad de expresividad, es decir, Turing-completo. Pero hay lenguajes menos expresivos, y los lenguajes completos de Turing disfrutan de sublenguajes adecuados o fragmentos que son menos expresivos que el lenguaje completo. Los datos residen en la sintaxis que permite probar que el cálculo asociado con una parte de la sintaxis se detendrá. Asimismo, los datos residen en la sintaxis que permite probar que el cómputo sólo disfrutará de ramificaciones finitas.


Los programadores no piensan en datos como este, solo conocen los datos cuando los ven. Pero en modelos de computación como el cálculo lambda que no vienen equipados con tipos de datos incorporados, todo, incluso cosas como los números de conteo o los valores booleanos, verdaderos y falsos, se representan como código. Seleccionar qué código constituye datos y cuál constituye programas de propósito general tiene que ver con poder detectar cuándo el código tiene el tipo de propiedades que discutimos anteriormente. En general, hay tipos de sistemas que pueden detectar propiedades como esta. Nuevamente, es un tema sutil, pero afortunadamente, no necesitamos entender todas las sutilezas, ni necesitamos entender exactamente dónde está la línea divisoria entre los datos y el código, solo que hay una.

En resumen, tanto el código como los datos son simplemente sintaxis que representan un estado sobre el cual operará una regla, o muchas reglas. Los datos se expresan en un fragmento menos expresivo de la sintaxis que el código, dándole un carácter definido o finito del que el código no siempre disfruta. La computación es el proceso de evolución que surge cuando algunas reglas interactúan con una representación de un estado. Ahora bien, ¿qué tiene que ver todo esto con la IA, la mente o incluso el cálculo rho?


La reflexión como característica definitoria de la inteligencia

El rho-cálculo tiene una representación sintáctica de la distinción entre computación y código. Tiene una operación que expresa el empaquetamiento de un cómputo como una pieza de código para que pueda ser operado, transformándolo en código nuevo. También tiene una operación para volver a convertir una pieza de código en un cálculo. Whoah, podrías decir, esa es una mierda del siguiente nivel. Pero, como mencionamos, los programadores de Lisp y Java han estado haciendo este tipo de metaprogramación durante mucho tiempo. Tienen que. La razón tiene que ver con la escala. Es imposible que los equipos humanos administren bases de código que involucren millones y millones de líneas de código sin soporte automatizado. Usan programas de computadora para escribir programas de computadora. Utilizan programas informáticos para crear implementaciones de programas informáticos. La metaprogramación es una necesidad en el mundo actual.


El argumento de Smith es que la introspección, la capacidad de la mente para observar el propio proceso de la mente, es una característica clave de la inteligencia. Para algunos, esta es incluso la característica definitoria de la inteligencia.


Pero allá por los años 80, todavía en los primeros días de la IA, un investigador llamado Brian Cantwell Smith hizo una observación que resonó conmigo y con muchas otras personas en la IA y campos adyacentes. El argumento de Smith es que la introspección, la capacidad de la mente para observar el propio proceso de la mente, es una característica clave de la inteligencia. Para algunos, esta es incluso la característica definitoria de la inteligencia. Para concretar esta idea de introspección, a la que llamó reflexión computacional, Smith diseñó un lenguaje de programación llamado 3-Lisp que tiene los mismos operadores que tiene el rho-calculus. Específicamente, 3-Lisp tiene una sintaxis para representar la conversión de un cálculo en código y una sintaxis para reflejar el código en un cálculo en ejecución.


Ahora bien, hay una buena razón para sospechar que existe una conexión entre el problema de la escala que enfrentan los desarrolladores de hoy y el problema de modelar nuestra capacidad reflexiva e introspectiva como seres razonadores. En particular, manejar la complejidad de representar nuestro propio razonamiento se vuelve manejable en presencia de la reflexión computacional. Podemos aplicar todos nuestros trucos algorítmicos a las representaciones de nuestro propio razonamiento para obtener un mejor razonamiento. Esta observación se amplía en el contexto de lo que los biólogos evolucionistas llaman la teoría de la mente .


Específicamente, la introspección surge de la ventaja evolutiva obtenida al poder modelar computacionalmente los comportamientos de otros, en particular, los miembros de su propia especie. Si Alice desarrolla la capacidad de modelar el comportamiento de Barbara, y Barbara es notablemente similar a Alice (como en la misma especie, la misma tribu, incluso la misma estructura familiar extendida), entonces Alice está muy cerca de poder modelar el comportamiento de Alice. Y cuando Alice necesita modelar el comportamiento de Bárbara cuando Bárbara interactúa con Alice, entonces Alice está directamente involucrada en modelar el comportamiento de Alice. Llevando esto a una escala en la que Alice pueda modelar su unidad familiar o el comportamiento de su tribu es donde las cosas se ponen realmente interesantes. Más sobre eso en breve, pero por ahora, podemos ver que algo sobre la reflexión computacional tiene que ver con mejorar el razonamiento a escala en dos sentidos de esa palabra: (la escala de complejidad) mejorar el razonamiento aplicándose el razonamiento a sí mismo, y (la escala social ) mejorar el razonamiento sobre un gran número de agentes de razonamiento.


De hecho, las ideas de Smith sobre la reflexión computacional y su papel en la inteligencia y el diseño de lenguajes de programación fueron una inspiración para el diseño del rho-cálculo, que toma la reificación y la reflexión como operadores computacionales primitivos. Sin embargo, donde 3-Lisp y el rho-calculus se separan es que 3-Lisp es decididamente secuencial. No tiene forma de representar razonablemente una sociedad de procesos computacionales autónomos que se ejecutan de forma independiente mientras interactúan y se coordinan. Pero en el contexto de una teoría de la mente, esto es justo lo que necesita hacer un razonador. Necesitan un modelo explícito de su contexto social, que se compone de agentes autónomos que actúan de forma independiente al mismo tiempo que se comunican y coordinan.


El Rho-Calculus: de 3-Lisp a Society of Mind

Casi al mismo tiempo que Smith estaba desarrollando sus ideas de reflexión computacional, Marvin Minsky estaba desarrollando su famosa tesis de la Sociedad de la Mente. Mi opinión sobre la propuesta de Minsky es que la mente es algo así como el Congreso de los Estados Unidos o cualquier otro organismo deliberativo. Consiste en un grupo de agentes independientes que compiten por diferentes recursos (como la financiación de la base imponible). Lo que consideramos una decisión consciente se parece más al resultado de un largo proceso deliberativo entre un grupo de agentes independientes y autónomos que a menudo transcurre muy por debajo de la experiencia consciente. Pero, el proceso deliberativo resulta en un voto vinculante, y ese voto vinculante es lo que se experimenta como una decisión consciente.


Foto de Simon Kadula en Unsplash


¿Cómo puede reconciliarse esta visión, que sitúa la mayor parte de los cálculos fuera del razonamiento consciente, con una visión de la mente como esencialmente, y de hecho definitoriamente, reflexiva? El cálculo rho fue diseñado con una respuesta a esta pregunta en mente.


El cálculo rho dice que los agentes computacionales vienen en solo seis formas:


  • 0 - el agente detenido o nulo que no hace nada;
  • for( y <- x )P - el agente que está escuchando en el canal x esperando datos que vinculará a la variable y antes de convertirse en el agente P;
  • x!( Q ) - el agente que está enviando un fragmento de código/datos en el canal x;
  • P|Q: el agente que es realmente la composición paralela de dos agentes, P y Q, que se ejecutan de forma concurrente y autónoma;
  • *x: el agente que refleja el código al que se refiere x de nuevo en un cálculo en ejecución


Observe cómo tres de estas construcciones usan el símbolo x. Dos de ellos usan x como si fuera un canal de comunicación entre agentes, y uno de ellos usa x como si fuera una referencia a un código. El único truco mágico que el rho-calculus tiene bajo la manga es que los canales son referencias a una pieza de código. Cuesta un poco acostumbrarse, pero viene con el tiempo.


Como observadores externos del contexto social de Alicia, podemos anotar su comportamiento como una composición paralela del comportamiento de cada individuo. En símbolos eso es P1 | P2 | … | Pn donde Pi es el modelo del i-ésimo individuo en el contexto social de Alicia. Ahora, un modelo del comportamiento de Alice necesita una representación de esa composición paralela para que su propio comportamiento represente el razonamiento al respecto. En símbolos eso es @( P1 | P2 | … | Pn ).


Armados con esta cantidad de información sobre el cálculo rho, podemos volver a nuestra narrativa sobre Alice y encontrar representaciones parsimoniosas de todos los desafíos que enfrenta su inteligencia social e introspectiva en desarrollo. Como observadores externos del contexto social de Alice, podemos anotar su comportamiento como una composición paralela del comportamiento de cada individuo. En símbolos, eso es P1 | P2 | … | Pn, donde Pi es el modelo del i-ésimo individuo en el contexto social de Alicia. Ahora, un modelo del comportamiento de Alice necesita una representación de esa composición paralela para que su propio comportamiento represente el razonamiento al respecto. En símbolos eso es @( P1 | P2 | … | Pn ). Para que Alice tenga estos datos ubicados en algún lugar al que tenga acceso, coloca el modelo en un canal x!( P1 | P2 | … | Pn ), y cuando necesita recuperarlos, ejecuta


for( y <- x )Alicia pensando en sus colegas( y ) | x!( P1 | P2 | … | Pn )


La regla de trabajo del cálculo en el cálculo rho, que es muy similar en espíritu a la reducción beta del cálculo lambda, es que una expresión como esta evoluciona a


Alicia pensando en sus colegas( @( P1 | P2 | … | Pn ) )


Entonces, ahora los pensamientos de Alice sobre sus colegas tienen una representación explícita de su comportamiento disponible para Alice. Con él, puede simular el comportamiento de sus compañeros simulando el comportamiento de P1 | P2 | ... | Pn mediante operaciones en @( P1 | P2 | ... | Pn ). Podemos modelar a Alice observando el comportamiento real de su colega con una expresión como Alice | P1 | P2 | ... | n.º Alice puede comparar su simulación con sus observaciones. De hecho, cualquier cosa que podamos modelar también está disponible para Alice tanto para ejecutar como para cosificar los datos y comparar el código y sus simulaciones con lo que observa del comportamiento real de su contexto social. Esto incluye el propio comportamiento de Alice.


Esto puede haber pasado un poco rápido, pero piénsalo. Este es el conjunto de operaciones más pequeño que necesita Alice para modelar simultáneamente su contexto social y a sí misma en él. En particular, los hilos están 'conscientemente disponibles' para Alice justo cuando su propio comportamiento cosifica esos hilos en datos, y su procesamiento interactúa con esos datos. Este argumento es parte de lo que pasó en las deliberaciones de diseño para el cálculo rho. Es el modelo más pequeño de computación que reconcilia los argumentos de Smith a favor de la reflexión computacional con los argumentos de Minsky a favor de una Sociedad de la Mente que encaja con la explicación de la biología evolutiva de los organismos con una teoría de la mente. Cualquier cosa más pequeña pierde un componente clave de la situación.


Nos hemos encontrado con el enemigo, y ellos somos nosotros.

Este argumento es la razón por la que es plausible que un modelo de computación como el rho-calculus se acople al hardware del cerebro de Alice. Ella necesita todos los elementos de este modelo para competir con otros miembros de su especie que también están compitiendo para modelar el comportamiento de su contexto social. Por eso, muy en contra de la posición de Joscha, diría que la concurrencia móvil está en el corazón de la inteligencia artificial general.


¡Mucha gratitud a Ralph Benko por sus comentarios editoriales infaliblemente astutos!