Parte: 15 — Seguridad de IA y machine learning · Fuente: Goodfellow, Shlens & Szegedy, "Explaining and Harnessing Adversarial Examples" (ICLR 2015) ⏱️ Duración estimada: 120 min · Nivel: Intermedio
Comprender por qué existen los ejemplos adversariales y aprender a generarlos, evaluarlos y defenderlos con herramientas reales. El alumno pasará de la teoría del gradiente (FGSM, PGD) a un ataque práctico sobre un clasificador propio usando Adversarial Robustness Toolbox (ART), y medirá la caída de precisión bajo ataque.
⚠️ Ética: los ataques de esta clase se realizan únicamente sobre modelos y datos propios en un laboratorio aislado. Atacar modelos de terceros sin autorización explícita puede ser ilegal.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Qué es un ejemplo adversarial | Perturbación mínima que cambia la predicción |
| 2 | FGSM: ataque de un paso | Base intuitiva basada en el signo del gradiente |
| 3 | PGD: ataque iterativo | Considerado el ataque de referencia (fuerte) |
| 4 | Normas de perturbación (L∞, L2, L0) | Definen qué significa "imperceptible" |
| 5 | Ataques dirigidos vs. no dirigidos | Forzar una clase concreta o solo un error |
| 6 | Transferibilidad y caja negra | Un adversarial de un modelo suele engañar a otro |
| 7 | Ataques físicos (patches, pegatinas) | La amenaza no vive solo en píxeles digitales |
| 8 | Defensas: entrenamiento adversarial | Mejora robustez a costa de precisión limpia |
x' = x + δ con ‖δ‖ ≤ ε que causa una predicción errónea. Característica: δ suele ser imperceptible para un humano.x' = x + ε · sign(∇ₓ J(θ,x,y)). Característica: un solo paso, rápido pero subóptimo.pip install adversarial-robustness-toolbox torch torchvision numpy matplotlib
Todo sobre un modelo y dataset propios.
Entrena o carga un clasificador. Una CNN sobre MNIST alcanza >98% en test limpio. Guarda model.pt.
Envuelve el modelo con ART.
python
from art.estimators.classification import PyTorchClassifier
clf = PyTorchClassifier(model=model, loss=loss_fn,
input_shape=(1,28,28), nb_classes=10,
clip_values=(0,1))
Mide la precisión limpia sobre el test set y anótala como línea base.
Genera FGSM.
python
from art.attacks.evasion import FastGradientMethod
atk = FastGradientMethod(estimator=clf, eps=0.2)
x_adv = atk.generate(x=x_test)
Evalúa la precisión sobre x_adv: debería desplomarse.
Genera PGD (ProjectedGradientDescent, eps=0.2, max_iter=40) y compara: PGD suele ser más efectivo que FGSM con el mismo ε.
Barre ε. Repite para ε ∈ {0, 0.05, 0.1, 0.15, 0.2, 0.3} y dibuja la curva precisión vs. ε. Observa el compromiso perceptibilidad/eficacia.
Ataque dirigido. Fuerza que un "3" se clasifique como "8" (targeted=True) y verifica visualmente que la imagen sigue pareciendo un 3.
Defiende con entrenamiento adversarial.
python
from art.defences.trainer import AdversarialTrainerMadryPGD
trainer = AdversarialTrainerMadryPGD(clf, eps=0.2)
trainer.fit(x_train, y_train)
Reevalúa: la precisión adversarial sube, la limpia baja un poco. Documenta el trade-off.
sign() del gradiente maximiza la pérdida bajo una restricción L∞.CarliniL2Method) y compara la magnitud de perturbación con L∞.Entrega un informe de robustez de tu clasificador con: precisión limpia base, curva precisión vs. ε para PGD, un ejemplo dirigido exitoso, y la comparación antes/después de entrenamiento adversarial.
Criterio de aceptación: con entrenamiento adversarial, la precisión bajo PGD (ε=0.2) mejora al menos 30 puntos porcentuales respecto al modelo sin defender, y el informe cuantifica explícitamente la caída de precisión limpia asociada. Todo el código es reproducible con python attack.py.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El ataque no reduce la precisión | Falta clip_values o el modelo está en modo eval sin gradientes. Verifica el wrapper de ART. |
| Perturbaciones visibles/feas | ε demasiado alto. Baja ε y usa PGD iterativo en vez de FGSM. |
| "Defensa perfecta" con gradient masking | La defensa ofusca gradientes, no aporta robustez real. Evalúa con ataques de caja negra/transferencia. |
| Precisión limpia se hunde tras defender | ε de entrenamiento demasiado alto. Ajusta y busca el punto de equilibrio. |
| Adversariales no transfieren | Modelos muy distintos o regularización fuerte. Usa un sustituto más parecido. |
❓ ¿Por qué existen los ejemplos adversariales? Las redes profundas son localmente casi lineales en dimensiones muy altas; pequeñas perturbaciones alineadas con el gradiente se suman y empujan la salida sobre la frontera de decisión (Goodfellow et al.).
❓ ¿Sirve la detección de adversariales en lugar de la robustez? Ayuda, pero muchos detectores se rompen ante ataques adaptativos que también engañan al detector. La robustez certificada o el entrenamiento adversarial son más sólidos.
❓ ¿Esto solo afecta a imágenes? No. Hay adversariales en audio, texto (sustituciones de palabras), malware (bytes que evaden clasificadores) y datos tabulares. El principio del gradiente es el mismo.
❓ ¿Qué es un ataque físico? Perturbaciones que sobreviven a la captura por cámara: pegatinas en señales de tráfico, patches impresos o monturas de gafas que engañan al reconocimiento facial.
Clase 291 — Introducción a la seguridad de IA y ML