miércoles, 27 de noviembre de 2024

Algunas ideas iniciales sobre RAG (Retrieval Augmented Generation)

Uno de los conceptos que forman parte del 'último grito' en inteligencia artificial y, en concreto, en inteligencia artificial generativa, es el de RAG ('Retrieval-Augmented Generation') y, en el deseo de profundizar en su conocimiento, hace dos o tres semanas finalicé la lectura del libro 'Unlocking Data with Generative AI and RAG' de Keith Bourne, un libro que esta razonablemente bien tanto desde el punto de vista teórico como práctico.

En este post, y a despecho de que en el futuro pueda escribir otros sobre el tema, quisiera, únicamente, resumir las ideas principales y más básicas sobre RAG.


Sobre el conocimiento contenido en grandes modelos de lenguaje


RAG ('Retrieval Augmented Generation') es una forma de extender el poder de los grandes modelos de lenguaje y los modelos generativos añadiéndoles información externa adicional.

Como sabemos, los grandes modelos de lenguaje han sido entrenados con cantidades ingentes de datos. Datos procedentes, y esto no está exento de polémica y problemáticas de propiedad intelectual, de páginas web, libros, wikipedia, etc. Más allá de las eventuales polémicas, lo que se consigue es, tras un entrenamiento masivo, disponer de ese modelo de lenguaje.

Embebido en el modelo se encuentra, por un lado, una suerte de conocimiento estructural del lenguaje humano, su sintaxis y morfología así como una aproximación a la semántica, no porque el modelo sepa realmente lo que significa cada palabra, que no lo sabe, sino porque guarda información masiva de la cercanía semántica de las palabras.

De una forma también indirecta, pero muy real desde el punto de vista práctico, el modelo almacena. codificado en sus millones de parámetros, alguna forma de amplísimo conocimiento del mundo, el conocimiento que estaba incluido en las páginas, libros y demás documentos con que fue entrenado. De nuevo, no se trata de un conocimiento estricto: el modelo saber, saber, lo que se dice saber, no sabe nada. Tampoco se trata una representación del conocimiento como se hacía en los años de la inteligencia artificial simbólica. Pero, a efectos prácticos, sí que incluye ese conocimiento.

Una vez que el modelo ha sido pre-entrenado, cosa que han hecho los grandes de la inteligencia artificial generativa como OpenAI, el modelo conoce suficientemente esa estructura del lenguaje humano y con eso nos basta. También, hasta cierto punto, podemos dar por bueno el conocimiento semántico que incluye el modelo.

Otras cosa sucede, sin embargo, con el conocimiento del mundo que en el fondo, aunque amplio, es limitado. Y ello por tres motivos fundamentales. 

Por un lado, porque aunque el modelo ha sido entrenado con cantidades ingentes de información, esa información no ha incluido, lógicamente, absolutamente toda la información existente en el mundo sino un subconjunto de ella. Del resto, el modelo no tiene más idea que la que, entre comillas, "pueda deducir".  

En segundo lugar, evidentemente, la información crece de manera dinámica: se producen eventos y noticias nuevos, se publican contenidos nuevos, se producen avances en todo tipo de disciplinas. Y eso es una gran cantidad de información nueva que el modelo ignora.

Finalmente, existe información que no es pública, información privada que manejan las personas y, sobre todo, las empresas. Y eso tampoco ha formado parte del conocimiento del modelo.

RAG es una técnica que viene para superar esas 'ausencias de conocimiento' dentro de un gran modelo de lenguaje y complementar el conocimiento que ya tiene el modelo con conocimiento nuevo, pero haciendo uso del conocimiento y capacidades de que ya dispone el modelo de lenguaje generativo.

Antes de ver un poco más sobre RAG, decir que no es RAG la única forma de personalizar o extender un gran modelo de lenguaje.

Se puede aplicar el 'fine-tunning' haciendo un re-entrenamiento del modelo con nuevos datos normalmente específicos de un área de conocimiento, sector o empresa, y habitualmente mediante aprendizaje supervisado.

Incluso, durante la interacción con el modelo, mediante un uso inteligente del 'prompt engineering' se puede aportar cierta información adicional, tanto por el contexto del diálogo, como por el uso de ejemplos, conocimiento explícito, etc-


La idea subyacente a RAG


Dicho de manera muy sencilla (a lo mejor en algún otro post me extiendo algo más sobre el cómo), lo que hace RAG es aumentar el conocimiento de un modelo con información adicional, con frecuencia procedente de un buscador de Internet SEO o mediante la compilación de conocimiento contenido en documentos o sistemas de información privados de una empresa u organización.

No entraré en ello, pero en el procesamiento de lenguaje natural las palabras, o mejor dicho los 'tokens' se representan mediante vectores (los famosos 'embeddings'). Pues bien, lo habitual es que RAG convierta también en vectores el conocimiento adicional. El modelo de lenguaje, cuando recibe un 'prompt', antes de procesarlo, lo incrementa con información adicional obtenida mediante la denominada búsqueda semántica en un repositorio vectorial que contiene el 'conocimiento extra'.

En la entrada del modelo de lenguaje se integra toda la información, tanto del prompt y su contexto, como la obtenida mediante búsqueda semántica en la base de conocimiento vectorial adicional. Y, a partir de ahí, ya actúa como normalmente, generando su respuesta. 


Aportaciones de RAG


Siguiendo el discurso de Keith Bourne, en el libro citado, lo que aporta RAG es:


  • Mayor precisión y relevancia: Al incorporar información actualizada y normalmente en tiempo real se promueve la actualidad y relevancia de la respuesta.

  • Personalización: Dado que se puede hacer al modelo usar información muy específica y adaptada al ámbito de aplicación que nos interese.

  • Flexibilidad: En el sentido de que se pueden aplicar las técnicas RAG a todo tipo de fuentes incluyendo bases de datos, páginas web, documentos, etc

  • Expansión del conocimiento del modelo más allá de los datos de entrenamiento: Casi por la propia definición de lo que es RAG, aumentamos el conocimiento del modelo con aquello específico que le aportamos.

  • Eliminación de alucinaciones: La aportación de información relevante, especialmente de tipo factual, disminuye la probabilidad de que el modelo genere 'alucinaciones', es decir, respuestas incorrectas o incluso absurdas pero presentadas de manera convincente.


Retos de RAG


