Configure un proyecto de resumen de texto con Hugging Face Transformers: Parte 1

Nodo de origen: 1236281

Cuándo OpenAI lanzó la tercera generación de su modelo de aprendizaje automático (ML) que se especializa en la generación de texto en julio de 2020, sabía que algo era diferente. Este modelo tocó un nervio como ningún otro anterior. De repente, escuché a amigos y colegas, que podrían estar interesados ​​en la tecnología, pero que por lo general no se preocupan mucho por los últimos avances en el espacio de IA/ML, hablar sobre ello. Incluso The Guardian escribió un artículo sobre eso O, para ser precisos, el modelo escribió el artículo y The Guardian lo editó y publicó. No había cómo negarlo - GPT-3 fue un cambio de juego.

Después de que se lanzó el modelo, la gente inmediatamente comenzó a pensar en posibles aplicaciones para él. En cuestión de semanas, se crearon muchas demostraciones impresionantes, que se pueden encontrar en la Sitio web de GPT-3. Una aplicación en particular que me llamó la atención fue resumen de texto - la capacidad de una computadora para leer un texto dado y resumir su contenido. Es una de las tareas más duras para un ordenador porque combina dos campos dentro del campo del procesamiento del lenguaje natural (PNL): la comprensión lectora y la generación de texto. Por eso me impresionaron tanto las demostraciones de GPT-3 para el resumen de texto.

Puedes darles una oportunidad en el Sitio web de Hugging Face Spaces. Mi favorito en este momento es un solicitud en línea. que genera resúmenes de artículos de noticias con solo la URL del artículo como entrada.

En esta serie de dos partes, propongo una guía práctica para organizaciones para que pueda evaluar la calidad de los modelos de resumen de texto para su dominio.

Descripción general del tutorial

Muchas organizaciones con las que trabajo (caridades, empresas, ONG) tienen una gran cantidad de textos que necesitan leer y resumir: informes financieros o artículos de noticias, trabajos de investigación científica, solicitudes de patentes, contratos legales y más. Naturalmente, estas organizaciones están interesadas en automatizar estas tareas con tecnología NLP. Para demostrar el arte de lo posible, a menudo uso las demostraciones de resúmenes de texto, que casi nunca dejan de impresionar.

Pero ahora que?

El desafío para estas organizaciones es que quieren evaluar modelos de resumen de texto basados ​​en resúmenes de muchos, muchos documentos, no uno a la vez. No quieren contratar a un pasante cuyo único trabajo es abrir la aplicación, pegar un documento, presionar el Resumir , espere el resultado, evalúe si el resumen es bueno y vuelva a hacerlo para miles de documentos.

Escribí este tutorial pensando en mi yo del pasado de hace cuatro semanas: es el tutorial que desearía tener cuando comencé este viaje. En ese sentido, el público objetivo de este tutorial es alguien que está familiarizado con AI/ML y ha usado modelos de Transformer antes, pero está al comienzo de su viaje de resumen de texto y quiere profundizar más en él. Debido a que está escrito por un "principiante" y para principiantes, quiero enfatizar el hecho de que este tutorial es a guía práctica – no las guía práctica. Por favor, trátalo como si Caja George EP había dicho:

En términos de cuánto conocimiento técnico se requiere en este tutorial: implica algo de codificación en Python, pero la mayoría de las veces solo usamos el código para llamar a las API, por lo que tampoco se requiere un conocimiento profundo de codificación. Es útil estar familiarizado con ciertos conceptos de ML, como lo que significa Presión en y desplegar un modelo, los conceptos de la formación, validacióny conjuntos de datos de prueba, y así. Además de haber incursionado en el Biblioteca de transformadores antes podría ser útil, porque usamos esta biblioteca ampliamente a lo largo de este tutorial. También incluyo enlaces útiles para leer más sobre estos conceptos.

Debido a que este tutorial está escrito por un principiante, no espero que los expertos en PNL y los profesionales avanzados de aprendizaje profundo obtengan mucho de este tutorial. Al menos no desde una perspectiva técnica; sin embargo, es posible que aún disfrute de la lectura, ¡así que no se vaya todavía! Pero tendrá que ser paciente con respecto a mis simplificaciones: traté de vivir según el concepto de hacer que todo en este tutorial sea lo más simple posible, pero no más simple.

