Денойзер активаций 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$ отвечает
для $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
Model tree for listussr/gpt2-resid-denoiser
Base model
openai-community/gpt2