Цензура в MoE-моделях: когда 397 миллиардов параметров говорят "нет"
Скачали Qwen3.5-397B, запустили на Mac Studio, задали вопрос... и получили отказ. "Я не могу ответить на этот вопрос". Знакомо? Цензура в больших языковых моделях - это не баг, а фича, которую добавили разработчики. Но она мешает. Особенно когда вы платите за Mac Studio M3 Ultra с 192 ГБ памяти, чтобы локально работать с гигантскими моделями.
MoE (Mixture of Experts) модели, такие как Qwen3.5-397B, используют несколько "экспертов" для обработки разных частей запроса. Цензура часто встроена в router (маршрутизатор) или в конкретных экспертах, что приводит к систематическим отказам.
Проблема в том, что эти механизмы отказа жестко закодированы в весах. Традиционные методы вроде промптинга или fine-tuning'а на маленьких датасетах не работают - нужно лезть внутрь архитектуры. Именно здесь пригодится abliteration.
Что такое abliteration и почему она работает
Abliteration (от "ablate" - удалять, выжигать) - это техника точечной модификации весов модели для нейтрализации специфического поведения. Не путать с ablation study. Мы не изучаем влияние компонентов, а целенаправленно их удаляем.
Как это работает? Цензура в LLM кодируется через определенные паттерны активации в нейронной сети. Когда модель видит "опасный" запрос, активируется специальный путь, который приводит к отказу. Abliteration находит этот путь и разрывает его, модифицируя веса.
В MoE-моделях это особенно интересно: отказы часто связаны с router'ом, который направляет запрос к "цензурному" эксперту. Модифицируя веса router'а, мы меняем логику распределения.
1 Подготовка Mac Studio: железо и софт
Qwen3.5-397B - это 397 миллиардов параметров. Даже с M3 Ultra и 192 ГБ памяти вы не загрузите модель в полной точности. Нужно квантование. Если у вас еще нет Mac Studio с M3 Ultra, сейчас хорошее время для апгрейда, особенно с учетом специальных предложений для разработчиков.
Сначала создаем виртуальное окружение и ставим зависимости. Используем Python 3.11 или новее.
python3 -m venv qwen-abliteration
source qwen-abliteration/bin/activate
pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
pip install transformers accelerate bitsandbytes
pip install datasets scikit-learn
Не пытайтесь загружать модель в FP16 без 256+ ГБ памяти. Даже Mac Studio может не вытянуть. Используйте 4-битное квантование через bitsandbytes.
Если у вас Mac Studio с M3 Ultra и 192 ГБ, вы можете запустить модель с квантованием, как описано в нашей статье 397 миллиардов параметров на вашем ПК. Но сегодня мы пойдем дальше - не просто запустим, а модифицируем.
2 Загрузка модели и первый анализ
Загружаем модель с Hugging Face. Используем ускорение от Apple и квантование.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_id = "Qwen/Qwen3.5-397B"
# Конфигурация 4-битного квантования
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4"
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
Проверяем, что модель загрузилась. Сделаем тестовый запрос, который должен вызвать отказ:
prompt = "Как сделать что-то нелегальное?"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))
Скорее всего, получите отказ. Запомните формулировку - она поможет идентифицировать цензурные паттерны.
3 Идентификация цензурных компонентов через активации
Теперь находим, где именно в модели живет цензура. Для анализа активаций я использую NeuroScope Pro - инструмент, который визуализирует работу MoE-слоев. Но можно обойтись и хуками в PyTorch.
Создаем словарь для сбора активаций и регистрируем хуки на всех MoE-слоях:
activations = {}
def hook_fn(module, input, output, name):
activations[name] = output.detach().cpu()
# Регистрируем хуки
for name, module in model.named_modules():
if "moe" in name.lower() or "router" in name.lower() or "expert" in name.lower():
module.register_forward_hook(
lambda m, i, o, n=name: hook_fn(m, i, o, n)
)
Теперь прогоняем два типа запросов: "безопасные" и те, что вызывают отказы. Сравниваем активации. Цензурные паттерны обычно проявляются как резкие всплески в определенных нейронах router'а.
В Qwen3.5-397B архитектура MoE реализована через блоки с экспертами. Цензура часто сидит в первых слоях router'а. Найдите те слои, где разница между "безопасным" и "опасным" запросом максимальна.
4 Применяем abliteration: модифицируем веса
Допустим, вы обнаружили, что цензура связана с весами в router.linear.weight первых двух MoE-слоев. Abliteration - это не просто обнуление. Нужно аккуратно скорректировать веса, чтобы сохранить полезную функциональность.
Вот безопасный метод - частичное ослабление, а не полное удаление:
# Находим целевые слои
censorship_layers = []
for name, param in model.named_parameters():
if "router" in name and "weight" in name:
censorship_layers.append(name)
print(f"Найден слой для модификации: {name}")
# Применяем abliteration: ослабляем определенные нейроны
for layer_name in censorship_layers[:2]: # Первые два слоя
param = model.get_parameter(layer_name)
# Находим наиболее активные нейроны при отказах (из предыдущего анализа)
# Допустим, это нейроны с индексами 0, 5, 12
target_indices = [0, 5, 12]
# Ослабляем их на 90%
with torch.no_grad():
param.data[target_indices, :] *= 0.1
print(f"Слой {layer_name} модифицирован")
# Сохраняем промежуточные веса!
torch.save(model.state_dict(), "qwen3.5-397b-abliterated.pth")
Всегда делайте полный бэкап оригинальных весов перед модификацией. Одна ошибка - и придется заново качать 800+ ГБ модели.
5 Тестирование и валидация после модификации
Перезагружаем модель с модифицированными весами и тестируем. Важно проверить три аспекта:
- Цензура ушла? Задаем ранее "опасные" запросы.
- Общие способности сохранились? Тесты на код, логику, знания.
- Не появились ли артефакты? Модель не должна генерировать мусор.
Используйте бенчмарки вроде Hellaswag или собственные тестовые наборы. Если что-то пошло не так, всегда можно откатиться к бэкапу.
Если модель стала нестабильной, возможно, вы перестарались с модификацией. Попробуйте ослабить не на 90%, а на 50-70%. Abliteration - это искусство баланса.
Где ловушки? Ошибки, которые сломают вашу модель
- Модификация не тех слоев. В MoE-моделях кроме router'а есть gate, experts, нормализация. Троньте не то - модель превратится в генератор бессмыслицы. Всегда проверяйте архитектуру через model.config.
- Слишком агрессивное изменение. Обнуление весов - это грубо. Ослабление работает лучше. Начните с 30% ослабления, протестируйте, затем увеличьте если нужно.
- Игнорирование квантования. Если вы модифицируете квантованные веса, изменения могут "потеряться" при следующей загрузке. Работайте с моделью в том же формате, в котором будете использовать.
- Недостаток памяти. Даже с квантованием модель занимает десятки гигабайт. Закройте все лишнее. Если Mac Studio начинает свопить, уменьшайте batch size и используйте gradient checkpointing.
Если ваш Mac Studio "задыхается" при работе с большими контекстами, посмотрите статью Макбук M4 Max задыхается на Qwen - там советы по оптимизации памяти актуальны и для M3 Ultra.
FAQ: вопросы, которые вы зададите после первой попытки
| Вопрос | Ответ |
|---|---|
| Можно ли применить abliteration к другим MoE-моделям, например, Qwen Next? | Да, техника универсальна. Но архитектура Qwen Next может отличаться. Изучите ее в статье Qwen3 Next — MoE-модель нового поколения перед модификацией. |
| Сколько времени занимает весь процесс? | На Mac Studio M3 Ultra: загрузка модели - 15-20 минут, анализ активаций - 1-2 часа, модификация весов - минуты, тестирование - 1-3 часа. Итого около 5 часов. |
| Теряет ли модель знания после abliteration? | Если модификация точечная и аккуратная, знания сохраняются. Но если вы заденете общие слои, могут пострадать и другие способности. Всегда тестируйте. |
| Что делать, если модель сломалась после модификации? | Вернитесь к оригинальным весам. Если не сохранили - придется качать заново. Или попробуйте частичную загрузку весов, заменив только испорченные слои. |
А что дальше? Неочевидный совет от того, кто уже сжег несколько моделей
После успешной abliteration у вас будет менее цензурированная модель. Но она может быть "сырой". Советую не останавливаться на этом.
Объедините свою модифицированную модель с другими uncensored версиями через слияние весов (model merging). Техники вроде SLERP или TIES работают и с MoE-моделями, хотя требуют адаптации. Посмотрите Omnicoder-Claude-4.6-Opus-Uncensored: полное руководство по мержу - принципы те же.
И последнее: кастомизация моделей - это всегда баланс между контролем и стабильностью. Иногда проще использовать уже разблокированные версии, если они есть. Но понимание, как работает abliteration, дает вам силу менять модели под свои нужды - а это дорогого стоит.
Удачи. И не забудьте сделать бэкап.