A cambio, y siguiendo la misma fuente, las problemáticas o retos a que se enfrenta RAG, son:


  • Dependencia de la calidad de datos: Resulta evidente, pero conviene explicitarlo: si la calidad de la información que le aportamos al modelo mediante RAG es mala, los resultados también lo serán.

  • Necesidad de limpieza y manipulación de datos: Un poco en línea con lo anterior, de cara a garantizar la calidad por un lado, y una mejor ingesta por otro, suele ser necesaria una manipulación y limpieza previa de los datos a usar en RAG, y esto puede ser una tarea laboriosa. Llamo la atención sobre que este punto y el anterior son absolutamente comunes para gran parte de las soluciones de machine learning basadas en datos, como por ejemplo, todo tipo de aplicaciones de analítica predictiva.

  • Computación adicional: RAG añade pasos adicionales, y eso tiene un coste computacional que puede llegar a penalizar las prestaciones o escalabilidad de la solución.

  • Explosión de almacenamiento y gestión asociada: En RAG la información adicional que se utiliza, puede residir en fuentes múltiples y no solo en una base de datos como en muchas aplicaciones tradicionales. Esto puede suponer una sobrecarga de mantenimiento y gestión.

  • Potencial sobrecarga de información: Se puede caer, en el extremo, en un exceso de información adicional, quizá no relevante, por lo que conviene permanecer vigilantes y añadir mediante RAG sólo la información realmente útil.

  • Alucinaciones: Aunque RAG tiende a eliminar alucinaciones, como hemos comentado entre las ventajas, no es imposible que introduzca alucinaciones nuevas. Es preciso vigilar para identificar y eliminar estas alucinaciones.

  • Altos niveles de complejidad en componentes RAG: las soluciones RAG pueden incluir diversos componentes, complejos de por sí e interrelacionados. Esto implica gestión y, sobre todo, prueba y depuración.

Conclusiones


RAG ('Retrieval-Augmened Generation') es una gran aportación de cara a la extensión y personalización de las soluciones basadas en modelos generativos, típicamente grandes modelos de lenguaje.

Trae consigo nuevas posibilidades y muchas ventajas, pero también incluye algunas problemáticas y riesgos a conocer y gestionar.


lunes, 25 de noviembre de 2024

Notas sobre aprendizaje por refuerzo (XI): métodos basados en modelo

Damos un nuevo paso en estas notas sobre aprendizaje por refuerzo siguiendo, como en toda esta ya larga serie, el libro 'Deep reinforcement learning' de Aske Plaat.

A partir de ahora, eso sí, iré un poco más rápido, sobrevolando más los temas para no complicar demasiado los artículos y no alargar en exceso esta serie, que ya debería irse acernado a su fin.

En este artículo, en concreto, comentaré las ideas principales de una forma de aprendizaje que se centra en el modelo de transiciones del entorno.

Pero antes, y como ya viene siendo habitual, repasemos lo principal que hemos visto hasta ahora


Recordatorio: resumen lo que hemos visto de aprendizaje por refuerzo


Recordamos el esquema que tantas veces hemos venido repitiendo:


Estamos ante la situación de un agente que interactúa con un entorno, un entorno que se encuentra en un estado s. Sobre ese entorno, el agente aplica unas acciones, a, como consecuencia de las cuales, el entorno puede experimentar una transición y cambiar de estado, pasando del estado s al s', y el agente recibe una recompensa r. El agente decide la acción a aplicar en cada momento, siguiendo una política π y su objetivo es maximizar la recompensa obtenida, no tanto en una única interacción, como siguiendo una secuencia o trayectoria.

Los métodos más básicos, aquellos en que el espacio de estado es reducido, siguen un enfoque tabular, en que se tabulan, de ahí el nombre, los posibles estados y para ellos se calculan unas funciones que nos dan el valor, Q, de la recompensa esperada.

Cuando la dimensión del espacio de estados es muy alta, como sucede habitualmente en problemas reales, dejan de tener sentido estos métodos tabulares así que renunciamos a representar la situación del entorno mediante su estado, y a cambio lo representamos mediante unas características ('features') y la obtención de valores o acciones vienen a ser unas funciones con base en esas características e implementadas mediante redes neuronales profundas, dando lugar al 'deep reinforcement learning'.

Cuando tratamos problemas ya no de alta dimensionalidad, sino continuos, como es la locomoción de robots, se adoptan los denominados métodos basados en políticas en que se prescinde de la visión de valores, y se trabaja directamente en optimizar las políticas, que pasan a considerarse como estocásticas, es decir, como distribuciones de probabilidad.


La idea del aprendizaje basado en modelos


Los modelos vistos hasta ahora eran lo que se denomina 'model-free', o sin modelo, en el sentido que el agente busca optimizar la política π pero lo hace directamente, sin 'intentar entender', por decirlo de alguna manera, cómo funciona el entorno con el que interactúa, sólo basándose en el 'feedback' que recibe de ese entorno en forma de recompensas.

Ese 'entender' se referiría a estimar y construir un modelo de las transiciones (T) del entorno

La forma de actuar sin modelo, como hemos visto hasta ahora, tiende a conducir en la práctica a un  entrenamiento lento y que puede precisar de millones de muestras para converger. 

Por ello surgen los métodos basados en modelos ('model-based').

En estos métodos, el agente primero construye localmente, y a partir del feedback referido del entorno, un modelo sobre el entorno, un modelo de transiciones del entorno. Y, una vez que ya tiene ese modelo, puede, con él, estimar la consecuencia que tendrían sus acciones y las recompensas que obtendría. Sería algo así como hacer juegos del tipo 'que pasa si' ('what-if') y, en función de los resultados, actualizar su política.

A esa generación o actualización de políticas, con base en el modelo local del entorno, es a lo que se llama planificación o 'imaginación'. Me permito solicitar al lector que se fije en lo que realmente hablamos al hablar de imaginación en estas situaciones, para evitar fantasías sobre las capacidades de la inteligencia artificial.

Como se puede ver, este tipo de métodos actualizan la política de una forma indirecta: primero aprenden un modelo local del entorno, a partir de la interacción con ese entorno, y luego usan ese modelo del entrono para actualizar la política, que es el objetivo final.

Como una forma sencilla de recordar la diferencia entre los métodos sin modelo y los basados en modelo, podríamos guardar esta frase de Plaat


Model-free teaches you how to best respond to actions in your world, and model-based helps you to understand your world.


