본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Sparse autoencoder, SAE; 희소 오토인코더
신경망 한 층의 활성 벡터를, 그보다 훨씬 많은 후보 중 소수만 켜지는 해석 가능한 특징 방향들의 합으로 분해하도록 학습한 오토인코더

희소 오토인코더(sparse autoencoder, SAE)는 입력을 넓은 은닉층으로 보낸 뒤 은닉 단위 대부분이 0이 되도록 제약을 걸고 입력을 다시 재구성하는 오토인코더다. 2023년 이후 기계적 해석 가능성 연구에서 대형 언어 모델의 내부 활성을 사람이 이해할 수 있는 특징(feature)으로 쪼개는 대표 도구가 되었다. 이 문서는 주로 그 해석용 SAE를 다룬다.

일반적인 오토인코더는 은닉층을 입력보다 좁게 만들어 정보를 압축하고, 변분 오토인코더는 잠재 공간에서 새 표본을 생성하는 것이 목적이다. 해석용 SAE는 반대로 은닉층을 입력보다 수십~수천 배 넓게(과완비, overcomplete) 만들고, 압축이나 생성이 아니라 "이 활성 벡터는 어떤 개념들의 조합인가"를 읽어 내는 데 쓴다. 학습이 끝나면 디코더의 열 하나하나가 특징 방향이 되고, 인코더 출력은 그 특징의 세기가 된다. 신호 처리에서 말하는 희소 사전 학습(sparse dictionary learning)을 신경망으로 푼 것이다.

언어 모델의 뉴런 하나는 대개 여러 무관한 개념에 반응한다(다의성). 앤트로픽의 〈Toy Models of Superposition〉은 그 원인을 중첩으로 설명했다. 특징이 드물게만 켜진다면 모델은 차원 수보다 많은 특징을 서로 거의 직교하는 방향에 겹쳐 담는다.[1] 그렇다면 뉴런 축이 아니라 그 방향들을 찾아야 하고, 방향이 차원보다 많으므로 주성분 분석 같은 직교 분해로는 찾을 수 없다. 희소성을 가정한 과완비 분해, 즉 희소 사전 학습이 필요하다.

2023년 9월 커닝엄(Hoagy Cunningham) 등은 언어 모델 활성에 SAE를 학습시키면 뉴런이나 PCA·ICA 방향보다 자동 해석 점수가 높은 특징이 나오고, 간접 목적어 식별 과제에서 인과적으로 중요한 특징을 더 세밀하게 짚어 낼 수 있음을 보였다.[2] 거의 같은 시기인 2023년 10월 앤트로픽은 〈Towards Monosemanticity〉를 발표했다.

모델의 한 지점(보통 중간 층의 잔차 스트림이나 MLP 출력)에서 활성 벡터 𝐱∈ℝD를 대량으로 모은다. 앤트로픽이 2024년 〈Scaling Monosemanticity〉에서 쓴 기본형은 다음과 같다.[3]

fi(𝐱)=ReLU(𝐖i,⋅enc⋅𝐱+bienc),𝐱^=𝐛dec+∑i=1Ffi(𝐱)𝐖⋅,idec

ℒ=𝔼𝐱[‖𝐱−𝐱^‖22+λ∑ifi(𝐱)⋅‖𝐖⋅,idec‖2]

  • F는 특징 수로 D보다 훨씬 크다. 손실의 첫 항은 재구성 오차, 둘째 항은 활성의 L1 벌점으로 대부분의 fi를 0으로 만든다.
  • L1 항에 디코더 열의 노름을 곱하는 이유: 그렇지 않으면 fi를 작게, 디코더 열을 크게 만들어 재구성은 그대로 두고 벌점만 피하는 "속임수"가 가능하다. 노름을 곱하면 단위 벡터로 정규화한 디코더 열을 특징 방향으로, fi‖𝐖⋅,idec‖2를 특징 활성값으로 읽을 수 있다.
  • 2023년 버전은 인코더에 넣기 전에 디코더 편향을 빼는 "인코더 앞 편향"(pre-encoder bias)을 쓰고, 이를 데이터의 기하 중앙값으로 초기화했다.[4]

아래는 차원 64의 공간에 희소한 실제 특징 512개를 겹쳐 담은 합성 데이터로 SAE를 학습시켜, 숨은 특징 방향을 되찾는지 확인하는 최소 예다(PyTorch 2.5에서 실행 확인).

import torch, torch.nn as nn, torch.nn.functional as F

