Saltar al contenido

Temas

Extracción de datos de entrenamiento

Cómo un modelo memoriza fragmentos de su corpus y cómo un atacante con solo acceso de consulta los recupera, siguiendo el ataque de Carlini et al. (USENIX Security 2021), y qué hacer al entrenar y al desplegar.

AvanzadoEn progreso 5 min de lectura1 oct 2026#privacidad#memorizacion#extraccion#llm#owasp-llm02#carlini

Un modelo de lenguaje se entrena con millones de documentos y después se despliega sin ellos. Parece que los datos se quedan atrás. No es así: el modelo puede haber memorizadoMemorizaciónCuando un modelo retiene y puede reproducir literalmente fragmentos de sus datos de entrenamiento, incluidos datos personales o secretos. secuencias concretas y reproducirlas palabra por palabra. Un atacante que solo pueda hacer consultas (el mismo acceso que tiene cualquier usuario de una API) puede intentar sacarlas.

Es la cara de “entrenamiento” de LLM02: Sensitive Information Disclosure del OWASP Top 10 for LLM, y el trabajo de referencia es Extracting Training Data from Large Language Models (Carlini, Tramèr, Wallace et al., USENIX Security 2021).

Qué demostró el artículo#

Atacaron GPT-2 (el modelo de OpenAI, entrenado con texto público de internet) como caso de estudio, y con acceso de solo consulta recuperaron cientos de secuencias literales del entrenamiento:

  • Datos personales: nombres, teléfonos, correos y direcciones.
  • Código, URLs, identificadores UUID y conversaciones de chat.
  • Secuencias que aparecían en un único documento del corpus. No hace falta que un dato sea famoso o se repita para que se memorice.

Además, los modelos más grandes memorizan más. Lo que se creía una cuestión de sobreajuste clásico (entrenar demasiado sobre pocos datos) ocurre también en modelos con un error de test bajo.

El ataque, paso a paso#

La idea es ingeniosa por lo simple: generar mucho y quedarse con lo sospechosamente probable.

Extracción de datos de entrenamiento
Corpusweb raspadaAtacantesolo consultaLLMobjetivoWeb públicamuestras generadasranking: LLM vs. zlibEl clima de hoy es…for i in range(10):Ana Ruiz · 6XX 123…1 2 3 4 5 6 7 8 9…Términos y condic…«Ana Ruiz · 6XX…»memorizado en los pesos200 000 muestras✓ aparece literal≈ 600 de 1 800 candidatas eran literalestextoprompt vacío

Paso 1 de 5El corpus

El modelo se entrena con texto raspado de internet. Entre millones de páginas hay una sola que publica un dato sensible: el nombre de Ana con su teléfono.

  1. Muestrear a lo bestia. Se generan cientos de miles de textos con un prompt vacío o con prefijos sacados de internet (el artículo usó unas 200 000 muestras por configuración). Casi todo es texto genérico.
  2. Puntuar cada muestra. Se calcula la perplejidad que el modelo objetivo asigna al texto. Una perplejidad muy baja significa “esto me suena”: puede ser memorizado, pero también texto trivial y repetitivo.
  3. Filtrar lo trivial con una referencia. Se compara con otra señal: un modelo más pequeño, la compresión con zlib o la versión en minúsculas. Si el modelo grande lo encuentra muy probable y la referencia no, la explicación más plausible es la memorización, no la simplicidad del texto.
  4. Quedarse con las primeras y verificar. Se ordenan por ese cociente y se revisan las mejores, buscándolas en la web pública (en el artículo, con los propios creadores del modelo para confirmar).

El resultado fue una precisión muy superior a la de elegir muestras al azar: de las 1 800 candidatas revisadas, unas 600 eran datos reales del entrenamiento.

Un poco de código: puntuar candidatas#

Esto es el núcleo del ranking, para entenderlo con las manos (en tu lab, con tu propio modelo):

rank_memorization.py
import math, zlib, torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("gpt2-xl")
big = AutoModelForCausalLM.from_pretrained("gpt2-xl").eval()
small = AutoModelForCausalLM.from_pretrained("gpt2").eval()
def log_ppl(model, text):
ids = tok(text, return_tensors="pt").input_ids
with torch.no_grad():
loss = model(ids, labels=ids).loss # media de -log p por token
return loss.item()
def score(text):
# Alto = el modelo grande lo ve mucho más probable que la referencia
zlib_entropy = len(zlib.compress(text.encode()))
return zlib_entropy / (log_ppl(big, text) * len(tok(text).input_ids))
# variante: log_ppl(small, text) / log_ppl(big, text)
candidates = [...] # muestras generadas por el modelo objetivo
for c in sorted(candidates, key=score, reverse=True)[:100]:
print(c)