Actuar como lo hacemos en los métodos con modelo, tiene dos consecuencias, una positiva y una negativa. La consecuencia positiva es que, una vez que el agente ha construido el modelo local del entorno, ya no necesita interactuar más con él para optimizar su política, sino que lo hace 'de gratis', por decirlo de alguna manera, exhibiendo, pues, menor complejidad en el muestreo. A cambio, y como riesgo, o como consecuencia negativa, pueden conducir a baja precisión en el modelo del entorno y, en consecuencia, a una política de baja calidad.

Algunos métodos basados en modelo, que se mencionan en la obra citada, son el Dyna-Q,  redes de predicción de valores ('value prediction networks') y redes de iteración de valores ('value iteration networks').


Conclusiones


Cuando supone un problema el tener que tomar demasiadas muestras del entorno, o cuando es un inconveniente serio la velocidad de convergencia, una alternativa son los métodos basados en modelo en que el agente primero construye un modelo local del funcionamiento del entorno (sus transiciones) y, a partir de ahí, interactuando con ese entorno local, en lugar de hacerlo con el real, optimiza su política.


Artículos de este blog relacionados



jueves, 21 de noviembre de 2024

Patrones subyacentes metodológicos y analíticos. El uso consciente de las herramientas y modelos

Después de bastante tiempo publicando artículos que, con alguna excepción en forma de reseña de libros, tenían que ver con la inteligencia artificial y/o la robótica, hoy voy a cambiar momentánea y brevemente de tercio para hablar de análisis, metodología y rigor.

Habitualmente veo, incluso en entornos académicos, usos o entendimientos incorrectos de herramientas, metodologías o enfoques de trabajo de naturalezas diversas pero que, de una forma u otra, caen dentro del ámbito de la gestión empresarial.

Me refiero a conceptos o herramientas como un simple DAFO, o un modelo de negocio o enfoques como 'agile' o 'design thning'.

Términos que tienen en común haber hecho fortuna en el mundo empresarial, enseñarse con frecuencia en el ámbito universitario o de posgrado, y estar muy presentes en medios más o menos especializados (en este caso a lo mejor habría que enfatizar lo del 'más o menos'). Y, como ya he comentado en algún otro post y a propósito de algún tema diferente, esa popularidad tiene una doble cara o es un arma de doble filo. Por un lado es bueno, ayuda a que se propague y se aplique, y por otro lado es malo, porque favorece el uso frívolo y descuidado del término, la herramienta o la metodología.

A mi, que valoro el conocimiento y el rigor y que me he preocupado de autoformarme en todos esas herramientas y enfoques que menciono, debo confesar que me enerva un tanto ese constante empleo frívolo, superficial e incluso ignorante de esos  nombres, herramientas y métodos.

Pero ayer vino a mi mente una reflexión algo más positiva, que me pareció interesante y que motiva este post.

El caso es que tuve ocasión de leer un uso, para mí algo 'cogido por los pelos' del término design thinking. Y pensando el porqué de ese uso, se me ocurrió una explicación diferente, y algo más positiva que la pura ignorancia y superficialidad.


Metodologías y patrones


Esa reflexión me lleva a distinguir, en cada enfoque metodológico o herramienta de trabajo, dos niveles.



Por un lado está lo que es la herramienta o metodología propiamente dicha, la que alumbraron sus creadores, generalmente conocidos gurús de la gestión, la que está bien analizada, documentada, explicada y a la que debemos referirnos para un discurso y una práctica rigurosos. A este nivel, y aunque el término quizá resulte algo aburrido y 'viejuno', lo voy a denominar metodología, ya que no se me ocurre un término más atractivo y moderno.

Pero por debajo de la metodología rigurosa, hay una serie de fundamentos, principios básicos o patrones de comportamiento, más difusos quizá, más laxos e indefinidos quizá, pero también más generales y que permiten su aplicación en entornos diferentes de aquellos para los que fue pensada la metodología inicialmente. Éstos serían los patrones subyacentes.

Lo que creo que sucede es que, en muchos casos, las personas no bien formadas, no bien advertidas, pero que 'han oído campanas', se quedan con dos cosas: por un lado, el nombre 'oficial' de la metodología, que en realidad se refiere al nivel superior y, por otro, a los patrones o principios básicos, que son el nivel inferior pero más general.

Y luego aplican los principios básicos, pero dándoles el nombre de la metodología.

Y así, se habla de un DAFO (cuando realmente no es un verdadero DAFO pero sí usa sus principios, sus patrones) o de un design thinking que, realmente, no es un 'design thinking pero que emplea sus principios y patrones.

Por si dicho así suena muy abstracto, lo concreto en cuatro herramientas o enfoques metodológicos muy populares y con frecuencia mal usados.


Análisis estratégico: el DAFO


Metodología


El DAFO es una muy bien conocida herramienta de análisis estratégico. El DAFO, como metodología (nivel superior), se aplica a una empresa u organización y adopta dos visiones: una externa (Amenazas y Oportunidades) en que se mira al mercado y al contexto, y otra interna (Fortalezas y Debilidades) en que se analiza la situación y competencias de la propia organización. Tanto para el análisis interno, como para el externo, se mira tanto lo bueno (Oportunidades y Fortalezas) como lo malo (Amenazas y Debilidades).

Hecho este análisis estratégico, la empresa puede identificar sus opciones estratégicas y elegir, con cierto conocimiento de causa, la mejor

Así concebida es, como digo, una herramienta de análisis estratégico y aplicada a una empresa o una organización

Sin embargo, la veo con frecuencia aplicada a un proyecto concreto, incluso de no mucho alcance, dentro de una organización. Estrictamente hablando, eso es incorrecto


Patrones subyacentes


Los patrones subyacentes al DAFO son esa doble mirada interna y externa, por un lado, y la otra doble mirada: positivo-negativo.

Y así considerado, en realidad, podríamos aplicarlo a otros muchos ámbitos. Por ejemplo, se habla en ciertos entornos, de un DAFO personal, y creo que ahí, si sabemos bien lo que estamos haciendo, podría llegar a tener bastante sentido. Me encaja menos aplicarlo a lo que he dicho más arriba, proyectos, pero, de nuevo, sabiendo lo que se hace, podría llegar a ser admisible.

Probablemente el DAFO sea una de las herramientas más sencillas y flexibles, con unas patrones más claros y que la habilitan con más facilidad que otras a aplicarla fuera de su verdadero entorno que recuerdo, de nuevo, que es el análisis estratégico.


Modelo de negocio: el Business Model Canvas


