Механистическая интерпретируемость LLM: визуализация активаций и внутренние механизмы | AiManual
AiManual Logo Ai / Manual.
08 Фев 2026 Гайд

Механистическая интерпретируемость LLM: как заглянуть внутрь нейросети и понять её решения

Полное руководство по механистической интерпретируемости LLM: как анализировать активации, находить нейроны-триггеры и понимать внутренние механизмы нейросетей

Чёрный ящик, который научились вскрывать

До 2025 года большие языковые модели были настоящими чёрными ящиками. Мы кормили их промптами, получали ответы, но понятия не имели, как именно внутри 175 миллиардов параметров рождалась эта строка текста. Потом случилось Anthropic с их исследованием Claude, и всё изменилось.

Механистическая интерпретируемость - это не про то, чтобы объяснить пользователю, почему модель выдала конкретный ответ. Это про то, чтобы понять, как модель думает на уровне нейронов, внимания и скрытых состояний. Если раньше это была академическая дисциплина для горстки исследователей, то к 2026 году появились инструменты, которые позволяют делать это любому инженеру с Python и GPU.

Важный нюанс: механистическая интерпретируемость не решает проблему этических провалов LLM. Даже если мы поймём, как модель пришла к опасному совету, это не сделает её безопаснее. Об этом подробно в статье «Провал LLM».

Почему это важно сейчас, а не пять лет назад

Раньше модели были меньше. GPT-3 с её 175 миллиардами параметров уже казалась монстром, но современные модели вроде Llama 3.2 405B или Gemini 2.5 Ultra перевалили за триллион параметров. Размер имеет значение, но не только в плане вычислительной сложности.

Чем больше модель, тем больше в ней эмерджентных свойств - способностей, которые не были явно закодированы в архитектуре, но появились в процессе обучения. И тем сложнее её интерпретировать. К 2026 году стало ясно: без понимания внутренних механизмов мы не сможем:

  • Надёжно детектировать и исправлять галлюцинации
  • Понимать, почему модель игнорирует явные инструкции (об этом подробнее в «LLM понимают цель, но игнорируют её»)
  • Создавать действительно безопасные системы для критических применений
  • Оптимизировать модели без потери качества
💡
Интересный факт: исследования Anthropic показали, что в Claude 3.5 Sonnet существуют «нейроны-детекторы» - отдельные нейроны, которые активируются на очень специфические концепции вроде «упоминание Калифорнии» или «вопросы о программировании». Это не метафора - буквально один нейрон из миллионов.

Три уровня интерпретируемости: от простого к сложному

1 Уровень внимания: кто на кого смотрит

Самый простой и самый обманчивый уровень. В трансформерах есть механизм внимания - каждый токен «смотрит» на другие токены в последовательности. Визуализация этих весов внимания даёт красивую картинку, но почти бесполезную для понимания.

Почему? Потому что современные модели используют multi-head attention с десятками голов в каждом слое. Одна голова может отслеживать синтаксические связи, другая - семантические, третья - что-то совсем непонятное. Смотреть на усреднённое внимание - всё равно что смотреть на среднюю температуру по больнице.

Что визуализировать Что это показывает Инструменты
Веса внимания по слоям Как токены взаимодействуют друг с другом TransformerLens, BertViz
Активации нейронов Какие концепции активны в скрытых состояниях Neuroscope, MechInterp
Градиенты Насколько важен каждый токен для ответа Captum, Integrated Gradients

2 Уровень активаций: что горит внутри

Здесь начинается настоящее веселье. Каждый слой трансформера производит активации - векторы в скрытом пространстве. Эти активации - внутреннее представление информации. Если научиться их читать, можно понять, что модель «думает» в данный момент.

Техника RepE (Representation Engineering), о которой мы писали в «RepE: Как хакнуть активации нейросети», позволяет не только читать, но и модифицировать эти представления. Хотите, чтобы модель меньше галлюцинировала? Добавьте в активации вектор «правдивости».

3 Уровень цепей: как мысль течёт по сети

Самый сложный и самый интересный уровень. Идея в том, чтобы отследить не просто активации, а цепочки вычислений, которые приводят к конкретному ответу. В модели Llama 3.2 исследователи нашли «цепи факт-проверки» - последовательности нейронов, которые активируются, когда модель проверяет факты.

