Подробные статьи о технологиях, определяющих будущее.

Программирование весов: третий рычаг для LLM

LLM читают и редактируют веса нейросети напрямую. Когда правка весов бьёт fine-tuning и почему этот подход хрупок.

Светящаяся решётка из узлов, одна нить которой аккуратно перепрошивается лучом света.
Ручная правка нейросети: одна нить среди миллиардов, изменённая осознанно, а не под давлением градиента.

Градиентный спуск никогда не был священным. Это были леса: единственный универсальный инструмент, которым мы располагали, чтобы формировать миллиарды чисел, которые никакой человек не способен прочитать, поэтому вокруг него построили всю религию глубокого обучения. Команда из MIT CSAIL только что выбила эти леса из-под него. Они дали frontier-модели сырые веса обученных нейросетей и попросили на обычном естественном языке объяснить их, найти в них баги и переписать. Без цикла обучения, без градиентов и без прямых проходов. И это сработало. Программирование пространства весов, то есть рассуждение о параметрах напрямую вместо того, чтобы подталкивать их вниз по склону, перешло из разряда мысленного эксперимента в разряд демо. По-моему, это тихо понижает fine-tuning из статуса «основного способа адаптировать модели» до одного из трёх вариантов.

Главный результат заслуживает того ажиотажа, который вокруг него поднялся. Попросили Qwen3.5-0.8B стать лучше в математике без каких-либо обновлений градиентов. Модель, GPT-6 Astra, нашла патологическую петлю рассуждений, которая была записана в виде одного направления в двух MLP-слоях, вычла это направление из 0,016% весов и подняла точность на MATH-500 с 7,9% до 48,1%. Те же настройки сэмплинга, всё то же самое. Исправление даже перенеслось на следование инструкциям и утроило IFEval. Это не подкрутка гиперпараметра, это хирургия. Но прежде чем хоронить градиентный спуск, стоит точно разобраться, что именно было продемонстрировано, где это обобщается и где уже ломается.

Что такое программирование пространства весов на самом деле

Годами у нас было ровно два способа изменить поведение модели. Промптинг меняет вход, а веса остаются замороженными. Fine-tuning меняет веса, но делает это вслепую: вы показываете ландшафт функции потерь пачку примеров и позволяете градиентам толкать параметры в любом направлении, которое уменьшает ошибку, почти без контроля над тем, какие внутренние механизмы при этом перестраиваются. Программирование пространства весов предлагает третий рычаг: отбросить функцию потерь целиком и дать системе рассуждений прочитать веса, сформировать гипотезу о том, что они вычисляют, и отредактировать их под спецификацию на естественном языке.

Самое жуткое здесь — результаты чтения. Исследователи обучили четыре крошечные политики с PPO играть в сеточные версии Breakout, Pong, Pac-Man и Freeway. Архитектуры, входные каналы и пространства действий были одинаковыми, так что отличить их друг от друга могли только веса. Astra назвала все четыре игры правильно, не получив список кандидатов. То же самое она проделала с диффузионными моделями, обученными генерировать круги, квадраты и треугольники. А вот сложная версия: по одним только средним слоям, без эмбеддингов и выходных слоёв, со всеми безымянными измерениями, она определила, на каком из трёх посимвольных трансформеров обучали Python, английский или романизированный японский. Попутно она нашла все индукционные головы, то есть схемы копирования, которые позволяют модели повторять ранее встреченный текст, перемножая матрицы весов. Это известный приём из литературы по интерпретируемости, о котором ей никто не рассказывал. Если вы следили за медленной работой над механистической интерпретируемостью, видеть, как универсальная модель делает это нативно, немного головокружительно.

Потом она начала писать веса. Дали контроллер машинки, обученный через PPO и застрявший в локальном минимуме: политика ехала прямо на рампу вместо того, чтобы сначала дать задний ход и набрать скорость. Astra диагностировала сбой по весам и одному записанному эпизоду, и её правка позволила машинке успешно пройти все 1024 эпизода оценки после изменения 3,5% параметров. Когда её попросили написать игровые сети с нуля, без какой-либо обратной связи от среды, она выдала политики, которые обыграли сети, обученные PPO на 100 миллионах шагов. Перечитайте: никакого взаимодействия, никакого сигнала награды, просто описание игры на естественном языке, скомпилированное рассуждениями языковой модели в работающие веса.

Как прямые правки весов работают на реальных моделях

Исправление Qwen — результат, который важен для практиков, потому что 0,8 миллиарда параметров — это настоящая модель, та самая, которую команды реально дообучают и выкатывают в прод. Проблема давно описана: маленькие reasoning-модели впадают в петли, повторяя один и тот же текст, пока не упрутся в лимит токенов, так и не выдав ответа. Model card самого Qwen об этом предупреждает, а в практических прогонах исследователей 85 из первых 96 ответов сгорели целиком в контексте в 32 768 токенов именно так. Диагноз Astra: MLP в слоях 15 и 19 записывали в residual stream направление, которое снова и снова втягивало модель в одну и ту же траекторию генерации. Исправление состояло в том, чтобы вычесть это направление из 64 выходных столбцов в каждом из двух MLP, всего 131 072 весов, или 0,016% модели.

