Notas para los visitantes:
python3 manage.py runserver
. Si no está familiarizado con la ejecución de flask de esta manera, consulte los documentos de Flask-Script. ¡Disculpe las molestias!Al 9 de mayo de 2017, los principales paquetes del proyecto son los siguientes:
python3 manage.py runserver
Desde el punto de vista del usuario/desarrollador, este proyecto ofrece una interfaz más limpia para jugar con modelos secuencia a secuencia. El resultado ideal es una API de chatbot con la legibilidad de Keras, pero con un grado de flexibilidad más cercano al de TensorFlow.
En el lado del 'cliente', jugar con los parámetros del modelo y ejecutarlos es tan fácil como crear un archivo de configuración (yaml), abrir un intérprete de Python y emitir algunos comandos. El siguiente fragmento, por ejemplo, es todo lo que se necesita para comenzar a entrenar en el conjunto de datos de Cornell (después de descargarlo, por supuesto) con su configuración:
import data
import chatbot
from utils import io_utils
# Load config dictionary with the flexible parse_config() function,
# which can handle various inputs for building your config dictionary.
config = io_utils . parse_config ( config_path = 'path_to/my_config.yml' )
dataset = getattr ( data , config [ 'dataset' ])( config [ 'dataset_params' ])
bot = getattr ( chatbot , config [ 'model' ])( dataset , config )
bot . train ()
Esta es sólo una forma de interactuar con el proyecto. Por ejemplo, el usuario también puede pasar parámetros a través de argumentos de la línea de comandos, que también se fusionarán con cualquier archivo de configuración que especifique (se da prioridad a los argumentos de la línea de comandos si hay conflicto). También puedes pasar la ubicación de un chatbot previamente guardado para continuar entrenándolo o iniciar una conversación. Consulte main.py
para obtener más detalles.
Ubuntu Dialogue Corpus: el enfoque de preprocesamiento se puede ver en ubuntu_reformat.ipynb en la carpeta notebooks. El uso previsto para el conjunto de datos es la clasificación de respuestas para diálogos de varios turnos, pero he adoptado el enfoque bastante simple de extraer pares de expresiones e interpretarlos como de una sola oración a una sola respuesta, que se corresponden con las entradas para el codificador y el decodificador. , respectivamente, en los modelos.
Cornell Movie-Dialogs: comencé con esta versión preprocesada del corpus de Cornell e hice modificaciones menores para reducir el ruido.
Comentarios de Reddit: Aprox. 1.700 millones de comentarios en Reddit. Actualmente estoy trabajando en el preprocesamiento y la reducción de este enorme conjunto de datos a un formato adecuado para entrenar modelos de conversación. Publicaremos enlaces de descarga de conjuntos de datos procesados cuando esté completo.
DynamicBot: utiliza un enfoque más orientado a objetos ofrecido por clases personalizadas en model_components.py. El resultado es una incrustación concatenada por lotes en línea más rápida y un enfoque más natural para chatear. Hace uso de la nueva (fantástica) API de Python en la versión TensorFlow 1.0, en particular dinámica_rnn. También se adhiere a buenas prácticas de alcance variable y convenciones comunes de tensorflow que he observado en la documentación y el código fuente, lo que tiene buenos efectos secundarios, como visualizaciones de gráficos limpios en TensorBoard.
SimpleBot: modelo agrupado simplificado basado en el modelo 'ChatBot' más complicado que se muestra a continuación. Aunque es menos flexible a la hora de personalizar las particiones del depósito y utiliza un softmax escaso sobre todo el vocabulario en lugar de muestreo, es mucho más transparente en su implementación. Hace un uso mínimo de tf.contrib, a diferencia de ChatBot, y más o menos se implementa desde "cero", en el sentido de depender principalmente de los métodos básicos de tensorflow. Si eres nuevo en TensorFlow, puede ser útil leer su implementación para tener una idea de las convenciones comunes en la programación de tensorflow, ya que fue el resultado de leer el código fuente de todos los métodos en ChatBot y escribir el mío propio, más compacto. interpretación.
ChatBot: versión extendida del modelo descrito en este tutorial de TensorFlow. Características de la arquitectura: entradas agrupadas, el decodificador utiliza un mecanismo de atención (consulte la página 69 de mis notas, y las entradas están integradas con las funciones simples proporcionadas en la biblioteca tf.contrib. También emplea una función de pérdida softmax de muestra para permitir tamaños de vocabulario más grandes (página 67 de notas). Comentarios adicionales: debido a la naturaleza de los modelos en cubos, se necesita mucho más tiempo para crear el modelo en comparación con otros. El principal cuello de botella parece ser el tamaño del cubo más grande y cómo se crean las operaciones de gradiente en función del mismo. tamaños de cubo.
El directorio de la página web muestra una forma sencilla y que ahorra espacio para implementar sus modelos de TensorFlow en una aplicación Flask. Los modelos están "congelados": todos los componentes que no son necesarios para chatear (por ejemplo, optimizadores) se eliminan y todas las variables restantes se convierten en constantes. Cuando el usuario hace clic en el nombre de un modelo, se crea una API REST para ese modelo. Cuando el usuario ingresa una oración en el formulario, se emite una solicitud POST (AJAX), donde la respuesta es la oración de respuesta del chatbot. Para obtener más detalles sobre la API REST, consulte views.py.
La aplicación Flask sigue las mejores prácticas, como el uso de planos para crear instancias de aplicaciones, diferentes bases de datos según el entorno de la aplicación (por ejemplo, desarrollo o producción) y más.
Aquí entraré en más detalles sobre cómo se construyen los modelos y cómo se pueden visualizar. Esta sección es un trabajo en progreso y aún no está completo.
En lugar de utilizar el argumento feed_dict
para ingresar lotes de datos al modelo, es mucho más rápido codificar la información de entrada y las técnicas de preprocesamiento en la propia estructura del gráfico. Esto significa que no alimentamos nada al modelo en el momento del entrenamiento. Más bien, el modelo utiliza una secuencia de colas para acceder a los datos de los archivos en el formato protobuf de Google, decodificar los archivos en secuencias tensoriales, agrupar y rellenar dinámicamente las secuencias y luego alimentar estos lotes al decodificador de incrustación. Todo dentro de la estructura del gráfico. Además, este procesamiento de datos se coordina mediante varios subprocesos en paralelo. Podemos usar tensorboard (y las mejores prácticas para el alcance variable) para visualizar este tipo de canalización en un alto nivel.
(¡Más descripciones próximamente!)
Se han realizado muchas investigaciones sobre estos modelos y he estado documentando mis notas sobre los artículos más "importantes" aquí en la última sección de mis notas de aprendizaje profundo aquí. Las notas también incluyen cómo intenté traducir el material de los artículos al código TensorFlow. Lo actualizaré a medida que las ideas de más artículos lleguen a este proyecto.
Papeles:
Recursos en línea: