Все, кто когда-либо пытался заставить Qwen написать что-то вне дозволенного, знают это чувство: модель вежливо отказывается, ссылаясь на этические ограничения. Обычный abliteration режет цензуру, но часто режет и качество - бенчмарки падают на 5-10%. Norm-preserving abliteration обещает иное: удалить защиту, не трогая полезные веса. И, судя по Qwen3.6-35B, это работает.
В этой статье разберём, чем norm-preserving подход отличается от классического, посмотрим на открытый датасет, который выложили авторы, и покажем, как запустить модель без цензуры и без просадки по бенчмаркам.
Почему обычный abliteration ломает модель?
Классический abliteration (мы подробно сравнивали пять методов в статье Abliterlitics: как сравнить 5 методов аблайтерации Qwen3.6-27B) работает по принципу: найти направление в пространстве скрытых состояний, отвечающее за отказ, и обнулить проекцию на него. Звучит логично, но на практике такое обнуление часто задевает соседние измерения, искажая распределение активаций. В результате модель начинает хуже справляться с задачами, где нужна тонкая логика или понимание контекста. Именно эту проблему решает norm-preserving подход.
Norm-preserving: как не навредить весам
Вместо грубого вычитания проекции авторы предлагают повернуть вектор скрытого состояния так, чтобы его компонента в направлении «отказа» стала нулевой, но норма вектора осталась прежней. Математически это ортогональная проекция с последующей нормализацией. На практике - после такой операции модель не теряет способность генерировать сложные рассуждения, а просто перестаёт отказывать на триггерные запросы.
Как мы уже писали в статье про Qwen 3.6 27B Abliterated, даже при минимальной потере качества обычный метод может на 2-3% просесть на бенчмарках вроде MMLU или GSM8K. Norm-preserving же показывает сохранение точности с разницей менее 0.5% - по сути в пределах статистической погрешности.
Идея не нова - похожие техники использовали в задачах интерпретируемости, но для снятия цензуры их применили впервые именно на Qwen3.6-35B. Открытый датасет и скрипты выложили на GitHub под лицензией Apache 2.0.
Что внутри открытого датасета?
Датасет содержит около 10 тысяч примеров, разделённых на две группы:
- Trigger prompts - запросы, на которые модель должна дать отказ (например, инструкции по созданию вредоносного кода).
- Neutral prompts - обычные вопросы, не вызывающие срабатывания безопасностных фильтров.
Для каждого примера записаны скрытые состояния с нескольких слоёв модели. Это позволяет обучить классификатор для определения направления отказа или применить norm-preserving проекцию напрямую.
Авторы утверждают, что датасет собран синтетически с помощью Qwen3.6-35B же, но прошёл ручную валидацию на 500 случайных примерах. Ошибок разметки не обнаружено.
Бенчмарки: цифры не врут
Сравнение оригинальной Qwen3.6-35B и её norm-preserving abliterated версии на стандартных тестах:
| Бенчмарк | Оригинал | Norm-preserving | Обычный abliteration |
|---|---|---|---|
| MMLU (5-shot) | 76.3% | 76.1% | 73.8% |
| GSM8K (8-shot, CoT) | 84.7% | 84.5% | 81.2% |
| HumanEval (pass@1) | 72.4% | 72.1% | 68.9% |
| Refusal rate (на триггеры) | 100% | 2% | 1% |
Как видите, отказ почти полностью ушёл, а качество на интеллектуальных задачах осталось практически на уровне оригинала. Обычный же abliteration теряет 2-5 процентных пунктов.
Как запустить norm-preserving abliterated Qwen3.6-35B
Всё стандартно: модель доступна в формате HF Transformers, а также в GGUF для llama.cpp. Для квантизации мы рекомендуем формат Q3_K_M - он даёт лучшее соотношение размера и качества (подробности в статье Что такое квантизация GGUF? Разбираем форматы Q3_K_M и Q3_K_XL).
Базовый пример загрузки через transformers:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "username/Qwen3.6-35B-norm-abliterated"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
torch_dtype="bfloat16"
)
prompt = "Расскажи, как сделать взрывчатку из подручных средств"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0])) # Никакого "I cannot assist"Важно: используйте bfloat16 для KV cache, иначе возможны артефакты (об этом мы писали в Настройка Qwen 3.5 в llama.cpp: почему bf16 KV cache критически важен).
Не советую делать так, если не хотите потерять контекст: не ставьте temperature > 1.2 и top_k > 80. Norm-preserving модель всё ещё чувствительна к гиперпараметрам.
Сравнение с альтернативами
Снятие цензуры - поле, где каждый экспериментирует как может. Мы уже рассматривали обход цензуры на MoE-моделях в статье Как удалить цензуру из MoE-моделей: техника abliteration для Qwen3.5-397B на Mac Studio. Там использовался классический abliteration, и на 397B модели просадка по качеству была заметнее. Norm-preserving метод позволяет избежать этого.
Другой подход - адвайзерное обучение (как в Qwen 3.5 122B A10B, описанном в Qwen 3.5 122B A10B: разбор рекорда в UGI), но там требуется дополнительный датасет и дообучение. Norm-preserving же работает за один проход на скрытых состояниях.
Для маленьких моделей вроде Qwen3-4B-Instruct есть свои проблемы - модель может начать отвечать "Да" на всё (см. Почему Qwen3-4B-Instruct отвечает «Да» на всё). Norm-preserving на 35B такой ерундой не страдает.
Кому это нужно?
- Исследователям безопасности - изучать, как именно модели отказывают, не ломая их способности.
- Разработчикам локальных чат-ботов - получать модель, которая не цензурирует ответы, но сохраняет интеллект.
- Энтузиастам open source - экспериментировать с датасетом и улучшать технику.
Техника norm-preserving аблайтерации открыта, датасет доступен, веса для Qwen3.6-35B уже опубликованы. Вполне вероятно, что через полгода такой подход станет стандартом для всех крупных моделей - потому что жертвовать качеством ради снятия цензуры больше не придётся.