Арифметика почти оскорбительно простая, и в этом весь смысл. Когда вы знаете, какое направление в пространстве активаций соответствует «зацикливаться вечно», его удаление — это проекция: для каждого затронутого вектора весов вычитаете составляющую вдоль плохого направления. Это можно написать в десятке строк.

import numpy as np
def subtract_direction(W, v, columns):
"""Remove the component of each chosen column that lies along v."""
v = v / np.linalg.norm(v)
W[:, columns] -= np.outer(v, v @ W[:, columns])
return W
# The Qwen repair, schematically: for the MLP output projections of
# layers 15 and 19, subtract the "loop" direction from 64 columns each.
# 2 layers x 64 columns x 1024 rows = 131,072 edited weights.
W_down[15] = subtract_direction(W_down[15], loop_dir[15], cols[15])
W_down[19] = subtract_direction(W_down[19], loop_dir[19], cols[19])

Сложная часть никогда не была в вычитании. Она в том, чтобы знать какое направление, в каком слое, среди residual stream шириной в тысячи измерений. Именно это раньше требовало градиентного спуска, потому что градиенты — это процедура поиска по пространству весов, которой вообще не нужно понимание. Astra заменила поиск диагнозом. Это разница между электриком, который перебирает проводки, пока неисправность не уйдёт, и тем, который читает схему и перерезает нужный провод. Та же логика объясняет, почему модель находила индукционные головы, перемножая матрицы весов: она применяла опубликованный метод интерпретируемости, которого ей никогда не показывали. Это намекает на настоящий перенос рассуждений, а не на заученные рецепты.

Одна светящаяся нить аккуратно вытягивается из плотной сотканной ткани из светящихся нитей.
Вычитание одного направления из весов сети: ткань держится, если выбрать правильную нить.

Когда прямая правка весов лучше fine-tuning

Вот моя позиция, и я её отстою: для узких, локализуемых сбоев в небольших и средних моделях прямая правка весов уже лучший инструмент, и тут спорить не о чем. Посмотрите на альтернативу с fine-tuning для бага с зацикливанием. Вы собираете датасет трасс рассуждений без петель, запускаете SFT или RL и надеетесь, что давление лосса уберёт поведение и не испортит всё остальное, что знает модель. Вы сожжёте GPU-часы, карабкаясь к прокси, то есть к большему количеству математических данных, вместо настоящего намерения: «перестань повторяться». Программирование пространства весов позволяет сформулировать намерение. Правка затронула сотую долю процента модели, а fine-tune затрагивает всю модель, и побочный ущерб проявляется позже в виде странных регрессий, которые никто не связывает с тем обучающим запуском.

Fine-tuning карабкается к прокси вашего намерения. Программирование пространства весов позволяет назвать само намерение.

Второй случай — выход из локальных минимумов, которые градиентные методы структурно покинуть не могут. PPO застрял у рампы, потому что обучение с подкреплением исследует пространство, слегка встряхивая текущую политику, и никакое небольшое возмущение «ехать прямо» не найдёт «сначала дать задний ход на две секунды». Рассуждение не встряхивает. Оно может перескочить к качественно другому решению, потому что работает с моделью задачи, а не с возмущением текущего ответа. Миллиард шагов PPO не нашёл того, что нашёл один проход рассуждений. Это не разрыв в эффективности, это разница в категориях.

В-третьих, петля итераций схлопывается. У fine-tuning есть хвост логистики: курация данных, запуски обучения, прогоны оценок, проверки на регрессии. Из-за него «небольшое изменение поведения» превращается в многодневный проект. Любой, кто запускал большую модель на своём железе, знает, что большая часть усилий уходит на инфраструктуру, а не на моделирование. Правка весов ближе к хотфиксу в коде: диагностировали, запатчили, прогнали оценки, откатили, если что-то пошло не так. Когда диагноз верный, весь конвейер обучения пропускается. Явные победы концентрируются в четырёх ситуациях:

  • Сбой диагностирован, но у вас нет обучающих данных, которые выражают исправление
  • Нужна хирургическая точность: поменять одно поведение, не сместив остальное
  • Модель застряла в локальном минимуме, из которого случайное исследование не выбирается
  • Вы не можете позволить себе конвейер обучения ни по GPU, ни по календарному времени

Почему программирование пространства весов хрупко

Теперь холодный душ, и его тут достаточно. Самое полезное наблюдение, которое я видел, есть не в статье, а у практика, который попробовал тот же трюк на небольшой модели natural-language-to-bash и не получил чистого выигрыша. Правка 1920 весов починила ошибки в grep, но сломала другие команды. Это ожидаемый исход, и в нём глубокая проблема: поведения в обученных сетях запутаны между собой. Правка Qwen сработала, потому что поведение зацикливания оказалось в компактном, удаляемом направлении. Многие поведения такими не являются. Они размазаны по суперпозиции, когда одни и те же столбцы несут несколько несвязанных признаков, так что вычесть «направление» — всё равно что убрать одну ноту из аккорда. Вы заденете остальные. Никто пока не умеет заранее предсказать, какие сбои геометрически компактны, а какие размазаны. Пока этого нет, каждая правка весов — ставка.

