electrostatickid commited on
Commit
f2ad181
·
verified ·
1 Parent(s): 1a6092f

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +72 -0
README.md ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ tags:
4
+ - interpretability
5
+ - activation-steering
6
+ - gpt2
7
+ - sparse-autoencoder
8
+ ---
9
+
10
+ # gpt2-steering-denoiser
11
+
12
+ Два небольших denoiser'а (MLP + alpha-conditioning), обученные корректировать негативный побочный эффект activation steering на GPT-2 small.
13
+
14
+ Полный код, методология и разбор результатов: **[github.com/trtbfn/tbank_mech_interp](https://github.com/trtbfn/tbank_mech_interp)** (см. `REPORT.md`).
15
+
16
+ ## Задача
17
+
18
+ Стиринг `h̃ = h + α·v` (где `v` — вектор из SAE-декодера) усиливает нужное свойство в генерации, но при росте `α` разваливает связность текста. Оба чекпойнта учатся исправлять это, не убирая сам стиринг.
19
+
20
+ ## Чекпойнты
21
+
22
+ - **`denoiser.pt`** — коррекция на слое инъекции (слой 6 из 12): `h̃ = denoiser(h + α·v, α/300)`. Стабильнее по всей сетке `α ∈ {32, 128, 256}`, разброс perplexity относительно plain steering — в пределах ±110.
23
+ - **`denoiser_L8.pt`** — коррекция ниже по потоку, на слое 8. Обучен на отдельной задаче (парные clean/corrupted активации слоя 8). Даёт лучший наблюдавшийся в проекте результат (`weather`, α=128: perplexity 583 против 1110 у сырого стиринга, concept-активация выше) при доминировании по обеим осям одновременно, но менее предсказуем на других доменах (разброс шире, есть выбросы).
24
+
25
+ Ни один из двух не доминирует систематически над другим — выбор зависит от того, что важнее: предсказуемость (`denoiser.pt`) или пиковый эффект (`denoiser_L8.pt`). Подробное сравнение — §6 отчёта.
26
+
27
+ ## Архитектура
28
+
29
+ ```python
30
+ class Denoiser(nn.Module):
31
+ def __init__(self, d_model=768, hidden_mult=4):
32
+ super().__init__()
33
+ hidden = d_model * hidden_mult
34
+ self.net = nn.Sequential(
35
+ nn.Linear(d_model + 1, hidden), # +1 — conditioning на alpha/ALPHA_MAX_COND
36
+ nn.GELU(),
37
+ nn.Linear(hidden, hidden),
38
+ nn.GELU(),
39
+ nn.Linear(hidden, d_model),
40
+ )
41
+
42
+ def forward(self, h, alpha_norm=None):
43
+ ...
44
+ return h + self.net(torch.cat([h, alpha_norm], dim=-1)) # residual-формулировка
45
+ ```
46
+
47
+ Полный код в `denoiser.py` репозитория.
48
+
49
+ ## Использование
50
+
51
+ ```python
52
+ import torch
53
+ from denoiser import Denoiser, ALPHA_MAX_COND
54
+
55
+ denoiser = Denoiser()
56
+ denoiser.load_state_dict(torch.load("denoiser.pt")["state_dict"])
57
+ denoiser.eval()
58
+
59
+ # h — активация residual stream (768,) на слое 6, alpha — сила стиринга
60
+ h_corrected = denoiser(h + alpha * v, alpha / ALPHA_MAX_COND)
61
+ ```
62
+
63
+ Для `denoiser_L8.pt` — та же архитектура, но применяется хуком на слое 8, при этом стиринг на слое 6 не трогается (см. `eval_steering.py`, метод `denoised_downstream`).
64
+
65
+ ## Обучение
66
+
67
+ - **Модель:** GPT-2 small (`transformer_lens`)
68
+ - **Данные:** WikiText-2 (~3120 абзацев → ~396K активаций), без пересечения с валидационными доменами
69
+ - **`denoiser.pt`:** корруптирование `h + α·u` (u — случайное единичное направление, α ~ U[0,300]), 300 эпох
70
+ - **`denoiser_L8.pt`:** парные данные (чистая/протёкшая активация слоя 8 при случайном возмущении на слое 6), 300 эпох
71
+
72
+ Детали и все найденные по пути ошибки (data leakage, несогласованность conditioning, невыполнимая схема зашумления) — в `REPORT.md` репозитория.