Machine Learning for kids: Construye con tus hijos un bot experto en su animal favorito

Thursday, January 10, 2019

Machine Learning for kids: Construye con tus hijos un bot experto en su animal favorito

En nuestro último post semanal del 2018 os adelantamos que este año queríamos pedirle a los Reyes Magos un regalo muy especial para esta semana. Hoy os contamos lo que pedimos: pasar una tarde entretenida haciendo un sencillo experimento de Machine Learning con nuestros niños. Es importante que los niños conozcan cómo que funciona nuestro mundo. ¿Y qué mejor manera de comprender las capacidades e implicaciones del ubicuo aprendizaje automático que poder construir algo utilizando esta tecnología ellos mismos?



Usaremos una herramienta basada en web, (no hay que instalar nada, ni  configurar nada complejo), que nos permitirá introducir a los niños en el mundo del entrenamiento de sistemas de aprendizaje automático y el tipo de cosas que se puede construir con ellos. Y de la forma que más les gusta aprender a los niños (y a los mayores también): ¡jugando!. Si no tienes hijos, ni ningún pequeño amigo más o menos a mano, no hay problema: puedes recuperar al niño/niña de tu infancia, y pasar un buen rato probándolo contigo mismo. ¿Qué te parece el plan?.

(Por cierto, os confirmamos que lo hemos probado con un auténtido "kid" de 13 años montamos un bot en aproximadamente 1,5 horas.)

La herramienta fue diseñada por Dale Lane utilizando APIs de IBM Watson Developer Cloud para usar en colegios o clubes de programación para niños. Ofrece un sencillo entorno que entrenamiento de modelos de aprendizaje automático para clasificación de texto, números o reconocimiento de imágenes. Los niños pueden crear proyectos o construir juegos con los modelos de aprendizaje que ellos mismos han entrenado con Scratch o Python, Nosotros, en este ejemplo, usaremos Python.

1.  Creación de un proyecto nuevo.


Manos a la obra. La idea es crear un chatbot capaz de respondernos a preguntas sobre el tema que elijamos. Lo primero que hay que hacer es decidir sobre qué tema queremos crearlo. Puede ser:
  • Nuestro animal favorito
  • Nuestro deporte favorito
  • Nuestro personaje favorito de novela, cómic, cine, vídeo etc.
  • Nuestro colegio, nuestro barrio, nuestro país…
Lo que queramos.

Como nos gustan mucho los búhos, hemos decidido que sean los protagonistas de nuestro proyecto. A continuación, pensamos cinco cosas que se puede preguntar sobre ellos. Por ejemplo:
  • ¿Qué comen los búhos?
  • ¿En qué partes del mundo se les puede encontrar?
  • ¿Cuánto tiempo viven los búhos?
  • ¿Qué especies de búhos hay?
  • ¿Qué tamaño pueden alcanzar?

Una vez recopilada la información con la que queremos entrenar nuestro sistema, vamos a la página web de Machine Learning for Kids

Página web de ML for Kids
Figura 1: Página web de ML for Kids

Vamos a probar la opción “Sin registro” y, si nos gusta la experiencia, nos registraremos para el próximo proyecto.

Creamos un proyecto nuevo con el botón "+ Añadir proyecto" ,que aparece en la parte superior derecha. Indicamos el nombre del proyecto, en nuestro ejemplo, Búhos, y seleccionamos de qué tipo es (reconocimiento de texto, de números o de imágenes). El nuestro es de texto. También indicamos el idioma.

Creación de un nuevo proyecto.
Figura 2: Creación de un nuevo proyecto.

2. Entrenamiento.


Ahora tendremos que “entrenar” a la computadora. Lo haremos dándole ejemplos de los que aprender. Para ello, hacemos click sobre el proyecto sobre el que queremos trabajar y nos dará tres opciones.

Navegador de proyectos
Figura 3: El proyecto, ya creado, aparece en una especie de navegador de proyectos.
Podemos abrirlo, o borrarlo.

Elegimos la primera “Entrenar”. 

Seleccionamos la opción "entrenar".
Figura 4: Seleccionamos la opción "entrenar".


Y, a continuación,  “Añadir nueva etiqueta” (“Add New label”, en la versión española hay algunos mensajes que aparecen en inglés, como este)


Añadir etiqueta.
Figura 5: Añadir etiqueta.

