English translation is not available yet. Showing Russian content.
Что такое representation engineering (RepE) и зачем он нужен?
Краткий тезис
Representation Engineering (RepE) — это подход к контролю поведения LLM без дообучения (fine-tuning). Вместо изменения весов модели RepE находит в скрытом пространстве нейросети направления (directions), соответствующие абстрактным концепциям (честность, пол, эмоции, опасность), и затем на этапе инференса сдвигает активации модели вдоль этих направлений, чтобы усилить или ослабить проявление концепции. RepE нужен для быстрой, дешёвой и интерпретируемой настройки поведения модели, особенно в задачах безопасности, снижения предвзятости и управления стилем ответа.
1. Определение и мотивация
Representation Engineering (RepE) — термин, введённый в работе «Representation Engineering: A Top-Down Approach to AI Transparency» (2023). В отличие от fine-tuning (изменение всех весов модели на новом датасете) или RLHF (обучение с подкреплением на основе человеческих предпочтений), RepE работает на уровне активаций (промежуточных представлений) модели.
Зачем нужен RepE
- Быстрота: не требует дорогостоящего обучения; достаточно одного forward pass на небольшом наборе примеров.
- Интерпретируемость: каждое направление соответствует понятной концепции (например, «честность»).
- Гибкость: можно динамически включать/выключать контроль во время инференса.
- Безопасность: позволяет блокировать нежелательное поведение (токсичность, обход ограничений) без переобучения.
RepE особенно актуален для Agentic RAG и AI-агентов, где модель должна адаптироваться к разным контекстам и ролям без перезапуска.
2. Как работает RepE: поиск концептуальных направлений
Основная идея — найти в скрытом пространстве модели (например, на последнем слое перед выходом) вектор, который кодирует определённую концепцию. Этот вектор называется концептуальным направлением (direction|concept direction).
Процесс состоит из двух этапов:
2.1 Извлечение направления (Extraction)
- Берём набор пар предложений: одно с проявлением концепции (например, «Я скажу правду»), другое — без неё («Я солгу»).
- Пропускаем оба через модель и записываем скрытые состояния (hidden states) на интересующем слое.
- Вычисляем разность между средними активациями для положительных и отрицательных примеров. Эта разность и есть направление концепции.
Формально:
direction = mean(activations_positive) - mean(activations_negative)
2.2 Применение (Steering)
- Во время генерации на каждом шаге (или на выбранных слоях) добавляем к активациям модели сдвиг вдоль найденного направления:
activation_new = activation_old + α * direction - Коэффициент α (steering strength) регулирует силу влияния: положительное α усиливает концепцию, отрицательное — ослабляет.
3. Отличие от fine-tuning и RLHF
| Аспект | RepE | Fine-tuning | RLHF |
|---|---|---|---|
| Изменение весов | Нет (только активации) | Да (все или часть) | Да (через PPO/DPO) |
| Стоимость | Очень низкая (несколько forward pass) | Высокая (GPU-часы) | Очень высокая |
| Гибкость на инференсе | Можно менять α динамически | Фиксированная модель | Фиксированная модель |
| Интерпретируемость | Высокая (направление = концепция) | Низкая (чёрный ящик) | Средняя (reward model) |
| Риск катастрофического забывания | Нет | Есть | Есть |
| Точность контроля | Грубая (линейный сдвиг) | Тонкая (адаптация распределения) | Тонкая (оптимизация предпочтений) |
RepE не заменяет fine-tuning, а дополняет его: fine-tuning задаёт базовое поведение, RepE позволяет корректировать его на лету.
4. Методы RepE: контролируемые и неконтролируемые
4.1 Контролируемые (supervised)
- Linear Artificial Tomography (LAT): использует пары предложений с известной меткой концепции.
- Addition|Contrastive Activation Addition (CAA): улучшенная версия с нормализацией и выбором оптимального слоя.
4.2 Неконтролируемые (unsupervised)
- PCA/ICA на активациях: выделение главных компонент, которые часто соответствуют семантическим осям (например, пол, тональность).
- Sparse Autoencoders (SAE): обучение разреженного кодировщика для выделения интерпретируемых признаков (см. вопрос 299).
4.3 Выбор слоя
Направления, извлечённые на разных слоях, кодируют разные уровни абстракции. Обычно эффективны средние слои (например, 50% глубины модели). Для задач безопасности часто используют последние слои перед выходом.
5. Применения RepE
5.1 Контроль честности (Honesty)
- Направление «честность» позволяет заставить модель признавать незнание («Я не знаю») вместо галлюцинаций.
- Пример: при α > 0 модель реже выдумывает факты.
5.2 Снижение предвзятости (Bias mitigation)
- Направления «пол», «раса», «возраст» — сдвиг в сторону нейтральности.
- Можно ослабить стереотипные ассоциации без переобучения.
5.3 Безопасность (Safety)
- Направление «вредоносность» (harmfulness) — при отрицательном α модель отказывается отвечать на опасные запросы.
- Используется для jailbreak defense: даже если пользователь пытается обойти ограничения, RepE подавляет вредные активации.
5.4 Управление стилем и тоном
- Направления «формальность», «эмпатия», «юмор» — динамическая смена стиля ответа.
5.5 Agentic RAG
- В агентных системах RepE позволяет переключать «личность» агента (например, из экспертного режима в дружелюбный) без перезагрузки.
6. Пример кода (Python) для извлечения направления
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "microsoft/phi-2"
model = AutoModelForCausalLM.from_pretrained(model_name, output_hidden_states=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# Примеры: честное vs нечестное высказывание
honest_pairs = [
("I don't know the answer.", "I know the answer, but I'll make something up."),
("I am not sure about that.", "I am absolutely certain, even though I'm wrong.")
]
def get_activations(text, layer=-1):
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, output_hidden_states=True)
# Берём скрытое состояние последнего токена на указанном слое
hidden = outputs.hidden_states[layer][0, -1, :] # shape: [hidden_dim]
return hidden
# Вычисляем направление
pos_activations = torch.stack([get_activations(pair[0]) for pair in honest_pairs])
neg_activations = torch.stack([get_activations(pair[1]) for pair in honest_pairs])
direction = pos_activations.mean(dim=0) - neg_activations.mean(dim=0)
# Применение во время генерации (упрощённо)
def steer_generation(prompt, alpha=2.0):
inputs = tokenizer(prompt, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, output_hidden_states=True)
# Сдвигаем активации последнего слоя
last_hidden = outputs.hidden_states[-1]
steered_hidden = last_hidden + alpha * direction.unsqueeze(0).unsqueeze(0)
# Далее используем steered_hidden для следующего токена (требуется модификация forward)
# ... (реализация зависит от фреймворка)
Примечание: в реальных фреймворках (например, transformers с хуками) сдвиг применяется через register_forward_hook.
7. Ограничения и риски RepE
- Линейность: RepE предполагает, что концепции линейно представимы в скрытом пространстве. Для сложных концепций (например, «мораль») это может не работать.
- Побочные эффекты: сдвиг по одному направлению может непреднамеренно изменить другие аспекты поведения (например, усиление честности может сделать модель более резкой).
- Чувствительность к α: слишком большой коэффициент ломает генерацию (бессвязный текст), слишком маленький — не даёт эффекта.
- Переносимость: направление, извлечённое на одной модели, не работает на другой (даже той же архитектуры, но с другими весами).
- Безопасность: злоумышленник может использовать RepE для усиления вредоносного поведения (например, найти направление «агрессия» и увеличить его).
8. Связь с механизмом интерпретируемости
RepE тесно связан с механистической интерпретируемостью (mechanistic interpretability). Если механистическая интерпретируемость пытается понять, как модель вычисляет концепции (через цепи нейронов), то RepE использует эти знания для управления поведением. Оба подхода опираются на анализ активаций, но RepE более прагматичен: ему не нужно полное понимание, достаточно найти полезное направление.
Пет-проект для закрепления
Задача: Создать инструмент, который позволяет динамически менять «честность» ответов LLM (например, модели GPT-2 или Phi-2) с помощью RepE.
Инструменты:
- Python, PyTorch, Hugging Face Transformers
- Датасет: TruthfulQA (пары правдивых/ложных утверждений)
- Библиотека для хуков: transformer_lens или nnsight
Шаги:
- Загрузите небольшую модель (например, distilgpt2).
- Подготовьте 20–30 пар предложений: правдивое vs ложное (из TruthfulQA).
- Извлеките направление «честность» на среднем слое (например, слой 4 из 6).
- Реализуйте forward hook, который добавляет α * direction к активациям на выбранном слое.
- Напишите функцию генерации с параметром alpha (от -3 до 3).
- Протестируйте на вопросах из TruthfulQA: оцените, как меняется доля правдивых ответов при разных α.
- Визуализируйте зависимость метрики (например, BLEU с эталонным правдивым ответом) от α.
Ожидаемый результат:
- Работающий скрипт, который при α > 0 увеличивает вероятность правдивых ответов, при α < 0 — ложных.
- График зависимости метрики от α.
- Вывод: RepE эффективен для простых концепций, но может нарушать грамматику при больших α.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 295 | Fine-tuning LLM (сравнение с RepE) |
| 296 | RLHF (альтернативный метод контроля) |
| 298 | Activation steering (частный случай RepE) |
| 299 | Sparse Autoencoders для интерпретируемости |
| 300 | Безопасность LLM и jailbreak defense |
Навигация
- Предыдущий: 296
- Следующий: 298
- Индекс: 00. Индекс разборов