Phase 07 - Lesson 06
BERT — Modelado de Lenguaje Enmascarado
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
GPT predice la siguiente palabra. BERT predice una palabra que falta. Una oración de diferencia — y una media década de todo moldeado por embeddings.
Tipo: Build Idiomas: Python Prerrequisitos: Fase 7 · 05 (Full Transformer), Fase 5 · 02 (Text Representation) Tiempo: ~45 minutos
El Problema
En 2018, cada tarea de PLN (Procesamiento del Lenguaje Natural) — análisis de sentimiento, NER, QA, implicación lógica (entailment) — entrenaba su propio modelo desde cero con sus propios datos etiquetados. No existía un checkpoint preentrenado de "comprensión de inglés" que se pudiera ajustar (fine-tune). ELMo (2018) demostró que se podían preentrenar embeddings contextuales con una LSTM bidireccional; ayudó, pero no generalizó.
BERT (Devlin et al. 2018) planteó: ¿y si tomáramos un encoder de transformer, lo entrenáramos con cada oración de internet y lo forzáramos a predecir las palabras faltantes a partir del contexto en ambos lados? Luego, se ajusta (fine-tune) un cabezal (head) en la tarea downstream. La eficiencia de parámetros fue una revelación.
El resultado: en un plazo de 18 meses, BERT y sus variantes (RoBERTa, ALBERT, ELECTRA) dominaron cada tabla de clasificación de PLN existente. Para 2020, cada motor de búsqueda, pipeline de moderación de contenido y sistema de búsqueda semántica en la Tierra tenía un BERT en su interior.
En 2026, los modelos basados solo en encoder (encoder-only) siguen siendo la herramienta adecuada para clasificación, recuperación (retrieval) y extracción estructurada — se ejecutan de 5 a 10 veces más rápido por token que los decoders y sus embeddings son la columna vertebral de cada stack de recuperación moderno. ModernBERT (diciembre de 2024) llevó la arquitectura a un contexto de 8K con Flash Attention + RoPE + GeGLU.
El Concepto
La señal de entrenamiento
Considere la oración: the quick brown fox jumps over the lazy dog.
Enmascarar el 15% de los tokens aleatoriamente:
input: the [MASK] brown fox jumps [MASK] the lazy dog
target: the quick brown fox jumps over the lazy dog
Entrene al modelo para predecir los tokens originales en las posiciones enmascaradas. Debido a que el encoder es bidirecional, predecir [MASK] en la posición 1 puede usar brown fox jumps en las posiciones 2 en adelante. Eso es lo que GPT no puede hacer.
Las reglas de máscara de BERT
Del 15% de los tokens seleccionados para la predicción:
- 80% se reemplazan con
[MASK]. - 10% se reemplazan con un token aleatorio.
- 10% se dejan sin cambios.
¿Por qué no usar siempre [MASK]? Porque [MASK] nunca aparece en el momento de la inferencia. Entrenar al modelo para esperar [MASK] en el 100% de las posiciones enmascaradas crearía un desvío de distribución (distribution shift) entre el preentrenamiento y el ajuste fino (fine-tuning). El 10% aleatorio + 10% sin cambios mantiene la honestidad del modelo.
Next Sentence Prediction (NSP) — y por qué se descartó
El BERT original también se entrenó en NSP (Predicción de la Siguiente Oración): dadas dos oraciones A y B, predecir si B sigue a A. RoBERTa (2019) realizó una ablación de esta tarea y demostró que la NSP perjudicaba en lugar de ayudar. Los encoders modernos la omiten.
Qué cambió en 2026: ModernBERT
El artículo de ModernBERT de 2024 reconstruyó el bloque con primitivas de 2026:
| Componente | BERT Original (2018) | ModernBERT (2024) |
|---|---|---|
| Posicional | Absoluto aprendido | RoPE |
| Activación | GELU | GeGLU |
| Normalización | LayerNorm | RMSNorm pre-norma |
| Atención | Totalmente densa (Full dense) | Alternada local (128) + global |
| Longitud de contexto | 512 | 8192 |
| Tokenizador | WordPiece | BPE |
Y, a diferencia del stack de 2018, es nativo de Flash Attention. La inferencia es de 2 a 3 veces más rápida en longitudes de secuencia de 8K que con DeBERTa-v3, con mejores puntuaciones de GLUE.
Casos de uso que aún eligen un encoder en 2026
| Tarea | Por que el encoder supera al decoder |
|---|---|
| Embeddings de recuperación / búsqueda semántica | Contexto bidireccional = mejor calidad de embedding por token |
| Clasificación (sentimiento, intención, toxicidad) | Un solo paso hacia adelante (forward pass); sin sobrecosto de generación |
| NER / etiquetado de tokens | Salida por posición, nativamente bidireccional |
| Implicación lógica de zero-shot (NLI) | Cabezal clasificador sobre el encoder |
| Reranker para RAG | Puntuación de Cross-encoder, 10 veces más rápido que los rerankers de LLM |
Constrúyalo
Paso 1: lógica de enmascaramiento
Consulte code/main.py. La función create_mlm_batch recibe una lista de IDs de tokens, un tamaño de vocabulario y una probabilidad de máscara. Devuelve los IDs de entrada (con las máscaras aplicadas) y las etiquetas (solo en las posiciones enmascaradas, -100 en otras partes — convención de índice de ignorado de PyTorch).
def create_mlm_batch(tokens, vocab_size, mask_prob=0.15, rng=None):
input_ids = list(tokens)
labels = [-100] * len(tokens)
for i, t in enumerate(tokens):
if rng.random() < mask_prob:
labels[i] = t
r = rng.random()
if r < 0.8:
input_ids[i] = MASK_ID
elif r < 0.9:
input_ids[i] = rng.randrange(vocab_size)
# else: keep original
return input_ids, labels
Paso 2: ejecutar la predicción de MLM en un corpus diminuto
Entrene un encoder de 2 capas + cabezal de MLM en un vocabulario de 20 palabras, 200 oraciones. Sin gradiente — realizamos comprobaciones de integridad en el paso hacia adelante (forward pass). El entrenamiento completo requiere PyTorch.
Paso 3: comparar tipos de máscaras
Muestre cómo la regla de tres vías mantiene al modelo utilizable sin [MASK]. Prediga sobre una oración no enmascarada y sobre una oración enmascarada. Ambas deberían producir distribuciones de tokens razonables porque el modelo vio ambos patrones en el entrenamiento.
Paso 4: ajustar el cabezal
Reemplace el cabezal de MLM por un cabezal de clasificación en un conjunto de datos de sentimiento ficticio. Solo se entrena el cabezal; el encoder se congela. Este es el patrón que sigue cada aplicación BERT.
Úselo
from transformers import AutoModel, AutoTokenizer
tok = AutoTokenizer.from_pretrained("answerdotai/ModernBERT-base")
model = AutoModel.from_pretrained("answerdotai/ModernBERT-base")
text = "Attention is all you need."
inputs = tok(text, return_tensors="pt")
out = model(**inputs).last_hidden_state # (1, N, 768)
Los modelos de embedding son BERT ajustados (fine-tuned). Los modelos de sentence-transformers como all-MiniLM-L6-v2 son BERT entrenados con pérdida contrastiva (contrastive loss). El encoder es el mismo. La pérdida cambió.
Los rerankers cross-encoder también son BERT ajustados. Clasificación de pares en [CLS] query [SEP] doc [SEP]. La atención bidireccional entre query (consulta) y doc (documento) es exactamente lo que da a los cross-encoders su ventaja de calidad sobre los biencoders.
Cuándo no elegir BERT en 2026. Cualquier tarea generativa. El encoder no tiene una forma sensata de producir tokens de manera autorregresiva. Además: cualquier modelo de menos de 1B de parámetros donde un decoder pequeño pueda igualar la calidad con mayor flexibilidad (Phi-3-Mini, Qwen2-1.5B).
Envíelo
Consulte outputs/skill-bert-finetuner.md. La habilidad (skill) define el alcance de un ajuste fino de BERT (elección del backbone, especificación del cabezal, datos, evaluación, criterios de parada) para una nueva tarea de clasificación o extracción.
Ejercicios
- Fácil. Ejecute
code/main.pye imprima la distribución de máscaras a lo largo de 10,000 tokens. Confirme que se seleccione aproximadamente el 15% y que de ellos, alrededor del 80% se convierta en[MASK]. - Medio. Implemente el enmascaramiento de palabra completa (whole-word masking): si una palabra se tokeniza en subwords, enmascare todos los subwords juntos o ninguno. Mida si esto mejora la precisión del MLM en un corpus de 500 oraciones.
- Difícil. Entrene un BERT diminuto (2 capas, d=64) en 10,000 oraciones de un conjunto de datos público. Ajuste el token
[CLS]para el sentimiento SST-2. Compare contra un baseline basado únicamente en decoder con parámetros equivalentes — ¿cuál gana?
Términos Clave
| Término | Lo que la gente dice | Lo que realmente significa |
|---|---|---|
| MLM | "Modelado de lenguaje enmascarado" | Señal de entrenamiento: reemplazar aleatoriamente el 15% de los tokens con [MASK] y predecir los originales. |
| Bidireccional | "Mira hacia ambos lados" | La atención del encoder no tiene máscara causal — cada posición ve a todas las demás posiciones. |
[CLS] |
"El token de pooling (pooler token)" | Un token especial añadido al principio de cada secuencia; su embedding final se utiliza como la representación a nivel de oración. |
[SEP] |
"Separador de segmentos" | Separa secuencias emparejadas (por ejemplo, query/doc, oración A/B). |
| NSP | "Predicción de la siguiente oración" | Segunda tarea de preentrenamiento de BERT; se demostró que es inútil en RoBERTa y se descartó después de 2019. |
| Ajuste fino (Fine-tuning) | "Adaptar a una tarea" | Mantener el encoder mayormente congelado; entrenar un cabezal pequeño en la parte superior para la tarea downstream. |
| Cross-encoder | "Un reranker" | Un BERT que toma tanto la query como el doc como entrada y produce una puntuación de relevancia. |
| ModernBERT | "Actualización de 2024" | Encoder reconstruido con RoPE, RMSNorm, GeGLU, atención alternada local/global y contexto de 8K. |
Lecturas Adicionales
- Devlin et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding — artículo original.
- Liu et al. (2019). RoBERTa: A Robustly Optimized BERT Pretraining Approach — cómo entrenar a BERT correctamente; elimina NSP.
- Clark et al. (2020). ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators — la detección de tokens reemplazados supera a MLM con el mismo nivel de cómputo.
- Warner et al. (2024). Smarter, Better, Faster, Longer: A Modern Bidirectional Encoder — artículo de ModernBERT.
- HuggingFace
modeling_bert.py— referencia canônica de encoder.