class SAE(nn.Module):
    def __init__(self, d_model, n_feat):
        super().__init__()
        self.W_enc = nn.Parameter(torch.randn(d_model, n_feat) * 0.1)
        self.b_enc = nn.Parameter(torch.zeros(n_feat))
        self.W_dec = nn.Parameter(self.W_enc.data.T.clone())    # 인코더 전치로 초기화
        self.b_dec = nn.Parameter(torch.zeros(d_model))

    def forward(self, x):
        f = F.relu((x - self.b_dec) @ self.W_enc + self.b_enc)  # 특징 활성
        x_hat = f @ self.W_dec + self.b_dec                     # 재구성
        return x_hat, f

def sae_loss(x, x_hat, f, W_dec, lam):
    mse = (x - x_hat).pow(2).sum(-1).mean()
    l1 = (f * W_dec.norm(dim=1)).sum(-1).mean()                 # 디코더 노름을 곱한 L1
    return mse + lam * l1

# 합성 데이터: 64차원에 512개 특징이 중첩, 특징마다 켜질 확률 1%
torch.manual_seed(0)
d, n_true = 64, 512
true_dirs = F.normalize(torch.randn(n_true, d), dim=1)
def batch(n=4096, p=0.01):
    coef = torch.rand(n, n_true) * (torch.rand(n, n_true) < p)
    return coef @ true_dirs

sae = SAE(d, 1024)
opt = torch.optim.Adam(sae.parameters(), lr=1e-3)
for step in range(10_000):
    x = batch()
    x_hat, f = sae(x)
    loss = sae_loss(x, x_hat, f, sae.W_dec, lam=0.3)
    opt.zero_grad(); loss.backward(); opt.step()

x = batch(); x_hat, f = sae(x)
l0 = (f > 0).float().sum(-1).mean()                             # 토큰당 켜진 특징 수
fvu = (x - x_hat).pow(2).sum() / (x - x.mean(0)).pow(2).sum()   # 설명 못 한 분산 비율
cos = F.normalize(sae.W_dec, dim=1) @ true_dirs.T
recovered = (cos.max(0).values > 0.9).float().mean()            # 되찾은 실제 특징 비율

이 설정에서 실제 특징 512개는 거의 전부 코사인 유사도 0.9 이상으로 되찾아지고, 토큰당 켜지는 특징 수(L0)는 10개 남짓이다(실제 평균은 약 5개). lam을 3e-3 수준으로 낮추면 재구성은 거의 완벽해지지만 L0가 180개를 넘고 실제 특징은 하나도 되찾지 못한다. 반대로 1.0으로 올리면 L0는 3개 안팎으로 줄지만 설명 못 한 분산이 절반을 넘는다. 희소성과 재구성 사이의 이 줄다리기가 SAE 설계의 핵심 문제다.

지표 정의 비고
L0 입력 하나에서 0이 아닌 특징 수의 평균 작을수록 희소, 해석이 쉬움
설명 분산, FVU 재구성이 설명하는 분산 비율, 또는 그 나머지 재구성 충실도
손실 회복률 원래 활성 대신 SAE 재구성을 모델에 넣었을 때의 손실을, 그 지점을 0으로 지운 경우와 비교 모델 출력 관점의 충실도
죽은 특징 비율 많은 토큰 동안 한 번도 켜지지 않는 특징의 비율 계산 낭비, 학습 실패 신호
해석 가능성 점수 사람이나 언어 모델이 특징 설명을 쓰고, 그 설명으로 활성을 예측하는 정확도 자동 해석(auto-interp)

〈Towards Monosemanticity〉의 주력 SAE는 MLP 층이 주는 손실 감소분의 79%를 회복했다.[4] 재구성 오차가 작아 보여도 손실 회복률은 크게 떨어질 수 있어 두 지표를 함께 본다.

앤트로픽의 두 연구

편집 원본 편집

Towards Monosemanticity (2023)

편집 원본 편집

1층 트랜스포머의 512개 뉴런 MLP 활성을 80억 개 표본으로 학습한 SAE로 분해했다. 사전 크기는 512개(1배)부터 131,072개(256배)까지 바꿔 보았다.[4]

  • 아랍 문자, DNA 서열, base64 문자열 같은 특징이 뉴런보다 훨씬 깨끗하게 하나의 개념에 대응했다. 특징을 인위적으로 켜면 해당 텍스트를 생성하는 등 모델 행동과도 일치했다.
  • 특징 분할(feature splitting): 사전을 키우면 큰 특징 하나가 서로 가까운 여러 세부 특징으로 갈라진다. 특징 집합이 고정된 정답이 아니라 해상도에 따라 달라진다는 뜻이다.
  • 보편성: 서로 다른 모델에서 학습한 SAE가 비슷한 특징을 찾았다.
  • 4,096개짜리 사전에서 168개는 죽은 특징이었다.

