Ir al contenido

Entrenar un modelo con datos de anotación

Resuelve las etiquetas de varios anotadores en objetivos de entrenamiento, mantén fija una partición de test reservada entre rondas, registra qué vio cada modelo y dimensiona una primera ejecución.

Para entrenar un modelo con datos de anotación, resuelve las etiquetas de cada ítem en un único objetivo o en el reparto de votos de los anotadores, asigna los ítems a las particiones de entrenamiento, validación y test con una regla que se mantenga fija entre rondas, e informa de la puntuación de test siempre que la partición de validación haya elegido el punto de control. El entrenamiento de modelos de Potato ejecuta cada paso con las anotaciones del propio estudio y registra con qué ítems entrenó cada ejecución.

Novedad de la v2.14.0

Los datos de anotación rara vez llegan con la forma que lee un entrenador. Un estudio con solapamiento tiene varias etiquetas por ítem, y las etiquetas suelen discrepar. Un estudio todavía en curso gana etiquetas cada día, y cada ronda de reentrenamiento ve más ítems que la anterior. Un entrenador necesita un objetivo por ítem y un conjunto fijo de ítems sobre el que puntuar, y las decisiones siguientes producen ambas cosas. Cada sección siguiente nombra el ajuste de Potato que toma la decisión. Para la propia página Training, consulta la visión general del entrenamiento de modelos y el tutorial que entrena un primer modelo. Para entrenar en tu propio código, Exportar anotaciones para aprendizaje automático cubre los formatos de exportación, y las mismas decisiones se aplican al archivo exportado.

Resolver varios anotadores en una etiqueta

La agregación convierte las etiquetas que varios anotadores dieron a un ítem en la etiqueta única con la que se entrena un modelo. El método más simple es el voto mayoritario. El voto mayoritario cuenta una vez la respuesta de cada anotador y conserva la respuesta más común. Dawid y Skene (1979) estiman una matriz de confusión para cada anotador con maximización de la esperanza y ponderan cada voto por la fiabilidad estimada del anotador. Un anotador descuidado influye entonces menos en el resultado que uno cuidadoso. Agregar etiquetas de crowdsourcing compara los dos métodos y los modelos construidos sobre Dawid-Skene.

Una ejecución de entrenamiento en Potato resuelve las etiquetas con model_training.aggregation. El valor predeterminado, consensus, ejecuta Dawid-Skene siempre que el proyecto tenga más de un anotador y recurre al voto mayoritario si la estimación falla. El otro valor, majority, ejecuta solo el voto mayoritario. Ambos métodos tratan la respuesta completa de un anotador en un esquema como un solo voto. Por eso dos respuestas multiselect cuentan como el mismo voto solo cuando ambas marcan el mismo conjunto de etiquetas.

El ajuste consensus de la ejecución y la exportación de consenso son funciones distintas. La exportación de consenso da a cada anotador un voto, informa del recuento y de la fracción de cada respuesta en cada ítem, y marca cada ítem como retired o needs_review. Lee la exportación antes de entrenar cuando quieras ver ítem por ítem dónde se dividen los anotadores. MACE estima una puntuación de competencia para cada anotador a partir de los mismos votos.

Aprender del desacuerdo

En tareas subjetivas como la ofensividad o la emoción, los anotadores pueden discrepar porque cada uno lee el ítem de manera distinta, y una única etiqueta votada descarta ese reparto. Uma et al. (2021) repasan métodos que entrenan con el desacuerdo en lugar de con una etiqueta agregada. Una familia de estos métodos entrena con etiquetas blandas. Una etiqueta blanda es una distribución de probabilidad sobre las etiquetas, construida a partir de la proporción de anotadores que eligió cada etiqueta.

hf-text-classification admite el parámetro soft_targets: true. Con el parámetro definido, un ítem que dos o más anotadores etiquetaron se entrena hacia el reparto de los anotadores mediante entropía cruzada frente a la distribución. Cuando dos de tres anotadores dijeron positive, el objetivo es 0,67 positive y 0,33 negative. Para un esquema multiselect, cada etiqueta se entrena hacia la proporción de anotadores que la marcó. Un ítem con un solo anotador se entrena con la etiqueta de ese anotador como antes. El modelo se mantiene entonces indeciso donde las personas discreparon, y cada predicción incluye las probabilities del modelo. Sobre ítems reservados con un reparto de votos, la ejecución informa de tres métricas más:

MétricaQué mide la métrica
soft_jsdDivergencia de Jensen-Shannon entre la distribución del modelo y el reparto de los anotadores, en bits de 0 a 1
soft_cross_entropyEntropía cruzada del reparto de los anotadores bajo la distribución del modelo
eceError de calibración esperado de la etiqueta principal frente a la etiqueta votada, sobre 10 intervalos de confianza

