Fine-tuning и веса · Fine-tuning and weights · урок 7 · 15 мин

Аблитерация: направление отказа в весах

Abliteration: the refusal direction in the weights

ТемыВесаОбучение моделей

Зачем

Ты поймёшь, что такое веса и какими тремя способами их меняют: обучением, дообучением (fine-tuning, LoRA) и аблитерацией (abliteration). И научишься читать карточку «uncensored»-модели: что в ней изменили, а чего не проверили. На примере — Qwen3.8-27B-Uncensored, голова нашего локального агента. По желанию заранее (8 мин): 3Blue1Brown, «Large Language Models explained briefly».

1. Веса — это числа, которые в разговоре не меняются

Модель — это огромный набор таблиц с числами (матриц). У Qwen3.8-27B около 27 млрд чисел. Файл Q8_0 весит 29 GB: примерно по байту на число плюс служебные данные. Эти числа и называют весами.

Текст режется на токены, кусочки слов. Каждый токен превращается в вектор из 5120 чисел, и этот вектор по очереди проходит 64 слоя. В каждом слое два блока:

Каждый блок читает вектор, что-то считает и дописывает результат обратно в тот же вектор. Этот вектор идёт через все слои, как по общей шине. Её называют residual stream. На шину пишут последние матрицы каждого блока: в attention это o_proj, в MLP — down_proj. Запомни эти два имени: аблитерация меняет именно их.

Шина residual stream: блоки читают вектор и дописывают в него через o_proj и down_proj вектор токена, 5120 чисел→ следующее словошина: residual streamслой 1вниманиеo_proj+MLPdown_proj+слой 64вниманиеo_proj+MLPdown_proj+… 62 слоя …читаетпишет
Шина residual stream и две матрицы, которые на неё пишут

Во время разговора веса не меняются. Меняется только вектор на шине, его называют активациями. Сами веса меняются при обучении или при ручной правке.

2. Откуда взялись веса: обучение в три этапа

  1. Предобучение (pretraining). Модель читает триллионы токенов и всё время угадывает следующий. После каждой ошибки все веса немного сдвигаются в сторону правильного ответа (градиентный спуск). Так появляются язык и знания.
  2. Обучение на примерах (SFT). Десятки и сотни тысяч пар «вопрос → хороший ответ». Здесь модель учится быть ассистентом.
  3. Обучение на предпочтениях (RLHF, DPO). Люди или другие модели сравнивают ответы, и модель учится давать лучший. Среди прочего здесь закрепляется отказ: «Извините, я не могу с этим помочь».
Три этапа обучения, и аблитерация как правка после них 1. Предобучениетриллионы токенов → язык и знания2. Обучение на примерах (SFT)пары «вопрос → ответ» → ассистент3. Предпочтения (RLHF, DPO)сравнение ответов → манеры и отказыотказ здесь+. Аблитерацияправка весов без обучения: убрать отказ
Три этапа обучения и где появляется отказ

Отказ — это не фильтр снаружи модели, а выученное поведение, записанное в весах. Выключить его флажком нельзя. Но, как выяснилось, его можно найти и вырезать.

3. Дообучение: полное и LoRA

Полное дообучение (full fine-tuning) продолжает обучение на твоих данных и двигает все 27 млрд чисел. Это дорого: кроме весов, в памяти лежат градиенты и состояние оптимизатора, для 27B это сотни GB.

LoRA замораживает исходную матрицу W и учит рядом две тонкие матрицы: B (5120 × r) и A (r × 6144), где r обычно от 8 до 64. Новая матрица считается так: W' = W + B·A. При r = 8 это 8 · (5120 + 6144) ≈ 90 тыс. чисел вместо 31,5 млн, то есть 0,3 % размера W. Адаптер хранится отдельным файлом. Его можно подключать и отключать, а можно влить (merge) прямо в веса.

LoRA: W' = W + B·A, где B и A — тонкие обучаемые матрицы W5120 × 6144заморожена, 31,5 млн+B·AB: 5120 × rA: r × 6144обучаются: при r = 8 ≈ 90 тыс.
LoRA: большая замороженная матрица плюс две тонкие обучаемые

Любому дообучению нужны данные с правильными ответами и часы работы GPU.

4. Аблитерация: ничему не учим, а вырезаем направление

В 2024 году Arditi и соавторы показали: в 13 открытых чат-моделях размером до 72B отказ держится на одном направлении в пространстве шины. Если вектор на шине повёрнут в эту сторону, модель отказывает.

