Elegir e implementar modelos de caras abrazadas | de Stephanie Kirmer | noviembre de 2024

Sacar modelos previamente entrenados de la caja para su caso de uso

Foto por Erda Estremera en desempaquetar

Me he estado divirtiendo mucho en mi trabajo diario recientemente experimentando con modelos del catálogo de Hugging Face, y pensé que este podría ser un buen momento para compartir lo que he aprendido y darles a los lectores algunos consejos sobre cómo aplicar estos modelos. con un mínimo de estrés.

Mi tarea específica recientemente ha consistido en observar blobs de datos de texto no estructurados (piense en notas, correos electrónicos, campos de comentarios de texto libre, etc.) y clasificarlos según categorías que sean relevantes para un caso de uso empresarial. Hay muchas maneras de hacer esto, y he estado explorando todas las que he podido hacer, incluidas cosas simples como la coincidencia de patrones y la búsqueda de léxico, pero también expandiéndome al uso de modelos de redes neuronales prediseñados para una serie de diferentes funcionalidades y estoy moderadamente satisfecho con los resultados.

Creo que la mejor estrategia es incorporar múltiples técnicas, en alguna forma de ensamblaje, para obtener la mejor de las opciones. No confío necesariamente en que estos modelos hagan las cosas bien con la suficiente frecuencia (y definitivamente no con la suficiente consistencia) como para usarlos solos, pero cuando se combinan con técnicas más básicas pueden aumentar la señal.

Para mí, como mencioné, la tarea consiste simplemente en tomar trozos de texto, generalmente escritos por un humano, sin un formato o esquema consistente, y tratar de descubrir qué categorías se aplican a ese texto. He adoptado algunos enfoques diferentes, además de los métodos de análisis mencionados anteriormente, para lograrlo, y estos van desde un esfuerzo muy bajo hasta algo más de trabajo de mi parte. Estas son tres de las estrategias que he probado hasta ahora.

  • Pídale al modelo que elija la categoría (clasificación de tiro cero; usaré esto como ejemplo más adelante en este artículo)
  • Utilice un modelo de reconocimiento de entidades con nombre para encontrar objetos clave a los que se hace referencia en el texto y realizar una clasificación basada en eso.
  • Pídale al modelo que resuma el texto, luego aplique otras técnicas para hacer una clasificación basada en el resumen.

Este es uno de los más divertidos: ¡buscar modelos en el catálogo de Hugging Face! En https://huggingface.co/models Podrás ver un surtido gigantesco de los modelos disponibles, que han sido añadidos al catálogo por los usuarios. Tengo algunos consejos y sugerencias sobre cómo seleccionar sabiamente.

  • Mire las descargas y los números de me gusta, y no elija algo que no haya sido probado por un número decente de otros usuarios. También puede consultar la pestaña Comunidad en la página de cada modelo para ver si los usuarios están discutiendo desafíos o informando errores.
  • Investiga quién subió el modelo, si es posible, y determina si lo encuentras digno de confianza. Esta persona que entrenó o afinó el modelo puede saber o no lo que está haciendo, ¡y la calidad de sus resultados dependerá de ella!
  • Lea atentamente la documentación y omita los modelos con poca o ninguna documentación. De todos modos, tendrás dificultades para utilizarlos de forma eficaz.
  • Utilice los filtros al costado de la página para limitar los modelos adecuados a su tarea. El volumen de opciones puede ser abrumador, pero están bien categorizadas para ayudarle a encontrar lo que necesita.
  • La mayoría de las tarjetas de modelo ofrecen una prueba rápida que puede ejecutar para ver el comportamiento del modelo, pero tenga en cuenta que este es sólo un ejemplo y probablemente sea uno que se eligió porque el modelo es bueno en eso y encuentra este caso bastante fácil.

Una vez que haya encontrado un modelo que le gustaría probar, es fácil comenzar: haga clic en el botón “Usar este modelo” en la parte superior derecha de la página Tarjeta de modelo y verá las opciones sobre cómo implementarlo. Si elige la opción Transformers, obtendrá algunas instrucciones similares a esta.

