#### [Actualización 2017-03-14]
- Actualice a TensorFlow V1.0.0, sin compatible con retroceso ya que TensorFlow ha cambiado tanto.
- Se agrega un modelo previamente capacitado con Twitter Corpus, justo
./go_examplepara chatear! (o una vista previa de mi ejemplo de chat)- ¡Podrías comenzar por rastrear este script
go_examplepara saber cómo funcionan las cosas!
Este es un modelo SEQ2SEQ modificado a partir del ejemplo de TensorFlow.
app.py de frascos de peso ligero para ser el backend de la aplicación Facebook Messenger. Expliqué algunos detalles sobre las características y algunos trucos de implementación aquí.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Puede encontrar corpus como el chat de Twitter, el subtítulo de película abierto o los foros de PTT de mi repositorio de CHAT Corpus. Necesitas ponerlo en camino como:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
Y elabore a mano algunas oraciones de prueba (cada oración por línea) en:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
Después de capacitar a su modelo hasta la perplejidad de menos de 50 años, podría hacer:
python3 main.py --mode test --model_name <MODEL_NAME>
[¡NOTA!] Si coloca alguna sobrescritura de parámetros en esta Commmand Main.py, asegúrese de aplicar tanto para entrenar como a prueba, o simplemente modificar en lib/config.py para FailSafe.
python3 app.py --model_name <MODEL_NAME>
Puede ver este ejemplo mínimo de FB_Messenger para obtener más detalles como configurar SSL, Webhook y Work-AROUNDS para el error conocido.
Aquí hay una comparación interesante: la búsqueda de haz habilitada para la conversación izquierda con Beam = 10, la respuesta es apenas mejor que siempre "no sé". La conversación correcta también utilizó la búsqueda del haz y, además, habilitó el modelo anti-lenguaje. Esto se supone que suprime la respuesta genérica, y la respuesta DO parece mejor.
[Actualizar 2017-03-09] El aprendizaje de refuerzo no funciona ahora, espere a la solución.
Si desea alguna oportunidad para mejorar aún más su modelo, aquí implementé una arquitectura de aprendizaje de refuerzo inspirada en Li et al., 2016. Simplemente habilite la opción Reforce_learn en config.py , es posible que desee agregar su propia regla en la función step_rf() en lib/seq2seq_mode.py .
¡Tenga en cuenta que debe entrenar en modo normal para obtener un modelo decente primero! , dado que el aprendizaje de refuerzo explorará el nuevo mundo valiente con este modelo previamente capacitado. Terminará tomando una eternidad para mejorarse si comienza con un mal modelo.
SEQ2SEQ es un gran modelo publicado por Cho et al., 2014. Al principio se usa para hacer traducción automática, y pronto la gente encuentra que cualquier cosa sobre mapear algo a otra cosa también podría ser lograda por el modelo SEQ2SEQ. Chatbot es uno de estos milagros, donde consideramos el diálogo consecutivo como una especie de relación de "mapeo".
Aquí está el clásico INTRO Picture Show The SEQ2SEQ Model Architecture, cita de esta función de blog sobre la función Gmail Auto-Repply.
El problema es que hasta ahora no hemos encontrado una mejor función objetivo para ChatBot. Todavía estamos usando MLE (estimación máxima de probabilidad), que está funcionando bien para la traducción automática, pero siempre generamos una respuesta genérica como "yo también", "Creo que", "te amo" mientras charlito.
Estas respuestas no son informativas, pero tienen una gran probabilidad, ya que tienden a aparecer muchas veces en el corpus de entrenamiento. No nosotros no siempre responderá nuestro chatbot, por lo que necesitamos encontrar alguna forma de hacer que nuestro bot sea más "interesante", técnicamente hablando, para aumentar la "perplejidad" de la respuesta.
Aquí reproducimos el trabajo de Li. et al., 2016 intenta resolver este problema. La idea principal es usar el mismo modelo SEQ2SEQ que un modelo de lenguaje, para que las palabras candidatas con alta probabilidad en cada marca de tiempo de decodificación como anti-modelo, luego penalizamos estas palabras, siempre es una alta probabilidad para cualquier entrada. Según este antimodelo, podríamos obtener una respuesta más especial, no genérica e informativa.
El trabajo original de Li. et al usan MERT (OCH, 2003) con Bleu como métricas para encontrar la mejor ponderación de probabilidad (el λ y γ en la puntuación (t) = p (t | s)-λu (t) + γnt ) del modelo anti-lenguaje correspondiente. Pero encuentro que la puntuación de Bleu en el corpus de chat tiende a ser siempre cero, por lo que no puede obtener un resultado significativo aquí. Si alguien tiene alguna idea sobre esto, envíeme un mensaje, ¡gracias!
Hay algunas opciones para el entrenamiento de modelos y la predicción en lib/config.py. Básicamente se explican por sí mismos y podrían funcionar con el valor predeterminado para la mayoría de los casos. Aquí solo enumeramos algo que necesita para configurar:
Sobre el medio ambiente
| nombre | tipo | Descripción |
|---|---|---|
| modo | cadena | Modo de trabajo: tren/prueba/chat |
| model_name | cadena | Nombre del modelo, afecta su ruta de trabajo (almacenar los datos, nn_model, carpetas de resultados) |
| scope_name | cadena | En TensorFlow si necesita cargar dos gráficos al mismo tiempo, debe guardarlos/cargarlos en diferentes espacios de nombres. (Si solo necesita un modelo SEQ2SEQ, déjelo como predeterminado) |
| VOCAB_SIZE | entero | Depende del idioma de su corpus: para el inglés, 60000 es lo suficientemente bueno. Para los chinos necesitas al menos 100000 o 200000. |
| GPU_USAGE | flotar | La fracción de memoria de GPU de TensorFlow utilizada, el valor predeterminado es 1 y TensorFlow ocupará el 100% de su GPU. Si tiene múltiples trabajos compartiendo su recurso GPU, hágalo 0.5 o 0.3, para 2 o 3 trabajos. |
| reforzarse_learn | intencionalmente | Establecer 1 para habilitar el modo de aprendizaje de refuerzo |
Sobre la decodificación
| nombre | tipo | por defecto | Descripción |
|---|---|---|---|
| beam_size | intencionalmente | 10 | Tamaño de búsqueda de haz, configurar 1 es igual a la búsqueda codiciosa |
| antilmo | flotar | 0 (deshabilitado) | castigar el peso del modelo anti-lenguaje |
| n_bonus | flotar | 0 (deshabilitado) | El peso de recompensa de la longitud de la oración |
La functina anti-LM está deshabilitada de forma predeterminada, puede comenzar desde la configuración de antilm = 0.5 ~ 0.7 y n_bonus = 0.05 para ver si le gusta la diferencia en los resultados.
Para el entrenamiento, se recomienda GPU ya que SEQ2SEQ es un modelo grande, necesita cierta potencia informática para realizar el entrenamiento y predecir de manera eficiente, especialmente cuando establece un tamaño de búsqueda de haz grande.
El requisito de DRAM no es estricto como CPU/GPU, ya que estamos haciendo un gradiente estocástico decente.
Si eres nuevo en el aprendizaje profundo, configurar cosas como GPU, Python Environment es molesto para ti, aquí hay un entorno de aprendizaje automático:
(Versión no GPU Docker) / (Versión de GPU Docker)
SEQ2SEQ es un modelo con muchos preliminares, he pasado bastante tiempo encuestando y aquí hay algunos de los mejores materiales que me benefician mucho:
El mejor modelo de blog que explica el modelo RNN, LSTM, GRU y SEQ2SEQ: Comprensión de las redes LSTM de Christopher Olah.
Este trabajo Sherjilozair/Char-Rnn-TensorFlow me ayuda a aprender mucho sobre el modelo de idioma y el gráfico de implementación en TensorFlow.
Si está interesado en más magia sobre RNN, aquí hay una publicación de blog de lectura obligada: la efectividad irrazonable de las redes neuronales recurrentes de Andrej Karpathy.
La versión de vainilla SEQ2SEQ+Atención: Nicolas-IVanov/TF_SEQ2SEQ_CHATBOT. Esto lo ayudará a descubrir el flujo principal del modelo Vanilla SEQ2SEQ, y construyo este repositorio basado en este trabajo.
Actualmente construyo la búsqueda de haz de gráfico, lo que significa, es muy lento. Hay discusiones sobre construirlo en gráfico aquí y allá. Pero desafortunadamente, si desea agregar algo más que la búsqueda del haz, como este trabajo anti-LM, necesita mucho más que una búsqueda de haz para estar en gráfico.
No he descubierto cómo el Mert con Bleu puede optimizar el peso del modelo anti-LM, ya que actualmente el BLU a menudo es cero.