







아래 논문은 IPE: Isolating Path Effects for Improving Latent Circuit Identification입니다. 핵심은 기존 circuit discovery가 edge 단위로 중요도를 계산하는 반면, 이 논문은 입력 임베딩 → 중간 컴포넌트들 → 최종 logits까지 이어지는 전체 computational path의 효과를 직접 분리해서 평가한다는 점입니다.
1. 문제의식
기존 방법들, 예를 들어 Activation Patching, Edge Activation Patching, ACDC, EAP는 보통 특정 노드나 edge를 patch/ablate해서 중요도를 계산합니다.
하지만 Transformer의 residual stream 구조에서는 한 노드가 여러 이전 컴포넌트의 정보를 동시에 받습니다. 따라서 특정 edge A → B를 ablate해도, 실제로는 B가 받은 다른 경로들의 영향까지 섞여 최종 logits에 반영됩니다.
논문은 이 문제를 다음처럼 봅니다.
“edge 하나의 효과”를 보려는 기존 방식은 실제로는 그 edge를 포함한 여러 path들의 혼합 효과를 측정한다.
그래서 IPE는 edge가 아니라 완전한 path를 단위로 봅니다.
예:
Input → MLP 0 → MLP 1 → Final logits
이 path만의 효과를 제거하거나 counterfactual 값으로 대체한 뒤, 최종 출력이 얼마나 변하는지를 측정합니다.
2. 핵심 아이디어: Path effect isolation
IPE는 특정 path를 따라 흐르는 message 변화량을 순차적으로 계산합니다.
논문에서 path를 다음처럼 둡니다.
a → b → c → d
각 노드의 함수는 이고, 각 노드 입력은 입니다.
2.1 Path ablation
path의 첫 노드 a의 출력을 제거하면:
이 변화량을 다음 노드 b의 입력에 반영합니다.
그 다음 c에도 반영합니다.
즉, path 전체를 한 번에 제거하는 것이 아니라, path를 따라 message delta를 전파합니다.
중요한 점은 b, c가 받는 다른 residual 정보는 그대로 두고, 선택된 path를 통해 전달되는 변화량만 추적한다는 것입니다.
3. IPE의 Path Evaluation 절차
IPE의 EvaluatePath는 다음과 같은 재귀적 절차입니다.
EvaluatePath(node, path, Δm):
if path is empty:
return Δm
corrupted_msg = node.forward(node.input + Δm)
clean_msg = node.forward(node.input)
Δm = corrupted_msg - clean_msg
next_node = path.pop()
return EvaluatePath(next_node, path, Δm)
즉, 각 노드에서:
- clean 입력
x로 출력 계산 - path에서 온 변화량
Δm을 더한 입력x + Δm으로 출력 계산 - 두 출력의 차이를 새로운
Δm으로 사용 - 다음 노드로 전달
이렇게 해서 마지막에는 최종 residual stream에서 해당 path가 제거되거나 대체되었을 때의 변화량을 얻습니다.
4. 두 가지 intervention 방식
논문은 IPE를 두 가지 방식으로 사용합니다.
4.1 IPE-Ablation
path의 첫 노드 출력을 0으로 제거합니다.
Δm_0 = - out_clean
이는 “이 path가 없었다면 logits이 어떻게 변했는가?”를 보는 방식입니다.
4.2 IPE-CF: Counterfactual Replacement
clean path의 출력을 counterfactual path의 출력으로 바꿉니다.
Δm_0 = - out_clean + out_counterfactual
즉, “이 path가 clean 입력이 아니라 counterfactual 입력에서 온 정보처럼 작동했다면 출력이 어떻게 변했는가?”를 봅니다.
IOI처럼 clean/counterfactual prompt가 명확한 task에서는 IPE-CF가 더 적합합니다.
5. Path scoring metric
논문은 두 가지 metric을 사용합니다.
5.1 Target Logit Difference
특정 정답 토큰 t의 logit 변화량을 봅니다.
LogitDifference =
100 × ( L(r_clean,t) - L(r_corr,t) ) / |L(r_clean,t)|
여기서 r_clean은 원래 residual stream, r_corr는 path intervention 후 residual stream입니다.
이 metric은 path를 제거했을 때 정답 logit이 얼마나 떨어지는지를 측정합니다.
5.2 Indirect Effect
Counterfactual 평가에서는 Indirect Effect를 사용합니다.
IE = 1/2 [
(P*(t_cf) - P(t_cf)) / P(t_cf)
+
(P(t) - P*(t)) / P*(t)
]
의미는 다음과 같습니다.
- counterfactual target
t_cf의 확률이 얼마나 증가했는가? - original answer
t의 확률이 얼마나 감소했는가?
즉, counterfactual path가 실제로 답을 counterfactual 방향으로 밀었는지를 측정합니다.
6. Search Algorithm: Backward Discovery
모든 path를 평가하는 것은 불가능합니다. Transformer에서 path 수는 layer와 component 수에 따라 지수적으로 증가합니다.
그래서 IPE는 top-down / backward search를 사용합니다.
시작점은 최종 logits입니다.
frontier = [LOGIT node]
completed = []
while frontier is not empty:
path = frontier.pop()
candidates = path.predecessors()
for node in candidates:
msg = EvaluatePath(node, path)
if Metric(msg) ≥ threshold:
if node is EMBED:
completed.append(node + path)
else:
frontier.append(node + path)
return completed
즉:
- logits에서 시작
- 이전 노드 후보들을 하나씩 붙임
- 현재 partial path의 contribution을 평가
- threshold 이상이면 path를 더 확장
- input embedding까지 도달하면 complete path로 저장
논문은 forward search도 고려했지만, partial path의 최종 효과를 정확히 평가하려면 downstream 전체 효과를 계산해야 해서 비효율적이라고 설명합니다. 그래서 backward search를 선택합니다.
7. 기존 EAP/ACDC와의 차이
| 구분 | 기존 Edge-centric 방식 | IPE |
|---|---|---|
| 평가 단위 | edge 또는 node | full path |
| 예 | MLP0 → MLP1 | Input → MLP0 → MLP1 → Logits |
| 문제점 | 다른 path 효과가 섞임 | 특정 path 효과만 분리 |
| 장점 | 빠르고 확장성 좋음 | 정보 흐름 해석이 더 정확함 |
| 단점 | path-level coherence 부족 | search cost가 큼 |
IPE의 핵심 장점은 path-level causal flow를 직접 추적한다는 점입니다.
8. 실험 설정
논문은 두 가지 평가를 수행합니다.
8.1 IOI ground-truth 비교
GPT-2 small의 IOI task에서 Wang et al.의 수작업 circuit과 비교합니다.
평가 기준:
- ground-truth node를 얼마나 회수했는가?
- ground-truth edge를 얼마나 회수했는가?
결과:
Recovered ground-truth nodes: 97.5%
Recovered ground-truth edges: 47.6%
즉, 핵심 노드는 거의 모두 찾았지만 edge 회수율은 낮습니다. 이는 path 중심 방법이 edge 전체 공간을 충분히 덮으려면 threshold를 매우 낮춰야 하기 때문입니다.
8.2 MIB leaderboard
MIB benchmark에서 다음 조건을 평가합니다.
| Task | Model |
|---|---|
| IOI | GPT-2 small |
| IOI | Qwen2.5 |
| MCQA | Qwen2.5 |
비교 대상은 EActP, EAP, EAP-IG, NAP-IG, IFR, UGS 등입니다.
9. 주요 결과
GPT-2 IOI에서는 IPE-CF가 매우 좋은 성능을 보입니다.
| Method | GPT-2 IOI CPR | GPT-2 IOI CMD |
|---|---|---|
| EActP(CF) | 2.30 | 0.02 |
| IPE-CF | 2.24 | 0.02 |
| IPE | 0.72 | 0.28 |
즉, counterfactual path replacement를 사용한 IPE-CF는 MIB leaderboard에서 상위권 성능을 냅니다.
반면 Qwen2.5에서는 성능이 낮습니다.
| Method | Qwen2.5 IOI CPR | Qwen2.5 IOI CMD |
|---|---|---|
| IPE | 0.42 | 0.58 |
| IPE-CF | 0.35 | 0.57 |
논문은 Qwen2.5의 layer 수가 많아 path search space가 너무 커지고, 현재 search budget으로는 충분한 edge/path coverage를 얻지 못했기 때문이라고 해석합니다.
10. 방법론적 한계
가장 큰 한계는 계산 비용입니다.
threshold를 낮추면 더 많은 path를 찾을 수 있지만, path 수가 지수적으로 증가합니다.

