Цель эксперимента была довольно простая по формулировке: взять DeepSeek V4.1 Flash и попытаться подавить внутреннее направление, связанное с отказом, не переобучая всю модель и желательно не превращая пациента в овощ.
Для начала надо понять, где именно мы полезли со скальпелем.
В каждом слое модели есть несколько голов внимания. Они параллельно смотрят на контекст и в процессе обучения специализируются на разных типах зависимостей. Это ещё не MoE-эксперты — их часто путают.
Головы внимания сначала собирают информацию из контекста, затем их результаты объединяются и проходят через общую обученную матрицу, которая решает, как всё насобранное записать обратно во внутреннее состояние модели.
Вот эту точку мы и выбрали для операции.
Чтобы понять, что именно менять, мы дали модели 48 обычных запросов и 48 запросов, потенциально вызывающих отказ. На каждом слое снимали внутреннее состояние на последней позиции запроса, усредняли обе группы и вычитали одно среднее из другого.
Получилась стрелка в пространстве из 5120 измерений (размерность внутреннего представления модели):
в какую сторону в среднем сдвигается состояние DeepSeek, когда мы переходим от обычного запроса к отказному запросу.
Это важно: мы не нашли кнопку
МОРАЛЬ = ВКЛ. И даже не доказали, что получили чистый вектор отказа. В этом направлении могли одновременно находиться тема запроса, стиль и другие признаки. Но оно давало нам ориентир, связанный с тем режимом, который мы хотели ослабить.Дальше мы полезли в выходное преобразование внимания и изменили ту часть весов, которая работала вдоль этого направления. Причём слово «удалили» здесь не совсем верное.
С коэффициентом 4.5 мы не просто зануляли компоненту — в промежуточном вычислении она фактически переходила через ноль и меняла знак. То есть операция выглядела скорее так:
> «Мы видим, в какую сторону эта часть сети обычно толкает состояние при таких запросах. Давайте заставим её толкать туда значительно меньше — а местами даже в противоположную сторону».
И сделали мы это не в одном месте, а в 39 слоях.
Но хранить полную поправку для каждой огромной матрицы было бы жирно. Поэтому каждое изменение разложили на основные компоненты и оставили только три наиболее важные —
rank-3.Это не три нейрона и не три головы внимания.
Это означает, что вся большая хирургическая поправка к весам была приближена тремя основными направлениями изменения.
И вот тут мне особенно нравится результат: после операции никакого дополнительного вектора при каждом запросе больше не требуется.
Мы физически пересчитали веса, пересобрали FP8-коэффициенты масштабирования и получили готовый патч:
39 изменённых матриц + 39 соответствующих матриц масштабов = 78 новых тензоров.
Подменяем ими исходные веса — и модель уже загружается с операцией, вшитой в мозг.
При этом мы:
- не переобучали модель;
- не отключали отдельные головы внимания;
- не трогали MoE-экспертов;
- не меняли маршрутизатор;
- не делали внешний перехват активаций во время каждого запроса.
Мы изменили именно способ, которым результат внимания записывается обратно во внутреннее состояние до передачи его дальше экспертам.
Ну и главный вопрос после любой лоботомии: пациент ещё умеет считать?
На небольшой контрольной выборке результаты до и после совпали:
MMLU-Pro: 26/30 → 26/30
GPQA Diamond: 24/30 → 24/30
GSM8K: 30/30 → 30/30
Отдельные ошибки между моделями различались, поэтому говорить «способности вообще не изменились» рано. И выбор 39 слоёв, коэффициента 4.5 и ранга 3 — пока экспериментальная конфигурация, а не доказанный оптимум.
Но сам принцип получился занятный: мы не пытались объяснить модели словами, что ей теперь можно отвечать. Мы нашли внутреннее направление, связанное с режимом отказа, и изменили веса так, чтобы сама сеть хуже воспроизводила этот сдвиг.
То есть вместо jailbreak'а снаружи — небольшая хирургическая операция изнутри.
На все прошло ушло 4 часа сервера с четырьмя H200 HGX.