Creamos una etiqueta “resumen” para cada una de las preguntas que nos hemos planteado sobre los búhos.  Por ejemplo, para la primera pregunta “¿Qué comen los búhos?”, podemos elegir como etiqueta “Comida”, o “Alimentación” (no admite tilde). Lo que queramos. Es sólo una etiqueta. Vamos creando una etiqueta para cada pregunta y nos queda algo así:


Etiquetas ya creadas.
Figura 6: Etiquetas ya creadas.

Para cada etiqueta, añadiremos, por lo menos 5 ejemplos. Para ello, en cada uno de los recuadros, seleccionamos “Add example” y añadimos hasta 5 formas distintas de formular esa pregunta. Por ejemplo, en Alimentación, podemos poner:

1. ¿Qué comen los búhos?
2. ¿Qué les gusta comer a los búhos?
3. ¿Qué tipo de comida prefieren los búhos?
4. Si fueras un búho, ¿qué te gustaría comer?
5. ¿Cuál es el manjar favorito de los búhos?

Y generamos 5 preguntas para cada cuadro. Queda algo así:

Ejemplo de preguntas.
Figura 7: Ejemplo de preguntas.

Hacemos lo mismo para cada una de las etiquetas (toca escribir un poco):


Escribimos formas alternativas de preguntar por cada uno de los temas.
Figura 8: Escribimos formas alternativas de preguntar por cada uno de los temas.

Una vez hecho esto, seleccionamos  “Volver al proyecto” (arriba a la izquierda) y volvemos a la pantalla que aparecía en la Figura 4. Ha llegado el momento de “Aprender y probar”. Si hemos recogido suficientes ejemplos, la máquina aprenderá a reconocer sobre qué le estamos preguntado, basándose en los ejemplos de preguntas que hemos hecho.

Con las preguntas de ejemplo entrenamos a la computadora  para que identifique el tema de la pregunta.
Figura 9: Con las preguntas de ejemplo entrenamos a la computadora
 para que identifique el tema de la pregunta.

La siguiente figura nos recuerda lo que hemos hasta ahora, recoger 5 ejemplos de pregunta por cada tema, y el paso siguiente: pulsar el botón azul de la parte inferior izquierda para empezar el entrenamiento.

Lanzamos el entrenamiento
Figura 10: Lanzamos el entrenamiento.





En lo que se entrena el modelo, puede que nos hagan una pequeña encuesta sobre Machine Learning. Cuando termine, aparece información de estatus. Como no nos hemos registrado, nos advierten que  nuestro modelo se borrará en unas horas.
Información de estatus del modelo ya entrenado.
Figura 11: Información de estatus del modelo ya entrenado.

3. Creamos un juego en Scratch o Python.


Volvemos a la página principal del proyecto con “Volver al proyecto”. Ha llegado el momento de usar el modelo de aprendizaje automático que hemos entrenado para crear un juego en Scratch o Python. Para ello, seleccionamos la tercera opción,  “Make” (recordar Figura 4) y después, elegimos la opción Python.

Seleccionamos la opción Python
Figura 12: Seleccionamos la opción Python.








Llegamos a esta pantalla:

Usamos ML en Python.
Figura 13: Usamos ML en Python.

Nos vamos a fijar en la ventana de código, a la derecha. Copiamos las líneas que aparecen en el recuadro rojo cuyo objetivo es importar la librería "requests" y definir la función "Classify". La primera pasa el texto que introducimos al modelo de aprendizaje automático que hemos creado y nos devuelve el resultado que mejor se aproxime. 

Copiamos estas líneas de código en Python.
Figura 14: Copiamos estas líneas de código en Python.



A continuación vamos a necesitar un editor cómodo para Python. Podemos usar el que más nos guste. Nosotros vamos a usar Jupyter Notebook. Si no lo tenéis instalado, en este post, Python para todos (2): ¿Qué son los Jupyter Notebooks?, podéis encontrar una forma sencilla de hacerlo. Pero si no queremos instalarnos nada, podemos usar la versión browser de Jupyter, o bien, si tenemos una cuenta Office 365 o Microsoft Account, podemos usar también los notebooks de Microsoft Azure. Nosotros hemos elegido esta última opción, pero cualquiera de las tres es perfectamente válida.

Iniciamos sesión con nuestro usuario de hotmail, live, u Office 365 en Microsoft Azure Notebooks , y creamos un proyecto nuevo con el botón "+ New Proyect" que aparece arriba a la derecha.