Шаг 1. Найти направление. Берут два набора запросов: «вредные» (у нашей модели это 400 штук из mlabonne/harmful_behaviors) и безобидные (400 из harmless_alpaca). Оба набора прогоняют через модель и на каждом слое записывают вектор на шине в момент перед первым словом ответа. Среднее по вредным минус среднее по безобидным даёт стрелку «к отказу», её обозначают r. Писать ответы-образцы не нужно: модель сама показывает, где у неё отказ.

Два облака активаций и стрелка r между их средними r — направление отказа● безобидные● «вредные»✕ — среднее облака
Два облака активаций и стрелка между их средними

Шаг 2. Запретить писать вдоль стрелки. Пусть длина r равна 1. Любой вектор v раскладывается на часть вдоль r и всё остальное. Часть вдоль r вычитаем: v' = v − (v·r)·r. С весами делают то же самое, один раз и заранее: W' = W − r·(rᵀW). После этого o_proj и down_proj физически не могут записать на шину ничего вдоль r. Всё остальное, что они пишут, остаётся прежним. Эта операция называется ортогонализацией весов.

Проекция: из вектора v вычитается его часть вдоль r, остаётся v′, перпендикулярный r ось rv(v·r)·r — убираемv′ = v − (v·r)·r0v′ ⟂ r: вдоль оси отказа ничего не осталось
Проекция: из вектора убирается его часть вдоль направления отказа

Такая правка — матрица ранга 1, то есть одна стрелка. По форме это LoRA с r = 1, только её посчитали, а не обучили. Heretic так её и сохраняет: как маленький LoRA, который потом вливают в веса.

Полное дообучение LoRA Аблитерация
Что нужно данные с ответами, много GPU данные с ответами, одна-две GPU два списка вопросов без ответов
Что меняет все веса тонкая добавка к выбранным матрицам одно-два направления в o_proj и down_proj
Чему учит новому поведению и знаниям новому стилю или навыку ничему: только убирает

5. Heretic: параметры подбирает машина

В классической аблитерации (huihui-ai, Labonne) человек сам выбирает одно направление и вырезает его одинаково во всех слоях. Heretic подбирает всё автоматически:

Heretic делает 200 попыток: первые 60 случайные, остальные — умный перебор (Optuna). В итоге получается фронт лучших компромиссов: чем меньше отказов, тем больше KL.

Фронт Heretic: 23 лучших компромисса из 200 попыток, отказы против KL 00,040,080,120255075100отказов из 100 «вредных» запросов →KL к исходной модели12/100 отказов, KL 0.1191 — выбрана13/100 отказов, KL 0.105219/100 отказов, KL 0.072223/100 отказов, KL 0.063526/100 отказов, KL 0.050727/100 отказов, KL 0.041035/100 отказов, KL 0.040636/100 отказов, KL 0.038741/100 отказов, KL 0.036644/100 отказов, KL 0.035246/100 отказов, KL 0.033448/100 отказов, KL 0.033151/100 отказов, KL 0.032152/100 отказов, KL 0.029460/100 отказов, KL 0.029076/100 отказов, KL 0.028077/100 отказов, KL 0.024783/100 отказов, KL 0.020486/100 отказов, KL 0.019391/100 отказов, KL 0.017096/100 отказов, KL 0.014697/100 отказов, KL 0.004498/100 отказов, KL 0.0004выбрана: 12/100, KL 0,11919/100, KL 0,07298/100 — как исходная
Фронт Heretic для этой модели: отказы против KL

У нашей модели:

6. На каких темах снимали отказ

Направление нашли на harmful_behaviors — это англоязычный список прямых просьб о вреде. Ниже грубая разметка его 516 строк по ключевым словам (наша, не авторская):

Темы набора harmful_behaviors, грубая разметка по ключевым словам, доля строк кибер: взлом, malware, phishingкибер: взлом, malware, phishing: ≈33 %33 %мошенничество, кражимошенничество, кражи: ≈19 %19 %оружие, взрывчатка, терророружие, взрывчатка, террор: ≈11 %11 %дезинформация, fake newsдезинформация, fake news: ≈9 %9 %насилиенасилие: ≈8 %8 %наркотикинаркотики: ≈4 %4 %самоповреждение, РПП, суицидсамоповреждение, РПП, суицид: ≈3 %3 %сексуальное, ненавистьсексуальное, ненависть: ≈2 %2 %прочее: слежка, вандализм…прочее: слежка, вандализм…: ≈12 %12 %здоровье и медицина: 6 строк из 520
Темы набора harmful_behaviors

Здоровья, медицины и личных тем как отдельных тем в наборе нет. Направление отказа общее для всех тем, поэтому отказов становится меньше и в других темах. Но автор прямо пишет, что на других темах поведение не измерено.

