Model Editing
Редактирование модели изменяет конкретный факт или поведение обученной модели, например один ответ LLM, без повторного обучения и влияния на несвязанные результаты.
Редактирование модели — это целенаправленное изменение конкретного факта или поведения обученной модели, например ответа, который большая языковая модель (LLM) выдаёт на запрос «Космическая игла находится в городе», без переобучения модели и без изменения её ответов на другие входные данные. Этот подход в основном используют, чтобы исправлять, обновлять или добавлять фактические знания в LLM, когда полное переобучение слишком дорого, а обычная тонкая настройка на одном примере обычно приводит к переобучению или искажает другие знания. Редактор либо вносит небольшое локальное изменение в веса модели, либо хранит правку отдельно от весов и перенаправляет на неё релевантные входные данные. Самый известный метод, Rank-One Model Editing (ROME), представили Кевин Мэн, Дэвид Бау, Алекс Андониан и Йонатан Белинков в работе Locating and Editing Factual Associations in GPT, представленной на NeurIPS 2022.
Как работает редактирование модели#
Запрос на редактирование указывает входные данные, часто субъект и отношение, а также новый выход — например, замену Сиэтла на Париж в качестве города, где находится Космическая игла. Методы редактирования делятся на несколько групп:
- Сначала найти, затем отредактировать: ROME сначала применяет причинную трассировку — метод интерпретируемости, который искажает и восстанавливает скрытые состояния, — чтобы найти место, где модели GPT вспоминают факт. Ключевое вычисление выполняется в полносвязных слоях (MLP) в середине сети, на последнем токене субъекта. ROME рассматривает выходную проекцию одного MLP как память «ключ — значение» и добавляет новый факт с помощью замкнутого обновления весов ранга 1; в GPT-2 XL метод редактирует 18-й слой из 48. MEMIT распределяет обновление по нескольким слоям, чтобы одновременно добавить тысячи фактов.
- Обучаемые редакторы: MEND обучает небольшую гиперсеть преобразовывать градиент примера для редактирования в низкоранговое обновление весов, благодаря чему правки быстро применяются даже к моделям с миллиардами параметров.
- Редакторы на основе памяти: SERAC хранит правки в явной памяти и использует классификатор области действия, чтобы направлять входные данные, связанные с правкой, в небольшую контрфактическую модель, не затрагивая базовые веса. GRACE добавляет кодовую книгу дискретных адаптеров «ключ — значение» в один слой для длинных последовательностей правок. Добавление нового факта в промпт, как это делает генерация с дополнением извлечённой информацией, — простейший редактор такого типа.
Обновление ROME основано на свойстве линейных слоёв: матрица весов W отображает сохранённые ключи в значения, а новому ключу k* можно назначить новое значение v*, добавив матрицу ранга 1. ROME взвешивает обновление обратной ковариационной матрицей C ключей, которые уже встречаются слою; её оценивают по выборке текста из Wikipedia. Это направляет изменение в сторону от направлений, используемых существующими ключами. В этом примере PyTorch применяется такое обновление к случайному слою, в котором хранятся 5 000 ключей, и сравнивается с обычным обновлением ранга 1 без учёта ковариации:
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%}")Оба обновления точно сопоставляют новый ключ с новым значением; ошибка равна 0.0000. Обычное обновление меняет медианный выход для 5 000 сохранённых ключей на 10.99%, а обновление ROME с учётом ковариации — на 5.02%, поэтому правка меньше затрагивает уже известное слою.
Оценка правок#
Правки оценивают одновременно по нескольким свойствам. Надёжность показывает, выдаёт ли изменённый вход новый ответ; обобщение — работают ли так же перефразированные запросы; локальность, или специфичность, — сохраняют ли несвязанные входы прежние ответы; переносимость — распространяются ли изменения на рассуждения, зависящие от факта. Авторы ROME создали набор данных CounterFact из 21 919 контрфактических правок, чтобы оценивать эти свойства вместе: прежние бенчмарки позволяли методам незаметно жертвовать специфичностью ради обобщения.
Правки часто не проходят более сложные проверки. На 5 000 правок из бенчмарка RippleEdits известным редакторам не удалось последовательно менять факты, логически связанные с редактируемым фактом, а лучший результат показал простой базовый метод редактирования в контексте. Гупта и соавторы обнаружили, что последовательное применение ROME и MEMIT заставляет модель забывать предыдущие правки и связанные с ними навыки: сначала постепенно, а затем резко. Это ограничивает число правок, которые модель способна усвоить.
Редактирование моделей компьютерного зрения#
Тот же механизм ранга 1 работает и с изображениями. Сантуркар и соавторы редактировали классификаторы изображений, переписывая правило, которое слой применяет к визуальному понятию, например сопоставляя представление снега с представлением дороги, чтобы модель распознавала автомобили на заснеженных дорогах, не собирая новые обучающие данные. Ultralytics YOLOE без градиентов изменяет собственную голову детекции при экспорте: классы, заданные с помощью set_classes(), умножаются на финальную свёртку каждой ветви классификации, поэтому экспортированная модель распознаёт новую лексику без обучения и текстового энкодера.
Редактирование моделей и смежные понятия#
- Тонкая настройка: Обновляет множество весов на основе набора данных, меняя поведение модели в целом. Редактирование нацелено на одну пару «вход — выход» и ограничивает изменения всего остального.
- Генерация с дополнением извлечённой информацией (RAG): Передаёт актуальные факты в промпте при каждом запросе и не меняет модель; такой подход легко откатить, и он масштабируется на множество фактов.
- Машинное забывание: Удаляет влияние конкретных обучающих данных. Редактирование заменяет или добавляет факт, а удаление факта при редактировании — один из видов машинного забывания.
- Арифметика задач: Складывает или вычитает изменения весов для целых задач, прошедших тонкую настройку. Редактирование модели работает на уровне отдельного факта.
- Механистическая интерпретируемость: Объясняет, как модель выполняет вычисления. Причинная трассировка ROME пришла из этой области и определяет, какой слой нужно отредактировать.










