- Llama 3.2-3B 내부 표현을 Sparse Autoencoder(SAE) 로 분해해 해석 가능한 특징을 추출하려는 프로젝트로, 활성값 캡처부터 학습·해석·검증까지 한 번 실행된 전체 파이프라인과 산출물을 공개함
- 파이프라인은 Llama 3.2-3B의 23번째 레이어 residual activation을 OpenWebText 문장 단위 데이터에서 캡처하고, 65,536개 latent와 TopK=64 설정의 SAE를 PyTorch로 학습함
- 공개 리소스에는 문장 단위 OpenWebText 데이터셋, 2,500만 문장의 활성값 3.2TB, Weights & Biases 학습 로그, 10 epoch 학습된 SAE 모델이 포함됨
- 학습은 8x Nvidia RTX4090에서 약 7일간 진행됐고, 최종 정규화 손실은 약 0.144였으며, auxiliary loss가 초기 약 40%였던 dead latent를 빠르게 되살리는 양상을 보임
- 해석 분석은 각 latent를 가장 강하게 활성화한 상위 50개 문장을 Claude 3.5로 분석하는 방식이며, feature steering은 가능하지만 첫 베타 버전에서는 결과가 일관적이지 않음
프로젝트 목표와 범위
- 이 프로젝트는 Llama 3.2-3B에 Sparse Autoencoder(SAE) 를 적용해 LLM 내부 표현을 더 해석 가능한 특징으로 분해하려는 시도임
- 현대 LLM은 여러 특징을 같은 뉴런에 겹쳐 저장하는 superposition을 사용하며, SAE는 활성값을 매우 크고 희소한 latent 공간으로 투영해 겹친 표현을 분리하려 함
- 목표는 다음 과정을 포함하는 전체 파이프라인 제공임
- LLM 활성값 캡처
- SAE 학습 데이터 생성과 전처리
- SAE 학습
- 학습된 특징의 의미 분석
- 실험적 검증과 feature steering
- 현재 버전 0.2는 한 번 전체 파이프라인을 실행해 Llama 3.2-3B용 해석 가능한 SAE를 만든 상태이며, 최종 버전은 아님
- 프로젝트는 Anthropic, OpenAI, Google DeepMind의 최근 SAE 기반 기계적 해석 가능성 연구를 재현하려는 성격을 가짐
핵심 기능
- 파이프라인은 활성값 캡처부터 검증까지 end-to-end로 구성되며, 순수 PyTorch와 최소 의존성으로 작성됨
- 주요 기능은 다음과 같음
- 문장 단위 OpenWebText 변형 데이터셋으로 LLM residual activation 캡처
- 효율적 학습을 위한 prebatching과 통계 계산
- 단일 노드 다중 GPU 분산 SAE 학습
- dead latent 방지와 회복을 위한 auxiliary loss
- 학습 안정화를 위한 gradient projection
- Weights & Biases와 콘솔 로그 기반 학습·검증·dead latent 모니터링
- latent를 강하게 활성화하는 입력 캡처와 Frontier LLM 기반 의미 분석
- 외부 Fairscale 의존성 없는 Llama 3.1/3.2 채팅·텍스트 완성 구현
- 텍스트·채팅 완성 및 선택적 Gradio UI를 통한 SAE 영향 검증과 feature steering
- 모든 컴포넌트는 확장성, 효율성, 유지보수성을 고려해 설계됐다고 명시됨
공개된 산출물
- OpenWebText Sentence Dataset
- OpenWebText를 문장 단위로 처리한 변형 데이터셋
- 원본 OpenWebText의 모든 텍스트와 순서를 유지함
- 문장은 parquet 형식으로 개별 저장돼 빠른 접근을 지원함
- 문장 분리는 NLTK 3.9.1의 사전 학습된 “Punkt” 토크나이저로 수행됨
- Captured Llama 3.2-3B Activations
- Llama 3.2-3B layer 23 residual activation 2,500만 문장 분량
- 원본 4TB가 3.2TB로 압축됨
- 다운로드 관리를 위해 100개 아카이브로 분할됨
- SAE Training Log
- Weights & Biases 기반 학습·검증·디버그 메트릭 로그
- 10 epoch, 10,000 logged steps
- train/val main loss, auxiliary loss, dead latent 통계를 포함함
- Trained 65,536 latents SAE Model
- 10 epoch 학습을 마친 최종 SAE 모델
- Llama 3.2-3B layer 23에서 나온 65억 activation으로 학습됨
코드 구조
- 프로젝트는 네 개 주요 컴포넌트로 나뉨
-
Data Capture
capture_activations.py: LLM residual activation 캡처openwebtext_sentences_dataset.py: 문장 단위 처리를 위한 커스텀 데이터셋
-
SAE Training
sae.py: 핵심 SAE 모델 구현sae_preprocessing.py: SAE 학습 데이터 전처리sae_training.py: 분산 SAE 학습 구현
-
Interpretability
capture_top_activating_sentences.py: feature activation을 최대화하는 문장 식별interpret_top_sentences_send_batches.py: 해석용 배치 생성과 전송interpret_top_sentences_retrieve_batches.py: 해석 결과 수신interpret_top_sentences_parse_responses.py: 해석 결과 파싱과 분석
-
Verification and Testing
llama_3_inference.py: 핵심 추론 구현llama_3_inference_text_completion_test.py: 텍스트 완성 테스트llama_3_inference_chat_completion_test.py: 채팅 완성 테스트llama_3_inference_text_completion_gradio.py: 대화형 테스트용 Gradio 인터페이스
Llama 3.1/3.2 커스텀 구현
- 연구 기반은
llama_3/model_text_only.py에 있는 Llama 3.1/3.2 transformer 구현임 - 이 구현은 Llama models repository의 참조 구현을 기반으로 하되, 프로젝트 목적에 맞춰 수정됨
- Fairscale에 대한 무거운 의존성을 제거함
- 초기 릴리스에서 이미지 해석 가능성까지 다루면 복잡도가 증가하기 때문에 multimodal 기능을 제거함
Transformer생성자에는 특정 레이어에서 활성값 캡처 또는 학습된 SAE 주입을 가능하게 하는 인자가 추가됨store_layer_activsae_layer_forward_fn
llama_3/디렉터리의 보조 파일 대부분은 원본 Llama models repository에서 유지됨- 보조 코드의 95%는 사용되지 않지만, chat formatter가 상호 연결된 import에 의존하기 때문에 그대로 포함됨
- 실제 추론 구현은
llama_3_inference.py에 있으며, 채팅과 텍스트 완성 모두에서 스트리밍을 지원함 - 추론은 batched inference, temperature, top-p 설정을 지원하며, temperature가 0이면 greedy sampling으로 자동 전환됨
데이터 캡처와 전처리
- 활성값 캡처에는 OpenWebText를 문장 단위로 처리한 커스텀 변형 데이터셋을 사용함
- 캡처 설정과 규모는 다음과 같음
- 2,500만 문장
- 문장당 최대 192 tokens
- 원본 활성값 4TB
- tar.gz 압축 후 3.2TB
- 약 7억 activation
- 평균 문장 길이 27.3 tokens
- 데이터셋은 Anthropic과 Google DeepMind가 사용한 약 80억 unique activation보다 약 한 자릿수 작음
- 작은 데이터셋을 보완하기 위해 SAE를 10 epoch 학습해 총 처리 activation 수를 Anthropic과 Google DeepMind 실험과 맞추려 함
- 차이는 이 프로젝트의 SAE가 각 activation을 10번 본다는 점임
- 32TB 규모로 확장하면 GCP bucket 비용이 약 $80/month에서 $800/month로 증가할 것으로 계산돼, 비영리 사이드 프로젝트 비용 제약이 있음
- 문장 단위 처리는 자연스러운 언어 단위에서 의미를 유지하려는 선택임
- 문장은 완결된 생각과 개념을 담는 단위로 간주됨
- 문맥의 인위적 절단을 피함
- 문장 경계를 넘는 의미 혼합인 contextual bleed를 줄이려 함
- 이후 해석 분석에도 같은 문장 단위 activation을 쓰기 위한 선택임
- BOS 토큰 없이 문장을 처리함
- 위치 특화 패턴을 피하고 의미 기반 특징을 해석하려는 목적임
- 캡처 지점은 Llama 3.2-3B의 28개 레이어 중 23번째 레이어이며, layer normalization 이후 residual stream activation임
- 모델 깊이의 약 5/6 지점으로, OpenAI 구현을 따름
- 캡처는 NCCL 기반 단일 노드 다중 GPU 추론으로 구현됨
- 별도 프로세스가 비동기 디스크 I/O를 처리해 GPU 처리 병목을 줄임
- 전체 캡처는 4x Nvidia RTX4090에서 약 12시간 걸림
- 전처리는 1024 activation 단위 batch를 미리 만들기 위한 단계임
- 가변 시퀀스 길이와 carryover 처리가 학습 중 복잡한 버그나 I/O 병목을 만들 수 있어 별도 전처리를 선택함
- Welford 알고리듬으로 전체 activation 평균 tensor를 계산함
- 계산된 평균은 SAE의
b_prebias 초기값으로 사용됨 - 전체 전처리 파이프라인은 multiprocessing으로 CPU 병렬화됨
SAE 설계와 학습 방식
- SAE는 OpenAI 선택을 주로 따른 TopK Autoencoder 구조임
- forward pass는 다음 형태로 구성됨
- Encoder:
h = TopK(W_enc(x - b_pre) + b_enc) - Decoder:
x^ = W_dec * h (+ h_bias) + b_pre
- Encoder:
b_pre는 encoder와 decoder에 모두 쓰이며, 전처리에서 계산한 평균으로 초기화됨b_enc는 encoder 전용 bias이며 무작위로 초기화됨- latent sparsity는 TopK 활성 함수로 강제됨
- 가장 큰 k개 activation만 유지하고 나머지는 0으로 설정함
- Anthropic 방식처럼 L1 penalty를 사용하지 않음
- 선택적
h_bias는 학습 중 비활성화되지만, 이후 feature steering을 위해 켤 수 있음 - 수치 정밀도는 float32를 사용함
- Llama가 요구하는 bfloat16과 sign bit 1개, exponent bit 8개를 공유해 변환이 빠르고 정확하다고 설명됨
- 이 프로젝트의 주요 SAE 하이퍼파라미터는 다음과 같음
d_model = 3072n_latents = 2**16, 즉 65,536k = 64k_aux = 2048aux_loss_coeff = 1 / 32dead_steps_threshold = 80_000batch_size = 1024num_epochs = 10learning_rate = 5e-5train_val_split = 0.95
- Llama 3.2 3B의 residual stream dimension 3,072 대비 약 21배 크기의 latent dimension을 선택함
- 손실 함수는 main reconstruction loss와 auxiliary loss의 조합임
total_loss = main_loss + aux_loss_coeff * aux_loss- 두 손실은 normalized space에서 계산됨
- auxiliary loss는 OpenAI가 제안한 방식으로, dead latent를 방지하고 되살리기 위한 역할을 함
- main reconstruction residual과 auxiliary reconstruction 사이의 MSE를 계산함
- 최근 활성화되지 않은 latent 중 top-
k_aux값을 decoder로 다시 보내 학습 신호를 줌 - top
klatent만 쓰는 주 학습에서 제외된 inactive latent가 놓친 정보를 포착하도록 유도함
- latent가
dead_steps_threshold인 80,000 training steps 동안 활성화되지 않으면 dead로 간주됨- 이 설정은 약 1 epoch에 해당함
- effective batch size 8192 기준 최근 약 6.5억 activation의 reconstruction에서 한 번도 활성화되지 않은 상태를 뜻함
- 학습은 NCCL backend의 단일 노드 다중 GPU 분산 학습으로 진행됨
- 8x Nvidia RTX4090
- 10 epoch
- per-GPU batch size 1024
- effective batch size 8192
- 약 70억 activation 처리
- 7일 조금 넘게 소요됨
- AdamW 설정은 희소 오토인코더의 드문 activation 패턴을 고려해 조정됨
beta_1 = 0.85beta_2 = 0.9999eps = 6.25e-10- learning rate는 cosine annealing으로 5e-5에서 1e-5까지 감소함
- decoder weight는 초기화 이후와 매 training step마다 unit norm으로 정규화됨
project_decoder_grads()는 decoder weight의 unit-norm 제약을 유지하기 위해 기존 dictionary vector와 평행한 gradient 성분을 제거함
학습 결과
- SAE 학습은 8x Nvidia RTX4090에서 약 7일 동안 진행됐고, 안정적인 수렴을 보임
- 최종 total normalized loss는 약 0.144에 도달함
- validation loss는 학습 데이터의 5% held-out 구간에서 계산됐고, training loss와 유사한 로그 감소 패턴을 보임
- warm-up 80,000 training steps 이후 약 40% latent가 dead로 식별됨
- auxiliary loss는 dead latent를 빠르게 되살렸고, dead latent 비율은 빠르게 감소함
- auxiliary loss는 dead latent가 최소
k_aux인 2,048개 이상일 때만 계산됨- 이 조건은 65,536개 latent 중 약 3%를 soft lower bound처럼 만들었음
- 후반부에는 dead latent가 부족해 auxiliary loss가 자주 0이 됨
- Anthropic과 OpenAI는 특정 구성에서 최대 65% dead latent를 보고했지만, 이 프로젝트는 더 작은 latent size와 auxiliary loss, gradient projection 조합에서 dead latent가 빠르게 줄어드는 결과를 보임
- 향후 실험에서는 auxiliary loss 계산의 최소 dead latent 조건을 제거하면 dead latent를 더 줄일 가능성이 있다고 적혀 있음
해석 가능성 분석
- 해석 분석은 Anthropic의 scaling monosemanticity 방법을 참고하지만, 단일 토큰이 아니라 문장 단위를 분석함
- 각 latent에 대해 가장 강하게 활성화한 상위 50개 문장을 캡처함
- activation strength는 문장 내 모든 토큰에 대해 두 가지 방식으로 집계됨
mean: 문장 전체에서 지속적으로 활성화되는 의미 주제를 찾기 위한 방식last: 자기회귀 모델에서 전체 문장을 본 마지막 토큰 표현을 활용하기 위한 방식
- 의미 분석에는 Claude 3.5, 구체적으로
claude-3-5-sonnet-20241022가 사용됨 - 프롬프트는 50개 문장에 대해 다음 단계를 수행하도록 구성됨
- 핵심 단어와 구문 식별
- 주제 요소 그룹화
- 잠재적 outlier 고려
- confidence score가 포함된 최종 의미 해석 제공
- 분석 파이프라인은 세 단계로 구현됨
- 비용 효율적인 batch로 분석 요청 전송
- 응답 수신
- 의미 해석 파싱과 처리
- 중간 산출물은 재현성과 추가 분석을 위해 보존됨
capture_top_sentences/: 원문 문장, activation aggregation, OpenWebText indextop_sentences_last_responses/와top_sentences_mean_responses/: 처리 전 의미 분석 응답latent_index_meaning/: latent index와common_semantic, certainty score 매핑
- 예시로 latent #896은 “United Nations 기관, 인물, 운영, 공식 문서에 대한 형식적 기관 용어 참조”로 식별됨
- 50개 중 50개 문장이 UN을 직접 참조함
UN,United Nations,Secretary-General,Special Rapporteur,UNDP,UNHCR,OCHA,UNODC같은 용어가 포함됨- certainty는 1.0으로 산출됨
- Claude 3.5 batch mode로 24,828,558 input tokens와 3,920,044 output tokens를 처리하는 데 $66.74가 들었음
- 이 방식은 feature extraction과 잠재적 feature steering을 위한 초기 방법으로 선택됐으며, 결과 품질 측면에서 단순함의 비용이 있다고 적혀 있음
검증과 feature steering
- 검증 인프라는 SAE가 모델 동작에 미치는 영향을 분석하고 검증하기 위한 세 가지 스크립트로 구성됨
llama_3_inference_chat_completion_test.pyllama_3_inference_text_completion_test.pyllama_3_inference_text_completion_gradio.py
- 각 구현은 다음을 지원함
- batched inference
- 각 줄을 별도 batch element로 처리
- temperature와 top-p 설정
- 학습된 SAE 주입
- feature activation 분석
- feature steering
latent_index_meaning/의 semantic meaning과 certainty score는 feature activation 분석과 steering 실험의 기반으로 사용됨- 예시 prompt는 다음 네 개임
The delegates gathered at theForeign officials released a statementHumanitarian staff coordinated their effortsSenior diplomats met to discuss
- 텍스트 완성 예시는
max_new_tokens=128,temperature=0.7,top_p=0.9,seed=42설정으로 실행됨 - feature steering 예시는 latent #896을 대상으로 함
h_bias를 통해 latent activation 값을 20 증가시킴- 모델의 텍스트 완성을 UN 관련 내용으로 유도할 수 있음
- 첫 베타 버전의 feature steering은 강하지 않음
- 예시에서도 두 번째와 세 번째 문장만 UN 관련 내용으로 전환됨
- UN으로 이어질 가능성이 있는 시작 문장을 의도적으로 골랐음
For any n, if 2n - 1 is odd처럼 UN과 무관한 문장 시작에서는 실패할 것이라고 적혀 있음
- 현재 해석 분석은 steering 최적화보다 feature extraction에 초점을 맞췄기 때문에 steering 결과는 일관적이지 않음
- feature steering은 첫 릴리스에서 추가 시연 성격이며, feature extraction 자체가 모델 이해에 유용하다고 정리됨
향후 개선 방향
- latent dimension을 최소
2^18, 즉 262,144개 feature로 늘리고 k를 32로 줄이는 실험이 제안됨- 더 많은 고유 feature를 발견하고 더 강한 sparsity를 유지하기 위한 방향임
- 증가한 계산량은 효율 개선이나 gradient accumulation 같은 방식으로 상쇄해야 함
- latent activation tracking을 더 체계화할 계획이 있음
- 학습 중
latent_last_nonzerotensor 상태를 자주 기록하면 latent가 언제 활성화되거나 죽는지 더 깊게 볼 수 있음
- 학습 중
- sparse latent 공간의 co-activation pattern을 추적해 feature interaction을 분석하는 지원이 제안됨
- 고활성 문장과 n-gram을 더 정교하게 그룹화하는 해석 분석 방식이 향후 과제로 제시됨
- feature extraction뿐 아니라 feature steering 기반 해석 분석도 수행할 수 있음
- Llama 3.1-8B activation으로 연구를 확장할 수 있음
- Llama 3.2와 코드베이스를 공유하기 때문에 hyperparameter와 많은 compute power 조정이 주요 요구 사항임
- activation capture 지점을 바꾸는 실험도 제안됨
- 모델의 더 이른 레이어
- transformer block 내부의 attention head output
- MLP output
- auxiliary loss 메커니즘을 추가 최적화할 수 있음
- 현재 구현은 dead latent 방지에서 강한 성능을 보였고, 최소 dead latent threshold와 feature 품질의 관계를 조사할 수 있음
- SAE architecture의 bias term과 main loss function 조정도 향후 실험 후보임
- 코드베이스 전반의 docstring 추가가 필요함
- inline documentation은 추가했지만, 첫 릴리스에서는 proper docstring을 넣을 시간이 없었다고 적혀 있음