Aprendizaje Activo con AutoNLP y Prodigy

'Active Learning with AutoNLP and Prodigy'

El aprendizaje activo en el contexto del Aprendizaje Automático es un proceso en el cual se añade de forma iterativa datos etiquetados, se entrena un modelo y se sirve al usuario final. Es un proceso interminable y requiere interacción humana para etiquetar/crear los datos. En este artículo, discutiremos cómo utilizar AutoNLP y Prodigy para construir un pipeline de aprendizaje activo.

AutoNLP

AutoNLP es un framework creado por Hugging Face que te ayuda a construir tus propios modelos de aprendizaje profundo de última generación en tus propios conjuntos de datos con casi ninguna programación. AutoNLP se basa en las herramientas de Hugging Face como transformers, datasets, inference-api y muchas otras.

Con AutoNLP, puedes entrenar modelos transformadores de última generación en tu propio conjunto de datos personalizado, ajustarlos finamente (automáticamente) y servirlos al usuario final. Todos los modelos entrenados con AutoNLP son de última generación y están listos para producción.

En el momento de escribir este artículo, AutoNLP admite tareas como clasificación binaria, regresión, clasificación de múltiples clases, clasificación de tokens (como reconocimiento de entidades nombradas o partes del discurso), respuesta a preguntas, resumen y más. Puedes encontrar una lista de todas las tareas compatibles aquí. AutoNLP admite idiomas como inglés, francés, alemán, español, hindi, holandés, sueco y muchos más. También hay soporte para modelos personalizados con tokenizadores personalizados (en caso de que tu idioma no sea compatible con AutoNLP).

Prodigy

Prodigy es una herramienta de anotación desarrollada por Explosion (los creadores de spaCy). Es una herramienta basada en web que te permite anotar tus datos en tiempo real. Prodigy admite tareas de procesamiento del lenguaje natural como reconocimiento de entidades nombradas (NER) y clasificación de texto, ¡pero no se limita a NLP! ¡Admite tareas de Visión por Computadora e incluso la creación de tus propias tareas! Puedes probar la demostración de Prodigy aquí.

Ten en cuenta que Prodigy es una herramienta comercial. Puedes obtener más información al respecto aquí.

Elegimos Prodigy porque es una de las herramientas más populares para etiquetar datos y es infinitamente personalizable. También es muy fácil de configurar y usar.

Conjunto de datos

Ahora comienza la parte más interesante de este artículo. Después de examinar muchos conjuntos de datos y diferentes tipos de problemas, nos encontramos con el conjunto de datos de Clasificación de Noticias de la BBC en Kaggle. Este conjunto de datos se utilizó en una competencia en clase y se puede acceder aquí.

Echemos un vistazo a este conjunto de datos:

Como podemos ver, este es un conjunto de datos de clasificación. Hay una columna de Texto que es el texto del artículo de noticias y una columna de Categoría que es la clase del artículo. En general, hay 5 clases diferentes: negocios, entretenimiento, política, deporte y tecnología.

Entrenar un modelo de clasificación de múltiples clases en este conjunto de datos utilizando AutoNLP es pan comido.

Paso 1: Descarga el conjunto de datos.

Paso 2: Abre AutoNLP y crea un nuevo proyecto.

Paso 3: Sube el conjunto de datos de entrenamiento y elige la división automática.

Paso 4: Acepta la tarificación y entrena tus modelos.

Ten en cuenta que en el ejemplo anterior, estamos entrenando 15 modelos diferentes de clasificación de múltiples clases. El precio de AutoNLP puede ser tan bajo como $10 por modelo. AutoNLP seleccionará los mejores modelos y realizará la afinación de hiperparámetros por ti. Así que ahora, todo lo que necesitamos hacer es relajarnos y esperar los resultados.

Después de aproximadamente 15 minutos, todos los modelos terminaron de entrenar y los resultados están listos. ¡Parece que el mejor modelo obtuvo un 98.67% de precisión!

Entonces, ahora podemos clasificar los artículos en el conjunto de datos con una precisión del 98.67%. Pero espera, estábamos hablando de aprendizaje activo y Prodigy. ¿Qué pasó con ellos? 🤔 De hecho, utilizamos Prodigy como veremos pronto. Lo usamos para etiquetar este conjunto de datos para la tarea de reconocimiento de entidades nombradas. Antes de comenzar la parte de etiquetado, pensamos que sería genial tener un proyecto en el cual no solo pudiéramos detectar las entidades en los artículos de noticias, sino también categorizarlas. Por eso construimos este modelo de clasificación en base a las etiquetas existentes.

Aprendizaje Activo

El conjunto de datos que usamos tenía categorías pero no tenía etiquetas para el reconocimiento de entidades. Por lo tanto, decidimos usar Prodigy para etiquetar el conjunto de datos para otra tarea: el reconocimiento de entidades nombradas.

Una vez que hayas instalado Prodigy, simplemente puedes ejecutar:

$ prodigy ner.manual bbc blank:en BBC_News_Train.csv --label PERSON,ORG,PRODUCT,LOCATION

Veamos los diferentes valores:

  • bbc es el conjunto de datos que se creará con Prodigy.
  • blank:en es el tokenizador spaCy que se está utilizando.
  • BBC_News_Train.csv es el conjunto de datos que se utilizará para etiquetar.
  • PERSON,ORG,PRODUCT,LOCATION es la lista de etiquetas que se utilizará para etiquetar.

Una vez que ejecutes el comando anterior, puedes ir a la interfaz web de Prodigy (generalmente en localhost:8080) y comenzar a etiquetar el conjunto de datos. La interfaz de Prodigy es muy simple, intuitiva y fácil de usar. La interfaz se ve así:

Todo lo que tienes que hacer es seleccionar qué entidad deseas etiquetar (PERSON, ORG, PRODUCT, LOCATION) y luego seleccionar el texto que pertenece a la entidad. Una vez que hayas terminado con un documento, puedes hacer clic en el botón verde y Prodigy te proporcionará automáticamente el siguiente documento sin etiquetar.

Usando Prodigy, comenzamos a etiquetar el conjunto de datos. Cuando teníamos alrededor de 20 muestras, entrenamos un modelo usando AutoNLP. Prodigy no exporta los datos en formato AutoNLP, así que escribimos un script rápido y sucio para convertir los datos al formato AutoNLP:

import json
import spacy

from prodigy.components.db import connect

db = connect()
prodigy_annotations = db.get_dataset("bbc")
examples = ((eg["text"], eg) for eg in prodigy_annotations)
nlp = spacy.blank("en")

dataset = []

for doc, eg in nlp.pipe(examples, as_tuples=True):
    try:
        doc.ents = [doc.char_span(s["start"], s["end"], s["label"]) for s in eg["spans"]]
        iob_tags = [f"{t.ent_iob_}-{t.ent_type_}" if t.ent_iob_ else "O" for t in doc]
        iob_tags = [t.strip("-") for t in iob_tags]
        tokens = [str(t) for t in doc]
        temp_data = {
            "tokens": tokens,
            "tags": iob_tags
        }
        dataset.append(temp_data)
    except:
        pass

with open('data.jsonl', 'w') as outfile:
    for entry in dataset:
        json.dump(entry, outfile)
        outfile.write('\n')

Esto nos proporcionará un archivo JSONL que se puede utilizar para entrenar un modelo usando AutoNLP. Los pasos serán los mismos que antes, excepto que seleccionaremos la tarea de Clasificación de Tokens al crear el proyecto AutoNLP. Usando los datos iniciales que teníamos, entrenamos un modelo usando AutoNLP. El mejor modelo tuvo una precisión de alrededor del 86% con una precisión y recuperación de 0. Sabíamos que el modelo no había aprendido nada. Es bastante obvio, solo teníamos alrededor de 20 muestras.

Después de etiquetar alrededor de 70 muestras, comenzamos a obtener algunos resultados. La precisión subió al 92%, la precisión fue del 0.52 y la recuperación alrededor de 0.42. Estábamos obteniendo algunos resultados, pero aún no eran satisfactorios. En la siguiente imagen, podemos ver cómo este modelo se desempeña en una muestra no vista anteriormente.

Como puedes ver, el modelo está luchando. ¡Pero es mucho mejor que antes! Anteriormente, el modelo ni siquiera podía predecir nada en el mismo texto. Al menos ahora, es capaz de darse cuenta de que Bruce y David son nombres.

Así que continuamos. Etiquetamos algunas muestras más.

Ten en cuenta que, en cada iteración, nuestro conjunto de datos se vuelve más grande. Lo único que estamos haciendo es cargar el nuevo conjunto de datos en AutoNLP y dejar que haga el resto.

Después de etiquetar alrededor de ~150 muestras, comenzamos a obtener buenos resultados. La precisión aumentó a 95.7%, la precisión fue de 0.64 y el recall alrededor de 0.76.

Echemos un vistazo a cómo este modelo se desempeña en la misma muestra no vista.

¡WOW! ¡Esto es increíble! Como puedes ver, ¡el modelo ahora se desempeña extremadamente bien! Es capaz de detectar muchas entidades en el mismo texto. La precisión y el recall aún eran un poco bajos, por lo que continuamos etiquetando aún más datos. Después de etiquetar alrededor de ~250 muestras, obtuvimos los mejores resultados en términos de precisión y recall. La precisión aumentó a ~95.9% y la precisión y recall fueron 0.73 y 0.79 respectivamente. En este punto, decidimos dejar de etiquetar y finalizar el proceso de experimentación. El siguiente gráfico muestra cómo la precisión del mejor modelo mejoró a medida que agregamos más muestras al conjunto de datos:

Bueno, es un hecho bien conocido que más datos relevantes conducirán a mejores modelos y, por lo tanto, a mejores resultados. Con esta experimentación, creamos con éxito un modelo que no solo puede clasificar las entidades en los artículos de noticias, sino también categorizarlas. Usando herramientas como Prodigy y AutoNLP, invertimos nuestro tiempo y esfuerzo solo en etiquetar el conjunto de datos (incluso eso se hizo más fácil gracias a la interfaz que ofrece Prodigy). AutoNLP nos ahorró mucho tiempo y esfuerzo: no tuvimos que descubrir qué modelos usar, cómo entrenarlos, cómo evaluarlos, cómo ajustar los parámetros, qué optimizador y planificador usar, preprocesamiento, postprocesamiento, etc. Solo necesitábamos etiquetar el conjunto de datos y dejar que AutoNLP haga todo lo demás.

Creemos que con herramientas como AutoNLP y Prodigy es muy fácil crear datos y modelos de vanguardia. Y dado que todo el proceso requiere casi no programación en absoluto, incluso alguien sin conocimientos de programación puede crear conjuntos de datos que generalmente no están disponibles para el público, entrenar sus propios modelos usando AutoNLP y compartir el modelo con todos los demás en la comunidad (o simplemente usarlos para su propia investigación / negocio).

Hemos lanzado el código fuente del mejor modelo creado utilizando este proceso. Puedes probarlo aquí . El conjunto de datos etiquetado también se puede descargar aquí .

Los modelos solo son de vanguardia debido a los datos en los que están entrenados.