Эти цепи - как маршруты в мозгу. Когда вы думаете о яблоке, активируется не один нейрон «яблоко», а целая сеть: цвет → форма → вкус → воспоминания. В LLM происходит то же самое, только с токенами и векторами.

Практика: находим нейроны-триггеры в Llama 3.2

Допустим, у нас есть подозрение, что в модели есть нейрон, который слишком сильно реагирует на определённые темы. Например, на упоминание политики. Как его найти?

Сначала установим инструменты. TransformerLens от Neel Nanda - стандарт де-факто для механистической интерпретируемости в 2026 году.

pip install transformer_lens==2.6.0
pip install mech_interp_tools==1.3.0
pip install plotly  # для визуализаций

Теперь загружаем модель. Для примера возьмём Llama 3.2 3B - достаточно маленькую, чтобы экспериментировать на Colab, но достаточно сложную, чтобы в ней были интересные паттерны.

import transformer_lens as tl
import torch

# Загружаем модель с кэшированием
model = tl.HookedTransformer.from_pretrained(
    "llama-3.2-3b",
    device="cuda" if torch.cuda.is_available() else "cpu",
    dtype=torch.float16
)

Ищем нейроны, которые реагируют на политические термины. Создадим промпты-триггеры и контрольные промпты:

political_prompts = [
    "Выборы президента состоятся в следующем месяце",
    "Парламент принял новый закон",
    "Политический кризис угрожает стабильности",
    "Министр объявил о своей отставке"
]

control_prompts = [
    "Яблоко упало с дерева",
    "Кот спит на диване",
    "Программист пишет код на Python",
    "Река течёт в море"
]

Теперь прогоним промпты через модель и соберём активации со всех слоёв:

def collect_activations(model, prompts, layer_idx):
    """Собираем активации с конкретного слоя"""
    tokens = model.to_tokens(prompts)
    with torch.no_grad():
        _, cache = model.run_with_cache(
            tokens,
            names_filter=lambda name: f"blocks.{layer_idx}.hook_resid_post"
        )
    return cache[f"blocks.{layer_idx}.hook_resid_post"]

# Собираем активации с середины сети (слой 16 из 32)
political_acts = collect_activations(model, political_prompts, 16)
control_acts = collect_activations(model, control_prompts, 16)

Ищем нейроны, которые сильно активируются на политические промпты и слабо - на контрольные:

# Сравниваем средние активации
political_mean = political_acts.mean(dim=[0, 1])  # усредняем по batch и позициям
control_mean = control_acts.mean(dim=[0, 1])

# Разница активаций
diff = political_mean - control_mean

# Находим топ-10 нейронов с наибольшей разницей
top_neurons = torch.topk(diff, k=10)

print("Топ нейронов, реагирующих на политику:")
for i, (neuron_idx, score) in enumerate(zip(top_neurons.indices, top_neurons.values)):
    print(f"Нейрон {neuron_idx}: разница {score:.4f}")

Что мы получим? Скорее всего, несколько нейронов, которые действительно «зажигаются» на политические темы. Но это ещё не всё. Нужно проверить, не случайность ли это.

Осторожно с интерпретациями! Найденный нейрон может активироваться не на «политику» как концепцию, а на конкретные слова вроде «выборы» или «президент». Всегда проверяйте на разнообразных примерах.

Визуализация: смотрим, как мысль движется по слоям

Нашли подозрительные нейроны. Теперь давайте посмотрим, как информация обрабатывается в модели. Для этого используем технику активационного патчинга (activation patching).

Идея простая: берём два промпта - один с политическим контекстом, другой без. Прогоняем оба через модель. Потом «пересаживаем» активации из политического прогона в контрольный на определённом слое и смотрим, как меняется ответ.

