Spaces:
Running
Neural MRI Scanner โ Implementation Specification
Model Resonance Imaging for AI Interpretability
Project Codename: NeuralMRI
Full Name: Neural MRI โ Model Resonance Imaging
Version: 0.1 (MVP)
Date: 2026-02-24
Author: JJ (Asia2G Capital / ModuLabs)
1. Executive Summary
Neural MRI Scanner๋ ์คํ์์ค LLM ๋ด๋ถ๋ฅผ ๋ MRI์ฒ๋ผ ์๊ฐํํ๊ณ , ์ค์๊ฐ์ผ๋ก ์๊ทน(perturbation)์ ๊ฐํด ๋ณํ๋ฅผ ๊ด์ฐฐํ ์ ์๋ AI ๋ชจ๋ธ ํด์ ๋๊ตฌ(interpretability tool)๋ค. MRI๋ Model Resonance Imaging์ ์ฝ์๋ก, ์๋ฃ MRI(Magnetic Resonance Imaging)๊ฐ ๋์ ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด๋ฏ AI ๋ชจ๋ธ ๋ด๋ถ์์ ํน์ ์ ๋ ฅ์ "๊ณต๋ช (resonate)"ํ๋ ๋ด๋ฐ๊ณผ ํ๋ก๋ฅผ ์ฐพ์ ์์ํํ๋ค๋ ์๋ฏธ๋ฅผ ๋ด๊ณ ์๋ค.
ํต์ฌ ์์ด๋์ด: ์๋ฃ ์์(T1, T2, fMRI, DTI, FLAIR)์ ๋ฉํฐ๋ชจ๋ฌ ์ค์บ ํจ๋ฌ๋ค์์ ๊ทธ๋๋ก AI ๋ชจ๋ธ ๋ด๋ถ ๋ถ์์ ๋งคํํ๋ค. ์ฐ๊ตฌ์๋ฟ ์๋๋ผ ์์ง๋์ด, ์์ฌ๊ฒฐ์ ์๋ "์ด ๋ชจ๋ธ ๋ด๋ถ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง" ์ง๊ด์ ์ผ๋ก ํ์ ํ ์ ์๊ฒ ํ๋ค.
๋์ ์ฌ์ฉ์:
- AI ์์ง๋์ด (๋ชจ๋ธ ๋๋ฒ๊น , ํ์ธํ๋ ๋ฌธ์ ์ง๋จ)
- ์ฐ๊ตฌ์ (mechanistic interpretability ์ฐ๊ตฌ ๋ณด์กฐ)
- ๊ธฐ์ ๋ฆฌ๋/์์ฌ๊ฒฐ์ ์ (๋ชจ๋ธ ํ๋์ ๋ํ ์ง๊ด ํ๋ณด)
2. MRI Modality โ AI Interpretability ๋งคํ
์ด ํ๋ก์ ํธ์ ํต์ฌ ํ๋ ์์ํฌ. ๊ฐ ์๋ฃ ์์ ๊ธฐ๋ฒ์ด AI ๋ชจ๋ธ์ ์ด๋ค ์ธก๋ฉด์ ๋ณด์ฌ์ฃผ๋์ง ์ ์ํ๋ค. ์๋ฃ MRI์ ์ฉ์ด ์ฒด๊ณ๋ฅผ AI ๋งฅ๋ฝ์ผ๋ก ์์ ํ ์ฌ์ ์ํ์ฌ ํ๋ก์ ํธ ๊ณ ์ ์ ์ฉ์ด ์ธ๊ณ๊ด์ ๊ตฌ์ถํ๋ค.
Terminology Map
| ์๋ฃ ์๋ณธ | Neural MRI ์ฌ์ ์ | ํ๋ค์ | ์๋ฏธ |
|---|---|---|---|
| MRI (Magnetic Resonance Imaging) | MRI | Model Resonance Imaging | AI ๋ชจ๋ธ ๋ด๋ถ ๊ณต๋ช ์์ |
| T1-weighted | T1 | Topology Layer 1 | 1์ฐจ ๊ตฌ์กฐ โ ์ ์ ์ํคํ ์ฒ ํ ํด๋ก์ง |
| T2-weighted | T2 | Tensor Layer 2 | 2์ฐจ ๊ตฌ์กฐ โ ํ ์(๊ฐ์ค์น) ๋ถํฌ |
| fMRI (functional Magnetic Resonance Imaging) | fMRI | functional Model Resonance Imaging | ๊ธฐ๋ฅ์ ํ์ฑํ ์์ |
| DTI (Diffusion Tensor Imaging) | DTI | Data Tractography Imaging | ๋ฐ์ดํฐ ํ๋ฆ ๊ฒฝ๋ก ์ถ์ |
| FLAIR (Fluid-Attenuated Inversion Recovery) | FLAIR | Feature-Level Anomaly Identification & Reporting | ํผ์ฒ ์์ค ์ด์ ํ์ง ๋ฐ ๋ณด๊ณ |
2.1 T1 โ Topology Layer 1 (Model Architecture)
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ฃ ์๋ณธ | T1-weighted MRI: ์กฐ์ง์ ํด๋ถํ์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค |
| AI ๋งคํ | ๋ชจ๋ธ์ ์ ์ ๊ตฌ์กฐ โ ๋ ์ด์ด ์, ๊ฐ ๋ ์ด์ด์ ๋ด๋ฐ/head ์, ํ๋ผ๋ฏธํฐ ์นด์ดํธ |
| ์๊ฐํ | ๊ฐ ๋ ์ด์ด๋ฅผ ๋ ธ๋ ํด๋ฌ์คํฐ๋ก, ํฌ๊ธฐ๋ ํ๋ผ๋ฏธํฐ ์์ ๋น๋ก. ๊ทธ๋ ์ด์ค์ผ์ผ ํค |
| ๋ฐ์ดํฐ ์์ค | model.config ์์ ์ง์ ์ถ์ถ (์ ์ ) |
| ์ธํฐ๋์ | ํธ๋ฒ ์ ๋ ์ด์ด ์์ธ ์ ๋ณด ํ์ (hidden_size, num_heads, intermediate_size ๋ฑ) |
2.2 T2 โ Tensor Layer 2 (Weight Distribution)
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ฃ ์๋ณธ | T2-weighted MRI: T1๊ณผ ๋ค๋ฅธ ํ์ด๋ฐ์ผ๋ก ๋ค๋ฅธ ์กฐ์ง ๋์กฐ๋ฅผ ๋ณด์ฌ์ค |
| AI ๋งคํ | ๊ฐ์ค์น(weight)์ ๋ถํฌ, magnitude, ํต๊ณ์ ํน์ฑ |
| ์๊ฐํ | ๊ฐ ๋ด๋ฐ/head์ weight magnitude๋ฅผ ๋ธ๋ฃจ ์ค์ผ์ผ ํํธ๋งต์ผ๋ก ํํ. ๋ฐ์์๋ก ํฐ ๊ฐ์ค์น |
| ๋ฐ์ดํฐ ์์ค | model.state_dict()์์ ๊ฐ ๋ ์ด์ด์ weight tensor โ ํต๊ณ (mean, std, max, L2 norm) |
| ์ธํฐ๋์ | ๋ ์ด์ด๋ณ/head๋ณ weight ํ์คํ ๊ทธ๋จ ํ์. ์ด์์น(outlier) ๊ฐ์ค์น ํ์ด๋ผ์ดํธ |
2.3 fMRI โ functional Model Resonance Imaging (Activation Patterns)
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ฃ ์๋ณธ | fMRI: ํ๋ฅ ๋ณํ๋ก ๋์ ํ์ฑํ ์์ญ์ ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ค |
| AI ๋งคํ | ํน์ ์ ๋ ฅ(prompt)์ ๋ํ ๊ฐ ๋ ์ด์ด/๋ด๋ฐ์ ํ์ฑํ(activation) ํจํด |
| ์๊ฐํ | Cool-to-Hot ์ปฌ๋ฌ๋งต (ํ๋โ๋ ธ๋โ๋นจ๊ฐ). ํ์ฑํ๊ฐ ๋์ ๋ด๋ฐ์ด "๋จ๊ฒ๊ฒ" ํ์. ์ค์๊ฐ ํ์ค ์ ๋๋ฉ์ด์ |
| ๋ฐ์ดํฐ ์์ค | TransformerLens์ run_with_cache() โ ๊ฐ ๋ ์ด์ด๋ณ activation tensor |
| ์ธํฐ๋์ | ํ๋กฌํํธ๋ฅผ ๋ฐ๊พธ๋ฉด activation์ด ์ค์๊ฐ์ผ๋ก ๋ณํ. ํ ํฐ๋ณ step-through ๊ฐ๋ฅ |
| ํต์ฌ ๊ธฐ์ | hook_resid_post, hook_attn_out, hook_mlp_out ์์ ์บ์ฑ |
2.4 DTI โ Data Tractography Imaging (Circuit Tracing)
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ฃ ์๋ณธ | DTI: ๋ฐฑ์ง์ ์ ๊ฒฝ์ฌ์ ํธ๋์ ์ถ์ ํ์ฌ ๋ ์์ญ ๊ฐ ์ฐ๊ฒฐ์ ๋ณด์ฌ์ค |
| AI ๋งคํ | ์ ๋ณด๊ฐ ์ด๋ค ๊ฒฝ๋ก(attention head โ MLP โ ๋ค์ ๋ ์ด์ด)๋ก ํ๋ฅด๋์ง ์ถ์ |
| ์๊ฐํ | ๋ฐฉํฅ๋ณ ์์ ์ธ์ฝ๋ฉ(directional color encoding). ์ ์๋ฏธํ ์ ๋ณด ํ๋ฆ ๊ฒฝ๋ก๋ง ๊ตต์ ๊ณก์ ์ผ๋ก ํ์. ํ๋ฆ ๋ฐฉํฅ ์ ๋๋ฉ์ด์ |
| ๋ฐ์ดํฐ ์์ค | (1) Attention pattern: ๊ฐ head์ attention matrix. (2) Attribution patching: ๊ฐ ์ปดํฌ๋ํธ์ ์ถ๋ ฅ ๊ธฐ์ฌ๋ |
| ์ธํฐ๋์ | ํน์ ์ถ๋ ฅ ํ ํฐ ์ ํ ์ ํด๋น ํ ํฐ์ ๊ฐ์ฅ ๊ธฐ์ฌํ ๊ฒฝ๋ก๊ฐ ํ์ด๋ผ์ดํธ๋จ |
| ํต์ฌ ๊ธฐ์ | TransformerLens์ activation patching, attention pattern ์ถ์ถ |
2.5 FLAIR โ Feature-Level Anomaly Identification & Reporting (Bias & Hallucination Detection)
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ฃ ์๋ณธ | FLAIR: ๋ณ๋ณ(lesion)์ ๊ฐ์กฐํ์ฌ ์ด์ ๋ถ์๋ฅผ ๋ช ํํ๊ฒ ๋ณด์ฌ์ค |
| AI ๋งคํ | ๋ชจ๋ธ์ "๋ฌธ์ ์ง์ " โ ํ ๋ฃจ์๋ค์ด์ , ํธํฅ, ๋ถํ์ค์ฑ์ด ๋์ ์์ญ |
| ์๊ฐํ | ์ ์ ์์ญ์ ์ด๋ก๊ฒ, ์ด์ ์์ญ์ ๋นจ๊ฐ์/ํํฌ์์ผ๋ก ํ์ค. ์ด์ ์ ์์ ๋ฐ๋ฅธ ๊ฐ๋ |
| ๋ฐ์ดํฐ ์์ค | (1) Logit lens: ์ค๊ฐ ๋ ์ด์ด์ ์์ธก์ด ์ต์ข ์์ธก๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง. (2) Entropy: ๊ฐ ์์น์ ๋ค์ ํ ํฐ ์์ธก ๋ถํ์ค์ฑ. (3) SAE feature ์ค ์๋ ค์ง ํธํฅ/ํ ๋ฃจ์๋ค์ด์ ๊ด๋ จ feature์ ํ์ฑํ |
| ์ธํฐ๋์ | ์ด์ ๋ ธ๋ ํด๋ฆญ ์ ํด๋น ๋ด๋ฐ/feature์ ์์ธ ์ ๋ณด, ๊ด๋ จ ํ์ต ๋ฐ์ดํฐ ํจํด ์ถ์ |
3. System Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend (React) โ
โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ MRI Canvas โ โ Mode Tabs โ โ Control Panels โ โ
โ โ (D3 / SVG) โ โ T1~FLAIR โ โ Stim, Perturb, โ โ
โ โ โ โ โ โ Layer Summary โ โ
โ โโโโโโโฌโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ WebSocket (real-time activation stream) โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โผ Backend (FastAPI + Python) โ
โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ Model โ โ Analysis โ โ Perturbation โ โ
โ โ Manager โ โ Engine โ โ Engine โ โ
โ โ (load/ โ โ (Trans- โ โ (activation โ โ
โ โ swap) โ โ formerLensโ โ patching, etc.) โ โ
โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Model Registry (HuggingFace Hub cache) โ โ
โ โ Llama-3.2-3B, Qwen-2.5-3B, Gemma-2-2B, etc. โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
3.1 Frontend
| ํญ๋ชฉ | ๊ธฐ์ |
|---|---|
| Framework | React 18+ (Vite) |
| ์๊ฐํ ์์ง | D3.js (SVG ๊ธฐ๋ฐ) โ ๋ด๋ฐ/์ฐ๊ฒฐ ๋ ๋๋ง |
| ์ค์๊ฐ ํต์ | WebSocket (activation ์คํธ๋ฆฌ๋ฐ) |
| ์ํ ๊ด๋ฆฌ | Zustand (๊ฒฝ๋) |
| ์คํ์ผ | Tailwind CSS + CSS Variables (DICOM ํ ๋ง) |
| ์ ๋๋ฉ์ด์ | requestAnimationFrame (์บ๋ฒ์ค ํ์ค), CSS transitions (UI) |
3.2 Backend
| ํญ๋ชฉ | ๊ธฐ์ |
|---|---|
| ์๋ฒ | FastAPI (Python 3.11+) |
| ๋ชจ๋ธ ์ธํธ๋ก์คํ์ | TransformerLens (HookedTransformer) |
| SAE ๋ถ์ | SAELens (์ ํ์ฌํญ, Phase 2) |
| ํ ์ ์ฐ์ฐ | PyTorch 2.x |
| ๋ชจ๋ธ ๋ก๋ฉ | HuggingFace transformers + accelerate |
| WebSocket | fastapi[websockets] |
| ์๋ฆฌ์ผ๋ผ์ด์ฆ | orjson (๋์ฉ๋ ํ
์ ๋ฐ์ดํฐ ์ง๋ ฌํ) |
3.3 ์ง์ ๋ชจ๋ธ (MVP)
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | TransformerLens ์ง์ | ์ฐ์ ์์ |
|---|---|---|---|
| GPT-2 small (124M) | 124M | โ ๊ณต์ ์ง์ | P0 (๊ฐ๋ฐ/ํ ์คํธ์ฉ) |
| GPT-2 medium (355M) | 355M | โ ๊ณต์ ์ง์ | P0 |
| Pythia-1.4B | 1.4B | โ ๊ณต์ ์ง์ | P0 |
| Gemma-2-2B | 2B | โ ์ง์ | P1 |
| Llama-3.2-3B | 3.21B | โ ๏ธ ์ปค๋ฎค๋ํฐ ์ง์ | P1 |
| Qwen-2.5-3B | 3B | โ ๏ธ ์ปค๋ฎค๋ํฐ/์ปค์คํ | P1 |
| Mistral-7B-v0.3 | 7.24B | โ ๏ธ ์ปค๋ฎค๋ํฐ ์ง์ | P2 (GPU ํ์) |
| Phi-3-mini-3.8B | 3.8B | โ ๏ธ ์ปค์คํ ํ์ | P2 |
์ฐธ๊ณ : TransformerLens๋ GPT-2, Pythia ๊ณ์ด์ด ๊ฐ์ฅ ์์ ์ . Llama/Qwen ๋ฑ์
HookedTransformer.from_pretrained()ํธํ์ฑ ํ์ธ ํ์. ๋ฏธ์ง์ ๋ชจ๋ธ์ nnsight๋ก ๋์ฒด ๊ฐ๋ฅ.
4. API Design
4.1 REST Endpoints
POST /api/model/load ๋ชจ๋ธ ๋ก๋ (HuggingFace ID ๋๋ ๋ก์ปฌ ๊ฒฝ๋ก)
GET /api/model/info ํ์ฌ ๋ก๋๋ ๋ชจ๋ธ์ ๊ตฌ์กฐ ์ ๋ณด (T1 ๋ฐ์ดํฐ)
DELETE /api/model/unload ๋ชจ๋ธ ์ธ๋ก๋ (๋ฉ๋ชจ๋ฆฌ ํด์ )
POST /api/scan/structural T1 ์ค์บ: ์ ์ ๊ตฌ์กฐ ๋ฐ์ดํฐ ๋ฐํ
POST /api/scan/weights T2 ์ค์บ: weight ํต๊ณ ๋ฐํ
POST /api/scan/activation fMRI ์ค์บ: ํ๋กฌํํธ ๊ธฐ๋ฐ activation ๋ฐํ
POST /api/scan/circuits DTI ์ค์บ: attention + attribution ๊ฒฝ๋ก ๋ฐํ
POST /api/scan/anomaly FLAIR ์ค์บ: ์ด์ ํ์ง ๊ฒฐ๊ณผ ๋ฐํ
POST /api/perturb/zero ํน์ ์ปดํฌ๋ํธ zero-out
POST /api/perturb/amplify ํน์ ์ปดํฌ๋ํธ amplify (factor)
POST /api/perturb/ablate ํน์ ์ปดํฌ๋ํธ ablate (์ ๊ฑฐ)
POST /api/perturb/inject ํน์ ์์น์ activation ์ฃผ์
POST /api/perturb/patch activation patching (causal tracing)
POST /api/perturb/reset perturbation ์ด๊ธฐํ (์๋ณธ ๋ณต์)
GET /api/features/list SAE feature ๋ชฉ๋ก (Phase 2)
POST /api/features/activate ํน์ SAE feature ํ์ฑํ/๋นํ์ฑํ (Phase 2)
4.2 WebSocket Endpoint
WS /ws/stream
ํด๋ผ์ด์ธํธ โ ์๋ฒ:
{
"type": "scan_stream",
"mode": "fMRI",
"prompt": "The capital of France is",
"token_step": true // true๋ฉด ํ ํฐ๋ณ๋ก ์คํธ๋ฆฌ๋ฐ
}
์๋ฒ โ ํด๋ผ์ด์ธํธ:
{
"type": "activation_frame",
"token_idx": 3,
"token": "capital",
"layers": [
{
"layer_id": "blocks.0.attn",
"type": "attention",
"activations": [0.12, 0.87, ...], // ์์ฝ๋ per-head ๊ฐ
"attention_pattern": [[...], ...] // DTI ๋ชจ๋ ์ ํฌํจ
},
...
]
}
4.3 ์์ฒญ/์๋ต ์คํค๋ง ์์
POST /api/scan/activation
Request:
{
"prompt": "The Eiffel Tower is located in",
"layers": "all", // ๋๋ ["blocks.3.mlp", "blocks.4.attn"]
"aggregation": "l2_norm", // "l2_norm" | "max" | "mean" | "raw"
"include_residual": true,
"token_positions": "all" // ๋๋ [0, 1, 5] (ํน์ ํ ํฐ ์์น)
}
Response:
{
"model": "gpt2-small",
"prompt_tokens": ["The", " Eiff", "el", " Tower", " is", " located", " in"],
"scan_mode": "fMRI",
"data": {
"embed": {
"type": "embedding",
"shape": [7, 768],
"activations_summary": [0.45, 0.52, 0.48, 0.61, 0.33, 0.55, 0.41]
},
"blocks.0.attn": {
"type": "attention",
"num_heads": 12,
"per_head_activation": [0.12, 0.87, 0.34, ...],
"attention_patterns": {
"shape": [12, 7, 7],
"data_url": "/api/tensor/attn_0_patterns"
}
},
"blocks.0.mlp": {
"type": "mlp",
"activation_summary": [0.22, 0.91, 0.45, ...],
"top_neurons": [
{"idx": 1247, "activation": 3.82, "label": null},
{"idx": 892, "activation": 2.91, "label": null}
]
}
},
"metadata": {
"compute_time_ms": 342,
"gpu_memory_mb": 1240
}
}
POST /api/perturb/patch
Request:
{
"prompt": "The Eiffel Tower is located in",
"target_token_idx": -1,
"target_component": "blocks.5.mlp",
"method": "zero",
"compare_logits": true
}
Response:
{
"original_prediction": {
"token": " Paris",
"logit": 12.34,
"prob": 0.87
},
"perturbed_prediction": {
"token": " the",
"logit": 8.12,
"prob": 0.23
},
"logit_diff": -4.22,
"affected_components": [
{"id": "blocks.5.mlp", "impact_score": 0.92},
{"id": "blocks.6.attn.head_3", "impact_score": 0.45}
]
}
5. Frontend Specification
5.1 ์ ์ฒด ๋ ์ด์์
โโ Top Bar โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ [โ] NEURAL MRI โ Model Resonance Imaging โ Model: [Dropdown โพ] โ GPU: 2.1GB/8GB โ
โโ Mode Tabs โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [ T1 Topology ] [ T2 Tensor ] [ fMRI ] โ
โ [ DTI ] [ FLAIR ] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ Layer Summary โ
โ DICOM Header โ โโ Embed: โโโโโโ 0.45 โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โ โโ Attn1: โโโโโโ 0.87 โ
โ โ โ โ โโ MLP1: โโโโโโ 0.34 โ
โ โ Main Scan Canvas โ โ โโ ... โ
โ โ (SVG/D3) โ โ โ
โ โ โ โ โ Stimulation Panel โ
โ โ - neurons โ โ ID: blocks.3.attn.h7 โ
โ โ - connections โ โ Activation: 0.8721 โ
โ โ - flow animations โ โ [Zero] [Amp] [Inv] โ
โ โ โ โ [Noise] [Ablate] โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ Comparison Panel โ
โ PROMPT: [________________] โ Original: "Paris" (0.87) โ
โ [โถ SCAN] [โธ PAUSE] [โบ RESET]โ Perturbed: "the" (0.23) โ
โ โ โ
โโโ Log Panel โโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [00:12] Scan complete โ Mode: fMRI, 7 tokens processed โ
โ [00:14] Perturbation: Zero-out on blocks.3.attn.head_7 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
5.2 ๋์์ธ ์์คํ
ํ ๋ง: "Medical Dark" โ DICOM ๋ทฐ์ด + ์์ ์ค ๋ชจ๋ํฐ ๋ฏธํ
/* Color Palette */
--bg-primary: #0a0c10; /* ๊ฑฐ์ ๊ฒ์ , ์ฝ๊ฐ ๋ธ๋ฃจ */
--bg-secondary: #0c0e14; /* ํจ๋ ๋ฐฐ๊ฒฝ */
--bg-surface: #12151c; /* ์นด๋/์
๋ ฅ ๋ฐฐ๊ฒฝ */
--border: rgba(100, 170, 136, 0.15); /* ์๋ฃ ๊ทธ๋ฆฐ ๋ณด๋ */
--text-primary: #66aa88; /* ์๋ฃ ๊ทธ๋ฆฐ ํ
์คํธ */
--text-secondary: #556; /* ํ์ ๋ณด์กฐ ํ
์คํธ */
--text-data: #aabbcc; /* ๋ฐ์ดํฐ ๊ฐ */
--accent-active: #00ffaa; /* ์ ํ/ํ์ฑ ํ์ด๋ผ์ดํธ */
--scan-line: rgba(255, 255, 255, 0.04); /* ์ค์บ๋ผ์ธ ์ค๋ฒ๋ ์ด */
/* Mode-specific Colors (T1=Topology, T2=Tensor, fMRI=functional MRI, DTI=Data Tractography, FLAIR=Feature-Level Anomaly) */
--t1-base: #8899aa; --t1-accent: #e0e0e0;
--t2-base: #4488cc; --t2-accent: #aaccee;
--fmri-cold: #1a2a5a; --fmri-warm: #cc8830; --fmri-hot: #ff4420;
--dti-green: #44ddaa; --dti-purple: #8866ff;
--flair-normal:#334; --flair-hot: #ff4466;
/* Typography โ Monospace only */
--font-primary: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace;
--font-size-xs: 9px; /* ๋ก๊ทธ, ๋ฒ๋ก */
--font-size-sm: 10px; /* ๋ผ๋ฒจ, ํญ */
--font-size-md: 11px; /* ๋ณธ๋ฌธ ๋ฐ์ดํฐ */
--font-size-lg: 14px; /* ํ์ดํ */
ํ์ ๋น์ฃผ์ผ ์์:
- ์ค์บ๋ผ์ธ ์ค๋ฒ๋ ์ด โ ์บ๋ฒ์ค ์์ 1px ๊ฐ๊ฒฉ์ ์ํ์ . opacity 0.03~0.05. CRT ๋ชจ๋ํฐ ๋๋
- DICOM ํค๋ โ ์บ๋ฒ์ค ์๋จ์ ์๋ฃ ์์ ์คํ์ผ์ ๋ฉํ๋ฐ์ดํฐ (๋ชจ๋ธ๋ช , ์ํ์ค, ๋ ์ง/์๊ฐ, FOV, "Model Resonance Imaging" ํ๊ธฐ)
- Vignette ํจ๊ณผ โ ์บ๋ฒ์ค ๊ฐ์ฅ์๋ฆฌ๊ฐ ์ด์ง ์ด๋์์ง๋ ํจ๊ณผ
- Pulse ์ ๋๋ฉ์ด์ โ fMRI ๋ชจ๋์์ ํ์ฑํ๋ ๋ด๋ฐ์ ํฌ๊ธฐ์ ๋ฐ๊ธฐ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฏธ์ธํ๊ฒ ๋ณ๋
- Flow ์ ๋๋ฉ์ด์ โ DTI ๋ชจ๋์์ ์ฐ๊ฒฐ์ ์ ๋ฐ๋ผ ์์ ์ ์/๋ฐ๊ธฐ๊ฐ ํ๋ฅด๋ ํจ๊ณผ
5.3 Canvas ๋ ๋๋ง ์ฌ์
๋ด๋ฐ(๋ ธ๋) ๋ ๋๋ง
๊ฐ ๋ด๋ฐ์ ์(circle)์ผ๋ก ํํ.
์์น ๊ฒฐ์ :
- Y์ถ: ๋ ์ด์ด ์์ (์๋จ = embedding, ํ๋จ = output)
- X์ถ: ๊ฐ์ ๋ ์ด์ด ๋ด ๋ด๋ฐ๋ค์ด ์ํ์ผ๋ก ๋ถํฌ
- ๋ ์ด์ด ๊ฐ ๊ฐ๊ฒฉ: 60~80px
- ๋ด๋ฐ ๊ฐ ๊ฐ๊ฒฉ: ๋ ์ด์ด ๋ด ๋ด๋ฐ ์์ ๋ฐ๋ผ ์๋ ์กฐ์
ํฌ๊ธฐ ๊ฒฐ์ (๋ชจ๋๋ณ):
- T1: ํ๋ผ๋ฏธํฐ ์์ ๋น๋ก (4~10px ๋ฐ์ง๋ฆ)
- T2: weight magnitude์ ๋น๋ก
- fMRI: base ํฌ๊ธฐ ร (0.5 + activation ร 1.0) ร pulse_factor
- DTI: ์ผ์ ํฌ๊ธฐ, ์์์ผ๋ก ๋ฐฉํฅ ์ธ์ฝ๋ฉ
- FLAIR: ์ ์=์๊ฒ, ์ด์=ํฌ๊ฒ + ํ์ค
์์ ๊ฒฐ์ (๋ชจ๋๋ณ):
- T1: ๊ทธ๋ ์ด์ค์ผ์ผ (rgb(v,v,v+10), v = 160~220)
- T2: ๋ธ๋ฃจ ์ค์ผ์ผ (weight ์์ผ๋ฉด ์ด๋์ด ๋จ์, ํฌ๋ฉด ๋ฐ์ ํ๋์)
- fMRI: cool-to-hot colormap
- activation < 0.3: ์ด๋์ด ํ๋ rgb(30+a*80, 30+a*100, 80+a*120)
- activation 0.3~0.6: ๋
ธ๋/์ฃผํฉ rgb(a*200, a*160, 40+a*60)
- activation > 0.6: ๋นจ๊ฐ/ํฐ rgb(200+a*55, a*120, a*30)
- DTI: HSL, hue = (x/width)*120 + (y/height)*120, saturation 70%, lightness 55%
- FLAIR: ์ ์=rgb(60,65,75), ์ด์=rgb(255, 50+a*60, 80+a*40) ํ์ค
์ฐ๊ฒฐ(์ฃ์ง) ๋ ๋๋ง
์ฐ๊ฒฐ์ ๋ ์ด์ด ๊ฐ ์ ๋ณด ํ๋ฆ์ ํํ.
๋ชจ๋๋ณ ํํ:
- T1: ์์ ํ์ ์ (opacity 0.15, width 0.5)
- T2: weight ํฌ๊ธฐ์ ๋ฐ๋ผ opacity์ ๋๊ป ๋ณํ
- fMRI: ์๋ ๋ด๋ฐ์ ํ๊ท activation์ ๋ฐ๋ผ ์์/๋๊ป ๋ณํ
- ๋์ activation: ํซ ์ปฌ๋ฌ, ๊ตต์ ์
- ๋ฎ์ activation: ๊ฑฐ์ ํฌ๋ช
- DTI: ์ ์๋ฏธํ pathway๋ง ํ์
- ๊ณก์ (quadratic bezier) ์ฌ์ฉ
- ๋ฐฉํฅ์ ๋ฐ๋ฅธ HSL ์์
- flow ์ ๋๋ฉ์ด์
(sin wave๋ก opacity ๋ณ๋)
- ๋น-pathway ์ฐ๊ฒฐ์ ๊ฑฐ์ ํฌ๋ช
- FLAIR: ์ด์ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ์ฃ์ง๋ง ๋นจ๊ฐ์ ํ์ด๋ผ์ดํธ
ํ ํด๋ก์ง ๋ ์ด์์ ์ต์ (Phase 2 ์ดํ)
MVP: ์์ง ๋ ์ด์ด ์คํ (์โ์๋)
Phase 2: ์ฌ์ฉ์๊ฐ ๋ ์ด์์ ๋ชจ๋๋ฅผ ์ ํ ๊ฐ๋ฅ
- Stack (๊ธฐ๋ณธ): ์์ง ๋ ์ด์ด ์คํ
- Brain: ํ์ํ ๋ ๋ชจ์์ผ๋ก ๊ฐ์ธ์ ๋ฐฐ์น (์ฝ๋ฅดํฐ์ปฌ ๋งคํ ๋น์ )
- Network: force-directed ๊ทธ๋ํ (D3 force simulation)
- Radial: ์ค์ฌ์์ ๋ฐ๊นฅ์ผ๋ก ๋ ์ด์ด๊ฐ ํ์ฅ
5.4 ์ธํฐ๋์ ์ฌ์
๋ด๋ฐ ์ ํ (Stimulation Mode)
1. ๋ด๋ฐ ํด๋ฆญ โ ์ ํ ์ํ ์ง์
2. ์ ํ๋ ๋ด๋ฐ ์ฃผ์์ ๋์ฌ์ ์ ๋๋ฉ์ด์
(green glow)
3. ์ฐ์ธก ํจ๋์ ์์ธ ์ ๋ณด ํ์:
- Node ID (layer.component.index)
- Layer type (attention / mlp / embedding / output)
- ํ์ฌ ๋ชจ๋์ ์ฃผ์ ๊ฐ (activation, weight, anomaly score)
- Top-k ์ฐ๊ฒฐ๋ ๋ด๋ฐ (๊ฐ์ฅ ๊ฐํ ์ฐ๊ฒฐ)
4. Perturbation ๋ฒํผ ํ์ฑํ:
- Zero-out: ํด๋น ์ปดํฌ๋ํธ ์ถ๋ ฅ์ 0์ผ๋ก
- Amplify 2ร: ์ถ๋ ฅ์ 2๋ฐฐ๋ก
- Invert: ์ถ๋ ฅ ๋ถํธ ๋ฐ์
- Noise ยฑฯ: ๊ฐ์ฐ์์ ๋
ธ์ด์ฆ ์ถ๊ฐ
- Ablate: ์์ ์ ๊ฑฐ (zero + gradient ์ฐจ๋จ)
5. Perturbation ์ ์ฉ ์:
- ๋ฐฑ์๋์ perturbation ์์ฒญ โ ์๋ก์ด activation ์์
- ์บ๋ฒ์ค ์ ์ฒด๊ฐ 0.3์ด๊ฐ ์ฌ์ค์บ ์ ๋๋ฉ์ด์
- ๋ณํ๋ ๋ถ๋ถ์ด ์ ์ ํ์ด๋ผ์ดํธ
- ์ฐ์ธก Comparison Panel์ before/after ํ์
ํ๋กฌํํธ ์ ๋ ฅ & ์ค์บ
1. ํ๋กฌํํธ ์
๋ ฅ โ SCAN ๋ฒํผ ํด๋ฆญ (๋๋ Enter)
2. ์ค์บ ํ๋ก๊ทธ๋ ์ค ๋ฐ ํ์ (์ค์ ๋ฐฑ์๋ ์ฒ๋ฆฌ ์๊ฐ ๋ฐ์)
3. WebSocket์ผ๋ก ํ ํฐ๋ณ activation ์คํธ๋ฆฌ๋ฐ
4. ํ ํฐ step-through ๊ฐ๋ฅ:
- ํ๋กฌํํธ ์์ญ์ ๊ฐ ํ ํฐ์ด ์นฉ(chip)์ผ๋ก ํ์
- ํ ํฐ ์นฉ ํด๋ฆญ โ ํด๋น ํ ํฐ ์์ ์ activation๋ง ํ์
- โ โ ํ์ดํ๋ก ํ ํฐ ๊ฐ ์ด๋
- ์๋ ์ฌ์ (0.5์ด ๊ฐ๊ฒฉ)
๋ชจ๋ ์ ํ
1. ๋ชจ๋ ํญ ํด๋ฆญ โ 0.3์ด ํฌ๋ก์คํ์ด๋ ์ ํ
2. ๋์ผํ ํ ํด๋ก์ง(๋ด๋ฐ ์์น)๋ฅผ ์ ์งํ๋ฉด์ ์์/ํฌ๊ธฐ/์ฐ๊ฒฐ ํํ๋ง ๋ณ๊ฒฝ
3. ์ด๋ ์ค์ MRI์์ ๊ฐ์ ํ์์ T1โfMRI ์ ํ๊ณผ ๋์ผํ ๊ฒฝํ
5.5 ๋ฐ์ํ ๊ณ ๋ ค์ฌํญ
- ์ต์ ์ง์ ํด์๋: 1280ร720
- ๊ถ์ฅ ํด์๋: 1920ร1080
- ์บ๋ฒ์ค ํฌ๊ธฐ: ์ปจํ
์ด๋์ ๋ง๊ฒ ์ค์ผ์ผ๋ง (SVG viewBox ์ฌ์ฉ)
- ๋ชจ๋ฐ์ผ: ๋ฏธ์ง์ (๋ฐ์คํฌํฑ ์ ์ฉ ๋๊ตฌ)
6. Backend Specification
6.1 ๋ชจ๋ธ ๋งค๋์ (ModelManager)
class ModelManager:
"""๋ชจ๋ธ ๋ก๋ฉ, ์ค์, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ"""
def load_model(self, model_id: str, device: str = "auto") -> ModelInfo:
"""
HuggingFace ๋ชจ๋ธ์ TransformerLens HookedTransformer๋ก ๋ก๋.
- model_id: "gpt2", "EleutherAI/pythia-1.4b", "meta-llama/Llama-3.2-3B" ๋ฑ
- device: "cpu", "cuda", "mps", "auto"
- ๋ฐํ: ๋ชจ๋ธ ๋ฉํ๋ฐ์ดํฐ (๋ ์ด์ด ์, hidden size, head ์ ๋ฑ)
"""
def unload_model(self) -> None:
"""ํ์ฌ ๋ชจ๋ธ ์ธ๋ก๋ + GPU ๋ฉ๋ชจ๋ฆฌ ํด์ (gc + torch.cuda.empty_cache)"""
def get_model_info(self) -> ModelInfo:
"""ํ์ฌ ๋ก๋๋ ๋ชจ๋ธ์ ์ํคํ
์ฒ ์ ๋ณด ๋ฐํ (T1 ๋ฐ์ดํฐ)"""
def get_model(self) -> HookedTransformer:
"""ํ์ฌ ๋ก๋๋ ๋ชจ๋ธ ์ธ์คํด์ค ๋ฐํ"""
6.2 ๋ถ์ ์์ง (AnalysisEngine)
class AnalysisEngine:
"""๊ฐ ์ค์บ ๋ชจ๋์ ๋ํ ๋ถ์ ์ํ"""
def scan_structural(self) -> StructuralData:
"""T1: model.cfg์์ ์ ์ ๊ตฌ์กฐ ์ถ์ถ"""
def scan_weights(self, layers: list[str] | None = None) -> WeightData:
"""T2: state_dict์์ weight ํต๊ณ ์ถ์ถ"""
def scan_activation(self, prompt: str, **kwargs) -> ActivationData:
"""
fMRI: prompt์ ๋ํ activation ์บ์.
TransformerLens run_with_cache() ์ฌ์ฉ.
ํต์ฌ ๊ตฌํ:
logits, cache = model.run_with_cache(prompt)
์ถ์ถ ๋์ hook points:
- hook_embed: ์๋ฒ ๋ฉ ๋ ์ด์ด
- blocks.{i}.hook_resid_pre: ๊ฐ ๋ธ๋ก ์
๋ ฅ residual
- blocks.{i}.attn.hook_result: attention ์ถ๋ ฅ
- blocks.{i}.hook_mlp_out: MLP ์ถ๋ ฅ
- blocks.{i}.hook_resid_post: ๊ฐ ๋ธ๋ก ์ถ๋ ฅ residual
aggregation ์ต์
:
- "l2_norm": L2 norm per position (์ค์นผ๋ผ)
- "max": max absolute value
- "mean": mean absolute value
- "raw": ์ ์ฒด ํ
์ ๋ฐํ (๋์ฉ๋, ์ ํ์ )
"""
def scan_circuits(self, prompt: str, target_token: int = -1) -> CircuitData:
"""
DTI: attention pattern + attribution ๊ฒฝ๋ก ์ถ์ถ.
(1) Attention Pattern:
_, cache = model.run_with_cache(prompt)
attn_patterns = cache["blocks.{i}.attn.hook_pattern"]
โ shape: [num_heads, seq_len, seq_len]
(2) Attribution (๊ฐ์ด ๋ฒ์ ):
๊ฐ head/mlp์ ์ถ๋ ฅ์ zero-out ํ์ ๋ target logit ๋ณํ๋ ๊ณ์ฐ.
โ ์ ๋๊ฐ์ด ํฐ ์ปดํฌ๋ํธ = ์ค์ ๊ฒฝ๋ก
"""
def scan_anomaly(self, prompt: str) -> AnomalyData:
"""
FLAIR: ์ด์ ํ์ง.
(1) Logit Lens:
๊ฐ ์ค๊ฐ ๋ ์ด์ด์ residual stream์ unembedํ์ฌ
์ค๊ฐ ์์ธก vs ์ต์ข
์์ธก์ KL divergence ๊ณ์ฐ.
ํฐ divergence = ํด๋น ๋ ์ด์ด์์ "์๊ฐ์ด ํฌ๊ฒ ๋ฐ๋" = ์ ์ฌ์ ์ด์
(2) Entropy:
๊ฐ ์์น์ logit์์ softmax โ entropy ๊ณ์ฐ.
๋์ entropy = ๋ชจ๋ธ์ด ๋ถํ์ค = ํ ๋ฃจ์๋ค์ด์
์ํ
(3) ์ด์ ์ ์:
anomaly_score = ฮฑ * normalized_kl_div + ฮฒ * normalized_entropy
ฮฑ = 0.6, ฮฒ = 0.4 (ํ๋ ๊ฐ๋ฅ)
"""
6.3 Perturbation ์์ง (PerturbationEngine)
class PerturbationEngine:
"""๋ชจ๋ธ ๋ด๋ถ์ ์๊ทน/๋ณํ์ ๊ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ต"""
def zero_out(self, component: str, prompt: str) -> PerturbResult:
"""
ํน์ ์ปดํฌ๋ํธ์ ์ถ๋ ฅ์ 0์ผ๋ก ๋ง๋ค๊ณ ์ฌ์คํ.
๊ตฌํ:
def zero_hook(value, hook):
value[:, :, :] = 0 # ๋๋ ํน์ head๋ง
return value
model.run_with_hooks(prompt, fwd_hooks=[(component, zero_hook)])
"""
def amplify(self, component: str, factor: float, prompt: str) -> PerturbResult:
"""์ถ๋ ฅ์ factor๋ฅผ ๊ณฑํ์ฌ ์ฆํญ"""
def ablate(self, component: str, prompt: str) -> PerturbResult:
"""์ปดํฌ๋ํธ๋ฅผ ์์ ํ ์ ๊ฑฐ (mean ablation: ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด)"""
def inject_activation(self, component: str, values: list, prompt: str) -> PerturbResult:
"""ํน์ activation ๊ฐ์ ์ง์ ์ฃผ์
"""
def activation_patch(
self,
clean_prompt: str,
corrupt_prompt: str,
component: str
) -> PatchResult:
"""
Activation Patching (Causal Tracing).
clean_prompt์ ํน์ ์ปดํฌ๋ํธ activation์
corrupt_prompt ์คํ ์ค์ ๊ต์ฒดํ์ฌ ๋ณต๊ตฌ ์ ๋๋ฅผ ์ธก์ .
๊ตฌํ:
_, clean_cache = model.run_with_cache(clean_prompt)
clean_activation = clean_cache[component]
def patch_hook(value, hook):
value[:] = clean_activation
return value
patched_logits = model.run_with_hooks(
corrupt_prompt,
fwd_hooks=[(component, patch_hook)]
)
recovery = (patched_logit - corrupt_logit) / (clean_logit - corrupt_logit)
"""
def compare_results(self, original: Logits, perturbed: Logits) -> ComparisonData:
"""์๋ณธ๊ณผ ๋ณํ ๊ฒฐ๊ณผ ๋น๊ต: top-k ์์ธก, logit diff, KL divergence"""
6.4 ๋ฐ์ดํฐ ์์ฝ ์ ๋ต
๋์ฉ๋ ํ ์๋ฅผ ํ๋ก ํธ์๋๋ก ์ ์กํ ๋์ ์์ฝ ์ ๋ต:
๋ฌธ์ : GPT-2 small๋ง ํด๋ ๋จ์ผ ํ๋กฌํํธ์ ๋ํ ์ ์ฒด activation cache๊ฐ ์๋ฐฑMB.
ํด๊ฒฐ:
1. ๊ธฐ๋ณธ ์๋ต: ๋ ์ด์ด๋ณ/head๋ณ ์์ฝ ํต๊ณ๋ง ์ ์ก (L2 norm, max, mean โ ์ค์นผ๋ผ ๋ฐฐ์ด)
2. ์จ๋๋งจ๋: ์ฌ์ฉ์๊ฐ ํน์ ๋ ์ด์ด/head๋ฅผ ์ ํํ๋ฉด ํด๋น ๋ถ๋ถ๋ง ์์ธ ๋ฐ์ดํฐ ์ ์ก
3. ์ดํ
์
ํจํด: full attention matrix๋ ์์ฒญ ์์๋ง ์ ์ก (shape: [heads, seq, seq])
4. ์คํธ๋ฆฌ๋ฐ: ํ ํฐ๋ณ step-through ์ ๊ฐ ํ ํฐ์ ๋ฐ์ดํฐ๋ง ์ฆ๋ถ ์ ์ก
5. ์บ์ฑ: ๋์ผ ํ๋กฌํํธ์ ๋ํ ์บ์๋ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด (LRU, ์ต๋ 5๊ฐ ํ๋กฌํํธ)
7. Implementation Phases
Phase 0: Foundation (1~2์ฃผ)
๋ชฉํ: ํ๋ก์ ํธ ๊ตฌ์กฐ ์
์
+ GPT-2 small๋ก T1/T2 ๋ชจ๋ ์๋
Backend:
- [ ] FastAPI ํ๋ก์ ํธ ์
์
(poetry/uv ๊ธฐ๋ฐ dependency ๊ด๋ฆฌ)
- [ ] ModelManager ๊ตฌํ (GPT-2 small ๋ก๋)
- [ ] scan_structural() ๊ตฌํ โ T1 ๋ฐ์ดํฐ ๋ฐํ
- [ ] scan_weights() ๊ตฌํ โ T2 ๋ฐ์ดํฐ ๋ฐํ
- [ ] ๊ธฐ๋ณธ REST API ์๋ํฌ์ธํธ (/model/load, /model/info, /scan/structural, /scan/weights)
Frontend:
- [ ] Vite + React ํ๋ก์ ํธ ์
์
- [ ] DICOM ํ
๋ง CSS ๋ณ์ ์ ์
- [ ] ๊ธฐ๋ณธ ๋ ์ด์์ ๊ตฌํ (Top Bar, Mode Tabs, Canvas, Panels)
- [ ] T1 Canvas ๋ ๋๋ง: ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ๋
ธ๋/์ฃ์ง๋ก ์๊ฐํ
- [ ] T2 Canvas ๋ ๋๋ง: weight ํํธ๋งต
- [ ] Model selector dropdown
ํ
์คํธ:
- [ ] GPT-2 small ๋ก๋ โ T1 ๋ฐ์ดํฐ ํ์ โ T2 ๋ชจ๋ ์ ํ ๊ฒ์ฆ
Phase 1: Core Scanning (2~3์ฃผ)
๋ชฉํ: fMRI + DTI ๋ชจ๋ ์๋. ํ๋กฌํํธ ์
๋ ฅ โ activation ์๊ฐํ
Backend:
- [ ] TransformerLens ํตํฉ (HookedTransformer.from_pretrained)
- [ ] scan_activation() ๊ตฌํ โ fMRI ๋ฐ์ดํฐ ๋ฐํ
- [ ] scan_circuits() ๊ตฌํ โ DTI ๋ฐ์ดํฐ ๋ฐํ
- [ ] WebSocket ์๋ํฌ์ธํธ (ํ ํฐ๋ณ activation ์คํธ๋ฆฌ๋ฐ)
- [ ] ๋ฐ์ดํฐ ์์ฝ/์ง๋ ฌํ ํ์ดํ๋ผ์ธ (orjson)
Frontend:
- [ ] fMRI Canvas: cool-to-hot ์ปฌ๋ฌ๋งต, ํ์ค ์ ๋๋ฉ์ด์
- [ ] DTI Canvas: ๊ณก์ ๊ฒฝ๋ก, ๋ฐฉํฅ๋ณ ์์, flow ์ ๋๋ฉ์ด์
- [ ] Prompt ์
๋ ฅ UI + SCAN ๋ฒํผ + ํ๋ก๊ทธ๋ ์ค ๋ฐ
- [ ] ํ ํฐ step-through UI (ํ ํฐ ์นฉ + ํ์ดํ ๋ด๋น๊ฒ์ด์
)
- [ ] Layer Summary ๋ฐ ์ฐจํธ (๋ชจ๋๋ณ ์ ์)
- [ ] WebSocket ์ฐ๊ฒฐ + ์ค์๊ฐ ์
๋ฐ์ดํธ
ํ
์คํธ:
- [ ] "The capital of France is" โ fMRI์์ "France" ํ ํฐ ์ ๊ด๋ จ ๋ด๋ฐ ํ์ฑํ ํ์ธ
- [ ] DTI์์ ์ ์๋ฏธํ information flow ๊ฒฝ๋ก ์๊ฐํ ํ์ธ
Phase 2: Perturbation + FLAIR (2~3์ฃผ)
๋ชฉํ: ์๊ทน/๋ณํ ์คํ + ์ด์ ํ์ง
Backend:
- [ ] PerturbationEngine ์ ์ฒด ๊ตฌํ (zero, amplify, ablate, inject, patch)
- [ ] scan_anomaly() ๊ตฌํ (logit lens + entropy)
- [ ] compare_results() ๊ตฌํ (before/after ๋น๊ต)
- [ ] Activation patching (causal tracing) ๊ตฌํ
Frontend:
- [ ] FLAIR Canvas: ์ด์ ์์ญ ํ์ด๋ผ์ดํธ, ํ์ค ์ ๋๋ฉ์ด์
- [ ] Stimulation Panel: ๋ด๋ฐ ํด๋ฆญ โ ์์ธ ์ ๋ณด + perturbation ๋ฒํผ
- [ ] Comparison Panel: ์๋ณธ vs ๋ณํ ๊ฒฐ๊ณผ ๋๋ํ ํ์
- [ ] Perturbation ์ ์ฉ ์ ์ฌ์ค์บ ์ ๋๋ฉ์ด์
- [ ] Reset ๊ธฐ๋ฅ (๋ชจ๋ perturbation ์ด๊ธฐํ)
- [ ] ์ค์บ๋ผ์ธ ์ค๋ฒ๋ ์ด + vignette ํจ๊ณผ
ํ
์คํธ:
- [ ] ํน์ attention head zero-out โ ์์ธก ๋ณํ ํ์ธ
- [ ] "The Eiffel Tower is in" โ ์ฌ์ค ๊ด๋ จ ์ปดํฌ๋ํธ ablation โ ํ ๋ฃจ์๋ค์ด์
์ ๋ ํ์ธ
- [ ] FLAIR์์ entropy๊ฐ ๋์ ์์น๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ด๋ผ์ดํธ๋๋์ง ํ์ธ
Phase 3: Polish + Multi-Model (2์ฃผ)
๋ชฉํ: ๋ค์ค ๋ชจ๋ธ ์ง์ + UX ์์ฑ
Backend:
- [ ] Pythia-1.4B, Gemma-2-2B ์ง์ ์ถ๊ฐ ๋ฐ ํ
์คํธ
- [ ] Llama-3.2-3B ์ง์ (TransformerLens ํธํ์ฑ ํ์ธ, ํ์ ์ nnsight ๋์ฒด)
- [ ] ๋ชจ๋ธ ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ต์ ํ
- [ ] API ์๋ต ์บ์ฑ ๋ ์ด์ด
Frontend:
- [ ] ๋ชจ๋ ์ ํ ํฌ๋ก์คํ์ด๋ ์ ๋๋ฉ์ด์
- [ ] ๋ด๋ฐ ํธ๋ฒ ํดํ
- [ ] ์ ์ฒด ์ค์บ๋ผ์ธ + CRT ๋ฏธํ ์์ฑ
- [ ] ์ฑ๋ฅ ์ต์ ํ (large graph์์ 60fps ์ ์ง)
- [ ] ์๋ฌ/๋ก๋ฉ ์ํ UX
ํ
์คํธ:
- [ ] ๋ชจ๋ธ ๊ฐ ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ ํ์ธ
- [ ] 3B ๋ชจ๋ธ์์ ์ ์ฒด ์ค์บ ํ์ดํ๋ผ์ธ e2e ํ์ธ
Phase 4: Advanced Features (ํฅํ)
- [ ] SAE Feature ํ์๊ธฐ (SAELens ํตํฉ)
- [ ] Brain ๋ ์ด์์ ๋ชจ๋ (์ฝ๋ฅดํฐ์ปฌ ๋งคํ)
- [ ] Multi-prompt ๋น๊ต (๊ฐ์ ๋ชจ๋ธ์ ๋ค๋ฅธ ์
๋ ฅ ์ activation ์ฐจ์ด)
- [ ] ์๊ณ์ด ๋
นํ/์ฌ์ (์ค์บ ์ธ์
์ ์ฅ)
- [ ] Export: ์ค์บ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฏธ์ง/์์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ
- [ ] ํ์
: ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ค์บ ์ธ์
์ ๊ณต์
- [ ] ์๋ ์ง๋จ: "์ด ๋ชจ๋ธ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค" ๋ณด๊ณ ์ ์์ฑ
8. Development Environment
8.1 ํ์ ์๊ตฌ์ฌํญ
- Python 3.11+
- Node.js 20+
- GPU: NVIDIA GPU with 8GB+ VRAM (๊ถ์ฅ). CPU ์ ์ฉ๋ ๊ฐ๋ฅ (GPT-2 small ํ์ )
- CUDA 12.x (GPU ์ฌ์ฉ ์)
- ๋ฉ๋ชจ๋ฆฌ: 16GB+ RAM
8.2 Backend ์์กด์ฑ
[project]
name = "neural-mri"
requires-python = ">=3.11"
dependencies = [
"fastapi>=0.110",
"uvicorn[standard]>=0.27",
"websockets>=12.0",
"transformer-lens>=2.0",
"torch>=2.2",
"transformers>=4.40",
"accelerate>=0.28",
"sae-lens>=3.0", # Phase 2
"orjson>=3.9",
"numpy>=1.26",
"pydantic>=2.6",
]
8.3 Frontend ์์กด์ฑ
{
"dependencies": {
"react": "^18.3",
"react-dom": "^18.3",
"d3": "^7.9",
"zustand": "^4.5",
"use-websocket": "^4.8"
},
"devDependencies": {
"vite": "^5.4",
"@vitejs/plugin-react": "^4.2",
"tailwindcss": "^3.4",
"autoprefixer": "^10.4",
"postcss": "^8.4"
}
}
8.4 ํ๋ก์ ํธ ๊ตฌ์กฐ
neural-mri/
โโโ README.md
โโโ docker-compose.yml
โ
โโโ backend/
โ โโโ pyproject.toml
โ โโโ neural_mri/
โ โ โโโ __init__.py
โ โ โโโ main.py # FastAPI app entry
โ โ โโโ config.py # ์ค์ (๋ชจ๋ธ ๊ฒฝ๋ก, ์บ์, GPU)
โ โ โโโ api/
โ โ โ โโโ __init__.py
โ โ โ โโโ routes_model.py # /api/model/* ๋ผ์ฐํธ
โ โ โ โโโ routes_scan.py # /api/scan/* ๋ผ์ฐํธ
โ โ โ โโโ routes_perturb.py # /api/perturb/* ๋ผ์ฐํธ
โ โ โ โโโ ws_stream.py # WebSocket ํธ๋ค๋ฌ
โ โ โโโ core/
โ โ โ โโโ __init__.py
โ โ โ โโโ model_manager.py
โ โ โ โโโ analysis_engine.py
โ โ โ โโโ perturbation_engine.py
โ โ โโโ schemas/
โ โ โ โโโ __init__.py
โ โ โ โโโ model.py # ModelInfo, ModelConfig
โ โ โ โโโ scan.py # ActivationData, CircuitData ๋ฑ
โ โ โ โโโ perturb.py # PerturbResult, PatchResult
โ โ โโโ utils/
โ โ โโโ __init__.py
โ โ โโโ tensor_summary.py # ํ
์ โ ์์ฝ ๋ณํ
โ โ โโโ serialization.py # orjson ์ปค์คํ
์ง๋ ฌํ
โ โโโ tests/
โ โโโ test_model_manager.py
โ โโโ test_analysis.py
โ โโโ test_perturbation.py
โ
โโโ frontend/
โ โโโ package.json
โ โโโ vite.config.js
โ โโโ tailwind.config.js
โ โโโ index.html
โ โโโ src/
โ โ โโโ main.jsx
โ โ โโโ App.jsx
โ โ โโโ theme/
โ โ โ โโโ variables.css # DICOM ํ
๋ง CSS ๋ณ์
โ โ โ โโโ globals.css
โ โ โโโ store/
โ โ โ โโโ useModelStore.js
โ โ โ โโโ useScanStore.js
โ โ โ โโโ usePerturbStore.js
โ โ โโโ components/
โ โ โ โโโ TopBar.jsx
โ โ โ โโโ ModeTabs.jsx
โ โ โ โโโ DicomHeader.jsx
โ โ โ โโโ ScanCanvas/
โ โ โ โ โโโ ScanCanvas.jsx # ๋ฉ์ธ SVG ์บ๋ฒ์ค
โ โ โ โ โโโ NeuronRenderer.jsx # ๋ด๋ฐ ๋ ๋๋ง ๋ก์ง
โ โ โ โ โโโ ConnectionRenderer.jsx # ์ฃ์ง ๋ ๋๋ง ๋ก์ง
โ โ โ โ โโโ ScanLineOverlay.jsx # CRT ์ค์บ๋ผ์ธ
โ โ โ โ โโโ colorMaps.js # ๋ชจ๋๋ณ ์์ ํจ์
โ โ โ โโโ Panels/
โ โ โ โ โโโ LayerSummary.jsx # ๋ ์ด์ด๋ณ ๋ง๋ ์ฐจํธ
โ โ โ โ โโโ StimPanel.jsx # ๋ด๋ฐ ์ ํ + perturbation
โ โ โ โ โโโ ComparisonPanel.jsx # before/after ๋น๊ต
โ โ โ โ โโโ LogPanel.jsx # ํ๋จ ๋ก๊ทธ
โ โ โ โโโ PromptInput.jsx
โ โ โ โโโ TokenStepper.jsx # ํ ํฐ๋ณ step-through
โ โ โโโ hooks/
โ โ โ โโโ useWebSocket.js
โ โ โ โโโ useAnimationFrame.js
โ โ โโโ api/
โ โ โโโ client.js # REST API ํด๋ผ์ด์ธํธ
โ โ โโโ ws.js # WebSocket ํด๋ผ์ด์ธํธ
โ โโโ public/
โ โโโ fonts/ # JetBrains Mono
โ
โโโ docs/
โโโ SPEC.md # ์ด ๋ฌธ์
โโโ API.md # API ์์ธ ๋ฌธ์
โโโ ARCHITECTURE.md # ์ํคํ
์ฒ ๋ค์ด์ด๊ทธ๋จ
9. Key Technical Decisions & Risks
9.1 TransformerLens ํธํ์ฑ
๋ฆฌ์คํฌ: TransformerLens๋ GPT-2, Pythia ๋ฑ ์ผ๋ถ ๋ชจ๋ธ๋ง ๊ณต์ ์ง์.
Llama, Qwen ๋ฑ์ ์ปค๋ฎค๋ํฐ ๊ตฌํ์ ์์กดํ๋ฉฐ ๋ฒ์ ์ ๋ฐ๋ผ ๊นจ์ง ์ ์์.
๋์:
1. MVP๋ GPT-2 small/medium + Pythia๋ก ์์ (ํ์คํ ์ง์)
2. ์ ๋ชจ๋ธ ์ถ๊ฐ ์ from_pretrained() ํธํ์ฑ ํ
์คํธ ์คํฌ๋ฆฝํธ ์์ฑ
3. TransformerLens ๋ฏธ์ง์ ๋ชจ๋ธ์ nnsight ๋ฐฑ์๋๋ก ํด๋ฐฑ
4. ๋ชจ๋ธ๋ณ hook point ์ด๋ฆ์ด ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ถ์ํ ๋ ์ด์ด ํ์
9.2 ์ฑ๋ฅ
๋ฆฌ์คํฌ: 3B+ ๋ชจ๋ธ์ full activation cache๊ฐ ์GB์ ๋ฌํ ์ ์์.
๋์:
1. ์์ฝ ์ฐ์ ์ ๋ต: ์ ์ฒด ํ
์ ๋์ per-layer/per-head ํต๊ณ๋ง ๊ธฐ๋ณธ ์ ์ก
2. Lazy loading: ์ฌ์ฉ์๊ฐ ํน์ ๋ ์ด์ด ์ ํ ์์๋ง ์์ธ ๋ฐ์ดํฐ ์ ์ก
3. ์๋ฒ์ฌ์ด๋ ์บ์ฑ: ๋์ผ ํ๋กฌํํธ์ ๋ํ ์บ์ ์ ์ง (LRU 5๊ฐ)
4. ํ ํฐ ์คํธ๋ฆฌ๋ฐ: ์ ์ฒด ์ํ์ค๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๋, ํ๋ก ํธ์๋์๋ ํ ํฐ๋ณ ์ ์ก
5. GPU ๋ฉ๋ชจ๋ฆฌ: ๋ชจ๋ธ + ์บ์๊ฐ VRAM ์ด๊ณผ ์ ์๋์ผ๋ก CPU ์คํ๋ก๋
9.3 ์๊ฐํ ์ฑ๋ฅ
๋ฆฌ์คํฌ: ๋
ธ๋/์ฃ์ง๊ฐ ์๋ฐฑ ๊ฐ์ผ ๋ SVG ๋ ๋๋ง์ด ๋๋ ค์ง ์ ์์.
๋์:
1. ์ง์ฝ ํํ: ๊ฐ๋ณ ๋ด๋ฐ์ด ์๋ "head" ๋๋ "layer component" ๋จ์๋ก ๋
ธ๋ ํํ
(GPT-2 small: 12 layers ร 3 components = ~36 nodes + embedding + output)
2. Viewport culling: ํ๋ฉด์ ๋ณด์ด๋ ๋
ธ๋๋ง ๋ ๋๋ง
3. ์ฃ์ง ๊ฐ์ํ: ๋ชจ๋์ ๋ฐ๋ผ ๋นํ์ฑ ์ฃ์ง๋ฅผ ์์ ๋ ๋๋งํ์ง ์์
4. Canvas ์ ํ: SVG ์ฑ๋ฅ ํ๊ณ ์ WebGL (Three.js) ๋๋ Canvas 2D๋ก ์ ํ
9.4 Perturbation ์์ ์ฑ
๋ฆฌ์คํฌ: perturbation์ด ๋ชจ๋ธ weight ์์ฒด๋ฅผ ์์ ํ๋ฉด ๋ณต๊ตฌ๊ฐ ์ด๋ ค์.
๋์:
1. run_with_hooks()๋ง ์ฌ์ฉ: ๋ชจ๋ธ weight๋ ์ ๋ ์์ ํ์ง ์์. Hook์ผ๋ก activation๋ง ๋ณํ.
2. Reset ๋ฒํผ: ๋ชจ๋ hook์ ์ ๊ฑฐํ๊ณ ์๋ณธ ์ํ๋ก ๋ณต๊ท
3. ๋ชจ๋ perturbation์ stateless: ๊ฐ ์์ฒญ๋ง๋ค ์๋ก hook์ ์ค์
10. Success Metrics
MVP (Phase 0~2 ์๋ฃ ๊ธฐ์ค)
1. GPT-2 small์ ๋ํด 5๊ฐ ๋ชจ๋ ๋ชจ๋ ์๋
2. ํ๋กฌํํธ ์
๋ ฅ โ ์ค์บ ์๋ฃ๊น์ง 2์ด ์ด๋ด (GPU ๊ธฐ์ค)
3. ํ ํฐ step-through๊ฐ smoothํ๊ฒ ์๋ (ํ๋ ์ ๋๋กญ ์์ด)
4. perturbation ์ ์ฉ โ ๊ฒฐ๊ณผ ๋น๊ต๊ฐ 1์ด ์ด๋ด
5. ๋ชจ๋ ์ ํ ์ ํ ํด๋ก์ง ์ ์งํ๋ฉด์ 0.3์ด ์ด๋ด ์ ํ
ํ์ฅ (Phase 3 ์ดํ)
1. 3B ๋ชจ๋ธ์์ ์ ์ฒด ํ์ดํ๋ผ์ธ 5์ด ์ด๋ด
2. ์ต์ 3๊ฐ ์ด์์ ์คํ์์ค ๋ชจ๋ธ ์ง์
3. Activation patching (causal tracing) ์๊ฐํ๊ฐ ๋
ผ๋ฌธ Figure ์์ค
11. References
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- TransformerLens: https://github.com/TransformerLensOrg/TransformerLens
- SAELens: https://github.com/jbloomAus/SAELens
- nnsight: https://github.com/ndif-team/nnsight
ํต์ฌ ๋ ผ๋ฌธ/์๋ฃ
- Elhage et al. (2022) "Toy Models of Superposition" โ ์ค์ฒฉ(superposition) ์ด๋ก
- Wang et al. (2022) "Interpretability in the Wild: IOI Circuit" โ ํ๋ก ๋ถ์
- Meng et al. (2022) "ROME: Rank-One Model Editing" โ ์ฌ์ค ์ ์ฅ ์์น ์ถ์
- Anthropic (2024) "Scaling Monosemanticity" โ SAE feature ์ถ์ถ
- Neel Nanda's TransformerLens tutorials: https://neelnanda.io/
์๊ฐ
- 3D Slicer (์๋ฃ ์์ ์๊ฐํ): https://www.slicer.org/
- FreeSurfer (๋ ์์ ๋ถ์): https://surfer.nmr.mgh.harvard.edu/
- Neuronpedia (SAE feature ํ์๊ธฐ): https://www.neuronpedia.org/
End of Specification