Mostrando entradas con la etiqueta Deep Learning. Mostrar todas las entradas
Mostrando entradas con la etiqueta Deep Learning. Mostrar todas las entradas

martes, 4 de febrero de 2025

Notas sobre aprendizaje por refuerzo (y XV): meta aprendizaje

Y con este post voy a poner fin ya a esta larga serie de artículos sobre aprendizaje por refuerzo, una serie inspirada y guiada por los contenidos del libro 'Deep reinforcement learning' de Aske Plaat. 

En este último artículo hablaremos del meta aprendizaje.

Pero antes de entrar en materia, como siempre en la serie, repasemos brevemente lo visto en los posts anteriores.


Recordatorio: lo que hemos visto de aprendizaje por refuerzo


El esquema que nos ha guiado durante toda la serie, ha sido el expresado en la siguiente figura que, a estas alturas, y si has seguido la serie, debería resultarte muy familiar:


Nos ocupamos inicialmente de la situación de un agente que interactúa con 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 lo largo de una secuencia o trayectoria.

Los métodos más básicos, aquellos en que el espacio de estado es reducido, siguen, decíamos, 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. 

También aparecía como opción el denominado aprendizaje basado en modelos ('model-based'), en que el agente primero consigue un modelo del entorno y luego ya prescinde del entorno propiamente dicho par a trabajar con ese modelo local durante todo el entrenamiento.

Hasta aquí estábamos en la situación de trabajar con un único agente.

Posteriormente vimos el caso en que teníamos dos agentes, exactamente dos y que se encontraban en una situación competitiva, en uno de los denominados juegos de suma cero en que la ganancia de un agente supone la perdida del otro. En esa situación, una opción habitual era trabajar con el aprendizaje basado en modelos, dado que, para un agente, el entorno está constituido por el otro agente, y se adopta la hipótesis razonable de que su política, la del otro agente, es igual a la nuestra, por lo que modelamos el entorno con el modelo de nuestra propia política. 

Eso, además, conducía a la posibilidad del autoaprendizaje o auto-juego ('self-play'), en que un agente aprende jugando, en el fondo, contra sí mismo (contra otro agente con la misma política, en realidad). Vimos que mediante los problemas mono-agente, se podían tratar problemas como la locomoción de robots, la búsqueda de rutas o videojuegos. 

Luego exploramos la situación multi-agente, en los cuales no sólo se produce una competición sino también una colaboración entre agentes y un campo del que decíamos se encontraba fundamentalmente en investigación.

Y, finalmente, en el post previo a éste hablamos brevemente de aprendizaje jerárquico, en el que se divide un problema complejo en sub-problemas más gestionables, lo que aumenta nuestra potencia de resolución de problemas complejos y proporciona un esquema más robusto y reutilizable. A cambio, existe el riesgo cierto de no alcanzar soluciones óptimas a nivel global porque, durante el proceso optimizamos la resolución de los sub-problemas pero no tanto el problema en su conjunto.


Reutilizando el conocimiento


La idea principal que subyace al meta aprendizaje es la reutilización de lo ya aprendido. Y eso, en parte, por una inspiración en cómo funciona el conocimiento humano, en que un nuevo conocimiento se apoya en el anterior, y, por otro lado, por una mera necesidad de eficiencia, de reducir lo máximo posibles las necesidades de entrenamiento de los algoritmos, una labor lenta y muy consumidora de tiempo, datos y energía.

En esta intención, nos encontramos con dos conceptos que, en el fondo, se parecen: la transferencia de aprendizaje, o 'transfer learning' y el meta aprendizaje o 'meta learning' propiamente dicho


Transferencia de aprendizaje (transfer learning)


Uno de los problemas del machine learning tradicional es que, cada vez que se quería entrenar un algoritmo o un modelo, se partía de cero, es decir, es como si, aunque ya dispusiésemos de un modelo con un cierto conocimiento, como si eso no valiese y hubiera que desaprenderlo todo para volver a empezar a aprender desde la base: había que, quizá, rediseñar los hiperparámetros de la, por ejemplo, red neuronal, había tomar un nuevo conjunto de datos de entrenamiento, dedicar el tiempo y la computación necesaria para realizar ese entrenamiento y utilizando los conjuntos de datos de prueba, testear y validar el modelo.