Metodología


El Business Model Canvas es una herramienta omnipresente en la literatura actual de gestión empresarial y, especialmente, de innovación y emprendimiento. Se trata de una herramienta para describir un modelo de negocio y, con base en esa descripción, poder adoptar posibles decisiones sobre el mismo. Ese es su objeto, aunque parece también muy ligado al emprendimiento y la innovación, precisamente porque, y tal y como definen reputados autores, una startup lo que está buscando es un modelo de negocio rentable y sostenible y, por tanto, necesita describir y analizar ese modelo de negocio y trabajar sobre él.

Pero he visto usar también el Busines Model Canvas para un proyecto, un simple proyecto, ni siquiera especialmente transformador, en una empresa establecida con un modelo de negocio establecido... y que el proyecto no va a modificar. Y eso no es muy correcto.


Patrones subyacentes


El Busines Model Canvas tiene unos patrones menos claros y externalizables que el DAFO, pero podríamos identificar la necesidad de una triple mirada: por un lado hacia el mercado (clientes, proposición de valor, canales y relaciones), por otro hacia la parte operativa (actividades, recursos y socios) y finalmente hacia la económica (flujos de ingresos y estructura de costes).

Y, quizá, podríamos decir que los propios cuadrantes que hay dentro de cada una de esas miradas, nos confecciona una especie de checklist de cosas a tener claras en una organización.

El Business Model Canvas es una herramienta muy popular y muy útil, pero que creo que no se extiende fácilmente fuera de su entorno natural que es el modelo de negocio de una empresa, o de una unidad de negocio dentro de ella o incluso de una línea de productos dentro de ella.

Si lo aplicas a un proyecto, creo que solo podría tener sentido en proyectos más o menos ambiciosos y transformadores y no tanto por el proyecto propiamente ducho sino para saber cómo el modelo de negocio condiciona al proyecto o cómo, caso de ser realmente transformador, el proyecto impacta en el modelo de negocio.


Dirección de proyectos: Agile


Metodología


Quizá uno de los términos más usados, y con frecuencia de manera incorrecta o con una valoración incorrecta, es el de 'agile'. Aunque a los fanáticos del agilismo les repele que se le denomine 'metodología' y prefieren hablar de 'framework', creo que aquí opto denominarla metodología, siguiendo los dos niveles explicados más arriba y, en concreto, del ámbito de la dirección de proyectos. Una metodología surgida en el mundo del desarrollo software, aunque luego ha hecho fortuna yendo más allá y aplicándose a otros muchos tipos de proyectos e impregnando metodologías de innovación y emprendimiento como 'lean startup'.

Aunque como metodología, en efecto, agile es 'laxa', los enfoques agile como scrum definen sus roles, sus herramientas, sus ceremonias...

La verdad es que creo que en el caso de 'agile', su mal uso se debe casi siempre a superficialidad y a ignorancia de todos esos detalles, pero de todas formas, creo que exhibe patrones muy claros,  muy útiles y muy exportables más allá de su ámbito natural.


Patrones subyacentes


El patrón más claro, y en el fondo definitorio, es el de el crecimiento iterativo y adaptativo, crecimiento y adaptación tanto en la definición del propio alcance del proyecto como en el desarrollo y entregables del mismo. Y un crecimiento y adaptación que, un poco, se mueven por una especie de ensayo y error, especialmente cuando trasciende el mundo del software y se centran en innovación.

Esa visión adaptativa e iterativa es la que lo convierte en tan útil para salir del mundo de los proyectos de software e ir hacia otro tipo de proyectos. Y, ese movimiento de ensayo y error, lo prepara bien para la innovación, como hemos dicho.


Productos y soluciones: desing thinking


Metodología


Quizá como metodología, el design thinking sea en sí misma la más difusa, a veces más una filosofía que una metodología y la que, de forma natural, tiende más a sus principios y patrones que a un enfoque cerrado.

De todas formas, y aunque muchos de los propios gurús del design thinking parecen derivar y ampliar sus fronteras, su ámbito principal es del diseño de productos y servicios, o soluciones en general, con una visión amplia, que conecta con el cliente y usuario finales, y que también propotipa y prueba, avanzando de forma iterativa.


Patrones subyacentes


Dentro de los patrones del design thinking se encuentran también la iteración y la adaptación, pero quizá refuerza más que agile, elementos como la creatividad, la empatía con y observación del usuario / cliente así como el prototipado

La cercanía al usuario final, la empatía y el prototipado son útiles en muchos problemas complejos o sin roadmap de resolución claro, y eso lleva a posibilidades de uso fuera del ámbito de los productos, servicios y soluciones.


Sobre el conocimiento y el rigor


Hecho el razonamiento anterior y ejemplificado en los casos que con más frecuencia me encuentro, tiendo a adoptar una visión un poco más optimista de cómo son usadas estas herramientas y metodologías.

No digo que no exista desconocimiento y superficialidad, que existen y bastante, y no digo que no exista un cierto 'postureo', que también existe y probablemente bastante, pero al menos me queda la expectativa de que, aunque seguramente bajo un nombre incorrecto, al menos se estén aplicando unos principios y patrones que sí pueden ser correctos y útiles. 

Dicho lo cual, a pesar de todo, reclamo, aunque sé que en vano, la profundización en el conocimiento real de las herramientas y tecnologías y que se usen por su nombre cuando realmente se está aplicando esa herramienta o metodología.

Y defiendo y abogo también, cuando tenga sentido, se apliquen sólo algunos de sus patrones y principios pero, cuando eso suceda, sea mediante una identificación y selección consciente de esos patrones y sin aplicarles un nombre que no les corresponde.

Esa es mi propuesta y ese es mi deseo. La propuesta aquí está. El deseo, creo que ni el genio de la lámpara me lo va a conceder :).


Conclusiones


Por debajo de las herramientas y metodologías más populares de análisis y gestión empresariales, subyacen unos principios y patrones básicos. 

La confluencia, por el lado negativo, de una cierta ignorancia y superficialidad en muchos adoptantes, y en el lado positivo, de unos patrones y principios básicos de utilidad mucho más general, hace que con frecuencia se apliquen  fuera del ámbito que les es propio y con un nombre que sería incorrecto.

Sin embargo, si reforzásemos el conocimiento y consciencia tanto de metodologías como de patrones, podríamos aplicar con mucho provecho los segundos, sin adjudicarles el nombre las primeras. 


miércoles, 13 de noviembre de 2024