Creamos un proyecto nuevo.
Figura 15: Creamos un proyecto nuevo.


Le asignamos un nombre, y un ID numérico:

Asignamos nombre e ID al proyecto.
Figura 16: Asignamos nombre e ID al proyecto.

Indicamos qué tipo de proyecto es: Notebook

Indicamos que se trata de un Notebook.
Figura 17: Indicamos que se trata de un Notebook.

Asignamos un nombre al Notebook e indicamos la versión de Python con la que queremos trabajar: 3.5

 Indicamos nombre y versión.
Figura 18: Indicamos nombre y versión.


Pegamos en este notebook el código que  hemos copiado anteriormente (ver figura 14), donde se hacía una llamada a la librería requests y la definición de la función classify

(Explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuesto notebook.)


Pegamos" el código que copiamos antes-- carga de librería requests y definición de la función classify.
Figura 19: "Pegamos" el código que copiamos antes-- carga de librería requests y definición de la función classify.


Ahora tenemos que definir la función respuesta: answer question. Para ello, añadirmos a continuación las siguientes líneas de código. Para cada tipo de pregunta, "class_name" generamos un bucle:

 "if  answerclass == nuestra etiqueta" print""

Para cada tipo de pregunta se genera un bucle if--print--efif.
Figura 20: Para cada tipo de pregunta se genera un bucle if--print--efif.

(Nota: Según la versión Python,  habrá que udar la función raw_input(">") o input(">") a secas)

Después, en el espacio entre "" agregaremos las respuestas que hemos buscado. Toca escribir de nuevo. 


Añadimos las respuestas correspondientes a cada pregunta entre las comillas después de print.
Figura 21: Añadimos las respuestas correspondientes a cada pregunta entre las comillas después de print.

Por último, cerramos agregando la pregunta que nos va a hacer el bot:


Agregamos la pregunta que nos hará el chatbot.
Figura 22: Agregamos la pregunta que nos hará el chatbot.

(Según la versión de Python, la función print puede necesitar (), y quedar así: print("¿Qué te gustaría...").

Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook):

(Github/Gist)
(Github/gist)

Ahora, ya sólo nos queda ejecutar la celda desde el menú Cell/Run Cells.


Como ya os adelantamos al principio del post, pusimos a prueba todo el proceso con Miguel, de 13 años, que eligió como tema para su bot los cerdos (es una apasionado de la biología, pero también del jamón). Para no hacerle escribir demasiado, en lugar de crear 5 etiquetas, creamos 3, eso sí, con 5 preguntas por cada una de ellas. Nos quedó así:


Versión "corta" creando sólo 3 etiquetas.
Figura 23: Versión "corta" creando sólo 3 etiquetas.

Completamos la función "answer question"como hicimos en la figura 21 con información sobre nuestro nuevo animal favorito y, al ejecutar la celda desde el menú Cell/Run Cells, nos aparece el cuadro de entrada con la pregunta : "¿Qué te gustaría saber de....?"


El bot ya está activo y le podemos preguntar.
Figura 24: El bot ya está activo y le podemos preguntar.


Y ¡ya podemos preguntar!. Nuestro bot no será "muy listo", porque tampoco es que nos hayamos esforzado mucho en entrenarlo a conciencia, pero ahí le tenemos, dispuesto a responder nuestras preguntas a partir de la información que le hemos facilitado para "aprender".

  Figura 25: Ejemplo del pregunta.
Figura 25: Ejemplo del pregunta.



Como no nos registramos en Machine Learning for Kids, cuando el proyecto "caduque", el bot dejará de funcionar. Si quieres volver a probarlo otro día, regístrate. En esta misma web podrás encontrar fichas sobre este proyecto e información sobre las muchas cosas que se pueden hacer. Esperamos que os haya gustado. 

Nos encantará saber, si lo habéis probado, qué tal os ha ido. ¡Dejadnos un comentario!