Es como si, aplicando la popular expresión, 'no hubiésemos aprendido nada'.

Esa estrategia, aparte de que intuitivamente contradice la forma de aprender humana, era económica y operativamente muy ineficiente.

Hablo en pasado, no porque sea un problema completamente superado, que no lo es, pero sí porque ya existen muchas vías de reutilización del conocimiento en los modelos de machine learning: lo que se conoce como transferencia de conocimiento o 'transfer learning'.

Así, por ejemplo, es sabido que, en el caso de las redes neuronales de convolución aplicadas a visión artificial, las primeras capas, por decirlo de alguna manera, se especializan en detectar ciertas características genéricas de las imágenes como bordes o esquinas, y que son las capas finales, en ocasiones capas densas de tipo perceptrón multicapa, las que proporcionan el resultado final. En este ámbito ya se ha experimentado con éxito con el entrenamiento de capas de convolución en una especie de 'visión general', que luego se utiliza en otros modelos más especializados que se reeentrenan pero en menor media o que añaden, por ejemplo, algunas capas adicionales.

En general este tipo de técnicas se aplican en redes neuronales profundas ('deep learning') y la forma de hacer el transfer learning es, por decirlo de alguna manera, transferir la red neuronal, con sus hiperparámetros (ej. número de capas o número de neuronas por capa) ya definidos y con los pesos (los parámetros) ya ajustados mediante el pre-entrenamiento.

En cierto sentido, ese transfer learning se ha elevado a una altísima expresión en los modelos generativos, como los GPT (no en vano, la P de GPT significa pre-trained) y en los denominados modelos fundacionales, unos modelos que están pre-entrenados por los grandes del sector como OpenAI pero que luego pueden ser especializados mediante 'fine tunning' o incluso, en otro tipo de estrategias, personalizados mediante interacción con el usuario a través de la incorporación de contenido aportado por un buscador o mediante las técnicas de RAG ('Retrieval Augmented Generation').


Meta aprendizaje ('meta learning')


En cierto sentido, el meta aprendizaje es una generalización del 'transfer learning'. Si en el transfer learning lo que pretendemos es transferir el conocimiento de una tarea concreta (por ejemplo una tarea de visión), lo que pretendemos con el meta aprendizaje es transferir el conocimiento de varias tareas (recogido sobre todo en hiperparámetros) para que el modelo o algoritmo resultante sepa como aprender una nueva tarea. Atención que hemos dicho que sepa aprender, no que sepa cómo hacer una nueva tarea, sino cómo aprender a hacerla, de ahí que hablemos de meta aprendizaje (aprender a aprender).

Eso, llevado a las redes neuronales del deep learning, lo que quiere decir es que, lo que transferimos en meta aprendizaje son más los hiperparámetros de la red (que definen su arquitectura y funcionamiento base) que los parámetros propiamente dichos (que reflejan de alguna forma el conocimiento adquirido), precisamente por la estrategia de aprender a aprender, más que de 'venir aprendido'.

Todavía se trata de un área de investigación pero existen ya varios algoritmos y entornos en funcionamiento. Entre los algoritmos, la fuente bibliográfica en que me baso menciona, por ejemplo, RecurrentML, Meta Network,  SNAIL, MAML y unos cuantos más. También proporciona algunos detalles matemáticos de este tipo de algoritmos pero no voy a entrar en esos detalles.


Conclusiones


Como podemos ver, algunos de los enfoques más avanzados en el campo del machine learning y sobre todo del deep learning es ver cómo podemos reutilizar conocimiento, al igual que hacen los humanos, para construir nuevo conocimiento o nuevas capacidades incluyendo ese aprender a aprender que parece un gran objetivo final.


***


Aunque, evidentemente, hay mucho más que decir, y seguro que mas que habrá en el futuro, de momento cierro esta larga serie (quince artículos) que he dedicado al aprendiza por refuerzo. No quiere decir que no vaya a tocar este campo de nuevo, sino que, caso de hacerlo, será ya, seguramente, como un post regular y probablemente apoyado en otras fuentes bibliográficas u otras reflexiones.


