Модель отредактировала веса другой модели без обучения. Часть 2: почему петля рвётся, а навык не добавить

—

от автора

Обложка сгенерирована с помощью ИИ

Статья получилась большой, поэтому я разбил её на две части. Это часть 2 из 2. Первая часть — про сами эксперименты MIT, дифф отредактированной Qwen и математику проекции; здесь — динамика петель, пределы метода, родственные работы, устройство весов разных моделей и риски.

Коротко о первой части

  • В посте MIT CSAIL [1] модель GPT-6 Astra правила веса чужих сетей напрямую, без градиентов. Главный пример — Qwen3.5-0.8B, которая на олимпиадных задачах в 93 % случаев уходила в бесконечный повтор.

  • Я побитово сравнил базовый и опубликованный отредактированный чекпойнт: изменены 131 072 веса в down_proj двух слоёв (15 и 19), и правка имеет вид W' = (I - 6vv^\top)W — ранг 1, 99.999 % энергии в одном направлении v.

  • Это не «вычитание» направления, а его разворот: компонента вдоль v становится -5 от исходной. Среди правок, которые так меняют одну ось, это минимальная по норме Фробениуса.

  • Почему это вообще работает: все слои пишут в общий residual stream, а MLP — это сумма столбцов down_proj, взвешенных активациями нейронов. Значит, повернув одну ось на выходе MLP, мы меняем то, что все последующие слои «читают» вдоль неё.

Метки те же: [Статья], [Доказано], [Мой замер], [Модель/интерпретация].


Часть 1. Почему разворот одного направления лечит зацикливание

1.1. От направления к решению «выйти из цикла»

[Модель] На каждом шаге модель выбирает между «продолжить петлю» и «сломать её» (закрыть </think>, написать ответ, сменить мысль). Выбор определяется разностью логитов двух токенов. Логиты — линейная функция финального состояния: \Delta z = u^\top x_L, где u — разность соответствующих строк выходной матрицы. По свойству суммы residual stream (первая часть, 3.1) вклады слоёв 15 и 19 входят в \Delta z слагаемыми, пропорциональными \langle u, v\rangle\cdot v^\top m_l. Если v работает как «продолжай» (\langle u,v\rangle<0), разворот знака у этих нейронов сдвигает \Delta z в сторону выхода на каждом шаге, где они активны. Это допущение: u мы не измеряли, и следующие слои могут частично компенсировать сдвиг.

Если по-простому: где-то в конце модель «голосует», продолжать ли тот же кусок текста. Слои 15 и 19 раньше подбрасывали голос «за». После правки они голосуют «против», и чаша весов чаще перевешивает в сторону выхода.

1.2. Мой замер: на петле эти нейроны правда пишут в v сильнее

[Мой замер] Я прогнал обе модели на CPU на двух текстах. Первый — нормальное решение уравнения (220 токенов). Второй — искусственная петля «Wait, let me check again…» ×12 (397 токенов). Хуком снимал, сколько выход MLP пишет вдоль v (code/demo_probe.py):

среднее \langle v, m_l\rangle

норм. текст, L15

петля, L15

норм. текст, L19

петля, L19

база

0.273

0.385

0.280

0.520

правка

−0.816

−1.518

−0.014

−0.246

Проекция выхода MLP на v по токенам

Проекция выхода MLP на v по токенам

Рис. 1. \langle v, \mathrm{MLP}_l(x_t)\rangle по позициям: база против правки на нормальном и зацикленном тексте.

На петле базовые MLP пишут в v сильнее: в 1.4 раза в слое 15 и в 1.9 раза в слое 19. После правки знак противоположный. Это всего два текста, то есть иллюстрация, а не статистика. Короткая генерация (400 токенов) за отведённое время до ответа не дошла ни у одной модели, поэтому выводов из неё я не делаю.

1.3. Геометрическая модель: (1−p)^T

[Модель] Пусть, попав в петлю, модель на каждом токене выходит из неё с маленькой вероятностью p. Тогда вероятность не выйти за T токенов — это T «неудач» подряд:

\Pr[\text{упереться в лимит}] = (1-p)^T,\qquad \mathbb E[\text{длина петли}] = 1/p .