Estructura de este tutorial

Esta serie se extiende a lo largo de cuatro secciones divididas en dos publicaciones, en las que recorremos las diferentes etapas de un proyecto de resumen de texto. En la primera publicación (sección 1), comenzamos presentando una métrica para las tareas de resumen de texto, una medida de rendimiento que nos permite evaluar si un resumen es bueno o malo. También introducimos el conjunto de datos que queremos resumir y creamos una línea de base usando un modelo sin ML: usamos una heurística simple para generar un resumen de un texto dado. La creación de esta línea de base es un paso de vital importancia en cualquier proyecto de ML porque nos permite cuantificar cuánto progreso hacemos al utilizar la IA en el futuro. Nos permite responder a la pregunta "¿Realmente vale la pena invertir en tecnología de IA?"

En la segunda publicación, usamos un modelo que ya ha sido entrenado previamente para generar resúmenes (sección 2). Esto es posible con un enfoque moderno en ML llamado transferencia de aprendizaje. Es otro paso útil porque básicamente tomamos un modelo listo para usar y lo probamos en nuestro conjunto de datos. Esto nos permite crear otra línea de base, lo que nos ayuda a ver qué sucede cuando realmente entrenamos el modelo en nuestro conjunto de datos. El enfoque se llama resumen de tiro cero, porque el modelo no ha tenido exposición a nuestro conjunto de datos.

Después de eso, es hora de usar un modelo previamente entrenado y entrenarlo en nuestro propio conjunto de datos (sección 3). Esto también se llama sintonia FINA. Permite que el modelo aprenda de los patrones e idiosincrasias de nuestros datos y se adapte lentamente a ellos. Después de entrenar el modelo, lo usamos para crear resúmenes (sección 4).

En resumen:

  • Parte 1:
    • Sección 1: Use un modelo sin ML para establecer una línea de base
  • Parte 2:
    • Sección 2: generar resúmenes con un modelo de tiro cero
    • Sección 3: entrenar un modelo de resumen
    • Sección 4: Evaluar el modelo entrenado

El código completo para este tutorial está disponible en el siguiente Repositorio GitHub.

¿Qué habremos logrado al final de este tutorial?

Al final de este tutorial, no se cumplirán tener un modelo de resumen de texto que se pueda usar en producción. Ni siquiera tendremos un candidato modelo de resumen (inserte emoji de grito aquí)!

Lo que tendremos en cambio es un punto de partida para la siguiente fase del proyecto, que es la fase de experimentación. Aquí es donde entra la "ciencia" en la ciencia de datos, porque ahora se trata de experimentar con diferentes modelos y diferentes configuraciones para comprender si se puede entrenar un modelo de resumen lo suficientemente bueno con los datos de entrenamiento disponibles.

Y, para ser completamente transparente, existe una buena posibilidad de que la conclusión sea que la tecnología aún no está madura y que el proyecto no se implementará. Y debe preparar a las partes interesadas de su negocio para esa posibilidad. Pero eso es tema para otro post.

Sección 1: Use un modelo sin ML para establecer una línea de base

Esta es la primera sección de nuestro tutorial sobre cómo configurar un proyecto de resumen de texto. En esta sección, establecemos una línea de base usando un modelo muy simple, sin usar ML. Este es un paso muy importante en cualquier proyecto de ML, porque nos permite comprender cuánto valor agrega ML a lo largo del tiempo del proyecto y si vale la pena invertir en él.

El código para el tutorial se puede encontrar en el siguiente Repositorio GitHub.

Datos, datos, datos

¡Cada proyecto de ML comienza con datos! Si es posible, siempre debemos usar datos relacionados con lo que queremos lograr con un proyecto de resumen de texto. Por ejemplo, si nuestro objetivo es resumir las solicitudes de patentes, también deberíamos usar las solicitudes de patentes para entrenar el modelo. Una gran advertencia para un proyecto de ML es que los datos de entrenamiento generalmente deben etiquetarse. En el contexto del resumen de texto, eso significa que debemos proporcionar el texto que se va a resumir, así como el resumen (la etiqueta). Solo al proporcionar ambos puede el modelo aprender cómo es un buen resumen.