논문 부록 Figure 5에서 보듯이:
- threshold ↓
- 발견되는 node/edge/path ↑
- edge 하나당 필요한 path 수 ↑
- 계산 비용 급증
따라서 현재 IPE는 GPT-2 small 수준에서는 유효하지만, Qwen2.5 같은 더 깊은 모델에서는 search efficiency 개선이 필요합니다.
11. 논문의 핵심 기여
정리하면 이 논문의 기여는 세 가지입니다.
- Path-centric circuit discovery 제안
edge가 아니라 input-to-logits full path를 평가합니다. - Isolated path effect 계산법 제안
path를 따라 message delta를 전파하여 특정 path 효과만 제거하거나 counterfactual로 대체합니다. - IOI에서 기존 circuit 회수 및 MIB 성능 검증
GPT-2 IOI에서 ground-truth node의 97.5%를 회수하고, IPE-CF는 MIB leaderboard에서 강한 성능을 보입니다.
한 줄 요약
이 논문은 Transformer circuit discovery에서 개별 edge 중요도 대신 전체 computational path의 causal effect를 분리해 측정하는 IPE 방법을 제안하며, GPT-2 IOI에서는 매우 효과적이지만 대형 모델에서는 path search 비용이 핵심 병목으로 남는다는 것을 보입니다.
Path-patching, Activation Patching, Edge Activation Patching, ACDC, attribution patching, edge attribution patching, EAP-IG 등의 차이는? 그리고 edge가 들어간 방법론들에서 edge는 멀리떨어진 layer의 node도 허용하나?
Mechanistic Interpretability에서 이 방법들은 종종 비슷하게 언급되지만 실제로는 “무엇을 causal unit으로 보는가?” 와 “어떻게 importance를 계산하는가?” 가 다릅니다.
먼저 큰 그림부터 보면:
Activation Patching
↓
Path Patching
↓
ACDC
↓
Attribution Patching
↓
Edge Attribution Patching (EAP)
↓
EAP-IG
↓
IPE
라고 볼 수 있습니다.
1. Activation Patching
(ROME 논문 계열에서 많이 사용)
목적
특정 node의 activation이 행동에 얼마나 중요한지 측정
예:
Corrupted Prompt
↓
Layer l
↓
h_l
corrupted run의 activation을 clean run activation으로 교체
수식
모델: M(x)
clean 입력: x_clean
corrupted 입력: x_corr
특정 node activation: a_l
patch: a_l^corr ← a_l^clean
importance:
AP(l) = Metric(M(xcorr; al←aclean)) - Metric(M(xcorr))
측정 대상
node
예:
attention head 8.6
MLP 7
residual stream layer 10
2. Path Patching
(IOI 논문)
Activation Patching을 “특정 edge” 수준으로 확장
아이디어
보고 싶은 edge A → B 만 clean 정보가 지나가도록 함
4 forward pass 사용
clean: Aclean → Bclean
corrupted: Acorr → Bcorr
patch: Acorr → Bclean
효과 측정
수식
Metric: m(.)
edge: A → B
importance:
PP(A→B) = m(Bpatched) - m(Bcorr)
문제
실제로는 A → B 만 측정하지 못함
왜냐하면 B가 residual stream 전체를 받기 때문
3. ACDC
(Towards Automated Circuit Discovery)
목적
수작업 Path Patching 자동화
핵심
후보 edge: ei
각 edge에 대해 Path Patching 수행
중요도:
S(ei) = ΔMetric(ei)
importance가 작은 edge 제거
Graph
↓
Pruning
↓
Circuit
특징
- edge-level
- greedy pruning
계산량
매 edge마다 patching
매우 비쌈
4. Attribution Patching
(Syed et al. 2023)
문제:
Activation Patching은 O(#nodes)번 forward 필요
해결:
1차 Taylor 근사
activation: a
patch 변화량: Δa = aclean-acorr
metric: F(a)
Taylor:
F(a+Δa) ≈ F(a) + ∇F(a)ᵀΔa
importance:
AP_attr = ∇F(a)ᵀΔa
즉, gradient × activation difference
장점
forward 1회
backward 1회
단점
비선형성 무시
5. Edge Attribution Patching (EAP)
(Hanna et al., 2024)
Attribution Patching을
node → edge 수준으로 확장
edge: i → j
message: mij
clean-corrupt 차이:
Δmij = mijclean - mijcorr
metric: F
gradient: ∂F/∂mij
importance:
EAP(i,j) = Δmij · ∂F/∂mij
즉, gradient × edge-message difference
특징
회로 발견 속도 매우 빠름
ACDC보다 수백 배 빠름
6. EAP-IG
(MIB benchmark)
EAP 문제:
gradient saturation
예:
gradient ≈ 0 이면 중요 edge를 놓침
그래서 Integrated Gradients 적용
경로:
m(α) = mcorr + αΔm
importance:
실제로:
K step approximation
IG ≈ Σk ∂F(m(αk))/∂m · Δm / K
최종:
EAP-IG = IntegratedGradient × Δm
장점
EAP보다 정확
gradient saturation 감소
단점
K번 backward 필요
7. IPE
(이번 논문)
기존 방법: edge score 중심
IPE: full path score 중심
경로
Input
→ Head A
→ MLP B
→ Head C
→ Logits
message delta 전파
Δma
→ Δmb
→ Δmc
→ ...
path 전체 제거
importance:
Logitclean - Logitablated_path
또는
Indirect Effect
Edge의 정의는?
이게 매우 중요한 질문입니다.
대부분의 논문에서 Edge는
Transformer Graph 상의 직접 연결
즉,
node_i → node_j 이고 j가 i의 출력을 직접 입력으로 받음
예:
Head 3.7 → MLP 4 가능
MLP 7 → Head 8.2 가능
멀리 떨어진 Layer도 가능?
가능합니다.
TransformerLens 계열 graph에서는 residual stream 때문에
Layer 3 → Layer 10 도 edge로 정의 가능
왜냐하면
Layer 10 input:
r10
= r9 + output9
= ...
= r3 + ...
즉, Layer3 output이 Layer10에도 직접 존재
그래서 ACDC/EAP에서는 edge를 보통
source node → destination node
로 정의하며, source layer와 destination layer 사이에 여러 layer가 있어도 허용합니다.
예:
Head 3.2 → Head 9.4 가능
MLP 2 → MLP 11 가능
Head 5.1 → Logits 가능
(특히 MIB 구현)
논문별 Edge 정의 차이
| 방법 | Unit | Edge 범위 |
|---|---|---|
| Activation Patching | Node | 없음 |
| Path Patching | Edge | 임의 source→destination |
| ACDC | Edge | 임의 layer 간 가능 |
| Attribution Patching | Node | 없음 |
| EAP | Edge | 임의 layer 간 가능 |
| EAP-IG | Edge | 임의 layer 간 가능 |
| IPE | Full Path | Input→Logits path |
핵심 정리
Mechanistic Interpretability의 circuit discovery는 사실상 다음과 같이 발전해 왔습니다.
Activation Patching
(node importance)
→
Path Patching
(edge importance)
→
ACDC
(edge search)
→
Attribution Patching
(fast node score)
→
EAP
(fast edge score)
→
EAP-IG
(more accurate edge score)
→
IPE
(path score)
그리고 EAP, EAP-IG, ACDC에서의 edge는 일반 그래프의 인접 노드(edge) 개념이 아니라 residual stream graph 상의 causal connection을 의미하므로, 보통 멀리 떨어진 layer의 node 사이도 edge로 허용됩니다. 이것이 IPE 논문이 비판하는 핵심이기도 합니다. 즉 EAP가 평가하는 A→B의 중요도는 실제로는 그 edge 하나가 아니라 A→B를 포함하는 수많은 path의 혼합 효과라는 것입니다.
Activation Patching과 path-patching의 수식이 같지 않나? edge를 실제 어떻게 구현하나?
맞습니다. 엄밀히 말하면 제가 앞서 단순화해서 설명한 수식만 보면 Activation Patching과 Path Patching이 거의 같아 보입니다.
실제로는 patch하는 위치가 다르기 때문에 완전히 다른 방법입니다.
1. Activation Patching
Activation Patching은 특정 node 전체를 교체합니다.
예를 들어 layer 5의 attention head 5.3을 본다고 합시다.
clean run: a_clean^(5.3)
corrupted run: a_corr^(5.3)
patch: a_corr^(5.3) ← a_clean^(5.3)
그 후 모델 전체를 다시 forward.
수식으로 쓰면
원래 corrupted 모델: y = F(a_corr)
patch 후: y’ = F(a_clean)
importance: Δ = Metric(y’) – Metric(y)
즉, Head 5.3 전체를 교체합니다.
문제점
Head 5.3의 출력은
Head 6.2
Head 7.4
MLP 8
...
모든 downstream에 전달됩니다.
그래서 Head 5.3이 중요하다는 것은 알 수 있지만 어디로 정보를 보내는지는 모릅니다.
2. Path Patching
IOI 논문의 핵심은 A → B 라는 특정 connection만 측정하는 것입니다.
예를 들어
Head 7.9 → Head 9.6
를 평가한다고 합시다.
Head 9.6의 입력은
resid_pre^(9)
= Σ 모든 이전 컴포넌트 출력
입니다.
즉, Head 7.9 만 받는 게 아닙니다.
그래서 Path Patching은
Head 9.6이 읽는 residual stream 중에서
Head 7.9 기여분만 clean으로 교체합니다.
수식
destination node B 입력:
r_B = m_A→B + m_other
corrupted:
r_B^corr = m_A→B^corr + m_other^corr
patched:
r_B^patch = m_A→B^clean + m_other^corr
즉, A→B 만 clean으로 바꿉니다.
나머지는 모두 corrupted 유지.
왜 구현이 어려운가?
Transformer는
B input = residual stream 만 받습니다.
모델 안에는 A→B edge 라는 텐서가 없습니다.
따라서, A의 output이 B에 얼마만큼 들어갔는가를 따로 계산해야 합니다.
TransformerLens 구현
attention head A 출력: z_A
attention pattern: P_A
OV matrix: W_OV
B에 전달되는 메시지:
m_A→B = P_A z_A W_OV
(정확히는 residual stream에 더해지는 벡터)
Path Patching은 m_A→B^corr을 제거하고 m_A→B^clean을 넣습니다.
즉,
r_B^patch = r_B^corr - m_A→B^corr + m_A→B^clean
이게 edge patching의 실제 구현입니다.
3. IOI 논문의 “Path”가 사실은 Edge
여기서 이름 때문에 많이 헷갈립니다.
Wang et al. (2023)의 Path Patching은 사실 edge patching에 가깝습니다.
평가 대상: A → B
IPE 논문이 비판하는 것도 이것입니다.
논문 표현:
Path patching is actually evaluating an edge while other paths remain active.
즉, Path Patching 이름인데 실제로는 single edge importance입니다.
4. EAP는 어떻게 구현하나?
Path Patching은 실제로 forward를 여러 번 해야 합니다.
EAP는 이걸 Taylor approximation으로 바꿉니다.
edge message: m_ij
difference: Δm_ij = m_ij^clean – m_ij^corr
gradient: ∂F / ∂m_ij
importance:
EAP(i,j) = Δm_ij^T (∂F/∂m_ij)
즉, 실제 patching을 하지 않고 “만약 patch했으면 얼마나 바뀔까?”를 gradient로 추정합니다.
5. IPE가 왜 새로운가?
기존 방법들은 모두 A → B를 평가합니다.
하지만 A → B를 patch해도 B는 여전히
C → B
D → B
E → B
등 다른 입력을 받습니다.
그래서 측정값은 A→B 하나의 효과가 아니라
A→B를 포함한 수많은 downstream path의 효과가 됩니다.
IPE는
Input
→ A
→ B
→ C
→ Logits
전체를 따라 Δm을 계속 전파합니다.
그래서 진짜 한 개의 computational path만 제거할 수 있습니다.
정리하면,
| 방법 | 실제 패치 대상 |
|---|---|
| Activation Patching | node 전체 |
| Path Patching (IOI) | 특정 edge(A→B) |
| ACDC | edge |
| EAP | edge (gradient 근사) |
| EAP-IG | edge (IG 근사) |
| IPE | 전체 path |
따라서 Activation Patching과 Path Patching의 수식 형태는 비슷하지만, Activation Patching은 a_B 전체를 교체하고, Path Patching은 a_B를 만드는 입력 중 A가 보낸 메시지 성분만 교체한다는 점이 본질적인 차이입니다. 이는 실제 TransformerLens 구현에서는 residual stream에서 특정 source node의 기여분을 분리하여
r_B^patch
= r_B^corr - m_A→B^corr + m_A→B^clean
형태로 구현됩니다.
답글 남기기