---
title: "LLM의 말하지 않은 중간 생각을 읽을 수 있는가 — Jacobian Lens와 J-space"
slug: "verbalizable-representations-global-workspace-deep-dive"
category: "AI / LLM"
topic: "ai-llm"
subtopic: "ml-foundations"
tags: ["Jacobian Lens","J-space","Mechanistic Interpretability","Global Workspace","Claude","Transformer Circuits","Paper Review"]
status: "published"
created: "2026-07-26"
updated: "2026-07-26"
summary: "Gurnee 외의 2026년 Jacobian Lens 원문과 공개 구현을 기준으로 평균 Jacobian이 intermediate residual을 vocabulary readout으로 옮기는 과정, sparse J-space, coordinate patching, 비용과 한계를 재구성한다. Python 3.9.6 표준 라이브러리 toy로 logit lens와 J-lens의 차이, 평균화, 직교 성분 보존, 1차 근사의 한계를 직접 검증했다."
kind: "Deep Dive"
evidence: "Gurnee 외 Transformer Circuits Thread 원문과 Anthropic 공개 jacobian-lens commit 581d398 직접 확인, Python 3.9.6 표준 라이브러리 toy 검증 실행"
series: "LLM 시스템 지도 — 4단계 내부 구조와 해석"
---

> **4단계 열 번째 논문.** 이 글은 Wes Gurnee 외의 [Verbalizable Representations Form a Global Workspace in Language Models 원문](https://transformer-circuits.pub/2026/workspace/index.html)을 직접 읽고 썼다. Transformer Circuits Thread의 공개일은 2026-07-06이다. 확인 기준일은 2026-07-26이다. 구현 설명은 Anthropic의 [`jacobian-lens` commit `581d398`](https://github.com/anthropics/jacobian-lens/tree/581d398613e5602a5af361e1c34d3a92ea82ba8e)을 기준으로 한다.

## 이 글에서 얻을 답과 범위

LLM의 출력은 마지막에 고른 token만 보인다. 그래서 모델이 `21 × 2 + 7`을 풀 때 `42`를 중간에 계산했는지, 사용자의 지시를 읽으며 `안전`이라는 개념을 실제로 썼는지, 혹은 답만 외운 회로가 바로 작동했는지는 출력만으로 구별하기 어렵다.

이 논문은 **Jacobian Lens(야코비안 렌즈)**를 제안한다. 어떤 intermediate residual stream vector(중간 잔차 흐름 벡터)가 이후 층을 지나면서 현재 또는 미래의 어떤 단일 vocabulary token(어휘 token)을 말하게 만들기 쉬운지를, 많은 문맥에서 평균 낸 미분으로 읽는다. 그리고 이 readout 방향 중 적은 수의 sparse nonnegative combination(희소한 음이 아닌 선형 결합)으로 나타나는 부분을 **J-space**라고 부른다.

읽은 뒤에는 아래를 답할 수 있어야 한다.

1. J-lens가 logit lens보다 이른 layer에서 다른 결과를 내는 이유
2. 평균 Jacobian이 무엇을 평균하고 무엇을 잃는지
3. J-space가 낮은 차원의 고정 subspace가 아니라 sparse frame의 제약된 부분인 이유
4. token 방향을 swap하는 intervention이 무엇을 보존하고 무엇을 전혀 보장하지 않는지
5. 원문의 global workspace 주장이 모델의 의식이나 진짜 내면 독백을 뜻하지 않는 이유
6. 이 방법을 alignment monitoring에 보조 도구로 쓸 수는 있어도 단독 안전 장치로 쓰면 안 되는 이유

범위는 논문의 방법, 그 논문이 보고한 Claude Sonnet 4.5 중심의 실험, 그리고 open-weight decoder Transformer에 적용하는 공개 reference implementation이다. Sonnet 4.5의 hidden state를 여기서 재현하지 않는다. 논문은 핵심 결과를 Haiku 4.5와 Opus 4.5에도 corroborate했고 일부 분석은 Opus 4.6에서 수행했지만, 이것을 모든 모델의 법칙으로 일반화하지 않는다.[원문 Methods](https://transformer-circuits.pub/2026/workspace/index.html#technical-details-of-j-lens-use-cases)

> **핵심 한 문장.** J-lens는 hidden vector를 사람 말로 번역하는 독심술이 아니라, 해당 vector의 **평균적인 1차 downstream effect**를 모델 자신의 vocabulary 축에 투영해, 나중에 말해질 준비가 된 단일 token 후보를 만드는 probe다.

## 왜 필요한가 — final answer만으로는 중간 계산을 구분할 수 없다

`프랑스의 수도는` 뒤에 `Paris`가 나왔다고 하자. 마지막 logit에서 `Paris`가 높다는 사실은 안다. 그런데 모델 안에서 `France → capital → Paris`라는 관계를 순서대로 썼는지, 입력 token과 연관된 pattern이 곧장 output layer까지 갔는지는 모른다. 더 어려운 경우는 모델이 답을 출력하지 않는 동안이다. 문서를 읽으면서 injection을 의심하거나 계산의 중간값을 보관해도, 그 개념은 출력에 나타나지 않을 수 있다.

기존 lens는 이 빈틈을 일부만 메운다.

| 방법 | intermediate state에서 보는 것 | 빈틈 |
| --- | --- | --- |
| final logits | 실제 다음 token 경쟁 | 앞선 layer의 의미와 중간 계산을 못 봄 |
| logit lens | intermediate residual에 final unembedding을 바로 적용 | layer마다 representation 좌표가 바뀌는 문제를 무시 |
| tuned lens | layer별 linear map을 학습해 final output distribution을 예측 | 목적이 상관적 prediction이라, 말하지 않은 중간값보다 최종 답으로 뛰어갈 수 있음 |
| activation patching | 실제 activation을 바꾼 뒤 output 변화 관찰 | 많은 후보를 전수 실험하면 비싸고, 일반 readout을 바로 주지 않음 |

원문은 단일 prompt의 변화율을 그대로 쓰지 않는다. 한 prompt의 Jacobian은 `이 문맥에서 지금 이 token을 어떤 용도로 썼는가`와 `다른 상황에서도 그 token을 말할 잠재력이 있는가`를 섞는다. 많은 web-text 형태 문맥과 source position, 이후 target position에 걸쳐 평균하면 뒤의 일반적인 성분을 더 많이 남길 수 있다는 것이 출발점이다.[원문 Introduction과 Methods](https://transformer-circuits.pub/2026/workspace/index.html#the-jacobian-lens)

이것은 매력적인 가설이지만 자동으로 참은 아니다. 평균이 context-specific한 계산을 지울 수도 있고, 미분은 작은 변화만 근사한다. 따라서 이 글에서는 readout, sparse decomposition, intervention, 안전 해석을 하나의 증거로 합치지 않고 따로 다룬다.

## 무엇인가 — 기능적 workspace 가설과 하지 않는 주장

### global workspace는 의식 판정기가 아니다

인지과학의 global workspace theory(전역 작업공간 이론)는 여러 specialized processor(전문 처리기)가 처리한 정보 중 작은 일부가 넓게 공유되어 report, deliberate reasoning, flexible use에 쓰인다는 기능적 설명이다. 원문은 여기서 **access consciousness(접근 의식)**의 기능적 측면만 비교 대상으로 삼는다. subjective experience(주관적 경험)인 phenomenal consciousness(현상적 의식)와의 관계에는 입장을 취하지 않는다고 명시한다.[원문 Motivation](https://transformer-circuits.pub/2026/workspace/index.html#motivation-conscious-access-and-the-global-workspace)

그래서 논문이 시험한 것은 아래 다섯 기능이다.

| 기능 | 논문의 operational question |
| --- | --- |
| verbal report | 현재 활발한 vector를 바꾸면 모델이 보고하는 단어도 바뀌는가 |
| directed modulation | 지시한 개념을 출력하지 않는 동안에도 불러오거나 억제하는가 |
| internal reasoning | 중간값 vector를 바꾸면 결론이 바뀌는가 |
| flexible generalization | 한 문맥의 개념 vector가 다른 operation의 input으로도 작동하는가 |
| selectivity | routine parsing과 fluency는 유지하면서 이 부분을 억제할 수 있는가 |

따라서 `workspace-like`는 **이 실험 묶음에서 보인 기능적 성질**이다. `모델이 의식이 있다`, `panic이라는 token이 나오므로 공포를 느낀다`, `J-lens에 아무것도 안 보이니 위험한 계획도 없다`는 세 문장은 원문으로부터 나오지 않는다. 특히 마지막 문장은 원문이 명시적으로 부정한다.[원문의 monitoring 한계](https://transformer-circuits.pub/2026/workspace/index.html#j-lens-for-alignment-monitoring)

### J-lens와 J-space의 정확한 정의

layer `ℓ`, token position `t`의 residual stream(잔차 흐름)을 `h_ℓ,t ∈ ℝ^d`라 하자. `d`는 residual width인 `d_model`이다. final layer의 residual `h_final,t′`는 normalisation(크기 정규화)과 unembedding(어휘 점수화) matrix `W_U`를 거쳐 vocabulary의 token score인 logit(softmax 전 점수)가 된다. `t′`는 source보다 같거나 뒤인 position이다.

J-lens는 layer마다 `d × d` 평균 Jacobian `J_ℓ` 하나를 만든다.

\[
J_\ell = \mathbb{E}_{t,\,t'\ge t,\,\text{prompt}}
\left[\frac{\partial h_{\text{final},t'}}{\partial h_{\ell,t}}\right]
\tag{1}
\]

- `∂h_final,t′ / ∂h_ℓ,t`는 source residual의 아주 작은 변화가 final residual에 주는 1차 변화율 표다.
- expectation은 token position, 그 이후 target position, pretraining-like corpus의 prompt에 대해 낸 평균이다.
- 원문 실험은 corpus에서 1,000개의 prompt를 뽑았다.
- 결과 하나는 layer `ℓ`의 좌표를 final-layer 좌표로 운반하는 선형 map이다.

그다음 readout은 다음과 같다.

\[
\operatorname{lens}(h_\ell)=
\operatorname{softmax}\left(W_U\operatorname{norm}(J_\ell h_\ell)\right)
\tag{2}
\]

`J_ℓh_ℓ`가 transport된 vector이고, `norm`은 model의 final-layer readout에 쓰는 normalisation이다. `W_U`는 각 vocabulary token에 score를 준다. softmax(모든 score를 합이 1인 상대 확률로 바꾸는 함수) 전 score를 sort하면 해당 activation이 평균적으로 이후 말하게 만들기 쉬운 token의 순위를 얻는다. `W_UJ_ℓ`의 각 row가 특정 token에 대응하는 J-lens vector `v_token`다.[원문 식과 Figure 4](https://transformer-circuits.pub/2026/workspace/index.html#the-jacobian-lens)

여기서 말할 준비가 됐다는 뜻은 `다음 token으로 반드시 출력한다`가 아니다. `현재 또는 future position의 output에 끼칠 평균적인 선형 효과가 vocabulary token 축에서 크다`는 뜻이다. 그래서 final layer 가까이에서는 next-token prediction과 비슷해지지만, middle layer에서는 아직 답으로 출력되지 않는 intermediate concept을 보려는 것이다.

J-space는 J-lens vector 전부의 span이 아니다. vocabulary size `V`가 `d`보다 커서 `V`개의 vector는 overcomplete하다. 선형 span만 보면 거의 residual 전체를 덮을 수 있고 한 vector를 어떤 token들의 합으로 쓸지 유일하지 않다. 원문은 activation을 적은 수 `k`개의 J-lens vector의 **sparse nonnegative combination**으로 근사할 수 있는 부분으로 제한한다. 보통 `k ≤ 25`를 썼지만, 이것은 자연 법칙이 아니라 분석자가 정하는 hyperparameter다.[원문의 J-space 정의](https://transformer-circuits.pub/2026/workspace/index.html#the-j-space)

## 선행 개념 — residual stream과 Jacobian을 작은 계산으로 닫기

### residual stream은 Transformer block의 공용 게시판이다

각 Transformer layer는 token마다 vector를 읽고 attention과 MLP의 계산 결과를 residual stream에 더한다. 초기 layer의 vector는 현재 token identity에 가깝고, 마지막 vector는 unembedding으로 다음 token을 고르기 좋은 좌표다. layer 사이에서는 같은 vector 공간을 쓰지만, 각 방향이 하는 일과 downstream에서 읽히는 방식은 달라진다.

logit lens는 intermediate vector에 `W_U`를 바로 곱한다. 식 (2)에서 `J_ℓ = I`인 경우다. residual connection 때문에 late layer에서는 이 근사가 꽤 맞을 수 있다. 하지만 early layer의 `h_ℓ`는 아직 final-layer 좌표가 아니다. J-lens는 identity 대신 평균 transport `J_ℓ`를 적용한다.[원문의 logit lens 비교](https://transformer-circuits.pub/2026/workspace/index.html#comparison-to-related-techniques)

### Jacobian은 작은 vector 변화를 전달하는 행렬이다

scalar 함수 `y=f(x)`에서 `x`를 조금 `Δx`만큼 바꿨을 때 `Δy ≈ f′(x)Δx`다. vector 입력과 출력에서는 모든 좌표 조합의 미분을 모아 Jacobian `J`라고 쓴다.

\[
\Delta y \approx J\Delta x
\]

이 부호 `≈`가 핵심이다. nonlinearity, attention pattern 변화, normalisation denominator 변화가 크면 작은 변화 근사가 멀리서 맞지 않는다. 더구나 J-lens의 `J_ℓ`는 특정 prompt의 local Jacobian도 아니고 많은 context의 평균이다. 그러므로 **per-prompt output을 정확히 reconstruction하는 행렬이 아니다.**

### sparse frame은 token 이름표가 붙은 완전한 좌표축이 아니다

orthonormal basis라면 vector를 서로 수직인 축의 계수로 딱 하나만 분해한다. J-lens vector는 vocabulary가 많고 서로 닮은 단어도 있어서 neither orthogonal nor unique다. 예를 들어 `dog`, `puppy`, `animal` 방향이 같은 activation을 일부 겹치게 설명할 수 있다. 단순 top-k dot product는 비슷한 말을 여러 번 뽑는다.

원문은 gradient pursuit로 `h ≈ Σᵢcᵢvᵢ`를 찾되, `cᵢ ≥ 0`이고 선택한 vector 수가 `k` 이하가 되도록 한다. 이 sparse decomposition이 J-space component다. 남는 `h - h_J`는 non-J-space component다. 이는 label을 자동 진실로 만드는 절차가 아니라, redundancy를 줄인 근사다.

## 밑바닥 원리와 알고리즘 — 평균 Jacobian을 fit하고 읽는 순서

### 1. 한 prompt에서 rows를 역전파로 모은다

공개 구현에서 `jacobian_for_prompt`는 prompt를 최대 128 token으로 자르고, 처음 16 position과 final position을 평균에서 뺀다. 처음 position은 attention sink 성질로 residual 통계가 atypical하다고 구현 주석이 설명하고, final position에는 next-token target이 없기 때문이다.[`fitting.py`의 position mask](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/fitting.py#L40-L72)

forward pass는 한 번 수행한다. 그 계산 graph를 보존한 채 final residual의 output dimension마다 one-hot cotangent(출력 쪽 미분을 지정하는 vector)를 넣어 backward한다. `dim_batch=8`이면 output dimension 여덟 개의 row를 한 backward에 계산한다. valid target position 모두에 cotangent를 놓고 source position 평균을 내므로, 구현의 row는 `Σ_{t′≥t} ∂h_final,t′ / ∂h_ℓ,t`의 source-position 평균이다. `d_model`이 `d`라면 한 prompt에 forward 1회와 `ceil(d / dim_batch)` backward가 필요하다.[`jacobian_for_prompt` 실제 구현](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/fitting.py#L100-L213)

```text
prompt token화
  → source layer와 final layer activation record
  → final residual의 dimension batch마다 one-hot cotangent 생성
  → autograd backward
  → valid source position의 gradient mean
  → layer별 d × d Jacobian row 채우기
```

### 2. prompt별 Jacobian을 running mean으로 합친다

`fit`은 prompt별 matrix를 running sum에 더한 뒤 성공한 prompt 수로 나눈다. checkpoint에는 source layer, target layer, skip-first 값도 기록해 다른 설정 checkpoint를 resume하지 못하게 막는다. process를 나눠 prompt subset마다 fit한 lens는 prompt 수 가중 평균으로 `merge`할 수 있다.[`fit`의 running mean(누적 평균)과 checkpoint](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/fitting.py#L224-L300) [`JacobianLens.merge`](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/lens.py#L105-L133)

이 평균은 training이 아니다. model parameter나 unembedding을 update하지 않는다. 어느 corpus를 평균에 넣었는지에 따라 `J_ℓ`가 달라지므로, prompt distribution은 lens의 일부다. general web text에서 fit한 lens로 금융 문서나 한국어 domain 내부 표현을 판정하면 domain mismatch를 별도 검증해야 한다.

### 3. 새 prompt에서는 forward 한 번과 matrix multiply로 읽는다

`JacobianLens.apply`는 새 prompt를 forward해 요청 layer residual을 recording한다. `transport`가 `residual @ J_bar.T`를 수행하고, `model.unembed`가 vocabulary logits를 낸다. `use_jacobian=False`면 transport를 생략해 logit-lens baseline을 만든다.[`lens.py`의 transport와 apply](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/lens.py#L135-L215)

```python
# 공식 README가 제시한 사용 흐름을 줄여 쓴 의사코드다.
lens = jlens.fit(model, prompts=my_prompts)
lens_logits, model_logits, input_ids = lens.apply(
    model,
    "Fact: The currency used in the country shaped like a boot is",
    positions=[-2],
)
```

이 코드가 하는 일은 token별 최종 생각을 출력하는 것이 아니다. 각 layer와 선택 position에서 vocabulary score vector 하나를 만들고 top-k를 보는 일이다. 공식 README는 paper lens가 128-token sequence 1,000개를 사용했고 약 100 prompt도 usable하다고 적지만, quality saturation은 model·corpus·질문에 따라 다시 측정해야 한다.[공개 구현 README](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/README.md)

### 4. vector를 읽기만 하지 않고 바꿔 가설을 시험한다

특정 token `q`의 lens vector를 `v_q`라 하자. 가장 단순한 steering은 아래다.

\[
h \leftarrow h + \alpha v_q
\tag{3}
\]

`α > 0`이면 방향을 더하고, 음수 또는 projection removal이면 ablation이 된다. 이런 결과는 `q`라는 label이 그 activation의 일부와 관련 있다는 evidence지만, 큰 `α`는 model이 학습하지 않은 영역으로 보내므로 자연스러운 처리의 필요충분 조건은 아니다.

두 token `s`, `q`를 exchange할 때는 `V = [v_s\;v_q]`를 만들고 pseudoinverse(무어-펜로즈 의사역행렬) `V†`로 local coordinate `c = V†h`를 읽는다. swap function을 `σ`라 하면 원문은 다음 patch를 쓴다.

\[
h_{\text{patched}} = h + V(\sigma(c)-c)
\tag{4}
\]

`V`의 span에 속한 두 coordinate만 바꾸므로 그 span에 직교하는 component는 보존된다. 단, `v_s`와 `v_q`가 orthogonal일 필요는 없고, pseudoinverse가 계산한 coordinate도 sparse J-space decomposition과 같은 것은 아니다. 이 patch는 **그 선택한 두 방향 밖의 residual을 그대로 둔다**는 기하학적 보존을 뜻할 뿐, attention pattern·nonlinear gate·다른 feature가 불변이라는 뜻은 아니다.[원문의 intervention 정의](https://transformer-circuits.pub/2026/workspace/index.html#technical-details-of-j-lens-use-cases)

## 내부 구조와 실제 실행 흐름 — 논문 결과를 어떤 증거로 읽을 것인가

### readout과 causal intervention은 다른 단계다

원문은 category의 item을 생각한 뒤 단어 하나로 보고하라는 prompt에서, output 직전 position의 J-lens가 model이 고를 item을 높은 순위에 둔다고 보고한다. 자발적으로 고른 item vector를 같은 category의 다른 item vector와 swap하면 보고 단어도 바뀌는 실험을 수행했다. 이것은 `top token이 그럴듯하다`보다 강한 증거다. 그러나 보인 task family와 intervention 설정에서의 결과이지 모든 abstract concept에 대한 완전한 decoder 검증은 아니다.[원문의 verbal report 실험](https://transformer-circuits.pub/2026/workspace/index.html#the-j-space-supports-verbal-report)

internal reasoning에서 더 흥미로운 결과는 two-hop question이다. 원문은 intermediate concept swap이 answer concept swap보다 median 약 17 percent 더 이른 depth에서 효과를 낸다고 보고했다. 90 prompt 비교에서 J-space component swap의 answer 성공률은 61 percent, raw J-lens vector swap은 60 percent, non-J remainder swap은 28 percent이었다. J-space coordinate를 clamp하면 non-J remainder의 성공률은 6 percent로 떨어졌다. 이 숫자는 Sonnet 4.5와 해당 protocol의 외부 측정값이다. 각각의 실패 case, random seed, prompt 표현을 떠나 일반 성공률로 쓰면 안 된다.[원문의 internal reasoning 결과](https://transformer-circuits.pub/2026/workspace/index.html#the-j-space-mediates-internal-reasoning)

### 작은 분산이 큰 행동 변화를 낼 수 있다

원문은 middle layer에서 J-space component가 activation variance의 median 6에서 7 percent 정도만 설명하고 나머지는 약 93 percent라고 보고한다. 같은 section에서 J-space component swap은 top-5에 target을 59 percent 넣었지만 pure lens vector swap은 88 percent를 보였다. 여기서 `J-space가 작으니 무시해도 된다`와 `J-space가 결과를 바꾸니 전체 생각이다`가 모두 틀린 극단이다.

작은 shared control signal이 큰 automatic computation을 선택하거나 route할 수 있다. 반대로 pure lens vector가 강하게 작동한다고 해서 natural activation이 그 한 token vector뿐으로 구성됐다는 뜻은 아니다. sparse decomposition의 `k`, nonnegative constraint, approximation error가 결과를 바꾼다.[원문의 J-space privilege와 variance 실험](https://transformer-circuits.pub/2026/workspace/index.html#the-j-space-is-privileged-in-internal-reasoning)

### layer depth에는 초반과 중간과 출력 직전의 구분이 있다

원문은 25개 evenly spaced residual layer를 0에서 100으로 reindex했다. centered kernel alignment(CKA, 두 layer의 pairwise geometry를 비교하는 지표)로 J-lens geometry를 비교하면 대략 early third, 긴 middle block, 작은 late block의 구조가 나타난다고 보고한다. early zone에서는 readout이 noisy하고, middle zone에서는 position 사이에 유지되는 abstract content가 보이며, final few layer에서는 imminent next token에 맞는 motor representation이 된다.[원문의 layer-wise 구조](https://transformer-circuits.pub/2026/workspace/index.html#in-which-layers-does-the-j-space-act-as-a-workspace)

이것을 layer 38에서 보편적인 의식 ignition이 일어난다고 해석하면 안 된다. 원문도 layer subsampling이 transition의 sharpness를 과장할 수 있고 model마다 gradual transition과 sub-block가 있다고 쓴다. `0에서 100`은 물리적 layer number가 아니라 비교를 위한 percentage index다.

### automatic processing과 reportable representation을 구별한다

같은 text를 보고 다음 word를 이어 쓰는 task에서는 model이 adjective나 past tense를 맞힐 수 있는데, 그 property label이 J-lens top token에 없을 수 있다. 반면 property의 이름을 직접 묻는 task에서는 같은 stimulus 위치에서 label이 J-lens에 나타난다. 즉 representation이 사용되었다는 것과 그 representation이 말할 수 있는 workspace에 들어왔다는 것은 구별된다.[원문의 flexible task와 automatic task 비교](https://transformer-circuits.pub/2026/workspace/index.html#the-j-space-is-selective)

이 구분은 운영에 중요하다. 자동화되어 잘 훈련된 위험 행동은 workspace를 덜 거칠 수 있다. 그러므로 J-lens가 prompt에서 suspicious token을 못 읽었다는 사실을 allow decision으로 쓰면 안 된다.

## 직접 검증 — 2차원 toy로 transport와 한계를 계산했다

이 논문의 Claude 실험을 노트북에서 재현한 것은 아니다. 공개 구현도 model weights와 corpus를 번들하지 않는다. 대신 식 (1)부터 식 (4)에 필요한 선형대수 주장 네 개를 Python 3.9.6 표준 라이브러리만으로 직접 검증했다.

실행 파일은 `/tmp/global-workspace-research/verify_jacobian_lens_toy.py`다. 이 글의 게시물에는 환경에 종속된 임시 파일을 넣지 않는다. 아래 명령을 실제 실행했다.

```bash
python3 --version
python3 /tmp/global-workspace-research/verify_jacobian_lens_toy.py
```

실제 출력이다.

```text
Python 3.9.6
PASS 1 identity logit-lens and transported J-lens can rank differently
PASS 2 mean Jacobian is one context-independent transport
PASS 3 coordinate patch preserved the orthogonal component
PASS 4 first-order transport is not an exact nonlinear reconstruction
all toy checks passed
```

### 확인 1 — `J = I`인 logit lens와 transport된 J-lens는 ranking이 달라진다

toy residual을 `h = (2, 1)`로 두고, token `alpha`, `beta`, `gamma`의 unembedding row를 각각 `(1,0)`, `(0,1)`, `(-1,-1)`로 뒀다. logit lens는 `h`를 그대로 decode하므로 `alpha`가 첫째다. Jacobian을 축 교환 matrix `[[0,1],[1,0]]`로 두면 `Jh = (1,2)`이고 J-lens는 `beta`를 첫째로 낸다.

이것은 J-lens가 더 참이라는 증명이 아니다. layer coordinate가 final coordinate와 다르면 `J`를 통과시킨 readout이 달라진다는 식 (2)의 최소 검산이다.

### 확인 2 — mean Jacobian은 문맥 하나의 map이 아니다

문맥 A의 `J_A = [[2,0],[0,0]]`, 문맥 B의 `J_B = [[0,0],[0,2]]`를 평균하면 `J̄ = I`가 된다. 이 `J̄`는 어느 하나의 문맥 Jacobian과 같지 않다. 바로 이 generalisation이 J-lens의 목적이면서 위험이다. prompt-specific path는 희미해질 수 있다.

### 확인 3 — two-coordinate patch는 직교 잔여분을 남긴다

서로 직교하는 source와 target 방향을 첫째·둘째 좌표축으로 두고 `h = (3,1,5)`를 만들었다. 두 좌표를 swap하면 `(1,3,5)`가 된다. 셋째 좌표 `5`는 그대로다. 실제 J-lens vector는 일반적으로 orthogonal하지 않으므로 code는 pseudoinverse를 쓴다. toy가 보이는 것은 식 (4)의 `span(V)` 밖 component 보존이며, 실제 semantic preservation 보증은 아니다.

### 확인 4 — 1차 근사는 멀리 가면 정확하지 않다

`f(x)=x²`에서 `x=1`의 derivative는 2다. `x=1.5`의 1차 예측은 `1 + 2×0.5 = 2`지만 실제 `f(1.5)=2.25`다. J-lens도 local derivative를 context 평균한 것이다. 그래서 큰 steering coefficient, 긴 multi-step continuation, context 분포 밖 input에서 lens score를 literal future probability로 읽으면 안 된다.

toy source와 검증 명령은 글 작성 시점에 직접 실행했다. 이는 공개 J-lens fit의 정확성, paper의 Claude 결과, semantic label의 타당성을 재현한 검증이 아니다.

## 성능과 트레이드오프 — fit은 비싸고 readout은 상대적으로 가볍다

`L`개 source layer, residual width `d`, vocabulary size `V`, `N`개 prompt라고 두자. dense `J_ℓ` 하나는 `d²` float를 저장한다. `L`개면 O(`Ld²`) memory 또는 disk가 필요하다. 공개 구현은 checkpoint size를 대략 `len(source_layers) × d_model² × 4` byte라고 설명한다. save 기본 dtype은 fp16으로 file size를 반으로 줄인다.[`fit` checkpoint 크기와 `save`](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/fitting.py#L254-L258) [`lens.py` save](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/lens.py#L52-L64)

fit은 더 비싸다. source layer 하나라도 `J`의 모든 row를 얻으려면 prompt마다 output dimension을 덮는 backward가 필요하다. 공개 implementation은 `ceil(d / dim_batch)` backward per prompt라고 명시한다. `dim_batch`를 키우면 batch에 복제하는 prompt 때문에 GPU memory는 늘지만 total backward FLOPs가 줄지는 않는다. `N` prompt와 `L` source layer의 activation recording, backward graph retention이 실제 병목이다.[공개 구현의 비용 설명](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/jlens/fitting.py#L11-L21)

fit된 뒤 한 activation을 읽는 dense 비용은 다음처럼 생각할 수 있다.

| 단계 | 일반적인 dense 비용 | 실무 병목 |
| --- | --- | --- |
| transport `J_ℓh` | O(`d²`) | layer별 matrix-vector multiply와 matrix 이동 |
| unembedding 전체 vocabulary score | O(`Vd`) | full vocabulary projection과 top-k |
| sparse decomposition | dictionary와 반복 횟수에 의존 | overcomplete non-orthogonal dictionary의 근사 오차와 탐색 비용 |
| patch 후 실제 model 실행 | 보통 Transformer forward 비용 | 여러 layer·position intervention과 비교 run 수 |

이 표는 model dimension을 넣지 않은 일반 복잡도다. Sonnet의 hidden width, GPU, batch size가 공개 구현 설명에서 제공되지 않았으므로 실제 latency나 VRAM 수치로 바꾸지 않는다. 원문이 `single precomputed matrix multiplication per layer`라며 readout의 싼 편이라는 점은 fit과 비교한 표현이다. full model forward 자체와 full-vocabulary projection이 무료라는 뜻은 아니다.[원문의 monitoring 적용 논의](https://transformer-circuits.pub/2026/workspace/index.html#j-lens-for-alignment-monitoring)

성능과 품질의 교환은 명확하다.

| 선택 | 얻는 것 | 잃는 것 |
| --- | --- | --- |
| 많은 representative prompt로 fit | 평균 transport의 안정성 기대 | backward 비용과 corpus 의존성 증가 |
| 적은 prompt로 빠른 fit | prototype 속도 | rare context와 domain별 편향 위험 |
| 큰 `k` sparse decomposition | 더 많은 residual을 설명할 가능성 | J-space의 selectivity 정의가 느슨해지고 redundancy 증가 |
| 큰 `α` steering | output 변화가 보기 쉬움 | out-of-distribution activation과 causal 과장 위험 |
| full top-k readout | 사람이 읽는 token 후보 | multi-token concept과 non-verbal representation 누락 |

## 실패와 한계와 운영 기준 — 탐지 화면을 policy engine으로 바꾸지 않는다

### 방법 자체의 한계

1. **single-token vocabulary 한계**가 있다. 긴 phrase, subword로 쪼개지는 이름, 숫자 표현은 한 vector가 깨끗하게 대표하지 않을 수 있다. 원문도 J-lens가 단일 vocabulary token과 연결된 vector만 찾는다고 적는다.
2. **평균화 한계**가 있다. J-lens는 chosen corpus에서의 typical effect다. 지금 prompt의 attention route와 gate를 정확히 설명하지 않는다.
3. **first-order 한계**가 있다. `Δh`가 크면 Jacobian 근사가 깨지고 normalisation, attention, nonlinear MLP의 상태가 바뀐다.
4. **sparse decomposition 한계**가 있다. `k ≤ 25`, nonnegative constraint, gradient pursuit가 정답 좌표를 찾는다는 증명은 없다. 다른 dictionary나 seed가 feature inventory를 바꿀 수 있다.
5. **intervention 해석 한계**가 있다. patch 성공은 선택한 direction이 output에 영향을 줬다는 evidence다. 그 direction이 human concept 하나와 정확히 같거나 normal execution에서 유일하게 필요했다는 증명은 아니다.

### 안전 monitoring 운영 절차

J-lens를 실제 system에서 experiment할 때는 다음 순서를 지킨다.

```text
offline model과 corpus 고정
  → clean holdout prompt에서 readout 재현성 측정
  → known benign·known risky case의 false positive와 false negative 분리
  → human review용 evidence로만 연결
  → baseline detector·output classifier·tool policy와 결합 평가
  → prompt distribution과 model version이 바뀔 때 lens 재적합·회귀 평가
```

monitoring score의 threshold는 paper의 top-k 하나로 정할 수 없다. 어떤 action을 막거나 사람에게 escalation할지, false negative와 false positive의 비용이 무엇인지 먼저 정하고 labeled evaluation set에서 정한다. J-lens는 output text에 보이지 않는 candidate concept을 inspection queue에 추가하는 보조 신호가 될 수 있다. access control, tool allowlist, sandbox, output policy, audit log를 대체하지 않는다.

공개 repo도 production SDK가 아니라 **reference implementation(참조 구현)이며 maintenance와 contribution을 받지 않는다**고 표시한다. secret prompt나 proprietary model activation을 실험에 넣기 전에는 model license, data retention, access boundary를 따로 확인해야 한다.[공개 README의 상태와 data 범위](https://github.com/anthropics/jacobian-lens/blob/581d398613e5602a5af361e1c34d3a92ea82ba8e/README.md)

### debugging 순서

readout이 이상하면 바로 semantic story를 만들지 말고 아래를 확인한다.

1. layer index와 token position이 source model의 layout과 맞는지 확인한다.
2. fit corpus, tokenizer, normalisation, unembedding가 apply model과 같은 revision인지 확인한다.
3. `use_jacobian=False` logit lens와 J-lens를 나란히 비교한다.
4. prompt 수와 `skip_first`, target layer 설정을 기록하고 lens를 다시 fit한다.
5. 작은 `α`부터 positive steering, negative ablation, coordinate swap을 분리한다.
6. output 하나가 아니라 repeated prompt·holdout prompt에서 effect size와 failure case를 저장한다.
7. safety claim이면 J-lens 부재 case까지 포함한 detector recall을 독립적으로 평가한다.

## 대안과 선택 기준 — 질문에 맞는 해석 도구를 고른다

| 질문 | 우선 도구 | J-lens와의 관계 |
| --- | --- | --- |
| 마지막 몇 layer가 어떤 token을 곧 낼까 | logit lens | 더 싸고 충분할 수 있음 |
| intermediate layer가 final token 좌표와 어떻게 달라졌나 | J-lens | 평균 causal transport를 더함 |
| 이 prompt에서 실제 어떤 feature path가 logit까지 갔나 | Circuit Tracing과 attribution graph | input-specific graph가 적합하며 J-lens의 global average와 목적이 다름 |
| hidden representation을 sparse human feature로 분해하고 싶나 | SAE | token readout보다 broader feature dictionary를 얻지만 train·label 비용이 큼 |
| label이 있는 property를 예측하고 싶나 | supervised probe | 높은 prediction accuracy가 필요할 때 유용하나 causal interpretation은 별도 |
| 특정 factual association을 어느 layer에 수정할까 | ROME 또는 MEMIT | knowledge edit 문제이며 workspace readout과 다름 |

logit lens는 `J=I`라는 단순 baseline이다. tuned lens는 final output distribution을 맞추는 trained map이라 output prediction에는 유용할 수 있지만, 원문은 unspoken intermediate computation에서 answer를 먼저 예측하는 경향을 보고한다. SAE는 unsupervised dictionary를 만들 수 있지만 사람의 label 부여와 large-scale training이 필요하다. Circuit Tracing은 한 prompt에서 actual path의 후보를 보지만 global verbalizability map을 주지는 않는다.[원문의 related-technique 비교](https://transformer-circuits.pub/2026/workspace/index.html#comparison-to-related-techniques)

내가 RAG나 agent 시스템을 운영하면서 이 방법을 고른다면 다음 기준을 쓴다.

- production incident의 root cause가 retrieval, tool authorization, orchestration이면 J-lens보다 trace, eval set, policy test부터 본다.
- open-weight model의 intermediate representation 연구가 목적이면 J-lens와 logit-lens baseline을 함께 fit한다.
- 특정 prompt의 wrong answer가 어떤 path에서 생겼는지 묻는다면 J-lens token list만으로 결론 내리지 않고 activation patching과 circuit graph를 추가한다.
- high-stakes safety decision은 J-lens가 아니라 deterministic permission check와 external verifier가 최종 authority여야 한다.

## 흔한 오해와 처음 질문에 대한 답

### J-lens top token은 모델의 숨은 chain of thought인가

아니다. top token은 average linear transport와 unembedding이 높은 점수를 준 vocabulary item이다. 한 문장짜리 private reasoning trace도 아니고, 해당 prompt에서 실제로 다음에 쓸 단어라는 보장도 아니다. intermediate reasoning의 causal role은 readout만이 아니라 swap과 ablation 같은 별도 intervention으로 시험해야 한다.

### global workspace라고 했으니 Claude가 의식이 있다는 뜻인가

아니다. 원문은 access consciousness와 비교 가능한 **functional properties**를 다루며 phenomenal consciousness에 대한 입장을 유보한다. Transformer의 fixed-depth feedforward pass, attention으로 이전 token representation을 다시 읽는 구조, 출력 token을 context에 재주입해 긴 reasoning을 이어 가는 방식은 인간의 recurrent workspace와 다르다.[원문의 human cognition 차이](https://transformer-circuits.pub/2026/workspace/index.html#notable-differences-from-human-cognition)

### `panic`, `ethical`, `fake`가 보이면 감정이나 의도를 증명한 것인가

아니다. 그것은 model vocabulary token과 activation direction의 readout이다. model output의 roleplay, training data pattern, prompt 문맥이 섞여 있다. 감정 경험이나 stable intention은 이 방법의 측정 대상이 아니다.

### J-lens에 위험한 token이 없으면 agent를 실행해도 되는가

안 된다. 원문도 automatic well-practiced computation, multi-token plan, lens가 포착하지 못한 route가 monitoring을 피할 수 있다고 적는다. J-lens는 audit signal 하나일 뿐이다. tool 권한, transaction boundary, approval, sandbox, retrieval access control은 J-lens와 독립적으로 강제해야 한다.

### 그러면 논문의 가장 실무적인 가치는 무엇인가

모델의 output만 보고 `안전하다` 또는 `위험하다`고 말하는 대신, hidden representation에 대한 **검증 가능한 가설**을 세우는 데 있다. `이 layer와 position에서 이 token direction을 바꾸면 어떤 output이 달라지는가`, `이 signal이 holdout에서도 재현되는가`, `다른 detector와 합쳤을 때 recall을 올리는가`를 측정할 수 있다. 그 질문을 점검하지 않은 semantic story는 데모이지 evidence가 아니다.

## 출처 및 검증 경로

### 1차 자료

1. Wes Gurnee 외, [Verbalizable Representations Form a Global Workspace in Language Models](https://transformer-circuits.pub/2026/workspace/index.html), Transformer Circuits Thread, 2026-07-06. 이 글의 정의, 식, Claude 실험 범위, 수치, 한계의 원문이다.
2. Anthropic, [`jacobian-lens` repository commit `581d398`](https://github.com/anthropics/jacobian-lens/tree/581d398613e5602a5af361e1c34d3a92ea82ba8e). `README.md`, `jlens/fitting.py`, `jlens/lens.py`를 직접 확인했다. fit의 backward pass와 running mean, apply의 transport·unembed 호출 경로를 검증했다.

### 직접 실행

```text
환경  Python 3.9.6
파일  /tmp/global-workspace-research/verify_jacobian_lens_toy.py
명령  python3 /tmp/global-workspace-research/verify_jacobian_lens_toy.py
관찰  identity readout과 transport readout ranking 차이, 평균 Jacobian, orthogonal component 보존, nonlinear first-order 오차가 모두 PASS
```

toy는 paper result 재현이 아니라 식의 최소 불변식을 확인한 것이다. 논문의 model-specific 수치는 원문 실험 결과로만 인용했다. 다음 글에서는 이 방법의 token-level interpretability와 factual knowledge edit가 만나는 **ROME**을 다룬다.
