Aprendizaje profundo I

Go El martes pasado concluía en Seúl la quinta y final partida de go (wéiqí en Chino) entre Lee Sedol, quizás el jugador actual más competitivo, y AlphaGo, un programa desarrollado por Google DeepMind, una subsidiaria de Google especializada en inteligencia artificial. El resultado final, 4-1, fue una victoria rotunda de la maquina sobre el ser humano.

Aunque mis habilidades con go, habiendo llegado al juego ya muy mayor, son prácticamente inexistentes, en mi familia hay varios jugadores apasionados del mismo que han dedicado, siguiendo una tradición milenaria en China, muchos años (algunos incluso décadas) al estudio de este arte (algo ahora facilitado por las muchas apps existentes para el iPad). Es natural, pues, que siguiésemos las cinco partidas con interés inusitado (incluyendo el parar en medio de Hyde Park en Londres para comprobar en el iPhone los últimos movimientos de cada jugador).

En comparación con el ajedrez o las damas, y a pesar de tener unas reglas a primera vista muy sencillas, go es un juego que genera muchas más combinaciones posibles de movimientos. El numero total de partidas legales de go se calcula en torno a mientras que el numero de partidas legales en ajedrez es “solo” de y en damas de un casi trivial . Esta diferencia de 50/150 órdenes de magnitud implica que el enfoque de “fuerza bruta” (literalmente, comprobar muchísimas jugadas posibles y seleccionar aquellas que maximicen el valor de la posición de las piezas en el tablero después de varias rondas de movimientos) que está en el centro del los programas tradicionales de ajedrez o de damas resulte de menos utilidad en el juego asiático. Como consecuencia principal, un programa competitivo de go al mayor nivel tiene que diseñarse con un enfoque alternativo basado en inteligencia artificial; es decir, ha de ser un programa que de alguna manera “entienda” cómo está jugando más que simplemente comprobar todas (o casi todas) las posibilidades existentes gracias a su potencia computacional y seleccionar la mejor entre ellas.[1] Incluso entre los seres humanos, la intuición, el estilo personal y la imitación de los grandes maestros del pasado tiene mucho más importancia en go que en ajedrez; lo cual también explica porque el pico de calidad de los jugadores profesionales en go a menudo llega muy pronto en su carrera y que se puedan escribir novelas como El Maestro de Go, de Yasunari Kawabata.

Y aunque muchos observadores conjeturaban que tal programa de go llegaría tarde o temprano, ha causado cierta sorpresa que haya sido en 2016. Elon Musk (el CEO de Tesla y un buen conocedor el mundo de la alta tecnología) ha citado un adelanto de diez años sobre las predicciones existentes. Tan recientemente como 2015, los mejores programas de go solo alcanzaban al nivel de un amateur sofisticado pero no podían competir con jugadores profesionales. AlphaGo, aplicando técnicas de aprendizaje profundo (en inglés, deep learning) se ha saltado esos 10 años y nos ha dejado a todos un pelín descolocados (aunque también ha habido voces escépticas sobre la generalidad de la contribución, como en este artículo de Gary Marcus).

En mi caso personal, el interés por el encuentro entre Lee Sedol y AlphaGo se reforzaba por la observación de que llevo un año trabajando en la aplicación en economía de algoritmos de aprendizaje automático (en inglés, machine learning), que incluyen los algoritmos de aprendizaje profundo como un subconjunto importante de los mismos. Y dado que este miércoles tengo que hablar sobre aprendizaje automático en economía (lo siento, no es una charla pública y no tengo transparencias que pueda circular), escribir una serie de dos entradas en NeG sobre los mismos me sirve para pulir la introducción a la misma. Dada la extensión del material a cubrir, hoy hablaré sobre el aprendizaje automático más en general y la semana que viene sobre el aprendizaje profundo que esta detrás de AlphaGo.

El aprendizaje automático es un conjunto de algoritmos diseñados para permitir que un código de ordenador aprenda sobre patrones en los datos. En vez de especificar una larga lista de atributos de los objetos a estudiar (como hacían los sistemas expertos antiguos), los algoritmos de aprendizaje automático comienzan con un simple modelo del mundo para clasificar observaciones y una serie de reglas para modificar tal modelo según el éxito del mismo. Dado que la mayoría de los ejemplos en los libros y en internet no son de economía y que los lectores de este blog podrán, llegados a este momento, estar preguntándose qué tiene todo esto que ver con nuestro campo de investigación, déjenme que les de un ejemplo. De hecho este ejemplo es el que empleo en mi propio trabajo.