En este tutorial, usamos un conjunto de datos disponible públicamente, pero los pasos y el código siguen siendo exactamente los mismos si usamos un conjunto de datos personalizado o privado. Y nuevamente, si tiene un objetivo en mente para su modelo de resumen de texto y tiene los datos correspondientes, use sus datos en su lugar para aprovecharlo al máximo.

Los datos que utilizamos son los conjunto de datos arXiv, que contiene resúmenes de artículos de arXiv, así como sus títulos. Para nuestro propósito, usamos el resumen como el texto que queremos resumir y el título como el resumen de referencia. Todos los pasos de descarga y preprocesamiento de los datos están disponibles en el siguiente cuaderno. Requerimos un Gestión de identidades y accesos de AWS (IAM) función que permite cargar datos hacia y desde Servicio de almacenamiento simple de Amazon (Amazon S3) para ejecutar este portátil con éxito. El conjunto de datos se desarrolló como parte del documento Sobre el uso de ArXiv como conjunto de datos y tiene licencia bajo el Creative Commons CC0 1.0 Dedicación de dominio público universal.

Los datos se dividen en tres conjuntos de datos: entrenamiento, validación y datos de prueba. Si desea utilizar sus propios datos, asegúrese de que este también sea el caso. El siguiente diagrama ilustra cómo usamos los diferentes conjuntos de datos.

Naturalmente, una pregunta común en este punto es: ¿Cuántos datos necesitamos? Como probablemente ya puedas adivinar, la respuesta es: depende. Depende de qué tan especializado sea el dominio (resumir solicitudes de patentes es bastante diferente de resumir artículos de noticias), qué tan preciso debe ser el modelo para ser útil, cuánto debería costar el entrenamiento del modelo, etc. Regresaremos a esta pregunta en un momento posterior cuando realmente entrenamos el modelo, pero en resumen, tenemos que probar diferentes tamaños de conjuntos de datos cuando estamos en la fase de experimentación del proyecto.

¿Qué hace a un buen modelo?

En muchos proyectos de ML, es bastante sencillo medir el rendimiento de un modelo. Esto se debe a que, por lo general, hay poca ambigüedad en torno a si el resultado del modelo es correcto. Las etiquetas en el conjunto de datos suelen ser binarias (Verdadero/Falso, Sí/No) o categóricas. En cualquier caso, en este escenario es fácil comparar la salida del modelo con la etiqueta y marcarla como correcta o incorrecta.

Al generar texto, esto se vuelve más desafiante. Los resúmenes (las etiquetas) que proporcionamos en nuestro conjunto de datos son solo una forma de resumir el texto. Pero hay muchas posibilidades para resumir un texto dado. Por lo tanto, incluso si el modelo no coincide con nuestra etiqueta 1:1, el resultado podría ser un resumen válido y útil. Entonces, ¿cómo comparamos el resumen del modelo con el que proporcionamos? La métrica que se usa con más frecuencia en el resumen de texto para medir la calidad de un modelo es la Puntuación ROUGE. Para comprender la mecánica de esta métrica, consulte La métrica de rendimiento definitiva en PNL. En resumen, la puntuación ROUGE mide la superposición de n-gramos (secuencia contigua de n elementos) entre el resumen del modelo (resumen del candidato) y el resumen de referencia (la etiqueta que proporcionamos en nuestro conjunto de datos). Pero, por supuesto, esta no es una medida perfecta. Para comprender sus limitaciones, consulte ¿A ROUGE o no a ROUGE?

Entonces, ¿cómo calculamos la puntuación ROUGE? Existen bastantes paquetes de Python para calcular esta métrica. Para garantizar la coherencia, debemos utilizar el mismo método en todo el proyecto. Debido a que, en un punto posterior de este tutorial, usaremos un script de entrenamiento de la biblioteca de Transformers en lugar de escribir el nuestro, podemos echar un vistazo al código fuente del script y copie el código que calcula la puntuación de ROUGE:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