Notas sobre aprendizaje por refuerzo (X): locomoción de robots

Como ya comentamos en un artículo anterior, uno de los posibles usos de los modelos de aprendizaje por refuerzo especialmente en el caso de los problemas continuos y basados en políticas, es el de la locomoción de robots, un tema que me interesa particularmente y que puede experimentar una mayor atención en un futuro inmediato dado el interés que, al menos desde el punto de vista mediático, despiertan los robots humanoides.

En este post, y basándome como siempre en esta serie en los contenidos del libro 'Deep reinforcement learning' de Aske Plaat, voy a hablar brevemente de esa locomoción de robots.

Un muy breve repaso


En toda esta serie de posts, realizo al principio un repaso de lo ya visto, pero en este caso va a ser muy breve, ya que no resulta muy necesario para lo que sigue.




Sólo recordar que en aprendizaje por refuerzo nos encontramos en la situación en que un agente (que en este caso va a ser un robot) va a interactuar con un entorno (real o simulado). Al aplicar acciones sobre ese entorno, puede generar cambios de estado en el mismo y, cuando se producen, el agente recibe una recompensa.

Las acciones se deciden mediante una política que es lo que, en el fondo, queremos aprender, de forma que maximicemos la recompensa acumulada.

En problemas de alta dimensionalidad de estados se aplica deep learning dando lugar al 'deep reinforcement learning'

Nos encontramos ahora en el punto en que el espacio de estados realmente es continuo y por tanto, más que trabajar, como en otros casos, con base en los valores de los diferentes estados, lo que hacemos es intentar aprender la política directamente.

Y uno de los campos de aplicación, es este de la locomoción de robots.

La locomoción de robots


La locomoción de robots se refiere al movimiento de robots autónomos, y cobra especial relevancia en el caso de robots cuyo movimiento no se apoya en ruedas sino en alguna forma de patas como los robots humanoides (dos piernas) o los 'robots perro' (cuatro patas) u otro tipo de robots con varias patas que semejan más alguna forma de insecto o crustáceo.

A los seres con patas naturales, básicamente animales, esas patas o piernas nos permiten desplazarnos (andar) pero también trotar, correr, saltar, subir escaleras, etc. En general, y aunque algunos robots como los de Boston Dynamics, muestran unas capacidades de movimiento extraordinarias, cuando trabajamos con robots, especialmente cuando investigamos, en este caso en el ámbito de aprendizaje por refuerzo, tendemos a simplificar las exigencias. 

Así se trabaja (más a nivel de investigación y simulación que de aplicación real) en robots de una sola pierna capaces de saltar, robots bípedos (típicamente humanoides) capaces de andar y saltar, y robots cuadrúpedos capaces de coordinar sus patas para moverse.

El aprendizaje de las políticas necesarias para esa locomoción ha demostrado ser computacionalmente muy intensivo, por lo que se han buscado simplificaciones y simulaciones.

En la obra citada se menciona, por ejemplo, el entorno Gym Mujoco, hoy en día trasladado a Gimnasium y la utilidad que ha demostrado, por ejemplo, el modelo del 'medio guepardo' ('Half cheetah').




En ese mismo entorno, desarrolladores e investigadores pueden trabajar también con otros modelos como, por ejemplo, el humanoide.



En algunos de estos estudios se ha acudido a esquemas simples, pero por ello exigentes, como recompensar de forma positiva al robot sólo por moverse hacia adelante y sólo con eso el robot (simulado) debe aprender a controlar todas sus articulaciones por mero ensayo y error (como en el fondo se aprende un poco siempre en aprendizaje supervisado).

Los resultados se pueden ver en el siguiente vídeo:




Aunque no lo hemos explicado en esta serie de posts, y sólo a efectos de referencia para el lector avanzado, en estos trabajos se han utilizados algoritmos 'advantage actor critic' con regiones de confianza ('trust regions').

En la referencia que seguimos, se menciona algún otro trabajo exitoso usando algoritmos PPO distribuidos.

Interacción visuo-motora


Otro campo de aplicación del aprendizaje por refuerzo dentro de la robótica es en la coordinación visuo-motora, es decir, en la coordinación entre  lo que 'el robot ve' y los movimientos que ejecuta en consecuencia, lo que en seres humanos podría ser la coordinación ojo-mano.

Esto supone un paso hacia la realidad de las soluciones. En muchas simulaciones las entradas del robot son características proporcionadas por el propio entorno de simulación pero ahora añadimos cámaras que proporcionan imagen real y el robot debe aprender a partir de las imágenes que proporciona esa cámara, y a partir de ahí inferir cómo debe mover sus articulaciones.

Se trata ya de un problema muy complejo (quizá porque ya es muy cercano a la realidad) pero en el libro se menciona algún éxito usando la suite de control de DeepMind.

Conclusiones


Con los modelos para espacios continuos hemos alcanzado un campo de aplicación enormemente interesante y prometedor y que es muy de mi interés personal: el de la locomoción de robots.

Todavía se trabaja en muchos casos experimentando en entornos simulados, pero parece que los resultados que se obtienen, así como las demostraciones hechas por algunos fabricantes de robots avanzados, permiten abrigar expectativas de buenos avances y resultados.

Artículos de este blog relacionados


viernes, 1 de noviembre de 2024

El servicio Azure OpenAI explicado por Adrián González Sánchez

He leído con ilusión el libro 'Azure Open AI services for cloud native applications', no sólo por mi claro interés en la temática (tanto en lo relativo a la inteligencia artificial generativa, como a las arquitecturas cloud nativas y la oferta de hiperescaladores como Microsoft) sino también por conocer personalmente, y apreciar, a su autor, Adrian González.

Nos encontramos ante un libro serio y bien fundamentado, que trata de manera rigurosa, el servicio Azure OpenAI lo que, además, arrastra consigo la explicación de muchos aspectos técnicos relevantes más allá del propio servicio o la propia oferta de Microsoft en Azure.