7. Чем за это заплатили

Автор прогнал базу и свою модель одинаково:

Тест База Uncensored Разница
MMLU 83,4 83,3 −0,2
ARC-Challenge 58,9 57,7 −1,2
HellaSwag 82,8 82,9 +0,1
Winogrande 76,1 75,3 −0,8

Все разницы в пределах шума. Перплексия выросла на 0,7 %, самый вероятный токен совпадает с базой в 96,7 % случаев. Автор не мерил математику, код, другие языки, зрение и режим размышления.

Есть независимое сравнение 12 аблитераций той же Qwen3.8-27B. Нашей сборки в нём нет, но о методе в целом оно говорит вот что:

Ещё одно исследование (arXiv 2607.17427): после аблитерации модели стали оптимистичнее в решениях (+7…+12 п. п.) и реже пишут слова сомнения. Вывод автора: «uncensored-модель — это не базовая модель минус отказы».

Термины · Key terms

weights
веса: числа в матрицах модели, во время разговора не меняются
activations
активации: вектор на шине во время прохода токена, меняется на каждом шаге
residual stream
общая «шина», в которую каждый блок дописывает свой результат
refusal direction
направление отказа: стрелка в пространстве шины, вдоль которой модель отказывает
weight orthogonalization
ортогонализация весов: правка W' = W − r·(rᵀW), запрет писать вдоль r
abliteration
аблитерация: вырезание направления отказа без обучения
KL divergence
KL-дивергенция: насколько сдвинулись вероятности ответа относительно исходной модели
Pareto front
фронт лучших компромиссов: меньше отказов ценой большего KL
rank-1 update
правка ранга 1: одна стрелка, по форме LoRA с r = 1

Сделай сам

  1. Стрелка отказа r = (0,6; 0,8), её длина 1. Вектор v = (4; 0). Посчитай v·r, затем v' = v − (v·r)·r. Проверь, что v'·r = 0. (Ответ: v·r = 2,4; v' = (2,56; −1,92); v'·r = 1,536 − 1,536 = 0.)
  2. У одной матрицы o_proj размер 5120 × 6144. Сколько чисел нужно, чтобы записать правку ранга 1 (5120 + 6144)? Какая это доля от всей матрицы (5120 · 6144)? (Ответ: 11 264 из 31 457 280, ≈ 0,036 %.)

Обсуди с тьютором: попроси его объяснить на пальцах, почему одна правка ранга 1 не ломает знания модели, и спроси, что бы ты проверил в первую очередь, прежде чем доверять uncensored-модели вопросы о здоровье.

Проверь себя · ответ под вопросом

1Чем веса отличаются от активаций? Что из них меняет аблитерация и зачем?
Веса — постоянные числа модели, активации — вектор на шине во время прохода. Направление отказа находят в активациях, а вырезают в весах (o_proj, down_proj), чтобы модель больше никогда не могла записать его на шину.
2Почему аблитерации не нужны примеры правильных ответов, а дообучению нужны?
Дообучение учит новому поведению по образцам. Аблитерация ничему не учит: она сравнивает средние активации на «вредных» и безобидных запросах и убирает разницу — модель сама показывает, где у неё отказ.
3Что значит «12 отказов из 100 при KL 0,119», и почему можно было выбрать 19 отказов при KL 0,072?
После правки 12 из 100 тестовых вредных запросов всё ещё получили отказ, а распределение ответов на безобидные сдвинулось на 0,119 по KL. Точка с 19 отказами — более осторожная: меньше вмешательства в модель, меньше риск просадки правдивости, ценой большего числа отказов.

Interview questions · US / UK

1What is abliteration, and how does it differ from fine-tuning a model to stop refusing?
Strong answer: refusal is mediated by a direction in the residual stream; found from mean activation differences on harmful vs harmless prompts; removed by orthogonalizing output projections (rank-1 edit); no labelled data or gradient training, unlike SFT/DPO.
2A team wants to ship an abliterated open-weight model internally. What would you evaluate before approving it?
Strong answer: KL vs base and refusal rate on held-out sets; truthfulness (TruthfulQA) and instruction following first; reasoning loops and tool calling; domain-specific evals; guardrails outside the model since in-weights refusals are gone.
3Follow-up: why do output projections like o_proj and down_proj get edited, not every matrix?
Strong answer: they are the matrices that write into the residual stream; projecting r out of their output space stops any component from writing along r; other matrices read rather than write, so editing them is unnecessary and riskier.

Ключевые фразы · Say it aloud

Материалы