5 comments:

  1. Hola a tod@s!

    Pues me ha parecido muy intersante no sólo para enseñar a jovenzuel@s, sino también para l@s "puretillas" que nos empezamos a iniciar en la programación de código para enredar con el Machine Learning y chatbots propios.

    A decir verdad, me resulta una manera muy sencilla de enseñar cómo son las tripas de un chatbot para personas principiantes, y creo que puede ayudar a entender mejor proyectos de desarrollo algo más complejos, si queremos "customizarlos" o diseccionar hasta el último fichero a ver qué tiene dentro... Y cómo funciona después de alterarlo, jeje.

    Por ejemplo, yo estoy con un proyecto propio, traduciendo uno que ya no se encuentra en la web original, pero que está replicado en GitHub por varias personas, y además quiero hacer unas mejoras (o lo que creo que podría hacerse y añadir algo más de complejidad al bot).

    Os paso los enlaces que de momento se encuentran funcionales, aunque el original pertenece a la AIML FOUNDATION, cuyo Autor es el Señor D. Richard S. Wallace. Esto viene comentado en alguno de los ficheros .aiml (una variación del .xml):


















    La web a la que hacen referencia ya no existe, ahora http://www.alicebot.org redirecciona a https://home.pandorabots.com/home.html, pero ya no da info para programar el chatbot. Así que he hecho algún experimento y me he echado unas risas (en la url, añadiendo un # al final, dando intro con cualquier chorrada añadida, sigue mostrando la web sin error, siempre en blanco, como al entrar en home... Probad, yo me he entretenido con intros sucesivos haciendo crecer la URL anteponiendo una almohadilla más cada vez en cada trozo de cadena, algo así... "https://home.pandorabots.com/home.html#beicon#Ah, sí? Pues prueba unos torreznos y me dices...#Con un buen tintorro, y ya verás cómo entras en calor..." y darle al Intro cada vez...)

    Los enlaces chachis para descargar el código y ejecutar el bot en Python (con etiquetas por temática en ficheros .aiml), son estos:

    https://github.com/cdwfs/pyaiml

    https://github.com/datenhahn/python-aiml-chatbot

    https://github.com/keiffster/alice2-y

    https://github.com/paulovn/python-aiml

    https://pypi.org/project/python-aiml/

    https://pypi.org/project/aiml/

    Cuando consiga yo lo que tengo en mente, ya compartiré también mi código, del bot original traducido al Castellano, y con otras funcionalidades, aunque no sé lo que podré tardar, porque es un hobby más.

    A disfrutar!!!

    Salutaciones

    Alf.


    ReplyDelete
  2. ¡Ánimo con tus "experimentos", Alf!. Para estas cosas (como para casi todo), la mejor manera de aprender es "cacharrear". Ponerse manos a la obra, equivocarse, encontrar la solución a los errores que van surgiendo, "picarse" para probar algo nuevo, algo más difícil o sencillamente, algo distinto. Pero sobre todo, pasárselo bien ;-)

    ReplyDelete
  3. Gracias Paloma!!! Esa es la clave: divertirse cacharreando, siempre que no se perjudique a nadie intencionadamente, claro.

    Por cierto, me olvidé entrecomillar los comentarios en el código del .xml que os intentaba mostrar en el post... El navegador los obvia y ckaro, no los vemos... No he caído hasta ver publicado lo anterior.

    Esto es lo que ocupa mi el espacio en blanco del post (a ver si el truki funciona...):


    "<"!-- File: bot_profile.aiml --">"

    "<"!-- Author: Dr. Richard S. Wallace --">"

    "<"!-- Last modified: July 19, 2014 --">"

    "<"!--  --">"

    "<"!-- This AIML file is part of the ALICE2 0.0.5 chat bot knowledge base. --">"

    "<"!--  --">"

    "<"!-- The ALICE2 brain is Copyright © 2014 by ALICE AI Foundation. --">"

    "<"!--  --">"

    "<"!-- The ALICE2 brain is released under the terms of the GNU Lesser General --">"

    "<"!-- Public License, as published by the Free Software Foundation. --">"

    "<"!--  --">"

    "<"!-- This file is distributed WITHOUT ANY WARRANTY; without even the  --">"

    "<"!-- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   --">"

    "<"!--  --">"

    "<"!-- For more information see http://www.alicebot.org --">"

    "<"!--  --">"

    ;-))

    ReplyDelete
  4. Thanks very much for sharing this - it's fantastic to see!

    As you point out, not all of the site has been translated into Spanish.
    e.g. https://github.com/IBM/taxinomitis/blob/master/public/languages/es.json#L215

    Unfortunately, I don't know any Spanish so it's difficult to fix that myself.

    If anyone here would be willing to help with this, it'd be fantastic if you could contribute translations for the bits of English you see left there!

    ReplyDelete