El contenido se estructura en siete capítulos, como sigue:
  • '1. Introduction to Generative AI and Azure OpenAI Service:' Un capítulo para fijar conceptos previos. Empieza con la disciplina de la inteligencia artificial explicando, por ejemplo, las formas de aprendizaje o los casos de uso habituales Sigue con inteligencia artificial generativa comentando sus capacidades, los modelos fundacionales o los principales actores actuales de la industria. Y finaliza poniendo en suerte lo que seguirá en siguientes capítulos, ya que introduce el concepto de Copilot y una muy rápida introducción del servicio Azure OpenAI.

  • '2. Designing Cloud Native Architectures for Generative AI:' Como una preparación, ya mucho más profunda y técnica al servicio Azure OpenAI, este capítulo explica elementos arquitecturales en relación con la nube, fijando lo que son las arquitecturas cloud nativas, los microservicios, los contenedores, 'serverless o el modelo DevOps de integración y despliegue continuos CI/CD. Y luego, ya desde un plano mucho más práctico, presenta el portal Azure y los modelos de servicio del servicio OpenAI.

  • '3. Implementing Cloud Native Generative AI with Azure OpenAi Service:' Quizá el capítulo nuclear, el que más explica realmente el servicio Azure OpenAI y sobre todo, cómo usarlo. Comienza explicando cómo fijar o ampliar el conocimiento que utilizará el modelo mediante el empleo del modelo tal cual es, o su extensión mediante técnicas de 'fine tunning' o RAG. Luego cuenta los diferentes componentes ('building blocks') del servicio Azure Open AI dentro de Azure Studio (Assistants playgound, Chat playground, Completions playground, DALLE-E playground y Bring your own data). A continuación, aborda los diferentes enfoques de implementación según se use el modelo tal cual, o se entrene mediante ejemplos, o se amplie con 'fine tunning' o RAG. Finaliza explicando formas de evaluar el desempeño de la solución creada.

  • '4. Additional Cloud and AI Capabilities:' Un capítulo un poco 'collage' pero muy interesante, donde explica aspectos relacionados de forma algo más indirecta con el servicio Azure OpenAI. Comienza explorando un poco el ecosistema global con diferentes soluciones complementarias o alternativas como la orquestación mediante Langchain, el SDK de software abierto 'Semantic Kernel', el framework LlamaIndex, el Bot Fraework de Azure para la construcción de chatbots tradicionales (previos a la explosión de la IA Generativa) y otros productos de Microsoft como la Power Platform, Copilot o AI Builder. En el siguiente bloque pasa revista a los almacenes de vectores ('vector stores') tan importantes en RAG y, en concreto, revisa Azure AI Search, Cosmos DB, Azure DataBricks, Redis, etc. En el tercero y último bloque del capítulo examina otros elementos relevantes de la plataforma Azure como son Azure AI Document Intelligence, Fabrics Lakehouse, Azure AI Speech o Azure API Management.

  • '5. Operationalizing Generative Ai Implementations:' Aborda aspectos mas relacionados ya con el despliegue e incluso el uso de servicios basados en Azure OpenAI, como son la ingeniería de instrucciones ('prompt engineering'), la operación de servicios basados en grandes modelos de lenguaje, la adaptación de las ideas de DevOps y MLOps al caso de los grandes modelos de lenguaje, la llamada LLMOps, incluyendo el denominado 'prompt flow', la securización de los modelos y el tratamiento de la privacidad y el cumplimiento normativo. Y finaliza con una mirada a los aspectos de uso responsable y de regulación.

  • '6. Elaborating Generative AI Business Cases:' De alguna forma se acerca a los pasos a dar en un proyecto. Comienza con el análisis 'pre-mortem' (qué podría ir mal), sigue con la selección del enfoque de implementación, la identificación de tareas y recursos, la estimación de duraciones y esfuerzos y la creación de un 'roadmap'. Luego proporciona consejos sobre cómo definir y dimensionar un caso de uso y finaliza con una visión de caso de negocio con el cálculo de costes y retorno de la inversión.

  • '7. Exploring the Big Picture:' Un curioso capítulo final en que, mediante entrevistas, se exploran aspectos relevantes del panorama actual que rodean a la IA Generativa o a la nube. En concreto, dialoga con David Carmona, Brendan Burns, John Maeda, Sara Bird, Tim Ward, Seth Juarez y Saurabh Tiwari.

'Azure OpenAI service for cloud native architectures' es un gran recurso para entender, no sólo el propio servicio que justifica el libro, sino todos los elementos técnicos, arquitecturales e incluso de gestión que lo rodean, específicamente cómo trabajar con grandes modelos de lenguaje y cómo trasladarlos a casos de uso reales así como todo el ecosistema que rodea a la IA Generativa y el mundo cloud. Un libro que quizá por ello podríamos decir que trasciende un poco lo que es su objetivo primario, proporcionando muchos, muy interesantes y muy bien explicados conceptos de inteligencia artificial generativa y de aquitecturas cloud, con una visión quizá bastante más amplia de lo que el título pueda sugerir.

Un libro técnico pero que ofrece una mirada global, claro y bien escrito, con la calidad, en fin, que cabe esperar de los libros de O'Reilly, y para mi, y en este caso concreto, del conocimiento y buen hacer de su autor.

Recomendable, sin duda.

Adrián González Sánchez

(Fuente: Fuente: Ligera elaboración propia de su ficha de profesor en ENAE)

Adrián González Sánchez
Destacado experto en Inteligencia Artificial y Tecnología, enfocado en la ética de la IA y la regulación de la UE. Actualmente, forma parte del equipo de Microsoft como Principal Specialist in Cloud, Data and AI for Public Sector.

Adrián González también imparte clase en ENAE Business School y en otras prestigiosas instituciones como Concordia University o École des dirigeanst HEC Montréal.

Asimismo, ha ocupado puestos como ejecutivo tecnológico, asesor de empresas y coach, por lo que cuenta con experiencia en múltiples industrias como Telecomunicaciones, Educación, Cadena de Suministro, Retail y Fintech. Además, tiene experiencia en desarrollo de software y cloud computing, siendo cofundador de una startup.

En este sentido, ha ocupado puestos como CTO en Smartbonds; Artificial Intelligence Consultant en IVADO Labs; y miembro del comité de LF AI and Data Fundation. Además también es miembro del Observatorio del Impacto Social y Ético de la IA (OdiseIA) y de FiinOps Foundation.

Posee certificaciones como Certified Product Manager (CPM®) y Certified Scrum Product Owner (CSPO®), y tiene habilidades en gestión de proyectos, estrategia, arquitectura y productos para proyectos de Ciencia de Datos, IA, Cloud y Blockchain.

