Model Editing
A edição de modelos altera um fato ou comportamento específico de um modelo treinado, como uma resposta de LLM, sem retreiná-lo nem afetar saídas não relacionadas.
A edição de modelos é a alteração direcionada de um fato ou comportamento específico em um modelo treinado, como a resposta que um modelo de linguagem grande (LLM) dá a "A Space Needle está localizada na cidade de", sem retreinar o modelo e sem alterar as saídas para entradas não relacionadas. É usada principalmente para corrigir, atualizar ou inserir conhecimento factual em LLMs, nos quais o retreinamento completo é caro demais e a sintonia fina simples com um único exemplo tende a causar sobreajuste ou prejudicar outros conhecimentos. Um editor calcula uma pequena alteração localizada nos pesos do modelo ou armazena a edição fora dos pesos e direciona para ela as entradas relevantes. O método mais conhecido, Rank-One Model Editing (ROME), foi apresentado por Kevin Meng, David Bau, Alex Andonian e Yonatan Belinkov em Locating and Editing Factual Associations in GPT, apresentado na NeurIPS 2022.
Como funciona a edição de modelos#
Uma solicitação de edição especifica uma entrada, geralmente um sujeito e uma relação, e a nova saída; por exemplo, mudar a cidade da Space Needle de Seattle para Paris. Os editores se dividem em algumas famílias:
- Localizar e editar: Primeiro, o ROME usa rastreamento causal, uma técnica de interpretabilidade que corrompe e restaura estados ocultos, para encontrar onde os modelos GPT recuperam um fato. O cálculo decisivo ocorre nas camadas feed-forward (MLP) no meio da rede, no último token do sujeito. O ROME trata a projeção de saída de uma MLP como uma memória de chave e valor e insere o novo fato com uma atualização de pesos de posto um em forma fechada; no GPT-2 XL, ele edita a camada 18 de 48. O MEMIT distribui a atualização por várias camadas para inserir milhares de fatos de uma só vez.
- Editores aprendidos: O MEND treina uma pequena hipierrede que transforma o gradiente do exemplo de edição em uma atualização de pesos de baixo posto, mantendo as edições rápidas em modelos com bilhões de parâmetros.
- Editores baseados em memória: O SERAC armazena edições em uma memória explícita e usa um classificador de escopo para encaminhar entradas relacionadas a uma edição a um pequeno modelo contrafactual, sem tocar nos pesos base. O GRACE insere um livro de códigos de adaptadores discretos de chave e valor em uma camada para sequências longas de edições. Inserir o novo fato no prompt, como faz a geração aumentada por recuperação, é o editor mais simples desse tipo.
A atualização do ROME se baseia em uma propriedade das camadas lineares: uma matriz de pesos W mapeia chaves armazenadas para valores, e uma nova chave k* pode receber um novo valor v* pela adição de uma matriz de posto um. O ROME pondera a atualização pela covariância inversa C das chaves que a camada já vê, estimada a partir de uma amostra de texto da Wikipédia, direcionando a alteração para longe das direções usadas pelas chaves existentes. Este exemplo em PyTorch aplica essa atualização a uma camada aleatória que armazena 5.000 chaves e compara-a com uma atualização simples de posto um que ignora a covariância:
import torch
torch.manual_seed(0)
scales = torch.logspace(0, -2, 256) # key dimensions with very different variances, as in real activations
keys = torch.randn(5000, 256) * scales # keys of 5,000 facts the layer already stores
W = torch.randn(128, 256) # the layer maps each key to a value
C = keys.T @ keys / len(keys) # second-moment statistics of the stored keys
k_new = torch.randn(256) * scales # key of the subject to edit
v_new = W @ keys[0] # new value: one already stored for another subject, as in "Seattle" -> "Paris"
# Plain rank-one update vs. ROME's update, which steers the change away from directions stored keys use
plain = W + torch.outer(v_new - W @ k_new, k_new) / (k_new @ k_new)
c_inv_k = torch.linalg.solve(C, k_new)
rome = W + torch.outer(v_new - W @ k_new, c_inv_k) / (k_new @ c_inv_k)
for name, edited in [("Plain rank-one", plain), ("ROME", rome)]:
error = (edited @ k_new - v_new).norm() / v_new.norm()
drift = ((keys @ (edited - W).T).norm(dim=1) / (keys @ W.T).norm(dim=1)).median()
print(f"{name}: new-fact error {error:.4f}, median change on stored facts {drift:.2%}")Ambas as atualizações mapeiam a nova chave exatamente para o novo valor, com um erro de 0.0000. A atualização simples altera a saída mediana das 5.000 chaves armazenadas em 10.99%, e a atualização do ROME ponderada pela covariância, em 5.02%, portanto a edição perturba menos o que a camada já sabia.
Avaliação de uma Edição#
As edições são avaliadas por várias propriedades ao mesmo tempo. A confiabilidade pergunta se a entrada editada agora produz a nova resposta; a generalização pergunta se paráfrases também produzem essa resposta; a localidade, também chamada especificidade, pergunta se entradas não relacionadas mantêm as respostas antigas; e a portabilidade pergunta se o raciocínio que depende do fato acompanha a alteração. Os autores do ROME criaram o conjunto de dados CounterFact, com 21.919 edições contrafactuais, para medir essas propriedades em conjunto, pois benchmarks anteriores permitiam que métodos trocassem generalização por especificidade sem que isso fosse percebido.
As edições muitas vezes falham nos testes mais difíceis. Nas 5.000 edições do benchmark RippleEdits, editores de destaque não conseguiram fazer alterações consistentes em fatos logicamente ligados ao fato editado, e uma simples referência de edição no contexto obteve a melhor pontuação. Gupta et al. descobriram que aplicar ROME e MEMIT sequencialmente faz o modelo esquecer edições anteriores e habilidades posteriores, primeiro gradualmente e depois abruptamente, o que limita quantas edições um modelo consegue absorver.
Edição de Modelos de Visão#
A mesma técnica de posto um também se aplica a imagens. Santurkar et al. editaram classificadores de imagens reescrevendo a regra que uma camada aplica a um conceito visual; por exemplo, mapeando a representação de neve para a de estrada para que o modelo lide com veículos em estradas nevadas, sem coletar novos dados de treinamento. O Ultralytics YOLOE faz uma edição sem gradiente da própria cabeça de detecção durante a exportação: as classes configuradas com set_classes() são multiplicadas na convolução final de cada ramo de classificação, de modo que o modelo exportado detecta o novo vocabulário sem treinamento nem codificador de texto.
Edição de Modelos vs. Conceitos Relacionados#
- Sintonia fina: Atualiza muitos pesos a partir de um conjunto de dados para alterar o comportamento de forma ampla. A edição tem como alvo um par de entrada e saída e restringe todo o resto.
- Geração aumentada por recuperação (RAG): Fornece fatos atuais no prompt a cada solicitação e deixa o modelo inalterado, o que facilita a reversão e permite escalar para muitos fatos.
- Desaprendizado de máquina: Remove a influência de dados de treinamento específicos. A edição substitui ou adiciona um fato, e uma edição que exclui um fato é uma forma de desaprendizado.
- Aritmética de tarefas: Adiciona ou subtrai alterações nos pesos de tarefas inteiras ajustadas por sintonia fina. A edição de modelos atua no nível de um único fato.
- Interpretabilidade mecanística: Explica como um modelo faz seus cálculos. O rastreamento causal do ROME vem desse campo e determina qual camada uma edição tem como alvo.










