Parcheando Pesos de LLM a Mano

Escribí una implementación desde cero de ROME — edición de modelos de rango uno — usando solo torch y transformers. El objetivo: reescribir un único hecho dentro de GPT-2 Medium con una sola adición de matriz, y ver qué le sucede a todo lo demás que sabe el modelo.

Realicé cuatro ediciones. Tres fueron quirúrgicas. La cuarta reveló que la “precisión quirúrgica” de ROME es extremadamente sensible a los detalles de implementación que no necesariamente se consideran de antemano.

Las Cuatro Ediciones

Elegí hechos que GPT-2 Medium realmente conoce con confianza (P > 0.5 en la respuesta correcta) en cuatro dominios distintos:

SujetoHecho originalEditado a
Universidad de Harvarden MassachusettsCalifornia
Googleen CaliforniaTexas
Tacosde MéxicoJapón
Estatua de la Libertaden Nueva YorkLas Vegas

Las cuatro ediciones alcanzaron su objetivo. Después de la actualización, el modelo predijo la nueva respuesta con probabilidad ≥ 0.98 para el prompt de edición exacto. Así que ROME en sí funciona. Lo que varía es todo lo demás.

Las Tres Ediciones Limpias

Tres de las cuatro se comportaron aproximadamente como el artículo de ROME predeciría. Esto es lo que le sucedió a hechos no relacionados después de cada edición:

Tacos → Japón (norma de actualización: 9% de la norma de peso)

ControlDespués
Sushi de Japón✓ sin cambios
Pizza de Italia✓ sin cambios
Ramen de Japón✓ sin cambios
Burritos de México→ Japón

Solo los Burritos, el vecino más cercano en el espacio de comida mexicana, fueron arrastrados.

Harvard → California (norma de actualización: 13%)

ControlDespués
MIT en Massachusetts✓ sin cambios (todavía borroso)
Capital de Massachusetts = Boston✓ sin cambios
Boston en Massachusetts✓ sin cambios
Yale en Connecticut→ California

Yale — el vecino más cercano a Harvard en el espacio de la Ivy League — se vino junto. Nada más se movió.

Estatua de la Libertad → Las Vegas (norma de actualización: 16%)

ControlDespués
Times Square en Nueva York✓ sin cambios
Ciudad de Nueva York en Nueva York✓ sin cambios
Empire State Buildingdisputado (New 0.49 vs Las 0.26)
Liberty Bell en Filadelfia→ Las Vegas

Dos monumentos vacilaron. El Liberty Bell es particularmente gracioso — no está en NY, pero comparte la palabra “Liberty” y GPT-2 los confundió.

Así que: ediciones directas limpias, daño colateral estrecho, magnitudes de actualización razonables (9–16%).

El modelo también inventó alegremente historias alternativas para que coincidieran. Mi favorita: después de mover Harvard a California, al preguntarle cuándo fue fundada, el modelo respondió “1776 por el padre jesuita francés Charles de Montesquieu.” Oración completa, internamente coherente, completamente falsa. Eso son los priors del modelo (“Harvard es prestigiosa, los lugares famosos tienen fundadores famosos”) llenando el hueco donde solía estar un hecho real.

La Desordenada: Google

La edición de Google salió mal. Mi primera ejecución reportó una norma de actualización del 117% — el cambio de rango 1 era mayor que la norma de la matriz de pesos en sí — y colapsó todo el clúster tecnológico de California:

Escribí una entrada de blog con esto como el hallazgo principal. Luego lo pensé más y me di cuenta de que 117% era sospechoso. Una edición de rango 1 no debería ser mayor que aquello que está editando.

Depurando Google

Resultaron ser dos cosas incorrectas.

Problema 1: mi covarianza estaba mal cocida

La fórmula de actualización de ROME depende de C, la covarianza de los vectores intermedios (post-GELU) en la capa objetivo:

u = torch.linalg.solve(C + lambda * I, h_star)
delta_W = (u / (h_star @ u)).unsqueeze(1) @ (v_star - W @ h_star).unsqueeze(0)

La dirección C⁻¹ @ h* es lo que hace que la edición sea selectiva — está alineada con h* pero ortogonal a las claves típicas. Si C está mal condicionada, C⁻¹ @ h* explota en direcciones de eigenvalor bajo, y la actualización se vuelve enorme.

