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ón | Resumen | |
|---|---|---|
| Métrica | BLEU (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=Truedel 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
- Realinear etiquetas a subtokens con
-100es la técnica que atraviesa NER y cualquier tarea de clasificación por token. - Fine-tunear un masked LM sobre tu propio dominio se mide en perplejidad, no en accuracy.
- Traducción y resumen comparten arquitectura (encoder-decoder) y filosofía de evaluación (comparar siempre contra el baseline más tonto posible).
- 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.
- QA extractivo depende enteramente de dos herramientas ya vistas: overflow de tokens y offset mapping.
- Las seis tareas hoy caben en un solo LLM prompteado — pero las métricas para juzgar si lo hizo bien no cambiaron.