{/ Эта страница автоматически создается на основе файла SKILL.md навыка с помощью сайта site/scripts/generate-skill-docs.py. Редактируйте исходный код SKILL.md, а не эту страницу. /}

Обучение разреженного автоэнкодера

Содержит рекомендации по обучению и анализу разреженных автоэнкодеров (SAE) с использованием SAELens для разложения активаций нейронной сети на интерпретируемые функции. Используйте при обнаружении интерпретируемых функций, анализе суперпозиции или изучении односемантических представлений в языковых моделях.

Метаданные навыков

Источник Необязательно — установите с помощью hermesskills installofficial/mlops/saelens
Путь optional-skills/mlops/saelens
Версия 1.0.0
Автор Исследование оркестра
Лицензия Массачусетский технологический институт
Зависимости sae-lens>=6.0.0, transformer-lens>=2.0.0, torch>=2.0.0
Платформы Linux, MacOS, Windows
Теги «Разреженные автоэнкодеры», «SAE», «Механистическая интерпретируемость», «Обнаружение функций», «Суперпозиция»

Ссылка: полная версия SKILL.md:::информация

Ниже приведено полное определение навыка, которое Гермес загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навык активен.

SAELens: разреженные автоэнкодеры для механистической интерпретации

SAELens — это основная библиотека для обучения и анализа разреженных автоэнкодеров (SAE) — метода разложения активаций многосемантических нейронных сетей на редкие, интерпретируемые функции. Основано на новаторском исследовании Anthropic по моносемантичности.

GitHub: jbloomAus/SAELens (более 1100 звезд)

Проблема: многозначность и суперпозиция

Отдельные нейроны в нейронных сетях полисемантичны — они активируются в множестве семантически различных контекстов. Это происходит потому, что модели используют суперпозицию для представления большего количества признаков, чем имеется нейронов, что затрудняет интерпретацию.

SAE решают эту проблему путем разложения плотных активаций на разреженные однозначные функции — обычно при каждом заданном вводе активируется лишь небольшое количество функций, и каждая функция соответствует интерпретируемой концепции.

Когда использовать SAELens

Используйте SAELens, когда вам нужно: - Откройте для себя интерпретируемые функции при активации модели. - Поймите, какие понятия усвоила модель. - Изучите суперпозицию и геометрию объектов. - Выполните функциональное рулевое управление или абляцию. - Анализировать функции, важные для безопасности (обман, предвзятость, вредный контент)

Рассмотрите альтернативные варианты, если: - Вам необходим базовый анализ активации → используйте TransformerLens напрямую. – Вам нужны эксперименты с причинно-следственным вмешательством → используйте pyvene или TransformerLens. - Вам необходимо управление производством → Рассмотрите возможность проектирования прямой активации

Установка

pip install sae-lens

Требования: Python 3.10+, трансформер-линза>=2.0.0

Основные понятия

Чему учат SAE

SAE обучены реконструировать активацию модели через редкое узкое место:

Input Activation  Encoder  Sparse Features  Decoder  Reconstructed Activation
    (d_model)               (d_sae >> d_model)             (d_model)
                 sparsity                      reconstruction
                 penalty                          loss

Функция потерь: MSE(исходное, восстановленное) + коэффициент L1_coefficient × L1(функции)

Проверка ключа (антропные исследования)

В исследовании «На пути к моносемантичности» оценщики обнаружили, что 70% функций SAE действительно интерпретируемы. Обнаруженные особенности включают в себя: - Последовательности ДНК, юридический язык, HTTP-запросы - Текст на иврите, сведения о питании, синтаксис кода. - Тональность, именованные сущности, грамматические конструкции.

Рабочий процесс 1: загрузка и анализ предварительно обученных SAE

Шаг за шагом

from transformer_lens import HookedTransformer
from sae_lens import SAE

# 1. Load model and pre-trained SAE
model = HookedTransformer.from_pretrained("gpt2-small", device="cuda")
sae, cfg_dict, sparsity = SAE.from_pretrained(
    release="gpt2-small-res-jb",
    sae_id="blocks.8.hook_resid_pre",
    device="cuda"
)