Подставим цифры статьи (T = 32\,768). 93 % обрывов соответствуют p \approx 2.2\cdot10^{-6}, 33.1 % — p\approx 3.4\cdot10^{-5}. Шанс выхода на токен вырос примерно в 15 раз. Для маленьких p логит и логарифм почти совпадают, так что это сдвиг логита выхода всего на \ln 15 \approx 2.7. Это не измерение, а перевод цифр статьи на язык модели.

Если по-простому: если каждый шаг даёт крошечный шанс вырваться, то при 32 тысячах шагов вероятность так и не вырваться очень чувствительна к этому шансу. Увеличить его в 15 раз — немного в абсолютных числах, но доля «застрявших» ответов падает с 93 % до трети.

Геометрическая модель

Геометрическая модель

Рис. 2. (1-p)^T для T=8192 и 32\,768; горизонтали — 93 %, 33.1 % и 8.5 % из статьи. Аналитическая кривая, не данные.

Константное p — грубое упрощение. Xu и др. [2] показали, что повторы самоусиливаются: чем больше раз фраза уже повторилась, тем вероятнее следующий повтор. Петля становится ловушкой, из которой с каждым шагом выбраться труднее; о той же дегенерации при жадном декодировании писали Holtzman и др. [3]. Я собрал игрушечную марковскую модель с таким самоусилением (code/loop_sim.py). Видно пороговое поведение: небольшой сдвиг логита переводит систему из режима «почти всегда застревает» в режим «почти никогда».

Игрушечная марковская модель

Игрушечная марковская модель

Рис. 3. Монте-Карло игрушечной модели (параметры произвольные, не подогнаны под данные): доля обрывов в зависимости от сдвига логита при разной силе самоусиления β.

[Интерпретация] 93 % против 8.5 %. У Qwen ловушка срабатывает почти всегда, и её ослабление сразу открывает решения, которые модель и так умела довести до конца. Самопроверка Astra это подтверждает: 576 из 579 «спасённых» задач — бывшие обрывы, а точность на ответах, которые и раньше доходили до конца, не изменилась [4]. У Gemma ловушки почти нет, так что сдвигать нечего.


Часть 2. Почему нельзя добавить навык, но можно добавить схему машинке

2.1. Проекция ничего не добавляет

[Доказано] Если правка — проектор P, то новое представление Px вычисляется из старого x. По неравенству обработки данных информации о правильном ответе Y в нём не больше, чем было: I(Y;Px) \le I(Y;x). Размерность тоже не растёт (\operatorname{rank}P=d-1).

Честная оговорка. Строгого запрета это не даёт. Во-первых, правка с \alpha=6 обратима. Во-вторых, вся информация и так есть в промпте, а модели не хватает вычисления, а не информации. Корректная формализация — «usable information» с вычислительными ограничениями [5], и там обработка может делать информацию доступнее. Поэтому сильное утверждение у меня только на уровне модели [Интерпретация]: одна ось с одним масштабом может переключить режим («продолжать» / «выходить»), но не может вписать новый алгоритм, например корректную многозначную арифметику. У Gemma ошибки распределённые, единого узкого места нет, и это сходится с её провалом.

Если по-простому: выключатель может погасить мешающий шум, но не может научить. Qwen умела решать, просто не могла остановиться, и правка убрала помеху. Gemma ошибается в самих вычислениях, а «где выключатель у неумения считать», не существует.

2.2. Машинка: тут правка именно добавляет схему

[Доказано: явная конструкция] У машинки обратная ситуация: нужно добавить в политику кусок, которого не было. Его можно вписать вручную. Простейший «если — то» строится из двух ReLU: при a=(x_{\text{порог}}-x_{\text{колеса}})/\varepsilon

g = \mathrm{ReLU}(a) - \mathrm{ReLU}(a-1) \in [0, 1].

Гейт g равен 0 по одну сторону порога и 1 по другую. Затем к логитам добавляется M\cdot g\cdot(\text{вектор «назад»}) с большим M. Пока гейт открыт, побеждает новая команда, а когда закрыт, работает исходная сеть без изменений. Пять промежуточных tanh-слоёв сигнал гейта переносят: на малых значениях tanh почти тождество, на больших почти знак, и для сигнала «да/нет» годится и то, и другое. По словам авторов, Astra сделала именно отдельный путь через несколько юнитов в каждом слое.

