http://www.redcientifica.com/gaia/

http://www.redcientifica.com/gaia/apren_c.htm


Notas sobre aprendizaje

Manuel de la Herrán Gascón

Indice:
En obras



Aprendizaje

Es asombroso como muchas personas, aún con los conocimientos basicos de estadística y la seguridad racional de que todas las combinaciónes de números tienen igual probablidad de salir premiados en la lotería, miran (miramos) con desconfianza el billete de número "11.111", o preferimos un billete traido expresamente de cierto pueblo donde "ha caido el gordo" dos años consecutivos.

Esto es reflejo de un proceso mental fundamental en los seres vivos, sobre todo si se mueven y deben buscar alimento, cobijo o pareja: la posibilidad de establecer relaciones causa-efecto, que en el ejemplo mostrado, funciona incluso donde nuestra lógica consciente nos dice que estas relaciones no existen.

En el ejemplo, probablemente el proceso mental que lleve a estas asociaciones sea algo parecido al que a continuación se describe. La persona observa los números que son premiados en los distintos sorteos, e inconscientemente trata de detectar regularidades en esos números. Los números por lo general no son faciles de recordar, por lo que números como el "72.719" se olvidan fácilmente. Sin embargo, hay algunos muy llamativos, pero escasos, como el "33.333" o el "12.345," difíciles de olvidar. La persona detecta entonces que la mayoría de los números premiados son del tipo de los "difíciles de recordar" y por tanto desconfía de los "fáciles de recordar".

El establecimiento de relaciones causa-efecto ("después del otoño viene el inverno") y la predicción del futuro que nos permiten estas relaciones ("es otoño, luego está próximo el invierno") ha sido una característica evolutiva que ha sido seleccionada por su gran utilidad en la supervivencia del individuo.

[ Volver al Indice ]



Cómo hacer que los ordenadores aprendan

Existen muchas formas de hacer que un programa aprenda. Una de ellas es usar Algoritmos Genéticos y Vida Artificial. Estos métodos están descritos extensamente a lo largo del web. De esta forma se pueden conseguir programas que se adaptan a las circunstancias y que aprenden por sí mismos y son capaces de reacciónar ante situaciones no previstas.

[ Volver al Indice ]



Cómo construir un programa capaz de aprender sobre cualquier cosa

Una vez que tenemos la idea de cómo hacer que un programa aprenda, podemos lanzarnos a la aventura de construir uno. Primero tenemos que decidir cuál es el problema que el programa debe aprender a resolver. Lo más facil es que el problema a resolver sea un juego. Por ejemplo podemos pensar en el ajedrez, las damas o el tres en raya. El programa comenzaría con una determinada cantidad de conocimiento del juego, y poco a poco aumentaría su conocimiento en cada partida.

El programa haría dos cosas principalmente: una de ellas sería jugar partidas contra sí mismo y extraer conclusiones de estas partidas. La otra sería jugar contra su creador, demostrándole hasta que punto ha progresado en su aprendizaje.

En lo que respecta a jugar contra sí mismo, estos programas son muy dados a ejecutarse por las noches, semanas enteras o incluso meses. Si queremos que el programa obtenga un conocimiento suficiente como para jugar una partida contra una persona sin aburrirla, probablemente tengamos que dejarlo en ejecución bastante tiempo. Muchas veces, este tiempo será excesivo, por ejemplo, varios millones de años, y entonces se opta por incluir la mayor cantidad de conocimiento inicial en el programa.

Pero esta operación resulta muy costosa en esfuerzos de programación. Como consecuencia de todo esto, la mayoría de los programadores deben adoptar un compromiso entre dos opciones:

La primera es realizar una programación sencilla que incluya poco conocimiento inicial acerca del problema que se va a resolver, lo cual es una ventaja, pero que posee el inconveniente de producir programas muy lentos en aprender hasta un nivel aceptable.