# 2. Get model activations
tokens = model.to_tokens("The capital of France is Paris")
_, cache = model.run_with_cache(tokens)
activations = cache["resid_pre", 8]  # [batch, pos, d_model]

# 3. Encode to SAE features
sae_features = sae.encode(activations)  # [batch, pos, d_sae]
print(f"Active features: {(sae_features > 0).sum()}")

# 4. Find top features for each position
for pos in range(tokens.shape[1]):
    top_features = sae_features[0, pos].topk(5)
    token = model.to_str_tokens(tokens[0, pos:pos+1])[0]
    print(f"Token '{token}': features {top_features.indices.tolist()}")

# 5. Reconstruct activations
reconstructed = sae.decode(sae_features)
reconstruction_error = (activations - reconstructed).norm()

Доступны предварительно обученные SAE

Релиз Модель Слои
gpt2-small-res-jb ГПТ-2 Малый Несколько остаточных потоков
гемма-2b-рез Джемма 2Б Остаточные потоки
Разное на HuggingFace Поиск по тегу saelens Разное

Контрольный список

Рабочий процесс 2: обучение пользовательского SAE

Шаг за шагом

from sae_lens import SAE, LanguageModelSAERunnerConfig, SAETrainingRunner

# 1. Configure training
cfg = LanguageModelSAERunnerConfig(
    # Model
    model_name="gpt2-small",
    hook_name="blocks.8.hook_resid_pre",
    hook_layer=8,
    d_in=768,  # Model dimension

    # SAE architecture
    architecture="standard",  # or "gated", "topk"
    d_sae=768 * 8,  # Expansion factor of 8
    activation_fn="relu",

    # Training
    lr=4e-4,
    l1_coefficient=8e-5,  # Sparsity penalty
    l1_warm_up_steps=1000,
    train_batch_size_tokens=4096,
    training_tokens=100_000_000,

    # Data
    dataset_path="monology/pile-uncopyrighted",
    context_size=128,

    # Logging
    log_to_wandb=True,
    wandb_project="sae-training",

    # Checkpointing
    checkpoint_path="checkpoints",
    n_checkpoints=5,
)

# 2. Train
trainer = SAETrainingRunner(cfg)
sae = trainer.run()

# 3. Evaluate
print(f"L0 (avg active features): {trainer.metrics['l0']}")
print(f"CE Loss Recovered: {trainer.metrics['ce_loss_score']}")

Ключевые гиперпараметры

Параметр Типичное значение Эффект
d_sae 4-16× d_модель Больше возможностей, выше емкость
l1_коэффициент от 5e-5 до 1e-4 Выше = реже, менее точно
лр от 1e-4 до 1e-3 Стандартный оптимизатор LR
l1_warm_up_steps 500-2000 Предотвращает раннюю смерть функции

Метрики оценки

Метрическая Цель Значение
L0 50-200 Среднее количество активных функций на токен
Оценка потерь CE 80-95% Перекрестная энтропия восстановлена ​​по сравнению с исходной
Мертвые функции <5% Функции, которые никогда не активируются
Объяснение разницы >90% Качество реконструкции

Контрольный список

Рабочий процесс 3: анализ функций и управление

Анализ отдельных особенностей

from transformer_lens import HookedTransformer
from sae_lens import SAE
import torch

model = HookedTransformer.from_pretrained("gpt2-small", device="cuda")
sae, _, _ = SAE.from_pretrained(
    release="gpt2-small-res-jb",
    sae_id="blocks.8.hook_resid_pre",
    device="cuda"
)

# Find what activates a specific feature
feature_idx = 1234
test_texts = [
    "The scientist conducted an experiment",
    "I love chocolate cake",
    "The code compiles successfully",
    "Paris is beautiful in spring",
]

for text in test_texts:
    tokens = model.to_tokens(text)
    _, cache = model.run_with_cache(tokens)
    features = sae.encode(cache["resid_pre", 8])
    activation = features[0,:, feature_idx].max().item()
    print(f"{activation:.3f}: {text}")

Управление функциями

