DIY Black Mirror: enseña a un bot basado en su historial de chat

En el "Black Mirror" hubo una serie (S2E1), en la que crearon robots similares a las personas muertas, utilizando la historia de la correspondencia en las redes sociales para el entrenamiento. Quiero contarte cómo intenté hacer algo similar y qué sucedió. No habrá teoría, solo práctica.


imagen


La idea era simple: tomar la historia de sus chats de Telegram y, sobre la base, entrenar a la red seq2seq, capaz de predecir su finalización al comienzo del diálogo. Dicha red puede funcionar en tres modos:


  • Predecir la finalización de la frase del usuario según el historial de conversación
  • Trabaja en modo chatbot
  • Sintetizar registros de conversación completos

Eso es lo que tengo


Bot ofrece completar frases


imagen


Bot ofrece completar el diálogo


imagen


Bot se comunica con una persona viva


User:  Bot:  User:  ? Bot:  User:  ? Bot:  User: ? Bot:    User:     ? Bot:    User:  ? Bot:    

A continuación, te diré cómo preparar los datos y entrenar a un robot como tú.


Cómo enseñarte a ti mismo


Preparación de datos


En primer lugar, necesitas obtener muchos chats en alguna parte. Tomé toda mi correspondencia en Telegram, ya que el cliente para el escritorio permite descargar el archivo completo en formato JSON. Luego tiré todos los mensajes que contienen comillas, enlaces y archivos, y transfirí los textos restantes a minúsculas y eliminé todos los caracteres raros de allí, dejando solo un simple conjunto de letras, números y signos de puntuación: es más fácil aprender la red.


Luego traje los chats a esta forma:


 === >  <    >  <  ! === >  ? <  

Aquí, los mensajes que comienzan con el símbolo ">" es una pregunta para mí, el símbolo "<" marca mi respuesta en consecuencia, y la línea "===" sirve para separar los diálogos entre ellos. El hecho de que un diálogo terminó y el otro comenzó, lo determiné por tiempo (si pasaron más de 15 minutos entre mensajes, entonces creemos que esta es una nueva conversación. Puede ver el guión para convertir la historia en github .


Como he estado usando telegramas activamente durante mucho tiempo, al final hubo muchos mensajes: había 443 mil líneas en el archivo final.


Selección de modelo


Prometí que hoy no habría teoría, así que intentaré explicarlo lo más brevemente posible con los dedos.


Elegí el clásico seq2seq basado en GRU. Tal modelo de entrada recibe el texto letra por letra y también genera una letra a la vez. El proceso de aprendizaje se basa en el hecho de que enseñamos a la red a predecir la última letra del texto, por ejemplo, le damos "guía" a la entrada y esperamos a que salga el "remache" .


Para generar textos largos, se utiliza un truco simple: el resultado de la predicción anterior se envía de vuelta a la red y así sucesivamente hasta que se genera la longitud de texto necesaria.


Los módulos GRU pueden ser muy, muy simplificados como un "perceptrón astuto con memoria y atención", se pueden encontrar más detalles sobre ellos, por ejemplo, aquí .


Un ejemplo bien conocido de la tarea de generar los textos de Shakespeare fue elegido como la base del modelo.


Entrenamiento


Cualquiera que haya encontrado redes neuronales probablemente sabe que aprenderlas en la CPU es muy aburrido. Afortunadamente, Google viene al rescate con su servicio Colab : en él puede ejecutar su código en jupyter notebook de forma gratuita utilizando una CPU, GPU e incluso TPU . En mi caso, el entrenamiento en la tarjeta de video se ajusta en 30 minutos, aunque los resultados correctos están disponibles después de 10. Lo principal es recordar cambiar el tipo de hardware (en el menú Tiempo de ejecución -> Cambiar tipo de tiempo de ejecución).


Prueba


Después del entrenamiento, puede proceder a la verificación del modelo: escribí varios ejemplos que le permiten acceder al modelo en diferentes modos, desde la generación de texto hasta el chat en vivo. Todos ellos están en github .


El método para generar texto tiene un parámetro de temperatura: cuanto más alto sea, más diverso será el texto (y sin sentido) producirá un bot. Este parámetro tiene sentido para configurar manos para una tarea específica.


Uso adicional


¿Por qué se puede usar esa red? Lo más obvio es desarrollar un bot (o teclado inteligente) que pueda ofrecer al usuario respuestas preparadas incluso antes de que las escriba. Una característica similar ha existido durante mucho tiempo en Gmail y en la mayoría de los teclados, pero no tiene en cuenta el contexto de la conversación y la forma en que un usuario en particular conduce la correspondencia. Digamos que el teclado G me ofrece opciones completamente sin sentido, por ejemplo, "Voy con ... respeto" en el lugar donde me gustaría obtener la opción "Voy de la casa de campo", que definitivamente usé muchas veces.


¿El chat bot tiene futuro? En su forma pura, definitivamente no está allí, tiene demasiados datos personales, nadie sabe en qué punto le dará al interlocutor el número de su tarjeta de crédito que una vez le arrojó a un amigo. Además, dicho bot no está afinado en absoluto, es muy difícil lograr que realice tareas específicas o responda correctamente una pregunta específica. Por el contrario, un chatbot de este tipo podría funcionar junto con otros tipos de bots, proporcionando un diálogo más conectado "acerca de nada", se adapta bien a esto. (Y, sin embargo, un experto externo en la persona de su esposa dijo que el estilo de comunicación del robot es muy similar al mío. Y los temas que le interesan son claramente los mismos: errores, arreglos, errores y otras alegrías y tristezas del desarrollador aparecen constantemente en los textos).


¿Qué más te aconseja que pruebes si este tema te interesa?


  • Transferencia de aprendizaje (para entrenar en un gran cuerpo de diálogos de otras personas y luego terminar por su cuenta)
  • Cambiar modelo: aumentar, cambiar tipo (por ejemplo, en LSTM).
  • Intenta trabajar con TPU. En su forma pura, este modelo no funcionará, pero se puede adaptar. La aceleración teórica del aprendizaje debería ser diez veces.
  • Puerto a una plataforma móvil, por ejemplo, utilizando Tensorflow mobile.

PS Enlace a github

Source: https://habr.com/ru/post/453314/


All Articles