Scaling Monosemanticity (2024)

편집 원본 편집

2024년 5월 앤트로픽은 상용 모델 클로드 3 소넷의 중간 층 잔차 스트림에 같은 방법을 적용했다. 잔차 스트림이 MLP 층보다 작아 계산이 싸고, 여러 층에 걸친 중첩 문제를 줄일 수 있다는 이유였다.[3]

  • 특징 수 1,048,576개(약 1M), 4,194,304개(약 4M), 33,554,432개(약 34M)의 SAE 세 개를 학습했다. 34M 학습 단계 수는 고정 계산 예산에서 손실을 최소화하도록 스케일링 법칙 분석으로 정했다.
  • 세 SAE 모두 토큰당 켜진 특징이 평균 300개 미만이었고 활성 분산의 65% 이상을 설명했다. 죽은 특징은 1M에서 약 2%, 4M에서 35%, 34M에서 65%였다.
  • 유명인, 도시, 코드의 타입 시그니처, 코드 속 보안 취약점과 백도어, 거짓말·기만·권력 추구, 아첨처럼 추상적인 특징이 나왔고, 상당수가 여러 언어와 이미지에 함께 반응했다.
  • 특징을 최대 활성의 10배로 고정(clamp)하자 행동이 그 개념 쪽으로 바뀌었다. 금문교 특징을 고정한 모델은 자기를 금문교라고 소개했고, 버그 없는 코드에 코드 오류 특징을 켜면 있지도 않은 오류 메시지를 지어냈다. 앤트로픽은 이 금문교 모델을 "Golden Gate Claude"라는 이름으로 2024년 5월 23일부터 24시간 동안 일반에 공개했다.[5]
  • 특징 분할도 다시 확인되었다. 1M의 "샌프란시스코" 특징은 4M에서 2개, 34M에서 11개로 갈라졌다. 반면 클로드가 런던의 자치구를 모두 나열할 수 있는데도 34M SAE에서 대부분의 자치구에 해당하는 특징을 찾지 못해, 특징 집합이 여전히 불완전함도 드러났다.

L1 벌점은 0이 아닌 개수(L0)의 불완전한 대리물이어서, 켜진 특징의 세기까지 0 쪽으로 깎는 수축(shrinkage) 편향을 낳는다. 이를 고치려는 변형이 2024년에 잇달아 나왔다.

변형 발표 활성 함수 특징
ReLU + L1 앤트로픽, 2023~2024 ReLU(Wx+b) 기본형. 수축과 죽은 특징 문제
Gated SAE 구글 딥마인드, 2024-04 어느 특징을 켤지(게이트)와 얼마나 켤지(크기)를 분리, L1은 게이트에만 수축 해소, 같은 재구성에 켜진 특징 수 절반[6]
TopK SAE OpenAI, 2024-06 상위 k개만 남기고 0, z=TopK(Wenc(x−bpre)) L0를 직접 지정, L1 불필요, 재구성-희소성 경계 개선[7]
JumpReLU SAE 구글 딥마인드, 2024-07 z⋅H(z−θ), 특징별 문턱 θ 직선 통과 추정기(STE)로 L0를 직접 학습, Gemma 2 9B에서 재구성 충실도 최고 수준[8]
트랜스코더 더네프스키 외, 2024-06 입력은 MLP 입력, 출력은 MLP 출력 층 표현이 아니라 MLP의 계산을 희소하게 근사, 회로 분석에 유리[9]
층 교차 트랜스코더(CLT) 앤트로픽, 2025-03 한 층의 특징이 이후 모든 층 MLP 출력에 기여 회로 추적·귀속 그래프의 기반[10]

TopK 방식 자체는 마흐자니(Makhzani)와 프레이(Frey)가 2013년 제안한 k-희소 오토인코더에서 왔다. OpenAI는 인코더를 디코더의 전치로 초기화하고, 죽은 특징 상위 몇 개로 재구성 오차를 모델링하는 보조 손실(AuxK)을 더해 죽은 특징을 줄였다. 이렇게 GPT-4 활성에 1,600만 개 특징의 SAE를 400억 토큰으로 학습했을 때 죽은 특징은 7%였다. 같은 논문은 아무 대책 없이 학습하면 최대 90%가 죽는다고 보고했다.[7]