def steer_with_feature(model, sae, prompt, feature_idx, strength=5.0):
    """Add SAE feature direction to residual stream."""
    tokens = model.to_tokens(prompt)

    # Get feature direction from decoder
    feature_direction = sae.W_dec[feature_idx]  # [d_model]

    def steering_hook(activation, hook):
        # Add scaled feature direction at all positions
        activation += strength * feature_direction
        return activation

    # Generate with steering
    output = model.generate(
        tokens,
        max_new_tokens=50,
        fwd_hooks=[("blocks.8.hook_resid_pre", steering_hook)]
    )
    return model.to_string(output[0])

Атрибуция функций

# Which features most affect a specific output?
tokens = model.to_tokens("The capital of France is")
_, cache = model.run_with_cache(tokens)

# Get features at final position
features = sae.encode(cache["resid_pre", 8])[0, -1]  # [d_sae]

# Get logit attribution per feature
# Feature contribution = feature_activation × decoder_weight × unembedding
W_dec = sae.W_dec  # [d_sae, d_model]
W_U = model.W_U    # [d_model, vocab]

# Contribution to "Paris" logit
paris_token = model.to_single_token(" Paris")
feature_contributions = features * (W_dec @ W_U[:, paris_token])

top_features = feature_contributions.topk(10)
print("Top features for 'Paris' prediction:")
for idx, val in zip(top_features.indices, top_features.values):
    print(f"  Feature {idx.item()}: {val.item():.3f}")

Распространенные проблемы и решения

Проблема: высокий коэффициент мертвых функций

# WRONG: No warm-up, features die early
cfg = LanguageModelSAERunnerConfig(
    l1_coefficient=1e-4,
    l1_warm_up_steps=0,  # Bad!
)

# RIGHT: Warm-up L1 penalty
cfg = LanguageModelSAERunnerConfig(
    l1_coefficient=8e-5,
    l1_warm_up_steps=1000,  # Gradually increase
    use_ghost_grads=True,   # Revive dead features
)

Проблема: плохая реконструкция (низкое восстановление CE)

# Reduce sparsity penalty
cfg = LanguageModelSAERunnerConfig(
    l1_coefficient=5e-5,  # Lower = better reconstruction
    d_sae=768 * 16,       # More capacity
)

Проблема: функции не поддаются интерпретации

# Increase sparsity (higher L1)
cfg = LanguageModelSAERunnerConfig(
    l1_coefficient=1e-4,  # Higher = sparser, more interpretable
)
# Or use TopK architecture
cfg = LanguageModelSAERunnerConfig(
    architecture="topk",
    activation_fn_kwargs={"k": 50},  # Exactly 50 active features
)

Проблема: ошибки памяти во время обучения

cfg = LanguageModelSAERunnerConfig(
    train_batch_size_tokens=2048,  # Reduce batch size
    store_batch_size_prompts=4,    # Fewer prompts in buffer
    n_batches_in_buffer=8,         # Smaller activation buffer
)

Интеграция с Нейронпедией

Просмотрите предварительно обученные функции SAE на neuronpedia.org:

# Features are indexed by SAE ID
# Example: gpt2-small layer 8 feature 1234
# → neuronpedia.org/gpt2-small/8-res-jb/1234

Справочник по ключевым классам

Класс Цель
САЭ Разреженная модель автоэнкодера
LanguageModelSAERunnerConfig Конфигурация обучения
SAETrainingRunner Менеджер цикла обучения
Магазин Активаций Сбор и пакетирование активации
HookedSAETransformer Интеграция TransformerLens + SAE

Справочная документация

Подробную документацию по API, учебные пособия и расширенное использование см. в папке references/:

Файл Содержание
ссылки/README.md Обзор и краткое руководство
references/api.md Полный справочник по API для SAE, TrainingSAE, конфигураций
references/tutorials.md Пошаговые руководства по обучению, анализу и управлению

Внешние ресурсы

Учебники

Документы

Официальная документация

Архитектуры SAE

Архитектура Описание Вариант использования
Стандарт ReLU + штраф L1 Общего назначения
Закрыто Изучил воротный механизм Лучший контроль разреженности
ТопК Ровно K активных функций Постоянная разреженность
# TopK SAE (exactly 50 features active)
cfg = LanguageModelSAERunnerConfig(
    architecture="topk",
    activation_fn="topk",
    activation_fn_kwargs={"k": 50},
)