Демо на чтение тоже стоит поскидывать в цене. Рассуждения Astra о игровых сетях опирались на поверхностную статистику: где концентрируются веса первого слоя, какие выходные логиты разделяются. А определение языка по сути было трёхвариантным выбором, где один вариант, романизированный японский, имеет заметно необычное распределение букв (нет q, l, v и x). Впечатляющее распознавание паттернов? Безусловно. Свидетельство глубокого нативного понимания пространства весов? Менее очевидно. Результат с диффузией работает в обе стороны: Astra рисовала все фигуры контурами, хотя модели на самом деле генерируют закрашенные. Эта ошибка доказывает, что она читала геометрию, а не симулировала сеть, но также показывает, что её «понимание» может быть структурно неверным так, что всё равно проходит тест.

Есть и вопросы масштаба с происхождением. Все чистые результаты лежат в диапазоне от 17 тысяч до 7 миллионов весов, а 0,8 миллиарда Qwen — выброс, и даже эксперимент с чтением средних слоёв потребовал до сотни запусков Python-анализа. Никто не показал, что это работает на модели 70B, не говоря уже о frontier-модели, а наивный подход, вставить веса в контекстное окно, умирает задолго до этого. Над всем висит неудобный вопрос: откуда взялась эта способность? LLM, которые подозрительно хороши в шахматах, обычно оказываются теми, кто проглотил кучу шахматной нотации в обучении. Если Astra целенаправленно обучали на данных о весах, эти результаты говорят меньше о возникающем понимании и больше о очень хорошей программе обучения. Мы этого действительно не знаем.

Наконец, скачок на MATH-500 нужно снабдить оговоркой. Этот бенчмарк годами насыщен обучающими данными, а базовая модель с результатом 7,9% почти наверняка проваливается на зацикливании и форматировании, а не на математических способностях. Значит, правка разблокировала скрытую способность, а не создала навык. Это всё равно ценно, разблокировка — реальный выигрыш. Но это другое утверждение, чем «правка сделала модель лучше в математике», и оно вписывается в знакомый паттерн, где бенчмарки упускают большую часть того, как выглядит реальная работа.

Скальпель и кувалда лежат рядом на верстаке возле обнажённой печатной платы.
Две философии изменения модели: скальпель правок весов и кувалда градиентного обучения.

Правки весов в продакшене: обращаться как с хотфиксами

Если хотите попробовать, и на маленьких моделях стоит, относитесь к правкам весов с той дисциплиной, с какой относитесь к горячему патчу работающей базы данных. Сравнивайте всё: фиксируйте, какие тензоры изменились и насколько, потому что 0,016% достаточно мало, чтобы тихий баг в скрипте правки жил незамеченным вечно. Оценивайте широко, а не только целевое поведение. Исправление Qwen случайно улучшило следование инструкциям, но знак этого побочного эффекта был везением, и в следующий раз он может оказаться отрицательным. Храните базовый чекпоинт как святыню и версионируйте каждую правку как откатываемый патч. И ограничьте амбиции: продемонстрированная зона комфорта — небольшие, хорошо изученные сбои в моделях, которые можно полностью оценить. Если вам хочется починить расплывчатую проблему «ощущения» в модели 70B, «убрав плохое направление», вы скоро на собственном опыте узнаете про суперпозицию.

  • Зафиксируйте базовый чекпоинт и храните правки как диффы, никогда не перезаписывайте на месте
  • Прогоняйте широкие оценки до и после, а не только целевой бенчмарк
  • Предпочитайте сбои с чёткой, воспроизводимой сигнатурой расплывчатым ощущениям
  • Закладывайте откаты: считайте, что часть правок что-то сломает

Моя честная позиция: сегодня это инструмент интерпретируемости и скальпель для отладки, а не конвейер деплоя. Первыми извлекут пользу команды, которые не будут выкатывать правки весов в прод. Это будут те, кто использует frontier-модель, чтобы объяснить, чему научились их маленькие модели, читая чекпоинты так, как мы уже читаем трассы рассуждений, и затем действуют на основе этого знания обычными, скучными и надёжными инструментами.

Градиенты не мертвы, их понизили в должности

Тут и разваливается мой вступительный тезис, и я хочу быть честным. Градиентный спуск делает то, чего программирование пространства весов не может: учится на данных в масштабе. Каждая способность, которую Astra использовала для этих правок, сама была установлена градиентами на огромном обучающем корпусе. Рассуждения могут делать хирургию над тем, что знает сеть, но не могут научить сеть сумме человеческого текста. Реалистичное будущее не в замене градиентов, а в разделении труда. Градиенты заливают бетон, программирование пространства весов делает чистовую отделку. Сорок лет мы относились к обученным весам как к непрозрачному артефакту, чёрному ящику, которым можно управлять только снаружи. Новая идея здесь в том, что ящик становится читаемым, и читает его уже не мы. Успокаивает это или пугает, наверное, зависит от того, насколько вы доверяли градиентам.