La segunda consiste en esforzarse por representar en el programa la máxima cantidad de conocimiento inicial sobre ese problema, lo cual supone enormes esfuerzos de programación, con el fin de obtener un programa que rápidamente, combinando el conocimiento que ya posee, sea capaz de llegar a otras conclusiones desconocidas para nosotros, lo que sería una enorme ventaja.

Se quiere llamar la atención sobre el interés teórico que supone llevar al límite la primera de estas opciones: realizar la mínima programación posible a pesar de tener que esperar y esperar hasta que el programa alcance un nivel aceptable de conocimiento.

La mínima programación posible consistiría en no incluir absolutamente nada de conocimiento acerca del juego al que el programa ha de jugar. Por ejemplo, el programa podría mover fichas del ajedrez, pero inicialmente no sabría ni siquiera cuales son las reglas para mover caballos, alfiles, etc, y no sólo perdería jugando contra nosotros, sino que pocas veces sería capaz de terminar una partida sin cometer una infracción.

[ Volver al Indice ]



Agentes autónomos

El programa del tres en raya se ha realizado, por comodidad, desde el punto de vista del proceso. Existen unos operadores (como el cruce y la mutación) que son aplicados en serie a todas las entidades. Es decir, primero se evalúan todas las entidades, después se seleccionan las mejores, más tarde se reproducen, etc. Cada agente decide cómo jugar al tres en raya, pero no puede decidir con quién jugar, con quién reproducirse, o cuándo compartir su conocimiento.

Para dotar a los agentes de mayor autonomía, a la vez que se logra una aproximación más cercana al mundo real, es preferible programar estas simulaciones desde el punto de vista de las entidades (los datos), siendo la propia entidad la que decide en cada momento cómo actuar.

Los dos estilos de programación pretenden simular un paralelismo: el primero es un paralelismo de procesos, el segundo es un paralelismo de entidades. El ideal sería disponer un procesador para cada entidad (paralelismo de entidades real). A falta de ello, el programa podría repartir el tiempo de ejecución entre todas las entidades. Esto es más complejo de programar por el hecho de tener que mantener el estado en que se ha quedado cada entidad antes de pasar a la ejecución de la siguiente, pero tiene la ventaja de que gran parte del código sería independiente del problema que se está resolviendo.

¿Cómo se consigue el mismo resultado dejando la iniciativa a las entidades? Bueno, en realidad los agentes no van a tener demasiada libertad, aunque tal vez ellos piensen lo contrario. En primer lugar es recomendable añadir a las entidades unas coordenadas que hagan referencia a su ubicación física, permitiendo que se muevan al azar por su mundo virtual. A partir de ahora, dos entidades deberán estar juntas para poder reproducirse o jugar una partida. Esto sería lo equivalente a la función de desordenar que ya posee el programa. Por otro lado, llamemos al peso "energía". La energía aumenta al ganar partidas y disminuye al perderlas. Hagamos que sólo se puedan reproducir los agentes con un determinado nivel de energía, y que fallezcan aquellos en los que ésta ha llegado por debajo de cierto valor. Acciones como reproducirse, moverse o la simple inactividad pueden restar energía al agente. Como se puede suponer, los agentes no van a tener más remedio que jugar y ganar si quieren seguir estando "vivos" o tener descendencia. La energía global del sistema debería permanecer constante (o al menos no variar demasiado) por coherencia, y para evitar extinciones o superpoblación, que de todas formas podrían suceder, y que en general se han de evitar.

Este modelo tiene muchas ventajas. Por una parte, una vez construido el esquema general, nos damos cuenta de que resulta mucho más fácil y rápido programar algunas funciones. La reproducción se simplifica mucho, al ser las propias entidades las que eligen pareja. Además este modelo nos permite ampliar y enriquecer el concepto de agente proporcionándole mayor potencia, convirtiéndolo en un pequeño resolutor de problemas. Y no sólo eso: para solucionar un problema distinto, bastará con definir unos nuevos agentes; el resto del programa permanecerá igual.