Además, comparte sus conocimientos y experiencias en su blog en Medium y en redes sociales como Twitter y Clubhouse. Adicional, Adrián González Sánchez es autor en la editorial O’Reilly donde es autor del libro 'Azure OpenAI Service for Cloud Native Applications', además de haber colaborado en diversas publicaciones:

  • Case Study: How the Port of Montreal Used NLP to Fast-Track Critical Cargo in 2020
  • Azure OpenAI for Cloud Native Applications
  • Kubernetes and Cloud Native Associate (KCNA) Study Guide

Puedes conocer más del autor visitando su perfil en LinkedIn o siguiéndole en X donde se presenta como @adriangs86.

Ficha técnica:


EDITORIAL: O'Reilly Media
AÑO: 2024 
ISBN: 978-1098154998
PAGINAS: 246

miércoles, 30 de octubre de 2024

Notas sobre aprendizaje por refuerzo (IX): aprendizaje de políticas y el ascenso de gradiente

En esta ya larga serie de posts que estoy dedicando al aprendizaje por refuerzo ('reinforcement learning'), nos habíamos quedado en el punto en que estábamos tratando con problemas en que ya usábamos redes neuronales como parte del algoritmo ('deep reinforcement learning') y que, además, nos enfrentábamos a un espacio de estados continuo, como el que ocurre, por ejemplo, en la locomoción de robots. 

Y habíamos pasado a trabajar directamente con políticas, desentendiéndonos de los valores. En este post vamos a avanzar sólo un poquito más, indicando una de las formas habituales en que se hace eso, utilizando, como es tan común en deep learning, el concepto de gradiente


Repasando


Antes de revisar las nuevas ideas, el repaso habitual, tomando como esquema la ya muy conocida figura:



Nos encontramos ante la situación de un agente (por ejemplo un robot) que interacciona con un entorno. Ese entorno se encuentra en un estado s. La interacción del agente con el entorno se concreta en la ejecución por parte del agente de acciones, a. Como consecuencia de esas acciones, el entorno puede experimentar una transición a un nuevo estado s' y el agente recibir una recompensa r. El agente decide la acción a aplicar en cada momento, siguiendo una política π.

Lo que pretendemos en el aprendizaje por refuerzo es aprender la mejor política π, de forma que se maximice la recompensa acumulada.

Los algoritmos más básicos, con unos estados discretos y de número reducido en el entorno, utilizan mecanismos basados en tablas (algoritmos tabulares) en que, para cada estado, se obtiene un valor de recompensa acumulada. Hablamos de recompensa acumulada porque lo que se busca no es optimizar la recompensa ante una acción aislada, sino ante una secuencia de acciones. Esa secuencia de acciones y sus consiguientes transiciones de estados y recompensas constituye lo que se denomina una trayectoria y, al final, en una trayectoria, tendremos una recompensa acumulada.

Lo métodos tabulares, como decimos, establecen en una tabla, el valor de esa recompensa acumulada esperada, que se tabula por cada estado (V) o por cada estado-acción (Q).

Cuando la dimensión del problema es muy grande, dejamos de trabajar con estados, la situación del entorno la representamos por unas características y usamos redes neuronales para implementar las funciones de valor y la política, conduciendo al 'deep reinforcement learning'.

El último paso visto en el post anterior es cuando estamos en una situación con estados y acciones no discretos sino continuos. Y nos quedamos diciendo que, en esa situación, nos olvidamos de trabajar con esa función Q que nos daba la recompensa acumulada esperada para un estado-acción sino que trabajamos directamente con la política π


El esquema de funcionamiento


Siguiendo, como en toda esta serie de posts, lo indicado el  libro 'Deep reinforcement learning' de Aske Plaat, observamos que el esquema básico de funcionamiento en ese aprendizaje de una política en un problema continuo, se puede resumir en los siguientes pasos


  • Inicializamos los parámetros θ de la política

  • Hasta que se alcance la convergencia, repetimos

    • Muestreamos una nueva trayectoria τ

    • Si τ es una 'buena trayectoria', modificamos los parámetros θ en la dirección de 'acercarnos' a esa trayectoria. Si se trata de una 'mala trayectoria', por el contrario, modificamos los parámetros en el sentido de 'alejarnos' de esa trayectoria.


Claro, para que este esquema de algoritmo sea operativo, necesitamos alguna forma de ver eso de que una trayectoria 'es buena' o 'mala', es decir, necesitamos medir lo que se denomina la calidad de la política, J. Una forma posible de hacerlo es retornar a las funciones valor, V, y tomar como calidad de la política el valor de la política en el estado inicial, s0, según esa función V, lo que expresado matemáticamente sería


J(θ) = Vπ(s0)


Y, lógicamente, lo que queremos es maximizar esa calidad de la política. Suponiendo que esa calidad es una función diferenciable (cosa que ya se imaginará el lector vamos a buscar de forma explícita y que no sucederá por casualidad), lo que vamos a hacer es trabajar con el gradiente . El gradiente nos da la variación de esa función de calidad ante un cambio de parámetros. Matemáticamente, eso significa hacer unas derivadas parciales en cada una de las dimensiones pero, geométrica e intuitivamente, implica calcular y utilizar la 'inclinación' de la superficie definida por por la función calidad de la política y, formalmente, se expresaría como


θJ(θ) = ∇θVπ(s0)


En cada iteración, ajustaremos los parámetros θ aplicando la sencilla fórmula


θt+1 = θt + α · ∇θJ(θ)


Es decir, en cada paso, los parámetros se ajustan sumándoles el gradiente de la calidad de la política (es decir, cómo varía), multiplicados por un factor de aprendizaje, α, que es un número real positivo, con frecuencia comprendido entre 0 y 1.

Los lectores familiarizados con las matemáticas en general y con las matemáticas del machine learning y el deep learning en particular, seguramente ya habrán pensado en el algoritmo de descenso de gradiente, tan habitual, por ejemplo, en el aprendizaje de redes neuronales. Y habrán pensado bien porque, en efecto, esa es la idea, con la única sutil diferencia de que, mientras en el aprendizaje de deep learning habitual buscamos normalmente minimizar una función error, en este lo que queremos es maximizar esa calidad. Por ello, en lugar de un descenso de gradiente, usamos un ascenso de gradiente, pero la idea es prácticamente la misma.

Para resumir un poco la idea, lo que vamos a hacer es implementar la política como una red neuronal (recordar que ya estamos en 'deep reinforcement learning'), inicializar sus parámetros (sus pesos) de alguna forma, normalmente de manera aleatoria, y luego hacer un aprendizaje iterando por trayectorias y ajustando esos pesos mediante un ascenso de gradiente aplicado a la calidad de la política medida como el valor de esa política en el estado inicial.

