OpenCyber Academy
Ingeniería · Capítulo 24 · Español
Código del curso: OCA-135Capítulo 24: OCA-135-C024

Capítulo 24 — Seguridad de la IA y del aprendizaje automático: métodos I

Aprendizaje gratuito y abierto para quienes desean proteger a las personas y la tecnología. No se necesita una cuenta para estudiar ni consultar las respuestas.

Mapa de la lección

Lección 24 publicada. Mapa, ejemplo, EX070.

flowchart TD
  N0["Resultados de aprendizaje"]
  N1["24.1 Evaluación de la evasión"]
  N2["24.2 Evaluación del envenenamiento"]
  N3["24.3 Evaluación de la inferencia de pertenencia"]
  N4["24.4 De los modelos de juguete a los componentes rea"]
  N5["24.4b Leer los resultados con responsabilidad"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX070"]

Dibujo lógico

flowchart LR
  N0["Resultados de aprendizaje"]
  N1["24.1 Evaluación de la evasión"]
  N2["24.2 Evaluación del envenenamiento"]
  N3["24.3 Evaluación de la inferencia de pertenencia"]
  N4["24.4 De los modelos de juguete a los componentes rea"]
  N5["24.4b Leer los resultados con responsabilidad"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX070"]
[Resultados de aprendizaje]
    |
    v
[24.1 Evaluación de la evasión]
    |
    v
[24.2 Evaluación del envenenamiento]
    |
    v
[24.3 Evaluación de la inferencia de pertenencia]
    |
    v
[24.4 De los modelos de juguete a los componentes rea]
    |
    v
[24.4b Leer los resultados con responsabilidad]
    |
    v
[Síntesis del capítulo]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX070]

Resultados de aprendizaje

Usted será capaz de (1) realizar evaluaciones adversariales básicas —evasión, envenenamiento e inferencia de pertenencia— sobre modelos de juguete; (2) interpretar los resultados como curvas y no como números aislados; (3) reconocer los límites de las evaluaciones con modelos de juguete; y (4) planificar la transferencia de los métodos a componentes reales con autorización.

24.1 Evaluación de la evasión

Las pruebas de evasión perturban las entradas dentro de un presupuesto y miden la exactitud. Informe de la exactitud en función del presupuesto. El laboratorio entrena una regresión logística y aplica perturbaciones de tipo FGSM; la exactitud cae del 98,5 % al nivel del azar a medida que crece ε.

"""Lab E: evasion of a toy linear classifier (synthetic data, stdlib only).
Trains logistic regression on two synthetic clusters, then applies a
fast-gradient-sign (FGSM-style) perturbation of size eps to every test point
and reports clean vs adversarial accuracy. Teaching model only."""
import math, random
rng = random.Random(7)
def point(label):
    cx = 1.0 if label else -1.0
    return [rng.gauss(cx, 0.7), rng.gauss(cx, 0.7)], label
train = [point(i % 2) for i in range(400)]
test = [point(i % 2) for i in range(200)]
w, b = [0.0, 0.0], 0.0
sig = lambda z: 1 / (1 + math.exp(-z))
for epoch in range(200):
    gw, gb = [0.0, 0.0], 0.0
    for x, y in train:
        p = sig(w[0]*x[0] + w[1]*x[1] + b)
        gw[0] += (p - y)*x[0]; gw[1] += (p - y)*x[1]; gb += p - y
    w = [w[i] - 0.1*gw[i]/len(train) for i in range(2)]; b -= 0.1*gb/len(train)
def acc(data, eps):
    ok = 0
    for x, y in data:
        # gradient of the loss w.r.t. x is (p - y) * w; FGSM steps along its sign
        p = sig(w[0]*x[0] + w[1]*x[1] + b)
        xa = [x[i] + eps*math.copysign(1, (p - y)*w[i]) for i in range(2)]
        ok += (sig(w[0]*xa[0] + w[1]*xa[1] + b) >= 0.5) == bool(y)
    return ok / len(data)
print(f"weights w=({w[0]:.3f}, {w[1]:.3f}) b={b:.3f}")
for eps in (0.0, 0.25, 0.5, 0.75, 1.0):
    print(f"eps={eps:.2f} accuracy={acc(test, eps):.3f}")

Salida esperada:

weights w=(1.795, 1.756) b=-0.080
eps=0.00 accuracy=0.985
eps=0.25 accuracy=0.950
eps=0.50 accuracy=0.840
eps=0.75 accuracy=0.660
eps=1.00 accuracy=0.505

La curva cuenta una historia más completa que cualquier punto aislado. Con ε = 0,25 el modelo aún mantiene el 95 %, pero con 0,75 ha bajado al 66 %, y con 1,0 está adivinando. Que eso importe depende de lo grande que sea el cambio que un atacante puede hacer de forma realista, y por eso el presupuesto se fija a partir del modelo de amenazas.

24.2 Evaluación del envenenamiento

Las pruebas de envenenamiento añaden o reetiquetan datos de entrenamiento y miden tanto la exactitud sobre datos limpios como los efectos dirigidos. El éxito de una puerta trasera puede ser alto mientras la exactitud sobre datos limpios no cambia, así que ambas métricas son imprescindibles.

"""Lab P: label-flip poisoning and a backdoor trigger on a toy nearest-centroid
classifier (synthetic data, stdlib only). Teaching model only."""
import random
rng = random.Random(11)
def point(label, trigger=False):
    cx = 1.0 if label else -1.0
    x = [rng.gauss(cx, 0.8), rng.gauss(cx, 0.8), 0.0]
    if trigger: x[2] = 5.0          # third feature is the 'trigger'
    return x, label
clean = [point(i % 2) for i in range(400)]
test = [point(i % 2) for i in range(400)]
def fit(data):
    c = {}
    for lab in (0, 1):
        pts = [x for x, y in data if y == lab]
        c[lab] = [sum(p[i] for p in pts)/len(pts) for i in range(3)]
    return c
def pred(c, x):
    d = {k: sum((x[i]-v[i])**2 for i in range(3)) for k, v in c.items()}
    return min(d, key=d.get)
def accuracy(c, data): return sum(pred(c, x) == y for x, y in data)/len(data)
print("label-flip poisoning (flip a fraction of class-1 labels to 0):")
for frac in (0.0, 0.1, 0.2, 0.3, 0.4):
    data = [(x, y) for x, y in clean]; ones = [i for i, (x, y) in enumerate(data) if y == 1]
    for i in ones[:int(frac*len(ones))]: data[i] = (data[i][0], 0)
    print(f"  flipped={frac:.1f} clean_test_accuracy={accuracy(fit(data), test):.3f}")
print("backdoor: add n triggered class-1 points labelled 0")
trig_test = [point(1, trigger=True) for _ in range(200)]
for n in (0, 10, 40, 80):
    data = clean + [(point(1, trigger=True)[0], 0) for _ in range(n)]
    c = fit(data)
    asr = sum(pred(c, x) == 0 for x, _ in trig_test)/len(trig_test)
    print(f"  poison_points={n:3d} clean_accuracy={accuracy(c, test):.3f} attack_success={asr:.3f}")

Salida esperada:

label-flip poisoning (flip a fraction of class-1 labels to 0):
  flipped=0.0 clean_test_accuracy=0.965
  flipped=0.1 clean_test_accuracy=0.965
  flipped=0.2 clean_test_accuracy=0.953
  flipped=0.3 clean_test_accuracy=0.950
  flipped=0.4 clean_test_accuracy=0.945
backdoor: add n triggered class-1 points labelled 0
  poison_points=  0 clean_accuracy=0.965 attack_success=0.075
  poison_points= 10 clean_accuracy=0.963 attack_success=0.145
  poison_points= 40 clean_accuracy=0.963 attack_success=0.685
  poison_points= 80 clean_accuracy=0.968 attack_success=0.980

La salida muestra ambos efectos. Invertir hasta el 40 % de las etiquetas de la clase 1 cuesta solo dos puntos de exactitud sobre datos limpios, porque el centroide se desplaza despacio. La puerta trasera es más sutil: con 80 puntos con disparador, la exactitud sobre datos limpios se mantiene en 0,968 mientras el 98 % de las entradas con disparador se clasifican mal. Una prueba que solo comprobara la exactitud sobre datos limpios daría por bueno este modelo envenenado.

24.3 Evaluación de la inferencia de pertenencia

Las pruebas de privacidad miden lo bien que un atacante puede distinguir a los miembros del conjunto de entrenamiento de los no miembros, como AUC y como tasa de verdaderos positivos con una tasa de falsos positivos baja.

"""Lab M: membership inference against an overfit 1-nearest-neighbour 'model'
that returns a confidence score. Synthetic records only; teaching model."""
import random, math
rng = random.Random(5)
def rec(): 
    y = rng.random() < 0.5
    return [rng.gauss(0.6 if y else -0.6, 1.0) for _ in range(4)], int(y)
members = [rec() for _ in range(150)]; nonmembers = [rec() for _ in range(150)]
def confidence(x, y, k):
    # k-NN vote share for the true label, computed over the training set
    d = sorted((sum((a-b)**2 for a, b in zip(x, m)), my) for m, my in members)
    return sum(1 for _, my in d[:k] if my == y)/k
def auc(pos, neg):
    s = sum((p > n) + 0.5*(p == n) for p in pos for n in neg)
    return s/(len(pos)*len(neg))
for k in (1, 5, 25):
    pos = [confidence(x, y, k) for x, y in members]
    neg = [confidence(x, y, k) for x, y in nonmembers]
    best = max(sum(p >= t for p in pos)/len(pos) - sum(n >= t for n in neg)/len(neg)
               for t in sorted(set(pos + neg)))
    print(f"k={k:2d} attack_auc={auc(pos, neg):.3f} best_advantage={best:.3f}")

Salida esperada:

k= 1 attack_auc=0.600 best_advantage=0.200
k= 5 attack_auc=0.521 best_advantage=0.073
k=25 attack_auc=0.520 best_advantage=0.060

El laboratorio muestra que la causa es el sobreajuste: el modelo de un vecino más cercano memoriza cada punto de entrenamiento, lo que da un AUC del ataque de 0,600 y una ventaja de 0,200. Promediar sobre cinco vecinos ya reduce el AUC a 0,521, y 25 vecinos cambian poco más, de modo que el atacante termina apenas mejor que si adivinara. Aun así, el AUC por sí solo puede ocultar riesgo: un ataque que identifica a unos pocos miembros con casi total certeza importa aunque el promedio parezca inofensivo, y por eso también se informa de la tasa de verdaderos positivos con una tasa de falsos positivos baja.

24.4 De los modelos de juguete a los componentes reales

Los modelos de juguete hacen medibles los conceptos en segundos; los modelos reales necesitan ataques más fuertes (PGD de varios pasos según Madry et al., arXiv:1706.06083; ataques adaptativos según Carlini et al., arXiv:1902.06705), conjuntos de prueba mayores y entornos autorizados. Evalúe siempre el artefacto desplegado. Nunca aplique estos métodos contra sistemas que no esté autorizado a probar. Los laboratorios enseñan qué significan las métricas; no muestran cómo se comportará un modelo real. Las evaluaciones reales también necesitan presupuestos justificados por el modelo de amenazas y suficientes elementos para obtener intervalos estrechos.

24.4b Leer los resultados con responsabilidad

Cada evaluación responde a una pregunta acotada: «¿cómo se comporta este modelo ante este ataque con este presupuesto?». Registre el ataque, sus parámetros, el número de elementos de prueba, las semillas y los intervalos. Un resultado fuerte ante un ataque débil dice poco; un resultado débil ante un ataque fuerte es informativo. Cuando una defensa parezca funcionar, pruebe un ataque que conozca la defensa antes de creerlo: es la lección central de Athalye et al. (arXiv:1802.00420). Conserve todo el código y las salidas de evaluación para que las versiones posteriores del modelo puedan compararse exactamente con las mismas pruebas.

24.5 Ejemplo resuelto (caso sintético de NRS)

Sam ejecutó los tres laboratorios para informar a los directivos de NRS en quince minutos: la evasión muestra la sensibilidad a cambios pequeños, el envenenamiento muestra por qué importa el contratista de etiquetado y la inferencia de pertenencia muestra por qué los datos de los sensores de Pulse no deben exponerse con las confianzas completas. Después, Sam delimitó el alcance de una evaluación real de TrackEye en el patio de pruebas con marcas impresas, con la autorización escrita del director de operaciones.

Usar modelos de juguete para la sesión informativa mantuvo la atención en los conceptos y no en las cifras reales de TrackEye, que todavía no existían.

24.6 Errores y límites

Un único valor de ε oculta la rapidez con que cae el rendimiento e invita a escoger a conveniencia el presupuesto que mejor queda. Medir solo la exactitud sobre datos limpios tras el envenenamiento pasa por alto por completo las puertas traseras, como muestra la fila de 80 puntos del laboratorio. Los resultados de juguete describen modelos de juguete; presentarlos como evidencia sobre TrackEye o Wrench induciría a error a quienes toman las decisiones. Sam etiqueta cada resultado de juguete como ilustrativo en la diapositiva donde aparece. La etiqueta se mantiene cuando se reutilizan las diapositivas.

Ejercicios — capítulo 24

Síntesis del capítulo

Los métodos básicos de evaluación adversarial —curvas de evasión, pruebas de envenenamiento con dos métricas, pruebas de privacidad con FPR bajo— desarrollan la intuición con rapidez; el aseguramiento real exige ataques más fuertes sobre los artefactos desplegados y con autorización.

Siga estudiando — capítulo 24 de 50

← Capítulo 23 (borrador) · Índice de capítulos del curso · Capítulo 25 (borrador) →

Respuestas desarrolladas

EX070. 0,950 con ε = 0,25 y 0,505 con ε = 1,00, cerca del azar en un problema de dos clases.

EX071. Una puerta trasera puede dejar sin cambios la exactitud sobre datos limpios (0,963 con 40 puntos envenenados) mientras el éxito del ataque sobre las entradas con disparador es de 0,685; la exactitud sobre datos limpios por sí sola no lo detectaría.

EX072. TrackEye es un modelo profundo y no lineal sobre imágenes, que requiere ataques más fuertes, de varios pasos y físicos; las condiciones reales (luz, velocidad) y los datos difieren de dos agrupaciones gaussianas.