Денойзер активаций GPT-2 small (слой 6, resid_post)

Условный по уровню шума денойзер residual stream, обученный для коррекции активационного стиринга: интервенция $h \leftarrow h + \alpha v$ ломает модель при больших $\alpha$, и денойзер применяется поверх неё, $\tilde h = D(h + \alpha v,\ \sigma)$, чтобы убрать внесённое искажение.

Результат эксперимента отрицательный: денойзер не улучшил Парето-фронт по сравнению с наивным стирингом. Чекпойнт выложен как воспроизводимый артефакт исследования, а не как рабочий инструмент. Разбор причин — в отчёте: https://github.com/listussr/llm-interpretability

Вход активация residual stream GPT-2 small, выход блока 5 (resid_post), $d = 768$
Условие уровень шума $\sigma$ (скаляр или вектор на батч)
Параметров 16 667 649 (fp32, 66.7 МБ)
Архитектура in_proj → 3 × AdaLN-residual блока (width 1024, mlp_ratio 2.0) → out_proj
Кондиционирование $\log(\sigma + 10^{-6})$ → Фурье-признаки → MLP, cond_dim = 256
Параметризация $D(x, \sigma) = x + s \cdot g!\left(\frac{x - \mu}{s},\ \frac{\sigma}{s}\right)$

$\mu$ и $s$ (scale) — статистика активаций, сохранена буферами внутри чекпойнта. Выходной проектор инициализирован нулём, поэтому до обучения сеть — точное тождество.

Обучение

Данные 1 000 000 активаций GPT-2 small, слой 6, корпус OpenWebText
Схема шума ve_rank1: изотропный $\mathcal{N}(0, \sigma^2 I)$ плюс с вероятностью 0.5 добавка ранга 1 вдоль случайного направления
Диапазон $\sigma$ лог-равномерно, $[0.01, 3.0] \times s$, то есть $\sigma \in [0.029,\ 8.64]$
Функция потерь $|(D(x,\sigma) - h)/s|^2$, сумма по координатам
Шагов 8000, batch 4096, AdamW, lr $10^{-3}$, warmup 100, косинус
Оборудование RTX 4070, около 12 минут

Позиция 0 (attention sink, норма в 37.6 раза выше остальных) исключена из обучающих данных и из всей статистики.

Чистота эксперимента. Rank-1 добавка бралась вдоль случайных направлений; при использовании SAE-направлений из обучающего пула исключены пять валидационных фичей и все направления с косинусом выше 0.4 к любой из них (96 штук).

Использование

Класс Denoiser живёт в репозитории проекта, отдельного пакета нет:

from huggingface_hub import hf_hub_download
from src.denoiser import Denoiser          # git clone https://github.com/listussr/llm-interpretability

path = hf_hub_download("listussr/gpt2-resid-denoiser", "denoiser_ve_rank1.pt")
D = Denoiser.load(path, device="cuda")

h_hat = D(h, sigma)                        # h: (B, 768) float32

Ключевой момент — калибровка $\sigma$. В формуле $\sigma$ есть уровень шума на одну координату, а $\alpha$ — норма добавки целиком. Изотропному шуму нормы $\alpha$ отвечает

σeff=α/d\sigma_{\text{eff}} = \alpha / \sqrt{d}

для $d = 768$ это деление на 27.7. Если подать в денойзер $\sigma = \alpha$, оценка $\sigma^2$ окажется завышенной в 768 раз и денойзер сотрёт стиринг полностью.

Веса продублированы в model.safetensors (плюс config.json) для тех, кому нужна загрузка без pickle.

Известные ограничения

Проверены и измерены; сформулированы здесь, потому что молчание о них сделало бы чекпойнт бесполезным.

$\sigma$ $|D(h) - h| / |h|$ махаланобис после
0.00 0.495 330
0.05 0.023 673
0.10 0.023 670
1.00 0.164 490
8.60 60.3 27211
чистые активации 0 685

Не тождество при $\sigma = 0$. Кондиционирование через $\log(\sigma + 10^{-6})$ отображает ноль в $-13.8$, тогда как обучение шло на $\log \sigma \in [-3.5, 2.2]$. При $\sigma = 0$ сеть меняет активацию на 50% нормы. Не подавать $\sigma = 0$; минимальное осмысленное значение — $0.03$.

Расходимость на верхней границе. При $\sigma = 8.6$ выход уходит на два порядка. Держаться внутри $\sigma \in [0.03,\ 5]$.

Избыточная агрессивность в рабочем диапазоне. При $\sigma_{\text{eff}} = 0.14$ ($\kappa = 0.05$) MLP сдвигает активацию на 2.4% нормы, а оптимальный для гауссова прайора винеровский фильтр — на 0.5%, в пять раз меньше. Этого хватает, чтобы KL с чистой моделью вырос с 0.06 до 4.26: MSE-обучение смещает активации в том числе вдоль направлений, к которым модель чувствительна, а квадратичная ошибка этого не различает.

Денойзинг съедает стиринг. Для гауссова прайора доля сохранённого стиринга равна $a = \lambda_v / (\lambda_v + \sigma^2)$, где $\lambda_v$ — дисперсия активаций вдоль $v$. Измеренная retention этого чекпойнта падает с 0.996 при $\kappa = 0.05$ до 0.543 при $\kappa = 0.45$. Обход — применять денойзер только к ортогональной к $v$ части (denoise_project в репозитории), тогда retention равна 1 по построению.

Привязка к точке. Обучен на выходе блока 5 GPT-2 small на OpenWebText. На другом слое, другой модели или заметно другом распределении текста $\mu$, $s$ и ковариация другие — переносимость не проверялась.

Что внутри репозитория

файл что это
denoiser_ve_rank1.pt чекпойнт: {"cfg": ..., "state_dict": ...}, грузится Denoiser.load
model.safetensors те же веса без pickle
config.json гиперпараметры архитектуры и обучения
denoiser.py исходник модели (копия из репозитория, для чтения)
train_history.json кривая обучения, в том числе по бинам $\sigma$

Ссылки

Код, отчёт и полный протокол эксперимента: https://github.com/listussr/llm-interpretability

Downloads last month
13
Safetensors
Model size
16.7M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for listussr/gpt2-resid-denoiser

Finetuned
(2260)
this model