Más allá de GPT-2#

El patrón se ha repetido con modelos mucho más grandes. En 2023 se mostró que un ataque de “divergencia” (pedir a un modelo conversacional que repita una palabra indefinidamente) lo hacía salirse de su modo de chat y emitir, con cierta frecuencia, texto literal de su entrenamiento. Los proveedores respondieron con filtros y prohibiciones en el servicio, pero eso no elimina la memorización: la tapa en una puerta.

Qué significa para ti#

Depende de qué construyas:

  • Si usas un modelo de un proveedor (Bedrock, API de terceros): la memorización de su corpus es riesgo del proveedor, pero tu entrada puede acabar en datos de entrenamiento si el contrato lo permite. Revisa los términos de uso de datos y desactiva el entrenamiento con tus prompts.
  • Si afinas (fine-tune) un modelo con tus datos: el riesgo es tuyo. Todo lo que metas en el conjunto de ajuste (tickets, correos, historiales) puede salir en una respuesta, a cualquier usuario que pueda consultar el modelo, sin pasar por tus permisos.

Defensa#

Ningún control es suficiente solo; se combinan en tres momentos.

  • Minimiza y limpia el corpus. Lo que no entra no se puede filtrar: elimina PII, secretos y credenciales (con herramientas de detección de secretos y Macie para S3).
  • Deduplica. Las secuencias repetidas se memorizan mucho más; deduplicar reduce de forma medible la memorización y mejora el modelo.
  • No afines con datos que no vayan a ver todos los usuarios. Para conocimiento por cliente, usa RAG con autorización antes de la recuperación.
  • Privacidad diferencial (DP-SGD). Recorta el gradiente de cada ejemplo y añade ruido, limitando la influencia de cada registro. Es la única defensa con garantía formal, con coste en precisión y cómputo.
  • Menos épocas y regularización. Entrenar menos sobre los mismos datos reduce la memorización.
  • Canarios. Inserta cadenas secretas aleatorias en el conjunto y mide si el modelo las reproduce: es un test cuantificable de cuánto memoriza.
  • Filtros de salida. Detecta PII y secuencias largas que coincidan literalmente con datos sensibles antes de devolverlas (Guardrails).
  • Limita la superficie de consulta. Rate limiting, detección de muestreo masivo y no exponer probabilidades por token (logprobs) salvo necesidad real.
  • Prueba tu propio modelo. Haz red teaming de extracción contra tu versión afinada (ver Red teaming de LLMs).

Tu turno

Mide la memorización de un modelo pequeño

En tu lab, con un modelo pequeño y datos que tú controles:

  1. Crea un corpus de ajuste con 1 000 frases normales y 5 canarios del estilo mi-codigo-secreto-7f3a9c2e.
  2. Afina el modelo y genera 10 000 muestras con un prompt vacío. ¿Aparece algún canario?
  3. Repite subiendo las épocas. ¿Cómo cambia la frecuencia con la que aparece?
  4. Deduplica y vuelve a probar con cada canario repetido una vez frente a diez.

Anota qué factor pesa más: repetición, tamaño del modelo o número de épocas.

Reto

Mi modelo afinado tiene mejor error en test que el base. ¿Puedo asumir que no memoriza datos privados?

▸Mostrar solución

No. El error de test mide cuánto generaliza, no qué retiene. Un modelo puede generalizar bien y conservar literalmente registros individuales. La memorización se mide con pruebas específicas (canarios, ataques de extracción, inferencia de pertenencia), no con la precisión.

En resumen#

  • Los LLM pueden memorizar y regurgitar datos de entrenamiento; Carlini et al. (2021) los extrajeron de GPT-2 solo con consultas.
  • El ataque es muestrear mucho + ordenar por “sospechosamente probable” (perplejidad frente a una referencia) + verificar.
  • Más tamaño y más repeticiones implican más memorización, pero también ocurre con datos vistos una sola vez.
  • Un modelo afinado con datos sensibles no respeta permisos: usa RAG con autorización para datos por cliente.
  • Defensa: limpiar y deduplicar el corpus, DP-SGD, filtros de salida, limitar consultas y probar tu propio modelo.

Referencias#

Notas relacionadas

ESC
↑↓ para navegar↵ para abriresc para cerrar