Curso / HF LLM Course / Capítulo 7
● piloto de formato

Hugging Face · LLM Course · Capítulo 7

Tareas clásicas de NLP: seis problemas, un mismo esqueleto

El capítulo más largo del curso original, a propósito — cada tarea es un tutorial completo e independiente, con bastante código repetido entre sí. Acá va lo que cada una enseña de verdad, sin repetir el mismo boilerplate seis veces.

0. Seis tareas, un patrón común

Clasificación de tokens, fine-tuning de un masked LM, traducción, resumen, entrenar un LM causal desde cero, y question answering extractivo. Las seis siguen el mismo esqueleto de siempre — datos → tokenizer → modelo con el head correcto (Capítulo 2) → Trainer o loop manual (Capítulo 3) → métricas → push_to_hub() (Capítulo 4) — y lo único que cambia de una a otra es qué head, qué arquitectura, y qué métrica de evaluación tiene sentido.

1. Clasificación de tokens (NER)

Named entity recognition asigna una etiqueta a cada token, no a la frase entera — el dataset de referencia es CoNLL-2003, con etiquetas en formato BIO (B-PER/I-PER para persona, B-ORG/I-ORG para organización, etc., ya visto en el Capítulo 1).

El detalle que realmente importa transferir de esta sección: un tokenizer de subpalabras puede partir una sola palabra etiquetada en varios tokens. Hay que realinear las etiquetas usando los word_ids() del Capítulo 6 — el primer token de una palabra se queda con su etiqueta real, los tokens de continuación (y los tokens especiales) se marcan con -100, el valor que PyTorch ignora al calcular la loss:

def align_labels_with_tokens(labels, word_ids):
    new_labels = []
    for word_id in word_ids:
        if word_id is None:
            new_labels.append(-100)  # [CLS], [SEP], padding
        else:
            new_labels.append(labels[word_id])  # misma etiqueta para cada subtoken
    return new_labels

Encoder-only (BERT) es la arquitectura natural acá: necesitás ver la frase completa para decidir la etiqueta de cada token, exactamente lo que la atención bidireccional del Capítulo 1 hace bien.

2. Fine-tuning de un masked LM

Esto es domain adaptation: seguir entrenando con el mismo objetivo de preentrenamiento (predecir palabras enmascaradas) pero sobre texto de tu dominio — reseñas de películas, papers médicos, lo que sea distinto al corpus genérico original. La métrica no es accuracy, es perplejidad (exp(loss)) — cuánto le "sorprende" al modelo el texto real; más baja es mejor.

Un truco que vale la pena conocer: whole word masking enmascara todos los subtokens de una palabra a la vez, no tokens sueltos al azar — si no, el modelo puede "adivinar" el resto de una palabra parcialmente visible sin aprender nada útil sobre el contexto.

3. Traducción y resumen

Estas dos comparten arquitectura y forma de entrenar — ambas son secuencia a secuencia: el encoder lee el input completo, el decoder genera el output token a token (encoder-decoder, Capítulo 1). Traducción usa Marian sobre el dataset KDE4 (interfaces de software en varios idiomas); resumen usa mT5 (multilingüe) sobre reseñas de Amazon.

TraducciónResumen
MétricaBLEU (overlap de n-gramas con la referencia)ROUGE (overlap de n-gramas, pensado para resúmenes)
Baseline"lead-3": las primeras 3 oraciones del texto, sin modelo — si tu modelo no le gana a esto, algo anda mal

El baseline lead-3 es la idea más reusable de esta sección, más allá del resumen: antes de creer que tu modelo fine-tuneado "funciona", compará contra la heurística más tonta posible. Si no le gana con margen, la métrica está mal elegida o el modelo no aprendió nada real.

4. Entrenar un LM causal desde cero

La sección más distinta de las demás: en vez de partir de un checkpoint pre-entrenado, se inicializa GPT-2 desde su config, con pesos al azar — no from_pretrained(), sino GPT2LMHeadModel(config) — y se entrena desde cero sobre un corpus curado (funciones de Python que usan librerías específicas como pandas/scikit-learn/matplotlib, filtradas del corpus completo de GitHub).