Estaba estimando C a partir de 200 muestras de WikiText — unas 10,600 tokens. Para una matriz de covarianza de 4096×4096, eso es ~2.5 muestras por dimensión. La matriz estaba severamente deficiente en rango. Tenía regularización 1e-4 * I, que no era suficiente.

Solución: 2000 muestras (~118,000 tokens, ~29× por dimensión) y regularización escalada por traza (1e-2 × mean(diag(C))).

Resultado para la misma edición: la norma de actualización cayó del 117% al 50.5%. Mejor condicionamiento, la mitad de la magnitud de actualización.

Pero 50% sigue siendo enorme, y los controles seguían rotos:

ControlDespués (covarianza corregida)
HQ de AppleTexas (1.00)
HQ de MicrosoftTexas (0.99)
Silicon ValleyTexas (0.92)
StanfordTexas (0.97)

Así que parte de la “catástrofe” era un bug — pero no toda. La fuga del clúster era real.

Problema 2: la posición importa, mucho

“Google” es un solo token BPE. En mi prompt — “Google is a company headquartered in the state of” — está en la posición 0. Eso significa que h* (el vector intermedio usado para la edición) se calcula a partir de un token que no ha visto contexto precedente. Es una representación desnuda.

¿Qué pasa si pongo a Google en algún lugar distinto de la posición 0? Cambié el prompt a “The technology company known as Google is headquartered in the state of” — ahora Google está en la posición 5, con “The technology company known as” como contexto previo.

Mismo objetivo de edición. Misma nueva covarianza. Resultado:

Así que solo dándole al token sujeto algo de contexto antes de calcular h*, la edición se vuelve lo suficientemente quirúrgica como para que Silicon Valley y Stanford sobrevivan. Apple y Microsoft todavía fueron empujados, así que existe cierta fuga real adyacente a Google — pero nada como el apocalipsis original.

Lo Que Esto Realmente Enseña

Quería que esta entrada fuera “mira, ROME no puede editar conceptos hub — mira cómo Google destruyó todo.” Ese encuadre estaba equivocado. La verdad es más interesante y menos dramática:

  1. ROME es sensible a detalles de implementación que no ves en el artículo. El conteo de muestras para la covarianza. La fuerza de regularización. Dónde se encuentra el token sujeto en el prompt. Equivocarse en cualquiera de estos y tu “daño colateral catastrófico” podría ser tu propio código.

  2. Los sujetos de token único en la posición 0 son el peor caso. Su h* es el menos discriminativo, y cualquier imprecisión numérica en C se invierte en una actualización sobredimensionada. Si quieres una edición limpia, agrega contexto previo al sujeto.

  3. La fuga de conceptos hub es real pero modesta. Incluso con covarianza adecuada y contexto previo, editar Google mueve Apple y Microsoft ligeramente. “Google” se encuentra en un vecindario semántico denso, y la edición de rango 1 toca ese vecindario. Puedes reducir esto en otro 2–4× con distribución multi-capa al estilo MEMIT, pero no puedes eliminarlo completamente.

  4. La norma de actualización es un diagnóstico confiable. Por debajo del 15% de la norma del peso: probablemente bien. Por encima del 50%: probablemente roto, ya sea por un bug o porque estás editando un hub. Verifica antes de confiar en la edición.

Las Confabulaciones Son Reales Igualmente

A través de cada edición exitosa, el modelo inventó hechos alternativos coherentes para que coincidieran:

Estos no son ruido — son el modelo aplicando sus priors al hecho modificado. Una vez que cree que Google es texana, “fundada por Steve Jobs” no es una alucinación aleatoria; es la mejor suposición del modelo sobre cómo debería verse la historia del fundador de una famosa empresa tecnológica de Texas.

El conocimiento dentro de un modelo de lenguaje no es una lista de hechos independientes. Es un grafo de hechos que se refuerzan mutuamente. Edita un nodo y el grafo produce una nueva región coherente (y completamente falsa) a su alrededor.

La Configuración

Todo el asunto son ~500 líneas en unos pocos archivos: rastreo causal, estimación de covarianza, descenso de gradiente de v*, la actualización de peso de rango 1, y un script de extremo a extremo para las cuatro ediciones.

Dependencias: torch, transformers, datasets. Nada específico de ROME.

Se ejecuta en CPU. Cada edición toma ~3 minutos con covarianza de 200 muestras, ~15 minutos con covarianza de 2000 muestras. La configuración de covarianza adecuada vale la espera.