Vamos a ver poco a poco todas las cosas que nuestros agentes son capaces de hacer. Cada entidad posee una serie de acciones que es capaz de realizar, pero ahora no solo coloca fichas: ahora también puede, por sí misma, compartir su conocimiento, buscar pareja, reproducirse, o comenzar una partida. Podemos hacer que en cada ciclo, cada entidad sólo pueda realizar un número determinado de acciones, elegidas del conjunto de acciones posibles, antes de pasar a la ejecución de la siguiente (recordemos que hay que simular un paralelismo). Otra posibilidad es asignar un intervalo de tiempo a cada entidad y que cada una ejecute todas las acciones que le sea posible. También podremos limitar el tiempo de ejecución (o el número de acciones) a algunas de las entidades peores, en vez de eliminarlas.

En el programa de "Hormigas y Plantas" incluido en "Ejemplos de Vida", cada entidad realizaba una acción por ciclo, que dependía del estado en que se encontraba, calculado en función de los vecinos que tuviera en ese momento. En el caso de que un mismo estado pudiera disparar más de una acción, la acción se decidía según una cierta probabilidad. Ahora estamos hablando de algo mucho más completo, más sencillo de entender (ya que se parece más a la vida real), aunque más tedioso de programar. La entidad poseerá básicamente cuatro atributos: objetivo, creencias, sentidos y acciones. El agente (autómata) se dedicará a una u otra tarea (acción, salida) en función de un proceso de decisión interno (inteligencia), más o menos complejo, basado en sus creencias (memoria, reglas) y sentidos (entradas).

La entidad va a tener un objetivo que cumplir y sus sentidos le informarán, entre otras cosas, de cuándo ese objetivo se cumple y en qué grado. Utilizando sus creencias, el agente realiza en cada caso la acción que cree que más le acercará a su meta. En el caso del tres en raya, el objetivo es ganar el juego. Los sentidos informan en cada momento del estado del tablero, que se almacenará en la memoria. Las acciones son no sólo las que actúan directamente sobre el problema que se está resolviendo, como colocar una ficha, sino también las que afectan a cualquier otro componente del entorno (como compartir el conocimiento con otro agente), o aquellas que consisten en manejar de alguna forma el conocimiento almacenado en la memoria, y que posteriormente determinarán la secuencia de acciones a realizar sobre el entorno, como predecir el comportamiento del contrario.

La información que recibe el programa acerca del entorno se almacenará en variables. Un estado será un conjunto de valores para esas variables. Por ejemplo, nuestro agente podrá ver el contenido de cada una de las 9 casillas del tres en raya, con lo que dispondrá de 9 variables, y las posibles combinaciónes de esos valores formarán el conjunto de estados posibles.

Creencias

Aquello en lo que la que la entidad cree lo podemos agrupar en tres categorías. En primer lugar, existirá una memoria de los sucesos que han ocurrido. Por otro lado es posible que unas variables dependan del valor de otras, por lo que existirán reglas que definan esta descomposición. Finalmente tenemos las reglas que predicen el comportamiento del entorno. Las reglas usadas por el juego del tres en raya son del tipo "si observo tal situación, realizo tal acción". Estas reglas sirven para decidir qué hacer, pero no explican el porqué. Un formato más general debería permitir reglas capaces de describir un estado inicial, un estado final, y la acción necesaria para pasar de uno a otro (Ver figura). Reglas como (1) "Si es el turno de X, yo juego con X, y en las casillas 1 y 2 hay una ficha X, estando vacía la casilla 3, y realizo la acción de poner una ficha en la posición 3, entonces el ganador será X con una probabilidad del 100%, y esta regla tiene una importancia máxima". Podrían existir reglas sin acción y/o reglas donde el estado final se deba calcular en función de otras variables: "Si en las casillas 1 y 2 hay una ficha X, en las casillas 4 y 5 hay una ficha O, estando vacías las casillas 3 y 6, entonces el ganador será el del turno actual, con una probabilidad del 40%, y esta regla tiene una importancia de 0,7".