🔧 Esto es exactamente lo que ya hiciste

Reemplazá "GPT-2 desde cero sobre funciones de Python" por "Gemma-4 con Continued Pretraining sobre 81 obras de Lacan y Freud", y tenés la Generación 0 de interpretante-lacaniano (13,9M tokens, loss 1.93→1.35). La diferencia técnica real: CPT no inicializa pesos al azar — parte de un checkpoint ya entrenado y sigue entrenando sobre el corpus nuevo, más barato y estable que arrancar de cero. El resto — curar el corpus, tokenizar, entrenar con Trainer o un loop con Accelerate — es la misma mecánica exacta.

Otro detalle que vale la pena rescatar: la sección muestra cómo escribir una loss function propia que le da más peso a los ejemplos que usan las librerías objetivo — una forma simple de orientar qué aprende el modelo más allá de "minimizar la loss promedio a secas".

5. Question answering extractivo

Distinto de generar una respuesta: acá el modelo señala dónde en el contexto está la respuesta, prediciendo dos posiciones (inicio y fin del span) sobre el dataset SQuAD. Dos problemas de ingeniería concretos que esta sección resuelve:

  • Contextos más largos que el máximo del modelo: se parten con overflow (el mismo return_overflowing_tokens=True del Capítulo 5), con una ventana de solapamiento para no cortar una respuesta justo en el límite.
  • Mapear la respuesta de vuelta al texto original: de nuevo el offset mapping del Capítulo 6 — sin él, convertir "el token 47 es el inicio de la respuesta" en "el carácter 213 del contexto original" requeriría reglas manuales por tokenizer.

Se evalúa con Exact Match (¿la respuesta es idéntica, carácter por carácter?) y F1 (overlap parcial de palabras) — dos formas de ser "generoso" o "estricto" con una respuesta casi correcta.

6. De seis tareas a un solo modelo

🟢 La actualización que redefine el capítulo entero

El propio curso original ya lo admite al cierre de este capítulo ("Mastering LLMs"): estas seis tareas solían requerir seis modelos fine-tuneados por separado. Hoy, un solo LLM decoder-only instruction-tuned resuelve las seis con el prompt correcto — "extraé las entidades de este texto", "traducí esto al francés", "respondé según este contexto" — sin entrenar nada. Fine-tunear un modelo especializado para una sola tarea sigue teniendo sentido cuando necesitás latencia mínima, correr en hardware chico, o exprimir el último punto de precisión en un dominio muy específico — pero ya no es el camino por defecto.

Lo que no quedó obsoleto: las métricas. BLEU, ROUGE, Exact Match y F1 siguen siendo exactamente cómo evaluás la salida de un LLM moderno en estas mismas tareas — cambia cómo generás la respuesta, no cómo la medís. Y saber qué arquitectura calza con cada tarea (encoder para clasificar, encoder-decoder para transformar una secuencia en otra, decoder para generar) sigue siendo el mapa mental que te dice qué esperar de un modelo antes de probarlo.

7. Resumen

  1. Realinear etiquetas a subtokens con -100 es la técnica que atraviesa NER y cualquier tarea de clasificación por token.
  2. Fine-tunear un masked LM sobre tu propio dominio se mide en perplejidad, no en accuracy.
  3. Traducción y resumen comparten arquitectura (encoder-decoder) y filosofía de evaluación (comparar siempre contra el baseline más tonto posible).
  4. Entrenar un LM causal desde cero es, mecánicamente, el mismo proceso que un Continued Pretraining — la diferencia es de dónde parten los pesos.
  5. QA extractivo depende enteramente de dos herramientas ya vistas: overflow de tokens y offset mapping.
  6. Las seis tareas hoy caben en un solo LLM prompteado — pero las métricas para juzgar si lo hizo bien no cambiaron.