Artículos de este blog relacionados


lunes, 20 de enero de 2025

Notas sobre aprendizaje por refuerzo (XIV): aprendizaje jerárquico

Había dejado en suspenso la serie de posts dedicados al aprendizaje por refuerzo, por aquello de los 'fatos navideños' y porque, entre medias, hubo también temas que me apeteció tratar antes.

Pero llega el momento de volver al tema y ponerle fin, lo que haré acometiendo los pocos posts restantes (dos o tres), de los cuales este es el primero. 

Y en él voy a esbozar alguna idea básica sobre el denominado aprendizaje por refuerzo jerárquico ('hierarchical reinforcement learning'). Y lo haré, como siempre en esta serie, apoyándome en lo que explica Aske Plaat en su libro 'Deep reinforcement learning'.

Pero antes, como siempre en esta serie de artículos, un repaso de lo visto hasta la fecha.


Recordatorio: lo que hemos visto de aprendizaje por refuerzo


El esquema que nos ha guiado, ha sido el siguiente:


Nos ocupamos inicialmente de la situación de un agente que interactúa con 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 lo largo de una secuencia o trayectoria.

Los métodos más básicos, aquellos en que el espacio de estado es reducido, siguen, decíamos, 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. 

También aparecía como opción el denominado aprendizaje basado en modelos ('model-based'), en que el agente primero consigue un modelo del entorno y luego ya prescinde del entorno propiamente dicho par a trabajar con ese modelo local durante todo el entrenamiento.

Hasta aquí estábamos en la situación de trabajar con un único agente.

Posteriormente vimos el c aso en que teníamos dos agentes, exactamente dos y que se encontraban en una situación competitiva, en uno de los denominados juegos de suma cero en que la ganancia de un agente supone la perdida del otro. En esa situación, una opción habitual era trabajar con el aprendizaje basado en modelos, dado que, para un agente, el entorno está constituido por el otro agente, y se adopta la hipótesis razonable de que su política, la del otro agente, es igual a la nuestra, por lo que modelamos el entorno con el modelo de nuestra propia política. 

Eso, además, conducía a la posibilidad del autoaprendizaje o auto-juego ('self-play'), en que un agente aprende jugando, en el fondo, contra sí mismo (contra otro agente con la misma política, en realidad). Vimos que mediante los problemas mono-agente, se podían tratar problemas como la locomoción de robots, la búsqueda de rutas o videojuegos. 

En el último post, exploramos la situación multi-agente, en los cuales no sólo se produce una competición sino también una colaboración entre agentes y un campo del que decíamos se encontraba fundamentalmente en investigación.


El enfoque jerárquico


El enfoque jerárquico de aprendizaje por refuerzo se basa, en realidad, y en primer lugar, en la estrategia de dividir un problema en sub-problemas, una técnica muy conocida del ámbito de la resolución de problemas. Hecha esa subdivisión, nos planteamos el aprendizaje de cómo realizar (cuál es la mejor política) para resolver cada sub-problema.

Se trata de un enfoque aplicable en teoría a cualquier problema secuencial, aunque en la práctica es más viable en unos tipos de problemas que en otros.

Algún problema muy adecuado para este enfoque sería, por ejemplo, el de la navegación de vehículos o robots. Igualmente, los problemas multi-agente que mencionábamos en el último post de esta serie, tienden a poder dividirse de manera natural en sub-problemas. 

Un riesgo de este enfoque jerárquico es que, dado que  buscamos sub-políticas, o por decirlo de otra mamera., optimizamos a nivel de sub-problemas, es posible que no consigamos una optimización absoluta a novel global, a nivel de todo el problema. De esta forma, el enfoque jerárquico tiende a dar soluciones menos óptimas que el enfoque, digamos, 'plano', pero haciéndolo más rápido.


Ventajas y desventajas del aprendizaje jerárquico


