El dÃa que me reemplazó un Bot
Tuve uno de esos dÃas donde te discuten cosas insólitas y sin argumentos en Twitter, me canse y decidà armar un bot que me reemplace unos dÃas, y asà no tener que lidiar con conversaciones ridÃculas y repetitivas. Vacaciones de Twitter!
TendrÃa que armar un bot que hable como yo, tuitee cosas parecidas y responda usando palabras que suelo utilizar (ademas de imágenes de memes), en un par de horas del fin de semana baje todo mi historial de tuits, los procesé removiendo usuarios, urls, y demás, finalmente pude armar un pequeño dataset de unos ~20.000 tuits.
Como mi idea era armar una red neuronal y entrenarla con esos datos (estoy aprendiendo ML), agregue también algunos posts que habÃa escrito a ese corpus de tuits y algún que otro texto que encontré por ahi que habÃa escrito anteriormente.
Después alquilé un servidor de Amazon con un buena placa de video (p2.xlarge GPU) y deje corriendo todo el finde un script que analizaba esos tuits entrenando el modelo que finalmente aprenderÃa mi estilo de hablar.
El script además imprimÃa pequeñas frases a medida que la red neuronal aprendÃa de mis textos, con lo cual cada tanto podia meterme e ir viendo pequeños avances en el aprendizaje. Al principio imprimÃa cosas sin sentido, pero de apoco comenzaba a aprender patrones entre las letras y de a poco comenzaba a formar palabras que tenÃan sentido. Después de unas horas comenzaba a escribir frases que tenÃan mas sentido, hasta que luego de dos dÃas podia escribir frases que tranquilamente hubiese escrito yo mismo (aunque a veces escribÃa sin sentidos).
Finalmente llegó el lunes y arme un script que se conectaba a Twitter y al recibir mensajes de otros usuario usaba ese modelo entrenado (el Alejandro Bot) y respondÃa como si fuese yo.
La experiencia ademas de ser super divertida, me ayudo a darme de cuenta de varias cosas:
- No es muy descabellado pensar que con un data set muchÃsimo mas grande y un entrenamiento mucho mayor le resultarÃa muy difÃcil a la gente diferenciar entre un Bot o una persona real.
- Ser reemplazado por un Bot puede ser catastrófico si el bot tuitea algo que sea violento, misógino o directamente inapropiado usando tu identidad. Algun que otro tuit lo tuve que borrar porque me pareció inapriopiado. De hecho un usuario bloqueo al bot pensando que era una persona.
- Responder tuits es una actividad muy poco estructurada, pero tranquilamente se podrÃan generar Bots que automaticen tareas que tienen mas estructura, por ej. pagar cuentas, responder preguntas básicas, recolectar información por nosotros (asistentes virtuales, et al.)
Las respuestas de los Bots no son super precisas, pero a veces como el cerebro de los humanos ajusta ante errores, llegan a interpretar cosas a partir de una frase inconexa.
- Dejar un Bot haciendo una tarea que a veces no nos gusta (responder tuits) es liberador y me encantarÃa en el futuro automatizar otros aspectos de mi vida de manera mas controlada, creo que ahi hay muchÃsimo futuro e industrias enteras.
¿Como se hace un bot?
Hay varias formas de hacer Bots, pero acá voy a explicar como hice el mÃo y el de Ricardo Fort (@ricardobort).
Mi Bot usó una red neuronal entrenada con mis tuits, pero generar eso es costoso ya que lleva mucho tiempo y recursos, una instancia de Amazon con un buen GPU sale aproximadamente $1 por hora , si consideras que un modelo puede tardar varios dÃas en entrenarse completamente no es un gasto trivial. Si bien es muchÃsimo mas caro usar una maquina con GPU en Amazon, el tiempo de iteración te permite ver el resultado del modelo muchÃsimo mas rápido en vez de tener que esperar dÃas para ver que onda lo que entrenaste, y una vez que tenés el modelo guardado en disco podes pasar el código a una maquina mas barata (no hace falta el GPU para generar las secuencias rápidamente), con un m2 para generar las frases es suficiente.
Para entrenar el Bot use Tensorflow, gracias a TFLearn que es una abstracción que utiliza Tensorflow a bajo nivel. En este caso particular utilicé una red neuronal que permite predecir secuencias, es decir, dado un aprendizaje anterior y sugiriendo un valor nuevo, predice el siguiente con cierta probabilidad. En este caso el valor sugerido es una secuencia de caracteres (una frase). Lo increÃble es que la red no predice frases, sino que al haber aprendido la relación entre las letras, predice la secuencia de caracteres que luego va a formar una frase. Mind blown.
El entrenamiento no fue muy grande (~1 dÃa ½)y el set de datos es muy muy pequeño con lo cual los resultados fueron buenos a veces â pero no perfectos â claramente es fácil darse cuenta que no estas hablando con una persona, muchas frases terminan siendo inconexas. Probablemente una forma de entrenamiento mejor hubiese sido entrenar la red basándola en conversaciones reales, en lugar de frases aisladas.
Acá esta el código del Bot (version neuronal) básicamente la idea es correr el script bot-train.py por unos dÃas y eso va a generar el modelo y guardarlo en el disco (model.ftl). A medida que lo entrenas podes ver el uso del GPU con el comando `nvidia-smi` y con htop el uso de CPU.
El script bot-predict.py se conecta a tuiter con las credenciales que ingreses en el archivo .twitter y responde basado en ese modelo.
La instancia de Amazon que use fue con el AMI (imagen pre-configurada) que tenia ya instalados Python, Tensorflow, etc. La pueden encontrar acá: âDeep Learning AMI Amazon Linux Versionâ https://aws.amazon.com/marketplace/pp/B01M0AXXQB
¿Hacemos un bot de Fort?
Después de ese experimento se me ocurrió usar el set de datos de tuits de Ricardo Fort ya que el siempre tuiteo de una manera muy general y particular.
Para eso baje todo el archivo de tuits e hice lo mismo que con mi Bot, el problema es que la cantidad de texto de él era mucho menor (solo ~11k tuits), con lo cual termine usando algo mucho mas barato de generar (no hace falta entrenamiento de dÃas) usando âMarkov Chainsâ, encontré una librerÃa de Python que las genera de forma fácil con lo cual solo tuve que modificar el script del Bot original mÃnimamente. Los resultados usando Markov son relativamente buenos y muchÃsimo mas rápidos.
Aca esta todo el código de los tres ejemplos que es bastante simple, de hecho es el primer codigo de Python que escribo.