[Моя оценка] Три юнита на слой — это примерно 680 весов на входном слое на юнит, около 256 на каждый внутренний и 16 на выход. Итого ≈ 5 900 весов, или ~3.4 % от 171 664. Это одного порядка с 3.5 % из поста; точный состав правки я не проверял.

Если по-простому: машинке нужно было одно новое правило — «сначала сдай назад, потом газ». Такое правило умещается в пару «если — то» и несколько тысяч чисел, и его можно вписать руками. Многошаговую арифметику так не впишешь: это не одно правило, а большая программа.


Часть 3. Родственники из литературы — коротко

ROME [6] — тоже правка ранга 1, но с противоположной целью. ROME записывает новый факт: ищет минимальное изменение MLP-матрицы, при котором ключ k_\star («Эйфелева башня находится в…») отображается в новое значение v_\star, а остальные ключи страдают минимально. Решение задачи наименьших квадратов с одним ограничением даёт формулу

\hat W = W + \frac{(v_\star - Wk_\star)\,(C^{-1}k_\star)^\top}{(C^{-1}k_\star)^\top k_\star},

где C — ковариация «обычных» ключей. Числитель — «чего не хватает» для нового факта, знаменатель — нормировка, а C^{-1} направляет правку туда, где она меньше всего мешает старым ассоциациям. MEMIT [7] масштабирует то же на тысячи фактов. Обе работы добавляют ассоциации, а не алгоритмы, и это ещё одна иллюстрация к части 2.

Если по-простому: абляция говорит слою «никогда не пиши в эту сторону», ROME — «на этот конкретный вопрос отвечай вот так». Это два зеркальных хирургических приёма над одной и той же матрицей.

Направление отказа [8]. Arditi и др. ортогонализуют все матрицы, пишущие в поток, по формуле W - \hat r\hat r^\top W. Правка Astra из 50 прогонов локальнее (2 матрицы, 64 столбца, \alpha=6). Правка из 10 прогонов ближе к Arditi: 30 матриц, \alpha=1.5.

Task arithmetic и слияние моделей. Вектор задачи \tau=\theta_{\text{ft}}-\theta_{\text{pre}} можно прибавлять и вычитать [9]. Это работает, потому что дообученные модели из одной точки старта лежат в одной «долине» лосса (linear mode connectivity [10]). Развитие этой линии — model soups [11], TIES [12], DARE [13], Git Re-Basin [14]. Отличие от Astra: там правка получена обучением, здесь — рассуждением.

Суперпозиция. В d-мерном пространстве почти ортогональных направлений помещается гораздо больше, чем d: у случайных векторов косинус порядка 1/\sqrt d (рис. 4). Сети этим пользуются и хранят больше признаков, чем измерений [15, 16]. Отсюда практическое следствие: «чистого» направления цикла может не быть, и разворот v слегка задевает сотни соседних признаков. Поэтому важен контроль Astra со случайным направлением той же нормы [4].

Косинусы случайных векторов

Косинусы случайных векторов

Рис. 4. Симуляция: косинусы между 2 000 случайных единичных векторов при d=64, 1024, 4096.


Часть 4. Как вообще устроены веса: Qwen, Gemma, Llama, MoE

Это справочная часть, ради которой полезно один раз посмотреть на реальные числа.

4.1. Где лежат параметры

[Мой замер] Я не стал считать по формулам, а прочитал заголовки safetensors всех шардов через HTTP Range-запросы (code/param_census.py). Это точные формы тензоров без скачивания самих весов. Gemma 3 и Llama у официальных репозиториев закрыты авторизацией, поэтому заголовки взяты из публичных зеркал unsloth/gemma-3-270m, unsloth/Llama-3.2-1B, NousResearch/Meta-Llama-3.1-8B. Конфиги в этих зеркалах соответствуют оригиналам, но побитовую идентичность весов я не проверял.

Модель

всего (хранится)

эмбеддинги/lm_head

внимание

MLP