Imaginémonos que disponemos de una base de datos muy amplia de la estructura financiera de empresas, como Compustat. Esta base de datos nos suministra información sobre el capital, deuda, bonos, ventas, crecimiento, etc. de un amplio abanico de empresas a lo largo de varias décadas. La cantidad de información en la misma es tremenda. El procedimiento tradicional de los economistas para analizar empíricamente tal información se ha basado en dos líneas de ataque.

Una primera línea de ataque

La primera línea de ataque, a veces llamada de forma reducida, busca especificar regresiones entre distintas variables observadas basándose en una mezcla de intuición y ligera teoría. Por ejemplo, el investigador regresa el apalancamiento de la empresa contra su tasa de crecimiento o la industria en la que opera. La idea es que, por ejemplo, si una empresa crece deprisa es probable que quiera apalancarse para aprovechar las oportunidades y financiar tal crecimiento. Este bien citado trabajo de Murray Frank y Vidhan Goyal es un ejemplo representativo de esta estrategia empírica.

Las desventajas de esta estrategia empírica son obvias. Solo por citar un problema entre muchos otros, uno nunca sabe hasta que punto los patrones documentados en los datos son espurios, producto quizás del azar, del prolongado esfuerzo del investigador de corroborar sus preconcepciones o del sesgo de publicación (es mucho más fácil publicar resultados positivos que negativos). Buena parte del esfuerzo de la econometría actual es buscar criterios de credibilidad basados en un análisis explícito de las fuentes de la identificación que permitan solventar estas dudas con un grado razonable de confianza.

Pero incluso olvidándonos de estos problemas, nos queda siempre la inquietud de que, con bases de datos amplias, incluso el investigador más perspicaz puede perderse y no descubrir patrones empíricos interesantes. Cualquiera que haya corrido regresiones complejas y presentado las mismas en público ha sufrido la experiencia de ver como un miembro de la audiencia levanta la mano y le pregunta “¿has probado x?” y pensar para uno mismo: “¿cómo no se me ha ocurrido a mi tan obvia pregunta?” Con la llegada de bases de datos masivas (en inglés, big data) este problema de mero manejo de los datos se hace cada vez más agudo, en especial en aplicaciones industriales, donde se necesitan calcular millones de regresiones con miles de potenciales regresores de manera cotidiana.

Un algoritmo de aprendizaje automático intenta explorar esta base de datos y buscar patrones empíricos robustos. En vez, por ejemplo, de probar todas y cada una de las especificaciones de regresión posibles (un problema de complejidad exponencial), podemos construir sencillos programas que encuentren relaciones en los datos y emplear las mismas para entender nuestra base de datos y predecir comportamientos futuros.

En una entrada de este blog, no puedo más que arañar la superficie de estos algoritmos, pero el libro de texto más popular sobre el tema es este de Kevin P. Murphy. Es un manual amplio, detallado y fácil de seguir. De todas maneras, y solo por ser un poco más concreto, voy a explicar la idea básica detrás de una búsqueda voraz (greedy search en inglés), un algoritmo de aprendizaje automático muy extendido y sencillo de programar.

Imaginemos que comenzamos construyendo una regresión -regularizada del apalancamiento de una empresa contra un conjunto de variables observadas como su tasa de crecimiento, el sector en el que opera o las características de su gobernanza corporativa. La regularización nos permite penalizar aquellas especificaciones que sobre-ajustan los datos. Las variables observadas pueden ser seleccionadas aleatoriamente (si que queremos un algoritmo totalmente automático) o con unas suposiciones rápidas previas (en inglés, an educated guess). De hecho, podemos comenzar incluso con un conjunto vacío de regresores, lo que facilita la generalización del algoritmo a problemas donde tiene que ser implementado miles de veces.

