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

Modelado de lenguaje enmascarado: elegir tokens, enmascararlos, predecir los originales

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

  1. Fácil. Ejecute code/main.py e 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].
  2. 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.
  3. 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

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).