En un esquema de etiqueta blanda, cada anotador da una distribución con controles deslizantes. hf-text-classification siempre entrena un esquema soft_label hacia la distribución media de los anotadores, y la preetiqueta fija los controles deslizantes en la distribución predicha. Los objetivos blandos necesitan dos o más etiquetas en un ítem. Por eso un estudio que planea entrenar con el desacuerdo reúne etiquetas solapadas desde el principio, y ¿Cuántos anotadores necesitas? cubre los ajustes de solapamiento. El desacuerdo es señal, no ruido da los argumentos para conservar el reparto en los datos.

Particiones de entrenamiento, validación y test

Las particiones de entrenamiento, validación y test cumplen tres funciones distintas. La partición de entrenamiento ajusta los pesos del modelo. La partición de validación elige entre modelos candidatos, por ejemplo la época en la que detenerse. La partición de test estima el rendimiento sobre datos no vistos y no participa en ninguna de las dos elecciones. Elegir un punto de control con validación es una forma de ajustar a validación. El punto de control que se conserva por su mejor puntuación de validación tiene una puntuación de validación sesgada al alza, y solo la puntuación de test procede de ítems que la elección nunca consultó.

Una ejecución de Potato divide los ítems etiquetados 70/15/15 de forma predeterminada (splits). La partición de cada ítem sale de un hash con semilla del ID del ítem (split_seed). Un ítem reservado en una ejecución sigue reservado en la siguiente, mientras split_seed y splits no cambien. Cambiar cualquiera de los dos ajustes puede mover ítems reservados al entrenamiento, y cada puntuación posterior al cambio mide entonces en parte memorización. Define ambos una sola vez, al principio del estudio.

Los entrenadores de ajuste fino, como hf-text-classification, conservan el punto de control de la época que obtuvo la mejor puntuación en validación. La puntuación principal de una ejecución así sale de test. sklearn-text, setfit, rdkit-property, los entrenadores de modelos de decisión y los puentes de inferencia no eligen nada con validación, y una ejecución de uno de esos entrenadores toma la puntuación principal de validación siempre que validación tenga ítems. La descripción emergente de la columna Held-out score de la tabla de ejecuciones nombra la partición y la métrica de cada número. Un ítem con etiqueta y sin predicción cuenta como erróneo. Un entrenador no puede subir la puntuación omitiendo ítems difíciles, y <split>_coverage informa de la proporción de ítems que recibió una predicción.

Ítems corregidos y fijados

Dos tipos de ítem van a la partición train de todas las ejecuciones posteriores, sea cual sea la partición que asignó el hash. El primero es un ítem que un revisor corrigió en la revisión del modelo, y el segundo es un ítem que alguien fijó con Train on these junto a un segmento de la página del Catálogo. Las correcciones vienen de los ítems en los que el modelo fue peor, y en validación o test las correcciones puntuarían al modelo sobre una muestra de sus propios errores. Una ejecución que mueve ítems reservados al entrenamiento registra una advertencia con el recuento, y la puntuación sobre ítems reservados de la ejecución deja de ser directamente comparable con la de una ejecución anterior. Una ejecución que entrena con un ítem corregido que una ejecución anterior había reservado también registra una advertencia, porque una puntuación sobre los ítems de validación o test de la ejecución anterior, o sobre un conjunto de datos guardado a partir de esos ítems, incluye entonces ítems con los que el nuevo modelo entrenó. Las correcciones y los ítems fijados siempre se entrenan da las reglas.

Registrar con qué entrenó cada modelo

Comparar dos ejecuciones exige saber con qué ítems entrenó y puntuó cada una. Cada ejecución de Potato escribe un paquete en <output_annotation_dir>/training/runs/<run_id>/bundle/ con train.jsonl, val.jsonl, test.jsonl, labels.json y manifest.json. El manifiesto registra la semilla de partición, el método de agregación, el número de ítems de cada partición, el número de ítems forzados al entrenamiento y un resumen SHA-256 de los archivos de partición. Nada en un paquete remite a Potato, y un script ajeno a Potato puede leer el paquete como una copia autónoma de las etiquetas resueltas y las particiones.

La base de datos del proyecto, project.sqlite, guarda un registro con una fila por ejecución. Cada fila anota el entrenador, los parámetros, los tamaños de las particiones, la semilla de partición, las métricas sobre ítems reservados y el resumen del paquete. Una segunda tabla anota en qué partición estuvo cada ítem en cada ejecución. La escritura de vuelta lee esa tabla y nunca preetiqueta un ítem con el que haya entrenado alguna ejecución que siga en el registro (retain_runs conserva cinco ejecuciones terminadas de forma predeterminada). Un modelo está seguro sobre los ítems con los que entrenó, por motivos que no dicen nada sobre datos nuevos.