Una vez estimada la primera regresión -regularizada (o si estamos empleando un conjunto vacío, después de inicializar el programa), seleccionamos aleatoriamente una variable de las no incluidas entre los regresores para ser incluida en la segunda regresión y seleccionamos, de nuevo de manera aleatoria, una variable incluida en la primera regresión (excepto cuando comenzamos con el conjunto vacío) para ser eliminada. La selección aleatoria puede realizarse con una probabilidad positiva de no movimiento (es decir de no eliminar una variable ya existente o de no incluir una nueva variable), para que el número total de regresores sea, en si mismo, una variable aleatoria. Una vez realizado este remplazo, estimamos la nueva regresión y comprobamos una medida de ajuste a los datos. Medidas populares incluyen el nivel de la verosimilitud marginal o, en el caso de que tal verosimilitud marginal sea costosa de computar, la moda de la distribución a posteriori del modelo (este tipo de algoritmos se suelen anidar en algún tipo de Monte Carlo por Cadenas de Markov). El algoritmo puede continuar iterando en las regresiones regularizadas hasta que no se aprecien mejoras en el ajuste del modelo a los datos.

La experiencia de correr esta clase de algoritmos nos suele demostrar dos lecciones. Primero, que el ajuste va a “saltos”. En muchas iteraciones apenas avanzamos: el algoritmo parece estancado. Y, de repente, un pequeño cambio en el conjunto de regresores, trae consigo una mejora sustancial que es seguida en las siguientes iteraciones por otras mejoras importantes, antes de volverse de nuevo a estabilizar. Aquellos lectores con conocimientos de evolución reconocerán en este patrón un caso de equilibrios puntuados como los propuestos por Niles Eldredge y Stephen Jay Gould (no voy a discutir, pues no es mi campo si tales equilibrios puntuados existen o no en biología evolutiva; solo resalto que en optimización aleatoria tales equilibrios puntuados se ven todo el rato).

Segundo, que el resultado final a veces es increíblemente contra-intuitivo: los regresores que importan para ajustar los datos no son los que uno hubiese pensado. No voy a entrar en la interpretación de si estos regresores tienen o no sentido económico o de si esto ayuda a “entender” el mundo. Lo que si que conozco con 100% certeza (y aquí estoy sujeto a “non-disclosure agreements” con fuerza legal, así que he de ser deliberadamente ambiguo) es que muchas empresas han descubierto que tales regresiones aleatorias les sirven para predecir francamente bien la cantidad de unidades de un bien que necesitan almacenar en sus diferentes centros de distribución incluso cuando la regresión parece no “tener sentido” alguno. Y muchos jugadores de go pensaron que algunos de los movimientos de AlphaGo eran totalmente contra-intuitivos en tiempo real y, sin embargo, al final del día tenían mucho sentido. En otras palabras, la búsqueda aleatorizada nos hace descubrir regiones de configuraciones de la regresión o de comportamiento que no habríamos explorado de otra manera.

Una segunda línea de ataque

Mencionaba anteriormente que frente a la técnica de formas reducidas, existía una segunda línea de ataque de los economistas a los problemas empíricos (y una línea en la que yo he trabajado mucho más): el enfoque estructural. Este enfoque plantea un modelo económico explícito y, en vez de estimar regresiones, estima los parámetros que indician tal modelo (por ejemplo, los parámetros estructurales de la función de utilidad, funciones de producción o conjuntos de información). No es este el momento de repasar los argumentos a favor o en contra de este segundo enfoque. Solo apuntar rápido que los algoritmos de aprendizaje automático también tienen un papel que jugar en esta clase de enfoques, en particular en la solución de problemas de optimización de alta dimensionalidad en el corazón de los mismos (esto es, en concreto, el problema en el que estoy trabajando ahora mismo; bueno, en cuanto acabe de colgar esta entrada).

A modo de conclusión rápida

No soy, ni muchísimo menos, el primer economista en trabajar en estos temas. Susan Athey lleva años trabajando en cosas similares (aunque desde un enfoque distinto del mío). Aquí, por ejemplo, Athey discute varias de las ideas del campo y aquí, con Guido Imbens, dando unas clases magistrales sobre el tema.

En el otoño tengo programadas unas clases sobre aprendizaje automático. Si tengo tiempo de preparar unas transparencias con las que esté contento y AlphaGo Skynet no nos ha convertido en sus esclavos, las colgaré en internet y las anunciaré aquí en NeG. Mientras tanto y en espera de la segunda entrada de esta serie el martes que viene, como dice una máquina de aprendizaje automático: “hasta la vista, baby!”