Podríamos decir que el enfoque jerárquico tiene las siguientes ventajas respecto al enfoque 'plano' (no jerárquico.


  • Simplifica la resolución de problemas mediante abstracciones. Los agente resuelven problemas granulares que resultan abstracción del problema en sub-problemas. Luego, las tareas granulares se agrupan en los problemas de mayor nivel de abstracción.

  • Se reduce el número de interacciones necesarias con el entorno, lo que conduce a eficiencia de muestreo. Entre otras cosas, se puede hacer 'transfer learning' de la resolución de subtareas aplicables en otros problemas.

  • Las políticas finales resultantes tienden a ser más generalistas, con mayor capacidad de adaptación a nuevas situaciones y por tanto se reduce la fragilidad de las mismas.

  • Permite resolver problemas mayores y más complejos.


A cambio, presenta las siguientes desventajas:


  • Necesita de, o al menos le resulta muy conveniente, un conocimiento del dominio del problema.

  • Presenta problemáticas de complejidad algorítmica en relación a la identificación de sub-objetivos, el aprendizaje de sub-políticas y las condiciones de terminación.

  • Introducen la idea de macro-acciones (combinaciones de acciones primitivas), el número de las cuales puede crecer de manera que se haga intratable y precise de enfoques aproximados.

  • La calidad de la política final, como ya dijimos, puede ser sub-óptima.


Un breve excurso: agentes


No he podido evitar, al hablar de este enfoque jerárquico, y de esa descomposición de problemas en sub-problemas, que mi mente se desviara hacia la idea de la Agentic AI, de los últimamente tan traídos y llevados agentes, unas soluciones software, cuyo 'cerebro' son modelos generativos del tipo de grandes modelos de lenguaje y una de cuyas promesas es, precisamente, que van a ser capaces de, recibiendo un objetivo como 'prompt', identificar las tareas (es decir, hacer una forma de descomposición) necesarias para conseguirlo y, a partir de ahí actuar.

No tengo claro de, hasta qué punto, beben esos agentes de las ideas del enfoque jerárquico objeto de este post, o prueban estrategias diferentes. Y tampoco está demostrado hasta la fecha, o al menos no me consta que así sea, que se hayan conseguido éxitos notables en esta materia...pero hay que dar un poco de tiempo. Se supone que los agentes son una de las grandes tendencias de 2025. Habrá que ver de hasta dónde son capaces de llegar en general, y en particular en esta capacidad, quizá su mayor reto,  de descomponer una tarea, o mejor, un objetivo, en subtareas accionables.


Conclusiones


El aprendizaje jerárquico parece un enfoque muy lógico si atendemos, incluso, a cómo razonamos los humanos, para afrontar problemas complejos. Sin embargo, parece ser más un campo de investigación que una realizad plenamente conseguida.

Pero la idea es muy interesante, y habrá que esperar resultados.

A ver si los tenemos en 2025.


Artículos de este blog relacionados


lunes, 16 de diciembre de 2024

Notas sobre aprendizaje por refuerzo (XIII): sistemas multi-agente

Casi todo lo que he comentado en esta larga serie de artículos dedicados al aprendizaje por refuerzo ('reinforcement learning'), se refería a problemas o situaciones en que nos centrábamos en un único agente, del cual queríamos maximizar su política.

En el último post, introdujimos ya el caso de dos agentes.

En este artículo damos un paso más para abordar los escenarios o sistemas multi-agente.

Como en toda esta serie, me guiaré por las enseñanzas recogidas en el libro 'Deep reinforcement learning' de Aske Plaat y, como anuncié en el post anterior, en los últimos artículos de esta serie profundizaré poco en los algoritmos propiamente dichos, delineando sólo las ideas principales.

Vamos, allá, pues, con los sistemas multi-agente.


Recordatorio: lo que hemos visto de aprendizaje por refuerzo


Pero antes, y como en toda esta serie, recordemos brevemente lo que hemos visto hasta ahora.


Mientras nos mantuvimos, en los primeros posts, en el caso de sistemas mono-agente, nos ocupábamos de la situación de un agente que interactúa con 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 lo largo de 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. 

También aparecía como opción el denominado aprendizaje basado en modelos ('model-based'), en que el agente primero consigue un modelo del entorno y luego ya prescinde del entorno propiamente dicho par a trabajar con ese modelo local durante todo el entrenamiento.

Y, en el último post, ya introdujimos brevemente las situaciones en que tenemos dos agentes, exactamente dos. Dos agentes que se encontraban en una situación competitiva, en uno de los denominados juegos de suma cero en que la ganancia de un agente supone la perdida del otro. En esa situación, una opción habitual es trabajar con el aprendizaje basado en modelos, dado que, para un agente, el entorno está constituido por el otro agente, y se adopta la hipótesis razonable de que su política, la del otro agente, es igual a la nuestra, por lo que modelamos el entorno con el modelo de nuestra propia política. 

Eso, además, conduce a la posibilidad del autoaprendizaje o auto-juego ('self-play'), en que un agente aprende jugando, en el fondo, contra sí mismo (contra otro agente con la misma política, en realidad).

Mediante los problemas mono-agente, se pueden tratar problemas como la locomoción de robots, la búsqueda de rutas o videojuegos. Y mediante los problemas de dos agentes, se ha conseguido tratar casos de juegos de mesa, por ejemplo. 


Sistemas multi-agente


Pues bien, ahora damos un nuevo salto de complejidad, abordando los escenarios o sistemas multi-agente, es decir, ya no nos limitamos a uno o dos agentes, sino que el número es mayor e indefinido.

Siendo un poquito formales, los problemas o sistemas multi-agente se podrían definir como problemas de decisión secuencial de múltiples agente autónomos que operan en un entorno estocástico compartido y donde cada uno de los agentes busca optimizar su recompensa a largo plazo mediante la interacción con el entorno y con los otros agentes.

El entrar en sistemas multi-agente, nos introduce además la idea de la colaboración entre agentes. En los casos mono-agente, no tiene sentido ni siquiera plantearlo y, en el caso de dos agentes, el foco ha estado en la competencia entre ellos, en los juegos de suma cero.

Sin embargo en los sistemas multi-agente una situación habitual es que los agentes colaboren para conseguir un objetivo común. Pero tampoco es extraño que los agentes compitan entre sí. Es decir, en los sistemas multi-agente, en general tenemos que contemplar tanto la competición como la colaboración.

Por eso, a la hora de trabajar con ellos, se suele dividir los problemas multi-agente en tres situaciones:


  • Comportamiento competitivo
  • Comportamiento cooperativo
  • Comportamiento mixto


Algunos retos de los sistemas multi-agente


Los sistemas multi-agente se enfrentan a varios retos. En concreto, en la obra citada, Plaat se concentra en tres:


  • Observabilidad parcial
  • Entornos no estacionarios
  • Espacios de estado grandes


El problema de la observabilidad parcial hace referencia que se trata de problemas en que no podemos suponer que el agente disponga de información perfecta sino que, bien al contrario, ésta es incompleta e imperfecta. Así, por ejemplo, un agente puede trabajar con información privada que no pone a disposición del resto de agentes, como se podría ejemplificar con las cartas propias de los jugadores de póker. Esto nos lleva a tener que considerar todos los posibles 'estados del mundo' lo que incrementa enormemente el número de variantes a considerar.

El problema de los entornos no estacionarios se refiere al hecho de que el entorno no permanece estable, dado que los agentes (que, en el fondo, forman parte del entorno para un agente dado) van mejorando sus propias políticas y, por tanto, el entorno para un agente dado, se modifica de manera continuada. De alguna forma, todos los agentes están aprendiendo de manera concurrente. El encontrarnos ante entornos no estacionarios hace que los agentes deban de tener en cuenta una suerte de espacio de acciones conjunto que, no sólo tenga en cuenta sus propias acciones, sino también las del resto de agentes. Esto, de nuevo, incrementa muchísimo, de manera exponencial, el espacio de acciones a considerar.

El tercer reto, espacio de estado grandes deriva, y en el fondo ya lo hemos mencionado, de que la presencia de múltiples agentes aumenta el espacio de acciones de manera exponencial con el número de agentes. De momento, la única forma de acometer estos grandes espacios de acciones es aplicando hipótesis simplificadoras pero realistas.


Aproximaciones


Plaat reconoce que este tipo de problemas no están realmente resueltos de manera general y que se encuentran fundamentalmente en investigación, pero menciona y describe algunos algoritmos o situaciones útiles como el CFR ('Counter Factual Regret minimization'), y su generalización a deep learning: Deep Counter Factual Regret Minimization con resultados interesantes para entornos competitivos.

También se explica la opción de, pese a estar hablando de agentes autónomos, centralizar el aprendizaje lo que, en el fondo, lo hace equivalente a un problema de un solo agente.

E igualmente explica estrategias en que se intenta reducir la complejidad, modelando el comportamiento del oponente basándose para ello en la teoría de la mente procedente del campo de la psicología.

Existen, asimismo, los algoritmos evolutivos (creo que otro nombre para o una derivada de los algoritmos genéticos) que se basan en los mecanismos propios de la biogenética: mutación, recombinación, y selección.

Finalmente, menciona los enfoques propios del 'swarm computing' (computación de enjambre) que se centra en los comportamientos emergentes que surgen en sistemas colectivos, descentralizados y auto-organizados.

No profundizaré más en los algoritmos aunque, especialmente el 'swarm computing' es muy de mi interés, y seguramente vuelva a él en otro momento ya fuera del ámbito del aprendizaje por refuerzo y pensando más en robótica..


Conclusiones


Un nuevo paso en el aprendizaje por refuerzo es el salto a los sistemas multi-agente donde, aparte de un entorno común, tenemos varios agentes autónomos, cada uno de los cuales desea optimizar su recompensa a largo plazo, y que interactúan entre si exhibiendo comportamientos tanto competitivos, como colaborativos o mixtos.

Aunque hay avances, se trata de un campo fundamentalmente en investigación.


Artículos de este blog relacionados


lunes, 9 de diciembre de 2024

Notas sobre aprendizaje por refuerzo (XII): autoaprendizaje y el caso de AlphaGo y AlphaZero

En los últimos tres o cuatro posts de esta ya larga serie dedicada al aprendizaje por refuerzo ('reinforcement learning'), voy a ir algo más rápido, en el sentido de sobrevolar un poco más los temas (que son progresivamente más complejos) y quedarme con  las ideas y enunciados principales, en un nivel algo más divulgativo.

En el post de hoy hablo del caso de autoaprendizaje con dos agentes que, como el propio nombre indica, contiene dos elementos nuevos:

  • El hecho de considerar dos agentes, en lugar de uno sólo, como habíamos hecho hasta ahora
  • El introducir la idea de autoaprendizaje.

Además, esto permitirá saltar de unas ideas que pueden parecer teóricas, a una realización muy concreta y conocida: AlphaGo y su sucesor AlphaZero. 


Repaso: Lo que hemos visto de aprendizaje por refuerzo


Antes, y como siempre en esta serie de posts sobre aprendizaje por refuerzo, un resumen de lo que hemos hablado hasta ahora



Estamos, al menos hasta ahora, ante la situación de un agente que interactúa con 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 lo largo de 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. 

Finalmente, en el último post, hablábamos del aprendizaje basado en modelos ('model-based'), en que el agente primero consigue un modelo del entorno y luego ya prescinde del entorno propiamente dicho par a trabajar con ese modelo local durante todo el entrenamiento.


La interacción de dos agentes


Ahora toca introducir varias novedades. La primera es que vamos a hablar de dos agentes en lugar de uno. Hasta ahora siempre habíamos considerado un agente interactuando con su entorno, pero ahora hablamos de dos agentes interaccionando entre sí.

En la referencia bibliográfica que ha guiado toda esta serie de posts, y que también lo hace con éste, el libro 'Deep reinforcement learning' de Aske Plaat, se nos indica que hay dos motivos que hacen interesante considerar este caso, a saber:


  • Que nos acerca a situaciones más realistas donde es habitual la existencia de varios agentes 
  • Que se han obtenido grandes éxitos en esta variante de aprendizaje por refuerzo, especialmente en el campo de los juegos.


Problemas de suma cero


Nos centramos además, en un tipo de problema muy común en el mundo de los juegos, que son los de suma cero, es decir, la ganancia de un agente supone en la misma medida la pérdida del otro.

Esto supone dos cosas: por un lado, que el entorno para un agente dado, es fundamentalmente el otro agente, y que este entorno es, por decirlo de alguna manera, hostil.

Si en los problemas que habíamos tratado hasta ahora, podíamos considerar al entrono 'neutral' (reacciona a las acciones del agente pero sin ningún 'propósito' ni de beneficiarle ni de perjudicarle) en los problemas de que hablamos ahora, el otro agente, que viene a ser el entorno, trabaja en contra del primer agente (y, as u vez, éste trabaja en contra del segundo agente, naturalmente. Por lo tanto, cuando un agente intenta aprender una política óptima, debe de tener en cuenta todos los posibles contraataques


Autoaprendizaje


Un enfoque para el aprendizaje por refuerzo en este caso es el denominado autoaprendizaje en el que sustituimos al entorno por una copia de nosotros mismos.

¿Qué quiere decir esto?

Nosotros somos uno de los agentes y nos comportamos racionalmente para intentar ganar el juego. Suponemos, evidentemente, que el otro agente es tan racional como nosotros y, por lo tanto, que podría actuar exactamente conforme a nuestra política. Por tanto, el otro agente, y por ende el entorno, tiene exactamente el mismo modelo que nosotros mismos.

Se trata, además, de un caso de aprendizaje basado en modelo, puesto que disponemos de un modelo del entorno.

En el autoaprendizaje se crea una suerte de círculo virtuoso en que usamos el entorno (que es una copia de nosotros mismos) para generar ejemplos de entrenamiento. Con esos ejemplos, mejoramos nuestro comportamiento, nuestra política, y también la del entorno, (que es una copia de nosotros mismos). Y así sucesivamente, tanto el agente como su entorno (que, ¿lo he dicho ya? es una copia de él mismo) van mejorando, y mejorando, y mejorando... sin ningún apoyo externo. Y así hasta la excelencia.

Se me ocurre decir, de mi cosecha, que es, además, una forma de aprendizaje muy económica y práctica, porque no necesitamos de ningún entorno del que aprender o del que obtener información mediante sensores o mecanismos similares.

Anotar finalmente que me estoy tomando la libertad de traducir como 'autoaprendizaje' lo que en realidad sería auto-juego ('self-play') o juego con uno mismo. Me ha parecido que como autoaprendizaje transmitía mejor la idea.


Algunos algoritmos


Como decía al inicio del post, no voy a profundizar en detalles algorítmicos, pero para beneficio del lector más avanzado, y por si 'quiere tirar del hilo' menciono los algoritmos que aparecen en el libro de Plaat.

El autor nos habla de MCTS ('MonteCarlo Tree Search') que es un algoritmo de búsqueda en un árbol o Alpha Zero tabula rasa. 


AlphaGo y AlphaZero.


Como no es difícil de imaginar, este tipo de aprendizaje se adapta de manera excelente al caso de juegos con dos jugadores y reglas muy claras.

Y, en efecto, se ha utilizado, por ejemplo, para jugar al ajedrez o el mucho más complicado juego del Go, dos juegos, tanto el ajedrez como el Go que, aunque complejos, se pueden considerar de información perfecta, en el sentido de que los dos agentes tienen una información completa y precisa de la situación del juego en cada momento.

En este campo del Go son casi míticos los sistemas AlphaGo y AlphaZero, siendo el primero el que batió a Lee Sedol en el legendario encuentro de Mayo de 2016.

AlphaGo, combinaba un aprendizaje supervisado con base en información de jugadores expertos con autoaprendizaje, usando tanto MCTS y autoaprendizaje. Su evolución AlphaGo Zero ya utilizaba únicamente autoaprendizaje mediante AlphaZero tabula rasa. Finalmente, AlphaZero, es una generalización del anterior válido para otros juegos. 


Conclusiones


Aunque superficialmente, hemos visto cómo se extiende el modelo de aprendizaje por refuerzo al caso de dos agentes, y también hemos conocido algunas ideas sobre el autoaprendizaje, que ha concluido a éxitos tan sonoros de la inteligencia artificial como la consecución de AlphaGo y su sucesor AlphaZero.


Artículos de este blog relacionados



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



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


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