Gemma 3 270M

0.268B

62.6 %

11.0 %

26.4 %

Qwen2.5-0.5B

0.494B

27.6 %

8.9 %

63.5 %

Qwen3-0.6B

0.752B*

41.4 %*

23.4 %

35.2 %

Qwen3.5-0.8B

0.873B

29.1 %

26.8 % (вкл. линейное)

30.3 % (+13.9 % vision/MTP)

Llama 3.2 1B

1.236B

21.3 %

13.6 %

65.2 %

Qwen3-8B

8.191B

15.2 %

18.4 %

66.4 %

Llama 3.1 8B

8.030B

13.1 %

16.7 %

70.2 %

Mixtral 8x7B

46.7B

0.6 %

2.9 %

96.6 % (эксперты)

Qwen3-30B-A3B

30.5B

2.0 %

3.0 %

95.0 % (эксперты)

DeepSeek-V3

684.5B**

0.4 %

1.7 % (MLA)

97.2 % routed + 0.4 % shared + 0.2 % dense

* В чекпойнте Qwen3-0.6B лежат и embed_tokens, и lm_head, хотя в конфиге tie_word_embeddings: true, поэтому эмбеддинги учтены дважды. ** Включая MTP-модуль. Без него получается 671B, как в техотчёте [17].

Доли параметров

Доли параметров

Рис. 5. Доля хранимых параметров по компонентам, по заголовкам safetensors.

Что видно из таблицы:

  • Gemma 3 270M — это наполовину словарь. 262\,144\times640 = 167.8 М параметров ушли на эмбеддинг, и на 18 слоёв трансформера остаётся около 100 М. Для правки «изнутри» это меньше «вычислительного мяса», а правки эмбеддингов в эксперименте были запрещены. [Интерпретация] Это ещё один довод в пользу того, что у Gemma просто нечего «разблокировать».

  • Qwen3.5-0.8B — гибрид. По layer_types из конфига каждый четвёртый слой — полное внимание (full_attention_interval: 4), остальные — linear_attention. В конфиге также стоят attn_output_gate: true, GQA 8 голов запроса на 2 KV-головы при head_dim 256, словарь 248 320 и tied-эмбеддинги. Блок MLP при этом классический SwiGLU 1024 → 3584 → 1024, поэтому выкладки первой части к нему применимы буквально.

  • Плотные модели среднего размера (Llama 3.1 8B: d=4096, 32 слоя, 32 Q-головы / 8 KV, FFN 14 336). Проверка: внимание на слой 2\cdot4096^2+2\cdot4096\cdot1024=41.9 М, ×32 = 1 342 М; MLP 3\cdot4096\cdot14336=176.2 М, ×32 = 5 637 М. Оба числа точно совпадают с заголовками. Около 70 % весов — в MLP, то есть именно в «ключах и значениях» из первой части (3.2).

4.2. Как MoE меняет картину

В MoE вместо одного MLP стоит набор экспертов E_j и роутер:

\mathrm{MoE}(x)=\sum_{j\in\mathrm{TopK}(Rx)} \pi_j(x)\,E_j(x)=\sum_j\pi_j(x)\sum_i h^{(j)}_i(x)\,w^{(j)}_i .

Разложение 3.2 сохраняется, только коэффициенты теперь ещё и гейтятся роутером. По конфигам:

  • Mixtral: 8 экспертов, top-2 [18];

  • Qwen3-30B-A3B: 128 экспертов, 8 активных, moe_intermediate_size 768;

  • DeepSeek-V3: 256 routed + 1 shared эксперт, 8 активных, первые 3 слоя плотные, MLA-внимание с kv_lora_rank 512 [17].

[Интерпретация] Для «правок в пространстве весов» MoE двояк. С одной стороны, 97 % весов лежат в экспертах, и каждый эксперт видит только часть токенов, так что правка конкретного эксперта локальна по определению. С другой стороны, одно и то же направление в потоке пишут десятки экспертов. Чтобы убрать его из потока, придётся ортогонализовать всех: 256\times 58 матриц down у DeepSeek-V3. Иначе роутер просто направит токен в нетронутого эксперта.

4.3. Как выглядят сами матрицы