1. Los programas de ajedrez o de damas no son particularmente intrigantes desde el punto de vista de inteligencia artificial: aunque incorporan ideas interesantes de como evaluar posiciones en el tablero o de como simplificar la búsqueda de movimientos eliminando ramas del árbol de decisión de manera temprana, como reitero en el texto principal, al final del día se centran en la aplicación de fuerza bruta computacional. La victoria de DeepBlue sobre Kasparov en 1997, mientras que prueba significativa del avance en la velocidad de procesamiento, no era un cambio cualitativa en la capacidad de los ordenadores de descubrir estrategias de comportamiento óptimo. De igual manera que un ordenador puede calcular muchísimo más rápido que cualquier humano, un ordenador moderno puede evaluar muchos más movimientos de ajedrez, pero en cierto sentido no hay “mayor secreto” en ello.

Hay 19 comentarios
  • Muy interesante.
    ¿Ha leído el libro de Bostrom 'Superintelligence'? Un tema que me llamó la atención fue el problema de programar las preferencias del programa para que tome las decisiones que mejor representen nuestros intereses. El estado actual del debate es bastante primitivo y creo que los economistas podrían contribuir en gran medida. El ideal parece un código que permita a la máquina inferir de nuestro comportamiento las decisiones que tomaríamos si tuviésemos su capacidad de análisis. Al fin y al cabo, una gran parte de la investigación empírica se centra en inferir las preferencias de un individuo en un problema de decisión y desarrollar un contra factual donde ese individuo esté mejor. ¿Conoce algún trabajo al respecto?

    • No he leido el libro. Gracias por la sugerencia. No conozco mucha literatura al respecto excepto pensar en el ordenador como un "mecanismo de compromiso" que nos permite evitar sesgos cognitivos, como inconsistencia temporal. Algunos papers de behavioral hablan de este tema.

    • Gracias por los enlaces. Si, yo tome la clase de Ng hace un año o asi y esta muy bien como introduccion basica al tema.

  • Gracias por la entrada, muy interesante, esperaré con ganas las referencias que nos pasas sobre Deep Learning. Últimamente me he interesado mucho por estas técnicas, pero en esta en concreto no he podido profundizar.
    El problema que veo en general a este mundo es que desde un punto de vista predictivo tiene un interés innegable pero a veces, cuando atacas ciego una base de datos con muchas variables, todas las ventajas que tienen las correlaciones para la predicción se convierten en obstáculos para discernir qué está pasando ahí.

    • Gracias por el comentario. Es una gran pregunta. Mira los enlaces a los trabajo de Susan Athey y su enfoque de como ir de mera correlacion a prediccion y analisis causal. Es el centro de su investigacion.

      • Justo mirando los enlaces que has sugerido he puesto el artículo "Machine Learning for Estimating Heretogeneous Casual Effects" en la lista de artículos para leer :). Gracias!

  • ¡Fascinante! Pero también plantea algunas dudas.
    Por ejemplo, cuando se ven cifras como 2.08E170, uno piensa que en Economía debería ser más fácil diseñar algún programa que funcionase. No creo que haya tantas posibilidades en ninguno de los contextos económicos de interés. Aunque sí puede suceder que la economía sea aún mucho más compleja en el sentido de que (por ponerlo gráficamente), lo que puede ser bueno el martes no lo sea el jueves.

    Lo que cuenta sobre la línea de ataque de "la forma reducida", parece ir en la misma dirección. Sin necesidad de ningún apoyo en la teoría económica, se encuentran resultados que funcionan (y no solo en el ámbito académico, según nos dice) y, además, los resultados obtenidos son contraintuitivos (¿contrarios a lo que predice la teoría?).

    Veremos qué nos depara el futuro.

    • Las reglas de go son muy sencillas y sin embargo dan lugar a todas esas posibilidades. Muchos problemas de decision en economia, especialmente si uno tiene que tener en cuenta lo que hacen otros agentes, genera problemas de complejidad extraordinaria. Piense, por ejemplo, en el problema de como distribuir miles de bienes por parte del Corte Ingles en sus centros por toda España o el problema de asignar eficientemente los aviones de una aerolinea grande (que ademas tiene que tener un ojo en lo que hacen otras compañias rivales). Antes de que uno se de cuenta, estas hablado de problemas increiblemente dificiles.

      Y si, lo realmente increible es que estas reglas contra-intuitivas generadas por las maquinas funcionan, casi siempre, muy bien (algunas veces, para ser sincero, son un desastre, pero son excepciones: de hecho la combinacion mas potente en la industria es cuando un ser humano hace un "reality check" de vez en cuando).

  • Coincido en el interés. La técnicas de aprendizaje automático están empezando a bañar casi todas las áreas, y van (están siendo) disruptivas en muchas de ellas. Por eso experimentos como el de AlphaGo son muy ilustrativos, aunque sean en entorno reducido (por más combinaciones que tenga el juego, no deja de ser un universo controlado con reglas claras, cosa que no se puede decir de la mayoría de los problemas reales 😉

    Dentro del aprendizaje automático, uno de los argumentos más potentes a favor del aprendizaje profundo (además del obvio de lo bien que funciona) es el de poder eliminar el trabajo manual de ingeniería de características (feature engineering). Los sistemas clásicos para (por ejemplo) reconocimiento de imágenes precisaban de mucha inteligencia humana en el procesado previo de señal para darle features bien mascadas a un reconocedor (un SVM, Random Forest, etc) y que este funcionase bien. En Deep Learning la promesa es: "métele a la red los pixeles en crudo que ella ya se apaña".

    Aunque en la práctica eso puede no ser totalmente cierto (p.ej. a la red de AlphaGo se le indican, aparte de la posición de las fichas en el tablero, otras características informativas del juego que necesitan extracción previa). Y me da que la especificación de la configuración de la red (capas, conectividad, etc) sustituye en parte el "factor humano" que se elimina al reducir el feature engineering. No free lunch ... 🙂

  • La amplitud de sus conocimientos/inquietudes me sigue asombrando.

    AlphaGo es un gran logro de la ingeniería. Las ideas básicas estaban ahí hace tiempo (1) (la última, hace diez años) pero el aumento en la potencia de cálculo y el esfuerzo de unas mentes brillantes consiguió este espectacular resultado. Aún así, pienso que aún queda un largo camino hasta llegar a Terminator:-)

    (1) La primera idea es el "aprendizaje por refuerzo"que enlaza con algo -creo- familiar a los economistas, la programación dinámica. Samuel aplicó con éxito esta idea a finales de los 50:
    https://webdocs.cs.ualberta.ca/~sutton/book/ebook/node109.html
    https://www.cs.virginia.edu/~evans/greatworks/samuel1959.pdf
    y Tesauro logró un gran éxito en los 90 al aplicarla al backgammon:
    http://www.bkgm.com/articles/tesauro/tdl.html

    (2) La 2ª idea es la del "deep learning":
    http://www.cs.toronto.edu/~hinton/absps/NatureDeepReview.pdf
    Tesauro empleó una red neuronal sencilla para conseguir un programa que jugaba al backgammon mejor que cualquier humano; pero para dominios más complejos es necesario emplear redes más sofisticadas. Hace un año Google presento DeepMind, un sistema que emplea redes neuronales "deep" que alcanzó prestaciones expertas en los "arcade games":
    https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
    https://www.youtube.com/watch?v=V1eYniJ0Rnk
    Pero no hay que dejarse llevar por la palabrería: las redes neuronales son dispositivos que estiman funciones no lineales; ni más, ni menos.

    (3) La 3ª idea, específica de los juegos bipersonales, es MonteCarlo Tree Search:
    https://en.wikipedia.org/wiki/Monte_Carlo_tree_search
    Desde 2006 (el año de la revolución deMonte Carlo en juegos) la técnica empezó a ser explotada sistemáticamente en los programas de Go.

    • Muchisimas gracias por los enlaces. Son super-utiles.

      En este tema de aprendizaje profundo he tenido la suerte de comenzar a colaborar con un grupo que trabaja en este tema en una empresa de alta tecnologia que todos conocemos. Lo poco que se del tema se lo debo todo a sus enseñanzas.

  • Hola. Gracias por la introducción y las recomendaciones. El aprendizaje automático me genera curiosidad, pero por otro lado me plantea algunas dudas. Por ejemplo, el problema de la interpretación de los parámetros. Personalmente, prefiero un modelo simple y fácil de interpretar antes que uno complejo y de difícil interpretación, aunque sea “mejor”. Depender de un modelo que parece que funciona, pero que nadie sabe exactamente cómo o por qué, lo veo inquietante. ¿Eso no es lo que hacían los financieros de las hipotecas subprime? Otro problema que veo son los recursos de computación que se necesitan para calcular estos modelos, que tengo la impresión que son considerables.

    • 1) "prefiero un modelo simple y fácil de interpretar antes que uno complejo y de difícil interpretación, aunque sea “mejor”" Si eres Walmart (en Estados Unidos), tienes millones de decisiones diarias de almacenamiento de productos/tienda. Como consecuencia de estos millones de decisiones que tienes que tomar cada dia, es imposible correr modelos que no sean automaticos, por muy sencillos que estos sean.

      2) "Depender de un modelo que parece que funciona, pero que nadie sabe exactamente cómo o por qué, lo veo inquietante". Cada vez que pinchas una recomendacion de Netflix o de Amazon estas empleando uno de estos algoritmos. Algunas veces se equivocan y no pasa nada. No hay que confundir un algoritmo en un mission-critical task que una recomendacion de pelicula.

      3) "os recursos de computación que se necesitan para calcular estos modelos, que tengo la impresión que son considerables." No necesariamente. El algoritmo que he explicado en el texto se puede implementar en un portatil normal y corriente. De hecho la gran ventaja del aprendizaje automatico es que requiere menos potencia computacional que los algoritmos expertos o de fuerza bruta tradicionales.

  • El modelo de las subprime era de lo mas simple, 'los q pagan cubren por los que no paguen'. La interpretación es muy sencilla: los que pagan logran cubrir por los que no pagan. Ahora bien, lo difícil era saber de ante mano si el mundo iba a ser así, esto es, cuantos pagarían y cuantos no, a que precio se ib a poder liquidar el colateral etc, cuantas provisiones habrian etc etc, si un maquina aprendiz de credit risk acota el problema satisfactoriamente no veo porque no se podrían haber utilizado para el bien de todos, es cuestión de si el type1 y type 2 de la maquina es mejor que la de la de un ser humano sin maquina.

    Las recetas de Newton sirven a cierta escala, las de la relatividad sirven a otra escala, las cuanticas a otra. Por que? Pues no lo sabe nadie. Son recetas q sirven. Usted quiere saber demasiado!

    Usted, lo q yo creo, es q le tiene miedo al out of sample. Sí estoy seguro, usted es un caso tipico de 'out-of-sample fear' syndrome. Y no es para menos, hay q tener mucho cuidao ay afuera.

  • Gracias por el artículo, ¡ya tenía ganas de oir/leer cómo la Economía absorbe este tipo de herramientas!

    En relación a los comentarios sobre si lo contraintuitivo es razonable, muchos de los mejores algoritmos en diversos problemas se fundamentan en el ensamblaje de predictores débiles, y aquí "débiles" significa que tienen menor capacidad predictiva, entre otras características.

    Echo en falta "gradient boosting" y "lasso", aunque supongo que no los ha especificado para mejorar la legibilidad (y lo consigue).

    Comentar que recientemente (noviembre) Google liberó el código de uno de sus algoritmos de redes neuronales, el TensorFlow. El mundo va muy deprisa.

    https://www.tensorflow.org/
    https://github.com/tensorflow/tensorflow

    • Gracias. La entrada se me fue a 2300 palabras (que es quizas ya mas largo de lo optimo) con lo cual no quise entrar en muchos detalles.

      Mi compañera de departamento: https://sites.google.com/site/xucheng06/ es experta en lasso y ha escrito muchas cosas muy importantes sobre el.

      Yo empleo gradient boosting en mi investigacion pero me resultaba mas complicado explicarlo para el publico en general que una busqueda voraz.

  • Comparto lo dicho por JLPC
    "La amplitud de sus conocimientos/inquietudes me sigue asombrando."
    Usted hoy me ha hecho recordar mis estresantes cálculos intuitivos de cuando todavía trabajaba, cuándo necesitaba calcular, sin casi posibilidad de corrección, la cantidad de prendas por modelo, color y talla, que en unos pocos meses mi clientela repetiría, por zona, según la moda o lo que el capricho consumista decidiera, que solía ser muy distinto a lo que se nos aconsejaba, incluido por cierto El Corte Inglés.
    Esperé con impaciencia la segunda entrada y seguiré, en lo que el tiempo me permite, sus recomendaciones de lectura. Nunca es tarde para aprender.

Los comentarios están cerrados.