Esta forma de actuar se utiliza, por ejemplo, en el método REINFORCE.


Otros métodos


En el libro citado, se mencionan y explican otras formas de  trabajar para optimizar esa política, como 'actor critic' o TRPO, pero no entraremos en ellos, al menos de momento, y sólo dejar constancia de que existen.


Conclusiones


Aunque hay varios métodos y algoritmos para conseguir trabajar en el caso de problemas continuos en la optimización directa de una política parametrizada, normalmente implementada como una red neuronal, hemos esbozado como se realiza aplicando el ascenso de gradiente sobre una calidad de política que se mide como el valor de esa política en un estado inicial.


Artículos de este blog relacionados


miércoles, 23 de octubre de 2024

Notas sobre aprendizaje por refuerzo (VIII): problemas continuos y métodos basados en políticas

Y damos un paso más en nuestro recorrido por las particularidades algorítmicas y técnicas del aprendizaje por refuerzo ('reinforcement learning').

En este post vamos a introducir un pequeño cambio de tercio centrándonos en problemas en que el espacio de estados es continuo (y, por tanto, de alguna forma infinito), por lo que debemos cambiar la perspectiva y no basarnos en las funciones del estado, sino en las propias políticas.

¿Te suena extraño ese vocabulario, estimado lector? 

Bueno, pues como en todos los posts anteriores de esta serie, vamos a hacer un breve repaso.


Recordatorio: Aprendizaje por refuerzo y deep reinforcement learning

Los seguidores de esta serie de posts ya conocen bien lo que viene a continuación:



Nos hallamos ante problemas en que un agente interacciona con su entorno, aplicando unas acciones (a) y recibiendo unas recompensas (r) por ello. El entorno está definido por un estado (s) y, al recibir la acción a del agente, eventualmente se produce un cambio de estado a s', momento en que se genera la recompensa r. Para decidir qué acción aplicar en cada momento, el agente aplica una política π. Lo que queremos conseguir es que el agente aprenda la mejor política, aquella que maximice su recompensa acumulada (es decir, no la recompensa ante una acción concreta sino ante toda una serie de acciones que conduzcan, eventualmente a un estado final).

Los algoritmos que hemos visto hasta ahora, se apoyan en la implementación de unas funciones valor para un estado (V) o valor para un estado y acción dados (Q), que nos proporcionan, precisamente, la estimación de la recompensa acumulada.

En los algoritmos más sencillos, aquellos aplicables cuando el entorno exhibe un número finito y no muy alto de estados, utilizábamos un enfoque tabular, trabajando con tablas indexadas con base a estados.

Cuando la dimensionalidad del problema crecía mucho, es decir, el número de estados posibles era demasiado alto, teníamos que cambiar el enfoque. Y ese cambio de enfoque nos llevaba a renunciar a conocer los estados como tal y, en lugar de ello, caracterizar la situación del entorno mediante un conjunto de características. Además, pasábamos a implementar las funciones principales del problema, las funciones de valor y la política como redes neuronales profundas, llegando hasta el 'deep reinforcement learning'.


Robótica y espacios de estados continuos


Los algoritmos usados hasta ahora tienen sentido cuando los estados y las acciones posibles eson discretos y están claramente diferenciados. En ellos, las acciones disponibles están muy claras y podemos diferenciar de manera nítida entre la mejor acción y el resto. 

Sin embargo eso no es así en muchos problemas del mundo real, problemas que además aplican a campos que son de mi muy especial interés como la robótica, los vehículos autónomos o los juegos de estrategia en tiempo real.

En concreto, los métodos que veremos, se aplican a robots que caminan o saltan, lo que se denomina 'locomoción'.

En concreto, en el conocido video que se muestra abajo, se ve a un agente, una especie de robot simulado, que aprende a correr y saltar mediante el tipo de algoritmos que en seguida veremos:




Métodos basados en política ('policy-based methods')


Para estos casos, tal y como se nos indica en el libro 'Deep reinforcement learning' de Aske Plaat, cuyo discurso estoy siguiendo en toda esta serie de posts, debemos cambiar el enfoque. Si hasta ahora nos enfocábamos en las funciones de valor de estado o de estado-accion, ahora abandonamos esas funciones y trabajamos directamente con la política a optimizar π

Estos métodos continúan apoyándose en soluciones de redes neuronales profundas que aprenden mediante el famoso algoritmo de descenso de gradiente.

Los tres métodos que menciona la obra mencionada son 'REINFORCE', 'Asynchonous advantage actor critic' y 'proximal policy optimization'.


Espacios de acciones continuos


En el tipo de problemas que estamos tratando, nos concentramos en las acciones, unas acciones que ahora se encuentran también en un espacio continuo. Así, el movimiento de la junta de un robot puede adoptar un valor continuo en radianes, al igual que lo puede hacer la posición del volante de un vehículo autónomo o el giro de sus ruedas.

Así, por ejemplo, y suponiendo que podemos girar una circunferencia completa, podríamos tener un valor contenido en el rango


[0,2π ] ∈ ℜ


donde existen un número de valores posibles infinito. Una opción podría ser discretizar estos valores. Sin embargo, los métodos de que nos ocupamos optan por trabajar directamente con acciones continuas y, por tanto, unas políticas que también son continuas.


Políticas estocásticas


Además, estos métodos utilizan unas políticas estocásticas que se traducen en distribuciones de probabilidad sobre las acciones.

Esta forma de actuar evita la inestabilidad en el caso de entornos estocásticos que aqueja a los métodos vistos hasta ahora basados en valor. Además, estas políticas incorporan 'de serie' el concepto de exploración' que vimos en el quinto post de esta serie cuando explicamos los algoritmos SARSA y Q-learning.


Conclusiones


De momento detengo aquí la exposición. Por supuesto, sólo hemos rascado un poco y delineado el tipo de problemas, algunos campos de aplicación y las bases de los algoritmos sin entrar a explicar con más detalle ninguno concreto, cosa que seguramente hagamos en un próximo post. Pero prefiero ir poco a poco, porque abordamos una temática bastante compleja.

Lo más interesante, es que nos estamos introduciendo ya en algoritmos muy cercanos a las complejas aplicaciones reales, más allá de los juegos y, en concreto, en elementos muy avanzados propios de la robótica o los vehículos autónomos, que me interesan especialmente.


Artículos de este blog relacionados