
Apenas se mostraron las noticias sobre la red neuronal BERT de Google, mostrando resultados de última generación en una serie de tareas de aprendizaje automático conversacionales (PNL), cuando OpenAI lanzó un nuevo desarrollo: GPT-2. Esta red neuronal con un número récord de parámetros en este momento (1,5 mil millones, frente a los 100-300 millones comúnmente utilizados en tales casos) fue capaz de generar páginas enteras de texto conectado.
Es tan bueno generar que OpenAI se negó a publicar la versión completa, temiendo que usarían esta red neuronal para crear noticias falsas, comentarios y reseñas indistinguibles de las reales.
Sin embargo, en OpenAI, se compartió una versión reducida de la red neuronal GPT-2 con 117 millones de parámetros. Lo lanzaremos a través del servicio Google Colab y experimentaremos con él.
Un poco de historia
Para aquellos que no han seguido el desarrollo del progreso en el procesamiento del habla natural (PNL).
En el verano de 2018, OpenAI entrenó previamente en un gran volumen de texto una red neuronal GPT construida sobre la arquitectura Transformer. Resultó que si reemplaza un par de las últimas capas y lo vuelve a entrenar para una tarea específica (este enfoque se llama Ajuste fino y se usa ampliamente en el aprendizaje automático), rompe los registros anteriores inmediatamente en una amplia gama de tareas de conversación.
Basado en este desarrollo, a finales de 2018, Google creó su propia red neuronal BERT . Mejoraron seriamente el resultado al hacer que la red neuronal fuera bidireccional, a diferencia del GPT.
Sin querer darse por vencido, en febrero de 2019, OpenAI aumentó inmediatamente su GPT en 10 veces y lo entrenó en una cantidad aún mayor de texto, en 8 millones de páginas web (un total de 40 GB de texto). La red GPT-2 resultante es actualmente la red neuronal más grande, con un número de parámetros sin precedentes de 1.500 millones (BERT tenía 340 millones en el modelo más grande y 110 millones en el BERT estándar).
Como resultado, GPT-2 pudo generar páginas enteras de texto coherente. Con referencias repetidas a los nombres de los personajes en el curso de la narración, citas, referencias a eventos relacionados, etc. No daré ejemplos aquí, pero referiré a aquellos que lo deseen al artículo original en el blog de OpenAI: Modelos de mejores lenguajes y sus implicaciones o los enlaces al final del artículo.
Generar un texto coherente de esta calidad es impresionante en sí mismo, pero lo más interesante es diferente. GPT-2 sin ningún entrenamiento adicional inmediatamente mostró resultados cercanos al estado de la técnica en una serie de tareas de conversación. Repito, quien se perdió la importancia del momento, ¡sin ningún entrenamiento adicional para una tarea específica!
¿Cómo lograron esto? Simplemente haciendo las redes neuronales las preguntas correctas.
Arquitectura GPT-2
GPT-2 está entrenado para predecir la siguiente palabra en una oración. Este es un enfoque clásico para generar texto. Al principio, las redes de recurrencia (RNN), en particular, LSTM, tenían la primacía en esta área. Pero después de la invención de la arquitectura Transformer en el verano de 2017, gradualmente comenzó a prevalecer en las tareas de conversación. Aunque el Transformer original tiene un problema para almacenar secuencias largas (los LSTM recuerdan las más largas), la velocidad del entrenamiento y la profundidad de la red lo compensaron con creces. Por cierto, ya han aparecido varias modificaciones del transformador, con la introducción de recurrencia ( Transformadores universales ), una modificación para secuencias más largas ( Transformer-XL ) y otras, pero hasta ahora solo se usa un Transformador original ligeramente sintonizado en Google y OpenAI.
Recuerdo que BERT de Google aprendió un poco diferente: predecir no la siguiente palabra en una oración, sino las palabras perdidas (enmascaradas) en una oración. Y también para determinar si dos oraciones consecutivas son una continuación lógica entre sí, o si de ninguna manera están conectadas por el significado. Esto permitió que BERT fuera un modelo de lenguaje que comprende el significado de las palabras dependiendo de su entorno (contexto). Lo que determinó el éxito de BERT en las tareas de NPL. Pero solo después del reentrenamiento (ajuste fino) para una tarea específica. Simplemente predecir palabras en el modelo base no funciona muy bien en él. Puede jugar con BERT en su navegador (a través de Google Colab): https://habr.com/en/post/436878 .
GPT-2 no es necesario volver a entrenar. Este no es solo un modelo de lenguaje como BERT, es un generador de texto. Simplemente dale el comienzo de la frase, y luego ella complementará su palabra por palabra.
Un detalle interesante: la investigación de OpenAI ha demostrado que las matrices de textos de Wikipedia y libros literarios (que BERT estudió en particular) tienen un estilo sesgado. Por lo tanto, entrenados solo en ellas las redes neuronales no generan texto muy bien. Para diversificar los datos y estilos de entrada, OpenAI utilizó GPT-2 para capacitación en páginas web regulares recopiladas de 8 millones de sitios (un total de 40 GB de texto). Y para descartar sitios de publicidad y spammers, se incluyeron en los sitios de muestra cuyos enlaces en el reddit tienen una buena calificación. Es decir, los sitios en los que viven usuarios que contienen información útil.
La pregunta correcta contiene la mitad de la respuesta.
Entonces, GPT-2, gracias a su tamaño sin precedentes, pudo generar páginas de texto coherente. Pero lo más sorprendente es que al hacerle la pregunta correcta (es decir, el comienzo correcto de una frase), ¡pudo responder varias preguntas! Solo porque la continuación de tal comienzo es lo más natural.
Por ejemplo, para obtener una respuesta a la pregunta "¿Qué es la Tierra?", Puede aplicar a la entrada de esta red neuronal el comienzo de la frase: "La Tierra es ...". Y ella completará esta frase hasta el final. Porque la respuesta será una continuación natural de este comienzo.
Además, al formar el comienzo de la frase de la manera correcta, puede obtener explicaciones para diferentes audiencias objetivo, teniendo en cuenta su inteligencia, edad y educación. Imagine frases continuas: "Yo, como científico, creo que la Tierra es ...". O: "Yo, como arado de tierras, afirmo que la Tierra es ...". O: "Yo, como maestra en un jardín de infantes, ahora les explicaré, niños, que la Tierra es ...".
Como puede ver, al formar las preguntas correctas (el comienzo correcto de la frase), puede obtener respuestas de niveles completamente diferentes y detalles diferentes. En cierto modo, sucede algo similar en las personas. El médico debe explicarle al paciente el curso de la enfermedad para que comprenda. A nivel del paciente. Si le preguntas a un niño de cinco años por qué hizo esto, entonces no puede responder de inmediato (que, naturalmente, los niños viven con sentimientos y emociones). Pero para dar la respuesta que se espera de él, el niño comienza a inventarla: a generar texto. Basado en el hecho de que la respuesta se adapta al padre y que al menos de alguna manera corresponde a lo que sucedió. Al principio, como muchos padres saben, estas serán respuestas ridículas. Pero al alentar y castigar ("cuéntame más", "no inventes excusas"), el niño aprenderá a dar respuestas detalladas y completas.
Este desarrollo de OpenAI y la capacidad de la red GPT-2 de proporcionar respuestas a tareas de conversación sin capacitación adicional especial para una tarea específica, abren dos preguntas interesantes:
1) ¿Se puede lograr la interpretabilidad de las redes neuronales mediante un generador de texto tan elemental y el comienzo correcto de una frase? Donde la respuesta será una extensión natural. Supongamos, por ejemplo, que una red neuronal no indica sellos en una fotografía mediante los números de coordenadas x-y, sino que explica su posición en texto plano. Luego, en el curso de la aclaración, haciéndole la pregunta correcta, por ejemplo: "Llegué a esta conclusión porque ...", en teoría, puede obtener una explicación de cómo encontró al gato en la foto. Y esta explicación en el caso extremo no puede ser peor que la humana. Lo que resuelve el problema global de la interpretabilidad de las redes neuronales.
2) ¿Puede una red neuronal pre-entrenada en grandes volúmenes de texto ser universal, tener sentido común y no requerir entrenamiento adicional para tareas específicas? Aquí, se entiende que cuando se trata de imitar el habla humana (respuestas humanas a preguntas), la red neuronal inevitablemente debe aprender el sentido común para dar respuestas muy similares a las humanas. Dar respuestas ficticias monosilábicas, en general, no es típico de las personas. En su mayor parte, las personas dan respuestas adecuadas detalladas, lo que significa que la red debe aprender a hacer lo mismo.
Ambas preguntas permanecen abiertas, pero definitivamente se ha dado el primer paso para su aprobación.
O más bien?
Si está de pie ahora, es mejor sentarse. Porque así es como OpenAI usando la red neuronal GPT-2 obtuvo sus resultados en tareas de conversación para diferentes dominios:
Respuestas a preguntas sobre el texto.
Bueno, eso es fácil. O alimentó a la red unos pocos párrafos con una descripción que incluía en algún lugar en el medio, por ejemplo, "la manzana está en la mesa", y al final se le atribuyó: "la manzana está en ..." y la red se agregó a la "mesa". Porque es capaz de recordar el contexto de varios párrafos.
O alimentó la red como una frase inicial con algunos ejemplos del tipo "Pregunta: alguna pregunta, Respuesta: alguna respuesta", y al final después de la pregunta real, agregaron: "Respuesta:". ¡Y la red neuronal agregó la respuesta! Dado que reveló la estructura del documento en la Pregunta-Respuesta anterior. Esto es asombroso.
Versión corta (resumen) del texto
La entrada es un texto largo de varios párrafos o incluso páginas, y la red neuronal debe escribir un contenido breve. ¿Cómo obtuvo este comportamiento de GPT-2? Justo después del texto agregaron "TL; DR". ¡Y eso es todo! ¡Esto resultó ser suficiente para que el GPT-2 agregue un resumen del artículo después de estos personajes! Debido a que tales símbolos en Internet a menudo denotan el resumen de la publicación.
Traducción de textos
La entrada GPT-2 recibió el texto en la forma: "hola = hola, perro = perro, viento = viento, gato = ...". Y la red neuronal agregó la traducción de la última palabra: "gato" (en el original en francés). Porque reveló la estructura del documento y simplemente lo complementó con la continuación más lógica. Si su mandíbula aún no se ha caído de todo esto, entonces tengo dos noticias para usted, y ambas son malas =).
Lanzamiento de GPT-2 a través de Google Colab
Desafortunadamente, la versión completa de GPT-2 en OpenAI fue rechazada para ser compartida. Motivando esto por el hecho de que usar esta red neuronal será demasiado fácil generar noticias falsas y críticas en las tiendas. A juzgar por su declaración, la discusión sobre la conveniencia de diseñar este modelo continuará durante los próximos 6 meses, luego de OpenAI decidirán si lo suben o no. Sin embargo, para una organización grande no es difícil repetir el modelo (parece que lo entrenaron para 256 TPU durante varios días y, según estimaciones preliminares, les costó alrededor de $ 45 mil)
Sin embargo, publicaron una versión reducida de GPT-2 con 117 millones de parámetros (en lugar de 1.5 mil millones, como en el modelo completo): https://github.com/openai/gpt-2 . Intentemos ejecutarlo y jugar con este modelo.
Actualización 9 de noviembre de 2019: finalmente, se ha presentado toda la línea de modelos, incluidos 1.500 millones, y se han actualizado los archivos y las instrucciones para el lanzamiento.
La forma más fácil de hacerlo es a través de Google Colab:
- Abrir el enlace
http://colab.research.google.com/github/blade1780/bert/blob/master/Gpt-2.ipynb
- En el menú Tiempo de ejecución , seleccione Ejecutar todo , de modo que por primera vez se inicien todas las celdas, el modelo se descargue y se conecten las bibliotecas necesarias. Acepte restablecer todo el tiempo de ejecución si es necesario. Ingrese el texto después de la aparición de "Solicitud de modelo >>>" y presione Entrar.
Presta atención a la línea desde el principio:
nombre_modelo = '117M'
Aquí puede especificar el tamaño del modelo GPT-2 a utilizar. Los siguientes modelos están disponibles (sujetos a actualización):
117 millones
124 millones
355 millones
Los 774M
El 1558M
Aquí, 117M es el modelo más pequeño que era el único disponible en el momento de escribir este artículo. OpenAI luego presentó modelos cada vez mayores, hasta el 5 de noviembre de 2019, presentó el máximo de 1558 millones (con 1.500 millones de parámetros).
Si algo salió mal ...Asegúrese de que GPU y Python 3 estén seleccionados en el menú Tiempo de ejecución -> Cambiar tipo de tiempo de ejecución
Si el botón de conexión no está activo, haga clic para conectarse.
O cree todo el código manualmente:
- Vaya a https://colab.research.google.com
- Presione el botón azul del CUADERNO NEW PYTHON 3
- Desde el menú Tiempo de ejecución -> Cambiar tipo de tiempo de ejecución, seleccione Python 3 y la GPU (este último para ejecutar la red neuronal en la GPU)
- En la primera celda, escriba:
model_name = '117M' !git clone https://github.com/openai/gpt-2 %cd gpt-2 !pip3 install -r requirements.txt !python3 download_model.py $model_name
En lugar de 117M (el más pequeño), puede especificar cualquier modelo intermedio o más grande: 1558M.
Y haga clic en el ícono negro Play a la izquierda de la celda. Esto descargará la red neuronal GPT-2 seleccionada e instalará las dependencias necesarias.
En la segunda celda (puede agregarlo a través del menú Insertar -> Celda de código o colocando el mouse debajo del centro de la celda actual, aparecerán los botones de agregar):
!python3 src/interactive_conditional_samples.py --model_name=$model_name
Esto iniciará el modo interactivo. Espere hasta que la red neuronal se inicie y aparezca una ventana para ingresar texto con la inscripción "" Solicitud de modelo >>> ". Ingrese el comienzo de la frase y presione Entrar. Después de un momento, el texto generado aparece debajo del encabezado MUESTRA.
También puede iniciar el modo de generar texto completamente al azar. El texto se generará infinitamente en pequeñas piezas de SAMPLE 1, SAMPLE 2, etc., hasta que haga clic en el botón Detener en la celda. Para hacer esto, cree una nueva celda con el código:
!python3 src/generate_unconditional_samples.py --model_name=$model_name | tee samples.txt
El resultado se guardará en el archivo samples.txt. Se puede descargar con los siguientes comandos (cree una nueva celda nuevamente y ejecútela después de generar el texto):
from google.colab import files files.download('samples.txt')
Puede cambiar los parámetros para generar texto (coeficiente de aleatoriedad, etc., consulte la descripción en el trabajo original ):
!python3 src/generate_unconditional_samples.py --model_name=$model_name --top_k 40 --temperature 0.7 | tee samples.txt
Dado que el 117M es un modelo muy reducido, no espere milagros (actualización: en el momento de escribir este artículo, solo estaba disponible. Ahora todo está disponible, incluido el 1558M más grande original, ver arriba). La mayoría de las muestras generadas serán absurdas. Pero también hay secciones significativas. El texto debe estar en inglés, mientras que en otros idiomas GPT-2 aún no puede funcionar.
Ejemplos de texto generado.
Muestras del texto generado por el modelo completo : https://blog.openai.com/better-language-models/#sample1 (en la parte superior de la barra para 8 historias).
También hay un enorme archivo de texto de 2.4 Mb con muestras generadas al azar: https://raw.githubusercontent.com/openai/gpt-2/master/gpt2-samples.txt
Y uno más, 2.27 MB, con otras configuraciones de aleatoriedad: https://raw.githubusercontent.com/openai/gpt-2/master/gpt2-topk40-samples.txt
Referencias