Para comparar modelos posteriores sobre exactamente los mismos ítems, Keep this split as a dataset en la página de la ejecución guarda los ítems de validación, test o train de la ejecución como una versión de un conjunto de datos, con las etiquetas humanas acordadas. Una versión guardada no cambia después. Cada versión guardada contiene una partición y empieza desde cero en lugar de sumarse a la versión anterior. Los ítems de validación de la ejecución 2 guardados sobre los de la ejecución 1 incluirían, de otro modo, ítems con los que entrenó la ejecución 2. Una evaluación sobre una versión guardada no puede leer la respuesta del modelo, porque las entradas guardadas omiten el campo de preetiquetas. Guardar requiere datasets.enabled: true. Cuando el modelo o el conjunto de datos salen del proyecto, Documentar conjuntos de datos y modelos cubre las hojas de datos y las fichas de modelo.

Cuántos datos necesita un primer modelo

Cada entrenador de Potato se niega a ajustar el modelo con menos de min_instances ítems en la partición train. Los valores predeterminados siguientes son los recuentos con los que arranca una ejecución:

EntrenadorValor predeterminado de min_instancesNota
setfit8Pensado para los primeros días de un proyecto, desde unos ocho ítems por etiqueta
sklearn-text10Calibra las confianzas solo a partir de 50 ítems de entrenamiento
hf-audio-tagger10
hf-text-classification, hf-token-classification, hf-image-classification20
llm-sft, llm-dpo20

El mínimo cuenta solo la partición train. Con la partición 70/15/15 predeterminada, una ejecución de sklearn-text arranca cuando unos 15 ítems tienen una etiqueta. El ejemplo de entrenamiento de modelos del repositorio de Potato da un punto medido. Con 120 de las 160 reseñas sintéticas de productos del ejemplo etiquetadas una vez cada una, una ejecución de sklearn-text obtuvo 0,84 de macro-F1 en validación y publicó 80 preetiquetas. La cifra procede de una tarea sintética de dos etiquetas, y la puntuación sobre ítems reservados de tus propias ejecuciones es el número que debes leer para tu tarea.

Empieza con sklearn-text. El entrenador no necesita nada más allá de una instalación normal ni GPU. Reentrena a medida que lleguen etiquetas y vigila la puntuación sobre ítems reservados de una ejecución a otra con split_seed sin cambios. Las preetiquetas anclan a los anotadores. Deja writeback.schemas vacío hasta que la puntuación sobre ítems reservados respalde mostrar las respuestas del modelo. Etiquetado asistido por un modelo cubre qué cambia cuando los anotadores ven preetiquetas, y Cómo distinguir la revisión del sellado automático cubre cómo comprobar que los anotadores siguen leyendo los ítems.

Una configuración que fija cada decisión

La configuración siguiente entrena con un esquema de sentimiento de dos etiquetas. Cada clave bajo model_training fija una de las decisiones anteriores:

yaml
annotation_task_name: "Review sentiment"
task_dir: "."
data_files:
  - "data/reviews.json"
item_properties:
  id_key: "id"
  text_key: "text"
output_annotation_dir: "annotation_output"
 
annotation_schemes:
  - annotation_type: "radio"
    name: "sentiment"
    description: "Is this review positive or negative?"
    labels: ["positive", "negative"]
 
model_training:
  enabled: true
  aggregation: consensus
  split_seed: 0
  splits: {train: 0.7, val: 0.15, test: 0.15}
  trainer_params:
    hf-text-classification:
      soft_targets: true

aggregation: consensus resuelve las etiquetas solapadas con Dawid-Skene. split_seed y splits se escriben con los valores predeterminados porque ninguno de los dos ajustes debe cambiar durante la vida del estudio. soft_targets: true hace que cada ejecución de hf-text-classification en el proyecto entrene con repartos de votos. Ese entrenador necesita pip install "potato-annotation[train-text]", y sklearn-text se ejecuta con la misma configuración sin instalación adicional. Sin un bloque writeback, los anotadores no ven preetiquetas. Reinicia el servidor con la configuración, abre /admin/training, elige un entrenador y el esquema sentiment, y haz clic en Train now. La referencia de configuración del entrenamiento de modelos lista todas las claves, y el tutorial del modelo en el ciclo añade la escritura de vuelta y el reentrenamiento automático.

Más información

Referencias

  • Dawid, A. P., and Skene, A. M. (1979). Maximum Likelihood Estimation of Observer Error-Rates Using the EM Algorithm. Applied Statistics, 28(1), 20. doi.org/10.2307/2346806
  • Uma, A. N., Fornaciari, T., Hovy, D., Paun, S., Plank, B., and Poesio, M. (2021). Learning from Disagreement: A Survey. Journal of Artificial Intelligence Research, 72, 1385–1470. doi.org/10.1613/jair.1.12752