Спектры down_proj

Спектры down_proj

Рис. 6. Сингулярные числа down_proj по всем слоям трёх моделей, от светлого к тёмному по глубине.

Эффективный ранг

Эффективный ранг

Рис. 7. Эффективный ранг \exp(H(\sigma^2/\sum\sigma^2)), нормированный на максимальный.

Нормы

Нормы

Рис. 8. Фробениусова норма down_proj по слоям.

[Мой замер] У Qwen3.5-0.8B эффективный ранг down_proj (1024×3584) составляет 690–854 из 1024 и имеет U-образный профиль с минимумом посередине (слои 9–13). У Qwen2.5-0.5B — 638–787 из 896, тоже с минимумом в середине. Матрицы далеки от низкорангового вида: модель использует почти всё пространство. Поэтому изменение ранга 1 на 64 столбцах — действительно точечная операция на фоне «плотной» матрицы: относительная фробениусова норма правки составила 10.6 % и 8.1 % от всей матрицы, но вся она сосредоточена в одном направлении из 1024. Нормы у Qwen3.5 почти постоянны по глубине (15–18). У Gemma они «пилообразные» (14–25), и максимумы приходятся на слои 0, 5, 12: 5 и 11 — слои с полным вниманием, а 0 и 12 — нет. Прямую связь я не утверждаю.

Распределения весов

Распределения весов

Рис. 9. Распределения весов Qwen3.5-0.8B (слой 15 и эмбеддинг), логарифмическая шкала плотности.

Распределения тяжёлохвостые. Эксцесс равен 4.7 у down_proj, 7.7 у gate_proj и 3.4 у эмбеддинга (у гауссианы 3). Максимум |w| в down_proj слоя 15 составляет 0.18 при σ = 0.0086, то есть около 21σ. Для правок это означает, что «посмотреть на большие веса» — плохая эвристика, и Astra её не использовала: отбор шёл по проекции на v, а не по величине (см. первую часть).


Часть 5. Ограничения, риски, открытые вопросы

Ограничения постановки. Это блог-пост, а не рецензированная статья. Модель Astra закрыта, и воспроизвести процесс поиска правки снаружи нельзя. Воспроизводима только сама правка, и её независимо перепроверили [19]. Три бюджета прогонов дали три разные правки с очень разным эффектом (12.3 / 14.1 / 48.1). Вывод: один удачный запуск — это ещё не надёжный метод. Авторы сами пишут, что строят бенчмарк и harness.

Модель, правящая себя. Авторы прямо называют рекурсивное самоулучшение одним из направлений. С формальной точки зрения правка весов — это действие с последствиями для всех будущих входов (см. 4.2: она не зависит от промпта). В отличие от промпта, её нельзя «откатить контекстом». Значит, нужен по крайней мере тот же уровень контроля, что и для обучения: фиксированные eval-сеты, контроль регрессий, ревью диффа.

Аудируемость. Есть и хорошая новость: правка ранга 1 читается лучше любого файнтюна. Диф из двух тензоров, SVD показывает одно направление, а манифест содержит sha256 до и после. Хорошо, что авторы сделали публикацию побитового диффа нормой. [Интерпретация] Плохая новость: правку той же нормы, но «размазанную» на много направлений, найти по весам существенно труднее. Аргумент суперпозиции (7.4) работает и против аудитора.

Цепочка поставок весов. Чекпойнт — это исполняемая логика, а не данные. Подмена 0.016 % весов может заметно поменять поведение, и метрики на стандартных бенчмарках эту подмену могут не выявить: на практике это сводится к контролю происхождения (хэши, подписи, воспроизводимые сборки). Обратная сторона статьи — тезис авторов, что LLM, читающая веса, могла бы искать такие вмешательства («auditing without evaluation»). В посте это заявлено как перспектива, а не результат: в эксперименте 7 по одним только весам сикофантскую модель отличить не удалось, удалось только с паттернами внимания.