Captura de pantalla tomada por el autor.

Si un modelo que ha seleccionado no es compatible con la biblioteca de Transformers, es posible que se enumeren otras técnicas, como TF-Keras, scikit-learn o más, pero todas deberían mostrar instrucciones y código de muestra para facilitar su uso al hacer clic en ese botón. .

En mis experimentos, todos los modelos eran compatibles con Transformers, por lo que me resultó bastante fácil ponerlos en funcionamiento, simplemente siguiendo estos pasos. Si tiene preguntas, también puede consultar la documentación más detallada y ver los detalles completos de la API para la biblioteca Transformers y las diferentes clases que ofrece. Definitivamente he pasado algún tiempo mirando estos documentos para clases específicas al optimizar, pero para poner en funcionamiento los conceptos básicos no debería ser necesario.

Bien, entonces has elegido un modelo que quieres probar. ¿Ya tienes datos? Si no, he estado usando varios conjuntos de datos disponibles públicamente para esta experimentación, principalmente de Kaggle, y allí también puedes encontrar muchos conjuntos de datos útiles. Además, Hugging Face también tiene un catálogo de conjuntos de datos que puede consultar, pero en mi experiencia no es tan fácil buscar o comprender el contenido de los datos allí (solo que no hay tanta documentación).

Una vez que elige un conjunto de datos de texto no estructurado, cargarlo para usarlo en estos modelos no es tan difícil. Cargue su modelo y su tokenizador (de los documentos proporcionados en Hugging Face como se indicó anteriormente) y pase todo esto al pipeline función de la biblioteca de transformadores. Recorrerás tus manchas de texto en una lista o serie de pandas y las pasarás a la función de modelo. Esto es esencialmente lo mismo para cualquier tipo de tarea que esté realizando, aunque para la clasificación de disparo cero también debe proporcionar una etiqueta candidata o una lista de etiquetas, como mostraré a continuación.

Entonces, echemos un vistazo más de cerca a la clasificación de tiro cero. Como señalé anteriormente, esto implica usar un modelo previamente entrenado para clasificar un texto de acuerdo con categorías en las que no ha sido entrenado específicamente, con la esperanza de que pueda usar sus incorporaciones semánticas aprendidas para medir similitudes entre el texto y la etiqueta. términos.

from transformers import AutoModelForSequenceClassification
from transformers import AutoTokenizer
from transformers import pipeline

nli_model = AutoModelForSequenceClassification.from_pretrained("facebook/bart-large-mnli", model_max_length=512)
tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large-mnli")
classifier = pipeline("zero-shot-classification", device="cpu", model=nli_model, tokenizer=tokenizer)

label_list = ['News', 'Science', 'Art']

all_results = []
for text in list_of_texts:
prob = self.classifier(text, label_list, multi_label=True, use_fast=True)
results_dict = {x: y for x, y in zip(prob["labels"], prob["scores"])}
all_results.append(results_dict)

Esto le devolverá una lista de dictados, y cada uno de esos dictados contendrá claves para las posibles etiquetas, y los valores son la probabilidad de cada etiqueta. No es necesario utilizar la canalización como lo he hecho yo aquí, pero hace que el disparo cero con múltiples etiquetas sea mucho más fácil que escribir ese código manualmente, y devuelve resultados que son fáciles de interpretar y con los que trabajar.

Si prefiere no utilizar la canalización, puede hacer algo como esto, pero tendrá que ejecutarlo una vez para cada etiqueta. Observe cómo es necesario especificar el procesamiento de los logits resultantes de la ejecución del modelo para obtener resultados interpretables por humanos. Además, aún necesita cargar el tokenizador y el modelo como se describe anteriormente.

def run_zero_shot_classifier(text, label):
hypothesis = f"This example is related to {label}."

x = tokenizer.encode(
text,
hypothesis,
return_tensors="pt",
truncation_strategy="only_first"
)

logits = nli_model(x.to("cpu"))[0]

entail_contradiction_logits = logits[:, [0, 2]]
probs = entail_contradiction_logits.softmax(dim=1)
prob_label_is_true = probs[:, 1]