Un formato que admite estas posibilidades es:

Estado, Acción --> Conclusión, Probabilidad, Importancia

Estado es un conjunto de pares "variable = valor", Acción es una acción simple o compleja, Conclusión es un conjunto de pares "variable = formula", que una vez resueltas las fórmulas produce pares "variable = formula". Probabilidad es la confianza que el agente tiene en la regla, e Importancia es un indicador del grado en que la regla puede afectar al objetivo.

Reglas

Acciones

¿Cómo decide la entidad que acción ejecutar con este tipo de reglas? La entidad posee una variable especial, llamada objetivo, que representa el grado en el que la entidad se comporta según la forma deseada por quien la creó. La variable objetivo dependerá de los valores de otras variables, según una fórmula determinada, en este caso, la colocación de tres fichas propias en línea. La evaluación de la entidad, o lo que es lo mismo, la comprobación de hasta dónde se cumple el objetivo, está encapsulado dentro de la propia entidad. No es necesario que otro agente lo evalúe, la propia entidad no puede evitar perder "energía" si no lo consigue.

El agente intentará realizar aquellas acciones que más le acerquen a su objetivo. Para ello, deberá predecir la respuesta del entorno ante sus acciones. Pero recordemos que el agente parte de un completo desconocimiento del problema particular. ¿Qué hacer? En primer lugar, observa la situación actual (inicialmente, el tablero vacío)-, y comprueba si el objetivo buscado se cumple. Como todavía nadie ha sido declarado ganador, y a falta de otra opción mejor, el agente ejecuta acciones al azar. Después de una acción observa sus consecuencias y su "mente" produce una asociación causa-efecto que almacena en forma de regla. Las posteriores acciones estarán condicionadas por el conocimiento almacenado en la memoria, evitándose en lo posible recurrir al azar.

Si se realiza una acción y se pasa a un estado desconocido, se almacenará información que represente ese nuevo estado y se creará una regla que represente las condiciones necesarias para pasar a ese nuevo estado. El problema consiste en cómo identificar qué acción ha sido la responsable de una transición. Por ejemplo, colocar una ficha en un determinado lugar puede ser la causa inmediata de ganar la partida, pero tiene poca utilidad suponer que únicamente esa acción es la responsable de vencer en el juego. Es más apropiado decir que la causa es la sucesión completa de acciones desde el comienzo de la partida. Para poder utilizar este tipo de reglas, las acciones se podrán organizar en una estructura jerárquica. Así, una sucesión de acciones interesante formará una acción de nivel superior, y esta acción podrá formar parte de una regla.

Sin embargo esto no explica la mayoría de los comportamientos inteligentes conocidos. Una partida no se gana por realizar una determinada serie de acciones, sino más bien por una estrategia, por un conocimiento del juego en general, por un conocimiento de experto obtenido a través de múltiples experiencias. A este nivel de análisis, la causa de haber ganado es el haber realizado una serie de acciones -tomar una decisión es realizar una acción-, que además de actuar sobre el entorno o problema a resolver, manejan símbolos referentes a él y manipulan o indican cómo manipular la información adquirida, determinando en última instancia cuál será la sucesión de acciones a realizar sobre el juego.

Aunque en cada instante sólo se pueda ejecutar una acción básica, las acciones de nivel superior se pueden solapar en el tiempo. La toma de una decisión cuya influencia se manifiesta en el desarrollo de otras acciones puede entenderse también como una acción. Por ejemplo, el hecho de decidir utilizar, bajo ciertas condiciones, únicamente un subconjunto del conjunto total de reglas posibles, puede considerarse una acción (de nivel superior). Esta acción se solapará con las acciones básicas que se ejecuten en cada momento. Este ejemplo además ilustra como permitir una cierta jerarquía dentro de las reglas, ya que es posible incluir esta acción, que hace referencia a las reglas, dentro de otra regla.