Al utilizar este método para calcular la puntuación, nos aseguramos de comparar siempre manzanas con manzanas a lo largo del proyecto.

Esta función calcula varias puntuaciones de ROUGE: rouge1, rouge2, rougeLy rougeLsum. La "suma" en rougeLsum se refiere al hecho de que esta métrica se calcula sobre un resumen completo, mientras que rougeL se calcula como el promedio de oraciones individuales. Entonces, ¿qué partitura ROUGE deberíamos usar para nuestro proyecto? Una vez más, tenemos que probar diferentes enfoques en la fase de experimentación. Por lo que vale, el papel ROUGE original afirma que "ROUGE-2 y ROUGE-L funcionaron bien en tareas de resumen de un solo documento", mientras que "ROUGE-1 y ROUGE-L funcionan muy bien en la evaluación de resúmenes breves".

Crear la línea de base

A continuación, queremos crear la línea de base mediante el uso de un modelo simple, sin ML. ¿Que significa eso? En el campo de la síntesis de textos, muchos estudios utilizan un enfoque muy simple: toman la primera n oraciones del texto y declararlo el resumen candidato. Luego comparan el resumen del candidato con el resumen de referencia y calculan la puntuación ROUGE. Este es un enfoque simple pero poderoso que podemos implementar en unas pocas líneas de código (el código completo para esta parte está en el siguiente cuaderno):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

Utilizamos el conjunto de datos de prueba para esta evaluación. Esto tiene sentido porque después de entrenar el modelo, también usamos el mismo conjunto de datos de prueba para la evaluación final. También probamos diferentes números para n: comenzamos con solo la primera oración como resumen candidato, luego las dos primeras oraciones y finalmente las tres primeras oraciones.

La siguiente captura de pantalla muestra los resultados de nuestro primer modelo.

Los puntajes de ROUGE son los más altos, con solo la primera oración como resumen del candidato. Esto significa que tomar más de una oración hace que el resumen sea demasiado detallado y conduce a una puntuación más baja. Eso significa que usaremos las puntuaciones de los resúmenes de una oración como referencia.

Es importante tener en cuenta que, para un enfoque tan simple, estos números son bastante buenos, especialmente para el rouge1 puntaje. Para poner estos números en contexto, podemos referirnos a Modelos Pegasus, que muestra las puntuaciones de un modelo de última generación para diferentes conjuntos de datos.

Conclusión y lo que sigue

En la Parte 1 de nuestra serie, presentamos el conjunto de datos que usamos a lo largo del proyecto de resumen, así como una métrica para evaluar los resúmenes. Luego creamos la siguiente línea de base con un modelo simple, sin ML.

En próximo post, usamos un modelo de tiro cero, específicamente, un modelo que ha sido entrenado específicamente para el resumen de texto en artículos de noticias públicas. Sin embargo, este modelo no se entrenará en absoluto en nuestro conjunto de datos (de ahí el nombre de "disparo cero").

Les dejo como tarea que adivinen cómo funcionará este modelo de tiro cero en comparación con nuestra línea de base muy simple. Por un lado, será un modelo mucho más sofisticado (en realidad es una red neuronal). Por otro lado, solo se usa para resumir artículos de noticias, por lo que podría tener problemas con los patrones inherentes al conjunto de datos arXiv.


Sobre la autora

Heiko Hotz es arquitecto sénior de soluciones para IA y aprendizaje automático y lidera la comunidad de procesamiento de lenguaje natural (NLP) dentro de AWS. Antes de ocupar este puesto, fue director de ciencia de datos del servicio de atención al cliente de la UE de Amazon. Heiko ayuda a nuestros clientes a tener éxito en su viaje de IA/ML en AWS y ha trabajado con organizaciones en muchas industrias, incluidas las de seguros, servicios financieros, medios y entretenimiento, atención médica, servicios públicos y fabricación. En su tiempo libre, Heiko viaja tanto como puede.

Sello de tiempo:

Mas de Aprendizaje automático de AWS