트랜스코더 계열의 목적은 다르다. 일반 SAE는 "이 층에 무엇이 표현되어 있나"를 답하고, 트랜스코더는 "이 MLP가 무엇을 무엇으로 바꾸나"를 답한다. MLP를 희소 트랜스코더로 바꿔 끼우면 특징 사이의 연결을 가중치 곱으로 바로 읽을 수 있어 회로 추적의 재료가 된다.

  • Gemma Scope: 구글 딥마인드가 2024년 8월 공개한 JumpReLU SAE 묶음. Gemma 2 2B와 9B의 모든 층과 하위 층, 27B의 일부 층에 대해 학습했다.[11] 구글 젬마 문서 참고.
  • OpenAI는 GPT-2 small용 TopK SAE 전체와 학습 코드, 시각화 도구를 공개했다.[7]
  • SAELens: 공개 SAE를 내려받고 학습·분석하는 오픈소스 라이브러리. Neuronpedia는 공개 SAE 특징의 활성 예시와 설명을 웹에서 찾아볼 수 있게 한다.
  • 불완전한 재구성: 클로드 3 소넷 SAE의 설명 분산은 "65% 이상"으로만 보고되었고, 재구성을 모델에 넣으면 손실도 늘어난다. 설명되지 않은 부분에 어떤 계산이 있는지는 알 수 없다.
  • 해상도 의존: 특징 분할 때문에 "모델이 가진 특징의 목록"이 하나로 정해지지 않는다. 특징이 엉뚱한 추상화 수준에 놓이는 분할·흡수(absorption) 문제는 앤트로픽 회로 추적 논문도 한계로 꼽았다.[10]
  • 죽은 특징과 비용: 사전이 커질수록 죽은 특징이 늘고, 큰 모델 한 층에 SAE를 학습하는 비용이 크다.
  • 실용성 의문: 2025년 구글 딥마인드 해석 가능성 팀은 유해 의도 탐지에서 SAE 기반 분류기가 단순 선형 프로브보다 분포 밖 일반화가 나빴고, SAE 재구성만으로 학습한 프로브도 원래 잔차 스트림 프로브보다 크게 떨어져 SAE가 목표 개념 정보를 버리고 있음을 시사한다며 SAE 기초 연구의 우선순위를 낮췄다.[12] 다른 연구도 데이터 부족, 클래스 불균형, 레이블 잡음, 공변량 이동 상황의 프로빙에서 SAE가 기존 방법을 일관되게 넘지 못한다고 보고했다.[13] 다만 같은 팀도 SAE가 쓸모없다는 뜻은 아니며 계속 도구로 쓰겠다고 밝혔다.
  1. ↑ Nelson Elhage 외, Toy Models of Superposition, Transformer Circuits Thread, 2022-09-14.
  2. ↑ Hoagy Cunningham 외, 〈Sparse Autoencoders Find Highly Interpretable Features in Language Models〉, 2023. arXiv:2309.08600
  3. ↑ 3.0 3.1 Adly Templeton 외, Scaling Monosemanticity: Extracting Interpretable Features from Claude 3 Sonnet, Transformer Circuits Thread, 2024-05-21.
  4. ↑ 4.0 4.1 4.2 Trenton Bricken 외, Towards Monosemanticity: Decomposing Language Models With Dictionary Learning, Transformer Circuits Thread, 2023-10-04.
  5. ↑ Anthropic, Golden Gate Claude, 2024-05-23.
  6. ↑ Senthooran Rajamanoharan 외, 〈Improving Dictionary Learning with Gated Sparse Autoencoders〉, 2024. arXiv:2404.16014
  7. ↑ 7.0 7.1 7.2 Leo Gao 외, 〈Scaling and evaluating sparse autoencoders〉, 2024. arXiv:2406.04093
  8. ↑ Senthooran Rajamanoharan 외, 〈Jumping Ahead: Improving Reconstruction Fidelity with JumpReLU Sparse Autoencoders〉, 2024. arXiv:2407.14435
  9. ↑ Jacob Dunefsky, Philippe Chlenski, Neel Nanda, 〈Transcoders Find Interpretable LLM Feature Circuits〉, NeurIPS 2024. arXiv:2406.11944
  10. ↑ 10.0 10.1 Emmanuel Ameisen 외, Circuit Tracing: Revealing Computational Graphs in Language Models, Transformer Circuits Thread, 2025-03-27.
  11. ↑ Tom Lieberum 외, 〈Gemma Scope: Open Sparse Autoencoders Everywhere All At Once on Gemma 2〉, 2024. arXiv:2408.05147
  12. ↑ Lewis Smith 외, Negative Results for SAEs On Downstream Tasks and Deprioritising SAE Research, AI Alignment Forum, 2025-03-26.
  13. ↑ Subhash Kantamneni 외, 〈Are Sparse Autoencoders Useful? A Case Study in Sparse Probing〉, 2025. arXiv:2502.16681