En las variables también existe una jerarquía. El número de variables que forman un estado normalmente será muy grande, y muchas veces ocurrirá que varios estados distintos se comportan como uno sólo. Esta última situación se da en el tres en raya por la simetría que posee el tablero. Por estas razones es interesante representar algunas combinaciónes de valores de variables como un único valor para una variable de nivel superior.

Así, dispondremos de un mecanismo que nos permitirá algo parecido a crear conceptos. Por ejemplo, se podría crear el concepto de "dos fichas en línea", que será una nueva variable, con un nombre o identificador cualquiera, que adoptará el valor verdadero en el caso de que se produzca esta situación. En las variables es posible aplicar la lógica difusa. Existen conceptos de naturaleza continua, que se definen mediante la referencia a una propiedad y el grado en que se manifiesta dicha propiedad. Por ejemplo, nosotros podemos decir que el cielo es azul. Sin embargo, no existe una frontera numérica que marque la diferencia entre un cielo azul y un cielo blanco en función del número de puntos de luz de cada color. Ambos conceptos pueden ser ciertos simultáneamente en cierta medida. Así, podríamos expresar: el cielo posee un tono azulado en un 70%. Por otra parte no siempre se dará un grado de confianza total a la información manejada. Es posible que un concepto se cumpla en un cierto grado y que a esta información se le asigne una cierta confianza, y de esta forma, podríamos decir: el cielo posee un tono azulado en un 70% y esta información posee una probabilidad del 90% de ser cierta. Estos valores pueden ser incluidos en cada variable.

¿Cómo reconocer que conceptos son importantes? Cuando un agente llegue a su límite de almacenamiento, deberá seleccionar algunas creencias para que sean borradas. Para ello, intentaremos relacionar los estados con el objetivo, de manera que se tengan más en cuenta aquellos que más influyen en él, ya sea favoreciendo o perjudicando su consecución.

La creación de variables de nivel superior también hace que las necesidades de espacio a la hora de almacenar una regla sean menores. Con un número suficiente de reglas describiendo el comportamiento del entorno, y conociendo el estado actual y el estado al que se desea llegar, se puede buscar la sucesión de acciones que nos llevan de un estado a otro, hasta la meta. La creación de variables superiores no ha de estar limitada a un solo instante de tiempo, a una sola lectura del entorno. En realidad, el tiempo se puede considerar como una variable más, y crear así conceptos que describan un comportamiento que posea continuidad.

Programación Orientada a... ¿Agentes?

Se han descrito las posibilidades de razonamiento dentro de un agente. Las entidades que hemos estudiado recuerdan a los procesos Unix (que nacen, mueren, tienen procesos hijos, se comunican enviándose mensajes), y también tienen un aire de instancias de Programación Orientada a Objetos (POO), ya que si en POO tenemos objetos que encapsulan datos y procedimientos, aquí tenemos agentes que encapsulan un objetivo, unos sentidos, unas creencias y unas acciones.

En cualquier caso, lo que es evidente es que si el método de búsqueda es independiente del problema a resolver, se echa terriblemente en falta la existencia de unas librerías de entidades y de un compilador de un lenguaje de definición de agentes y de entornos de problema. En teoría, con algo así, nos quedaría poco por programar. En la práctica, y dada la lentitud inherente del aprendizaje evolutivo, cuyo ejemplo más cercano somos nosotros mismos (que hemos tardado 3.800 millones de años en evolucionar desde los primeros microorganismos vivos), será más útil combinar estas técnicas con la representación humana del conocimiento. De todo ello puede resultar un Resolutor General de Problemas de gran potencia. Las posibilidades de este nuevo paradigma son sin duda, muy excitantes.

[ Volver al Indice ]


[ Home Page Castellano | Home Page English ]
Traduccion