return prob_label_is_true.item()

label_list = ['News', 'Science', 'Art']
all_results = []
for text in list_of_texts:
for label in label_list:
result = run_zero_shot_classifier(text, label)
all_results.append(result)

Probablemente habrás notado que no he hablado yo mismo sobre el ajuste fino de los modelos para este proyecto; eso es cierto. Puede que haga esto en el futuro, pero estoy limitado por el hecho de que tengo un mínimo de datos de entrenamiento etiquetados para trabajar en este momento. Puedo usar técnicas semisupervisadas o iniciar un conjunto de entrenamiento etiquetado, pero todo este experimento ha sido para ver hasta dónde puedo llegar con modelos disponibles en el mercado. Tengo algunas pequeñas muestras de datos etiquetados, para usar en las pruebas del rendimiento de los modelos, pero eso no es ni de lejos el mismo volumen de datos que necesitaré para ajustar los modelos.

Si tiene buenos datos de entrenamiento y le gustaría ajustar un modelo base, Hugging Face tiene algunos documentos que pueden ayudar. https://huggingface.co/docs/transformers/en/training

El rendimiento ha sido un problema interesante, ya que hasta ahora he realizado todos mis experimentos en mi computadora portátil local. Naturalmente, usar estos modelos de Hugging Face requerirá mucha más computación y será más lento que las estrategias básicas como expresiones regulares y búsqueda de léxico, pero proporciona una señal que realmente no se puede lograr de otra manera, por lo que puede valer la pena encontrar formas de optimizar. Todos estos modelos están habilitados para GPU y es muy fácil ejecutarlos en GPU. (Si desea probarlo rápidamente en GPU, revise el código que mostré arriba y donde verá “cpu” como sustituto de “cuda” si tiene una GPU disponible en su entorno de programación). Tenga en cuenta que el uso de GPU Sin embargo, los proveedores de nube no son baratos, así que priorice en consecuencia y decida si más velocidad vale el precio.

La mayoría de las veces, usar la GPU es mucho más importante para el entrenamiento (téngalo en cuenta si decide realizar un ajuste fino) pero menos vital para la inferencia. No voy a profundizar en más detalles sobre la optimización aquí, pero querrás considerar también el paralelismo si esto es importante para ti: tanto el paralelismo de datos como el paralelismo real de entrenamiento/cómputo.

¡Hemos ejecutado el modelo! Los resultados están aquí. Tengo algunos consejos finales sobre cómo revisar el resultado y aplicarlo realmente a preguntas comerciales.

  • No confíe ciegamente en el resultado del modelo, sino ejecute pruebas rigurosas y evalúe el rendimiento. El hecho de que un modelo de transformador funcione bien en un determinado blob de texto, o sea capaz de hacer coincidir correctamente el texto con una determinada etiqueta con regularidad, no significa que este sea un resultado generalizable. Utilice muchos ejemplos diferentes y diferentes tipos de texto para demostrar que el rendimiento será suficiente.
  • Si tiene confianza en el modelo y desea utilizarlo en un entorno de producción, realice un seguimiento y registre el comportamiento del modelo. Esta es solo una buena práctica para cualquier modelo en producción, pero debe mantener los resultados que ha producido junto con las entradas que le proporcionó, para poder verificarlo continuamente y asegurarse de que el rendimiento no disminuya. Esto es más importante para este tipo de modelos de aprendizaje profundo porque no tenemos tanta interpretabilidad de por qué y cómo el modelo genera sus inferencias. Es peligroso hacer demasiadas suposiciones sobre el funcionamiento interno del modelo.

Como mencioné anteriormente, me gusta usar este tipo de resultados de modelos como parte de un conjunto más amplio de técnicas, combinándolas en estrategias de conjunto; de esa manera no confío solo en un enfoque, sino que obtengo la señal que esas inferencias pueden proporcionar. .

Espero que esta descripción general sea útil para aquellos que están comenzando con modelos previamente entrenados para análisis de texto (u otro modo). ¡Buena suerte!