Открытые вопросы (вам, читателям):

  1. Почему \alpha\approx6, а не 1? Абляция (\alpha=1) не хватает, потому что остальные слои тоже пишут в v? Или нужен активный сигнал «выходи из цикла»? Это проверяется дёшево: сравнить \alpha\in\{1,2,4,6\} на 100 задачах с лимитом токенов.

  2. Можно ли найти то же направление без LLM, классическим diff-in-means между «зацикленными» и «продуктивными» контекстами, как у Arditi и др.? Если да, то что именно добавляет «рассуждение» Astra?

  3. Где граница между «снять препятствие» и «добавить навык»? Машинка показывает, что вписать вручную можно то, что описывается коротко. Есть ли для LLM навыки с короткой схемой, которых у модели нет?

  4. Как такие правки ведут себя при квантизации? В bf16 уже 884 из 131 072 изменений округлились в ноль. Что останется в int4?


Код и воспроизведение

Все скрипты лежат в code/ и работают на CPU (8 ядер, 15 ГБ RAM):

  • analyze_edit.py — дифф базовой и отредактированной Qwen3.5-0.8B, SVD правки, подгонка \alpha;

  • param_census.py — подсчёт параметров по заголовкам safetensors;

  • charts.py — рисунки первой части и рис. 2, 4–9 этой части (спектры, нормы, гистограммы, аналитическая кривая, симуляция косинусов);

  • demo_probe.py — зонд \langle v, m_l\rangle (рис. 1) и короткая генерация;

  • loop_sim.py — игрушечная марковская модель (рис. 3).

Ключевая часть зонда:

for L in (15, 19):    lm.layers[L].mlp.register_forward_hook(        lambda mod, i, o, L=L: rec.__setitem__(L, (o[0] @ v[L]).detach()))with torch.no_grad():    model(tok(text, return_tensors='pt').input_ids)

Источники

  1. Takehi R., Teoh J., Zhang A., Khattab O. Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights. MIT CSAIL, 2 Nov 2026. https://rikiyat.github.io/blog/weight-space-programming/

  2. Xu J. et al. Learning to Break the Loop: Analyzing and Mitigating Repetitions for Neural Text Generation. https://arxiv.org/abs/2206.02369

  3. Holtzman A. et al. The Curious Case of Neural Text Degeneration. https://arxiv.org/abs/1904.09751

  4. Логи экспериментов: https://github.com/RikiyaT/lm_understand-logs (каталог exp8_math/)

  5. Xu Y. et al. A Theory of Usable Information Under Computational Constraints. https://arxiv.org/abs/2002.10689

  6. Meng K. et al. Locating and Editing Factual Associations in GPT (ROME). https://arxiv.org/abs/2202.05262

  7. Meng K. et al. Mass-Editing Memory in a Transformer (MEMIT). https://arxiv.org/abs/2210.07229

  8. Arditi A. et al. Refusal in Language Models Is Mediated by a Single Direction. https://arxiv.org/abs/2406.11717

  9. Ilharco G. et al. Editing Models with Task Arithmetic. https://arxiv.org/abs/2212.04089

  10. Frankle J. et al. Linear Mode Connectivity and the Lottery Ticket Hypothesis. https://arxiv.org/abs/1912.05671

  11. Wortsman M. et al. Model soups. https://arxiv.org/abs/2203.05482

  12. Yadav P. et al. TIES-Merging: Resolving Interference When Merging Models. https://arxiv.org/abs/2306.01708

  13. Yu L. et al. Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch (DARE). https://arxiv.org/abs/2311.03099

  14. Ainsworth S. et al. Git Re-Basin: Merging Models modulo Permutation Symmetries. https://arxiv.org/abs/2209.04836

  15. Elhage N. et al. Toy Models of Superposition. https://arxiv.org/abs/2209.10652

  16. Cunningham H. et al. Sparse Autoencoders Find Highly Interpretable Features in Language Models. https://arxiv.org/abs/2309.08600

  17. DeepSeek-AI. DeepSeek-V3 Technical Report. https://arxiv.org/abs/2412.19437

  18. Jiang A. Q. et al. Mixtral of Experts. https://arxiv.org/abs/2401.04088

  19. Отредактированный чекпойнт и независимая перепроверка: https://huggingface.co/RikiyaT/Qwen3.5-0.8B-weight-space-programming

ссылка на оригинал статьи https://habr.com/ru/articles/1103804/