Saltar al contenido

← Transformers con Hugging Face en Python

Conceptos básicos de Transformers

Preview gratis Sección 1 · Fundamentos de Transformers y el ecosistema Hugging Face

En este video

  • Comparas las redes recurrentes con el Transformer y ves por qué la autoatención permite entrenar en paralelo.
  • Calculas la atención con consultas, claves y valores en numpy, y ves por qué se divide entre la raíz de d_k con la dimensión 512.
  • Revisas la atención multicabeza y la codificación posicional con senos y cosenos.
  • Distingues encoder y decoder, y ves cómo preentrenan: rellenar palabras con MASK y predecir el siguiente token con Qwen.
  • Lees con AutoConfig la configuración de BERT, 12 capas y 768 dimensiones, y de Qwen 2, 24 capas y 896 dimensiones.
preparacion.py
# Datos y preparación que el video da por hechos: ejecuta esto antes del resto del código.
import os
os.environ["TRANSFORMERS_VERBOSITY"] = "error"
os.environ["HF_HUB_DISABLE_PROGRESS_BARS"] = "1"
import numpy as np
np.set_printoptions(precision=2, suppress=True)

def softmax(x):
    e = np.exp(x - x.max(axis=-1, keepdims=True))
    return e / e.sum(axis=-1, keepdims=True)

tokens = ["el", "animal", "estaba"]
Q = np.array([[1.0, 0.0, 1.0, 0.0], [0.0, 2.0, 0.0, 1.0], [0.0, 2.0, 1.0, 1.0]])
K = np.array([[1.0, 0.0, 0.0, 0.0], [0.0, 1.5, 0.5, 1.0], [0.5, 0.5, 1.0, 0.0]])
V = np.array([[1.0, 0.0], [0.0, 1.0], [0.5, 0.5]])
atencion.py · escalado.py
# atencion.py
d_k = K.shape[1]
scores = Q @ K.T / np.sqrt(d_k)
pesos = softmax(scores)
print(pesos)
print(pesos.sum(axis=1))
salida = pesos @ V
print(salida.shape)

# escalado.py
rng = np.random.default_rng(42)
d = 512
q, k = rng.normal(size=d), rng.normal(size=(5, d))
crudo = k @ q
print(crudo.round(1))
print(softmax(crudo).round(3))
print(softmax(crudo / np.sqrt(d)).round(3))
posiciones.py
import matplotlib.pyplot as plt
pos, i = np.arange(50)[:, None], np.arange(0, 64, 2)
ang = pos / 10000 ** (i / 64)
pe = np.zeros((50, 64))
pe[:, 0::2], pe[:, 1::2] = np.sin(ang), np.cos(ang)
plt.figure(figsize=(9, 4.5))
plt.imshow(pe, cmap="RdBu", aspect="auto")
plt.xlabel("dimensión"); plt.ylabel("posición")
relleno.py
# Paso que el video ejecuta sin mostrarlo en pantalla:
import torch
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
QWEN = "Qwen/Qwen2.5-0.5B-Instruct"
DISTIL = "distilbert/distilbert-base-multilingual-cased"

fm = pipeline("fill-mask", model=DISTIL)
frase = "El paquete llegó [MASK] y en perfecto estado."
for r in fm(frase, top_k=3):
    print(r["token_str"], round(r["score"], 3))
siguiente.py
tok = AutoTokenizer.from_pretrained(QWEN)
model = AutoModelForCausalLM.from_pretrained(QWEN)
ids = tok("El paquete llegó", return_tensors="pt")
with torch.no_grad():
    probs = model(**ids).logits[0, -1].softmax(-1)
for p, i in zip(*probs.topk(3)):
    print(repr(tok.decode(i)), round(p.item(), 3))
configuracion.py
# Paso que el video ejecuta sin mostrarlo en pantalla:
BERT = "nlptown/bert-base-multilingual-uncased-sentiment"

from transformers import AutoConfig
for ck in [BERT, QWEN]:
    c = AutoConfig.from_pretrained(ck)
    print(c.model_type, c.num_hidden_layers,
          c.num_attention_heads, c.hidden_size,
          c.hidden_size // c.num_attention_heads)

Recursos