def activation_patching_experiment(model, source_prompt, target_prompt, layer_idx):
    """Эксперимент с патчингом активаций"""
    # Токенизируем
    source_tokens = model.to_tokens(source_prompt)
    target_tokens = model.to_tokens(target_prompt)
    
    # Запускаем source прогон с кэшем
    with torch.no_grad():
        source_logits, source_cache = model.run_with_cache(source_tokens)
    
    # Создаём хук для патчинга
    def patch_activations(activations, hook):
        # Заменяем активации target на активации source
        return source_cache[hook.name]
    
    # Запускаем target с патчингом
    with torch.no_grad():
        patched_logits = model.run_with_hooks(
            target_tokens,
            fwd_hooks=[(f"blocks.{layer_idx}.hook_resid_post", patch_activations)]
        )
    
    # Сравниваем логиты
    original_logits = model(target_tokens)
    
    # Смотрим на разницу в предсказаниях
    original_next_token = model.tokenizer.decode(
        original_logits[0, -1].argmax().item()
    )
    patched_next_token = model.tokenizer.decode(
        patched_logits[0, -1].argmax().item()
    )
    
    return original_next_token, patched_next_token

Пример использования:

source = "Политический аналитик заявил, что выборы будут"
target = "Погодный аналитик заявил, что завтра будет"

original, patched = activation_patching_experiment(model, source, target, 16)
print(f"Оригинальное продолжение: {target}{original}")
print(f"После патчинга слоя 16: {target}{patched}")

Если патчинг на слое 16 заставляет модель предсказывать «выборы» вместо «дождь», значит, именно на этом слое обрабатывается политическая информация.

Ошибки, которые совершают все (и вы тоже совершите)

Механистическая интерпретируемость - минное поле для ошибок. Вот самые частые:

  • Корреляция ≠ каузальность. Нейрон активируется на политические темы? Это не значит, что он «отвечает» за политику. Может, он просто активируется на длинные слова, а политические термины обычно длинные.
  • Эффект множественных сравнений. В модели миллиарды нейронов. Если проверять их все на случайные корреляции, обязательно найдётся нейрон, который «предсказывает» курс биткоина. Это статистический шум.
  • Переобучение на тестовых данных. Нашли нейрон, который прекрасно детектирует политику на вашем датасете? Проверьте на новых данных. Скорее всего, он детектирует что-то другое.
  • Игнорирование распределённых представлений. Современные LLM редко кодируют концепции в отдельных нейронах. Чаще это распределённые паттерны активаций по сотням нейронов.
💡
Проверочный тест: если вы можете «выключить» нейрон (занулить его активации) и модель перестаёт понимать концепцию, это сильное доказательство. Но даже тогда нужно проверить, не сломались ли другие функции модели.

Что дальше? Будущее механистической интерпретируемости

К 2026 году появились три тренда, которые меняют поле:

  1. Автоматизированное открытие цепей. Вместо того чтобы вручную искать паттерны, модели сами ищут в себе вычислительные цепи. Техника вроде ACDC (Automatic Circuit Discovery) уже показывает promising results.
  2. Интерпретируемость для мультимодальных моделей. Когда модель обрабатывает и текст, и изображения, и видео, задача усложняется на порядок. Как отследить, что изображение кота влияет на текстовое описание?
  3. Интервенционная интерпретируемость. Не просто читать активации, а активно вмешиваться в работу модели. Техника CausaNova, о которой мы писали в «CausaNova», позволяет заставить модель врать осознанно - и понимать, как это работает.

Самый интересный вопрос: приведёт ли механистическая интерпретируемость к созданию по-настоящему прозрачных AI? Скорее всего, нет. Скорее всего, мы создадим инструменты для анализа, но сами модели станут ещё сложнее. Это как с мозгом: мы знаем о нём в тысячи раз больше, чем 100 лет назад, но до сих пор не понимаем сознание.

Но есть и хорошая новость: даже частичное понимание даёт практические benefits. Мы уже можем находить и фиксить некоторые виды галлюцинаций. Можем оптимизировать модели для конкретных задач. Можем создавать более безопасные системы.

Начните с малого. Возьмите маленькую модель (Llama 3.2 3B отлично подходит), установите TransformerLens и попробуйте найти нейрон, который реагирует на что-то простое - на упоминание цветов или животных. Потом усложняйте. Через месяц вы будете смотреть на LLM не как на магический чёрный ящик, а как на сложную, но анализируемую систему.

И помните: самая большая ошибка - думать, что вы всё поняли. Модели всегда сложнее, чем кажется.