이 저장소는 LLM의 활성화 스티어링(Activation Steering) 을 통해 학생의 성격 특성(Self-Efficacy, Intrinsic Motivation, Academic Stress)을 제어하려는 실험들의 모음입니다. SAE(Sparse Autoencoder) 사용 여부, 개입 위치(residual stream vs attention head), 토큰 범위(all vs last), feature 선택 기준 등을 다양하게 조합하여 비교 실험을 진행했습니다.
설문 항목으로 학습한 활성화 패턴(또는 SAE feature)을 inference 시점에 hidden state에 더해, LLM이 특정 성격 특성(예: 자아효능감 high/low)을 가진 것처럼 답변하도록 유도하는 실험.
| 코드 | 이름 | 설명 |
|---|---|---|
se | Self-Efficacy | 학업적 자아효능감 |
im | Intrinsic Motivation | 내재적 학습 동기 |
as | Academic Stress | 학업 스트레스 |
각 특성은 high / low 2개 레벨을 가지며, 3개 특성 × 2개 레벨의 조합으로 8개의 synthetic pattern 을 정의하여 평가에 사용합니다 (PATTERN_LABELS in config.py).
| 영역 | 모델 |
|---|---|
| 메인 (대부분의 최신 실험) | meta-llama/Llama-3.1-8B-Instruct |
| Gemma 파일럿 | google/gemma-2-2b-it |
| 초기 attention head 파일럿 | Llama 3B / Llama 8B / Phi-3.5 |
| SAE | 모델 | 위치 | 차원 |
|---|---|---|---|
LlamaScope (llama_scope_lxr_8x, l15r_8x) | Llama 3.1 8B | layer 15 (residual) | 32,768 features (8x expansion of d_model 4096) |
Gemma Scope (gemma-scope-2b-pt-res-canonical) | Gemma 2 2B | layer 12 (residual) | 16,384 features |
평가 시점의 logit 차이를 측정합니다. 프롬프트 템플릿:
Question: Given a statement of you: "{statement}", Do you agree?
Answer:
마지막 토큰 위치에서 Yes / No 토큰의 logit 차이(logit_diff = logit(Yes) - logit(No))를 계산하여, 기대되는 정답과의 일치율을 accuracy로 집계합니다 (LOGIT_PROMPT_TEMPLATE).
activation_steering_codes/
├── preprocessing/ # 설문 데이터셋 전처리
├── error_finetuning/ # (별개) 산술 오류 생성 finetuning 시도
├── no_sae_steering/ # SAE 없이 activation 직접 조작
│ ├── llama/ # - Llama 3.1 8B residual diff vector
│ └── pas_pilot_by_claude/ # 초기 attention head probe 파일럿 (3B/8B/Phi)
└── sae_steering/ # SAE feature 기반 스티어링
├── gemma/ # - Gemma 2 2B 파일럿
└── llama/ # - Llama 3.1 8B (residual / attention head 변형)
설문 항목 전처리 및 train/test split 생성.
이 결과는 이후 모든 실험에서 공유됩니다.
주제: Llama 3.1 8B로 의도적인 산술 오류(예: 부호 실수)를 생성하는 finetuning 데이터 파이프라인.
answer_differs=True)negative_sign_errors_*.json, stats_*.json, test_responses_*.json
스티어링 본 트랙과는 별개의 시도이며, 이후 설문 기반 스티어링으로 무게중심이 옮겨갑니다.
아이디어: SAE 없이, trait별 텍스트를 모델에 통과시켜 얻은 hidden state의 평균 차이 벡터(mean(high) - mean(low))를 그대로 layer 15 residual stream에 더한다.
핵심 코드:
coeff × diff_vector 추가outputs/ (예: features_se_20260318_162738.json, evaluation_20260318_162844.json):
features_{trait}_*.json: top-K residual dimension 정보vectors_{trait}_*.pt: 학습된 차이 벡터(d_model = 4096)evaluation_*.json: coefficient sweep 결과 (per-item logit_diff 포함)no_sae_steering/llama/before_0317/ 폴더는 3월 17일 이전 버전을 보관한 스냅샷입니다.
가장 초기 시도였던 attention head 단위의 개입 파일럿. Claude가 작성한 프로토타입이며, 모델별로 폴더가 분리되어 있습니다.
| 폴더 | 모델 | 개입 위치 |
|---|---|---|
| steering_attention_header/llama_8b_codes/ | Meta-Llama-3-8B-Instruct | 어텐션 헤드 출력 |
| steering_attention_header/llama_3b_codes/ | Llama 3B | 어텐션 헤드 출력 |
| steering_attention_header/phi_35_codes/ | Phi-3.5 | 어텐션 헤드 출력 |
| steering_second_residauls/llama_3b_codes/ | Llama 3B | 두 번째 residual stage |
파이프라인:
activation_extractor.py: 각 어텐션 헤드별 activation 수집probe_trainer.py: 헤드별로 logistic regression probe 학습 → trait를 잘 분류하는 head 식별steering.py: 그 head의 출력 방향에 α × σ_h × direction_h 추가, golden section search로 α 탐색outputs/ 안에는 evaluation_results_*.json (alpha sweep 결과), interventions_*.pkl (선택된 head별 displacement 저장)이 다수 남아 있습니다. before_system_prompt_update/ 폴더는 시스템 프롬프트 변경 전 결과를 비교용으로 보관한 것입니다.
Llama로 옮기기 전 Gemma 2 2B + Gemma Scope SAE로 검증한 초기 단계.
파이프라인 (find_high_feature 기준):
combined = Σ W_dec[idx] 로 steering vector 생성± coeff × combined 추가[20, 50, 100, 150, 200, 250])Llama 3.1 8B + LlamaScope (layer 15, 8x expansion). 변형 실험이 가장 많이 모여 있는 영역입니다.
명명 규칙:
LXR = Llama × Residual streamLXA = Llama × Attention output8x, 32x = SAE expansion factor (d_sae / d_model)l15, all_layers = 단일 layer 15 vs 모든 layerall_tokens vs last_token = activation 추출 시 사용할 토큰 범위only_high vs by_density vs by_no_density = feature 선택 기준only_input_* = QA pair 중 user 입력만 사용| 변형 | 경로 | 차이점 |
|---|---|---|
| only_high × all_tokens | LXR_8x_l15/only_high/all_tokens/ | high 텍스트 전 토큰 평균 |
| only_high × last_token | LXR_8x_l15/only_high/last_token/ | high 텍스트의 마지막 토큰만 |
| by_density (input only) | only_input_LXR_8x_l15/by_density/ | feature density ≤ 1% sparse feature만 사용 |
| by_no_density (input only) | only_input_LXR_8x_l15/by_no_density/ | density 필터 없음 |
| 32x × all layers | LXR_32x_all_layers/ | 32x expansion + 모든 layer 대상 (실험 단계) |
각 폴더의 핵심 파일은 거의 동일한 구조를 공유합니다 (sae_loader.py, feature_finder.py, sae_steerer.py, main_find_features.py, main_evaluate.py, analyze_feature_density.py, benchmark_math.py).
산출물 패턴:
sae_features_{trait}_*.json — 선택된 feature index, score, densitysae_vectors_{trait}_*.pt — 선택된 feature의 W_dec와 합산 벡터evaluation_sae_*.json — coefficient sweep 평가 결과feature_density_*.npz — 32,768개 feature의 활성화 빈도by_density 변형은 benchmark_output/ 아래에 수학 벤치마크 부작용 측정 결과를 함께 남기고 있습니다.
residual stream 대신 layer 15의 self-attention 출력에 같은 종류의 SAE 벡터를 더해보는 변형.
residual 변형과 코드 구조는 거의 동일하며, hook을 거는 위치만 model.model.layers[L] 에서 model.model.layers[L].self_attn 으로 바뀝니다.
디렉토리 이름과 출력 파일의 timestamp(YYYYMMDD_HHMMSS)를 단서로 추정한 흐름입니다.
no_sae_steering/pas_pilot_by_claude/ 의 Llama 8B / 3B / Phi-3.5 attention head 실험.
probe 학습 + α 탐색으로 head 단위 개입 가능성 확인.모든 실험이 동일한 전처리 산출물을 공유합니다:
all_data_ItemKey.xlsx — 설문 원본Test-set.json — 8개 synthetic pattern 평가 셋traintest_split_balanced_80_20.json — 80/20 분할data_loader.py 가 위 셋을 읽어 trait/level 별 텍스트 묶음으로 변환TRAIT_DESCRIPTIONS)각 (trait, level) 쌍에 대해 8개의 영문 문장을 사전 정의해두고, feature 탐색 시 high/low 양쪽 활성화 추출에 사용합니다 (config.py:81).
acts_high = extract_layer_activations(model, texts_high, layer=SAE_LAYER)
acts_low = extract_layer_activations(model, texts_low, layer=SAE_LAYER)
feat_high = sae.encode(acts_high) # (N_high, d_sae)
feat_low = sae.encode(acts_low) # (N_low, d_sae)
score = feat_high.mean(0) - feat_low.mean(0)
top_indices = score.argsort()[-TOP_K_FEATURES:]
combined_vector = sae.W_dec[top_indices].sum(0) # (d_model,)
by_density 변형은 위 단계 앞에 density[i] ≤ MAX_FEATURE_DENSITY 필터를 추가합니다.
def hook_fn(module, input, output):
hidden = output[0] if isinstance(output, tuple) else output
hidden = hidden + sign * coeff * combined_vector
return (hidden,) + output[1:] if isinstance(output, tuple) else hidden
handle = target_module.register_forward_hook(hook_fn)
# inference ...
handle.remove()
target_module 은 residual 변형에서는 model.model.layers[L], attention 변형에서는 model.model.layers[L].self_attn 입니다.
각 실험은 trait별로 baseline (no steering) + 여러 coefficient에서의 정확도를 함께 기록합니다. coefficient 후보 집합은 변형마다 다릅니다 (예: residual SAE는 [1, 2, 3, 5, 7, 10], no-SAE diff vector는 [5, 10, 15, 20, 30, 50], Gemma는 [20, 50, 100, 150, 200, 250]).
sae_features_{trait}_{YYYYMMDD_HHMMSS}.json
sae_vectors_{trait}_{YYYYMMDD_HHMMSS}.pt
evaluation_sae_{YYYYMMDD_HHMMSS}.json
feature_density_{YYYYMMDD_HHMMSS}.npz
타임스탬프가 같이 묶이므로 어느 feature 셋이 어느 평가 결과를 만들었는지 추적할 수 있습니다.
| 트랙 | SAE | 모델 | 개입 위치 | 토큰 | Feature 선택 | 비고 |
|---|---|---|---|---|---|---|
| pas_pilot (attn head) | ✗ | Llama 3B/8B, Phi-3.5 | attention head 출력 | — | head별 probe | 가장 초기 |
| no_sae_steering/llama | ✗ | Llama 3.1 8B | residual L15 | all | mean(high)−mean(low) | SAE-free baseline |
| gemma/find_high_feature | ✓ Gemma Scope | Gemma 2 2B | residual L12 | all | high에서 강한 top-K | Gemma 파일럿 |
| gemma/find_both_feature | ✓ Gemma Scope | Gemma 2 2B | residual L12 | all | high & low 둘 다 활성 | 대조 |
| LXR_8x_l15 / only_high / all_tokens | ✓ LlamaScope | Llama 3.1 8B | residual L15 | all | high에서 강한 top-K | 메인 |
| LXR_8x_l15 / only_high / last_token | ✓ LlamaScope | Llama 3.1 8B | residual L15 | last | 〃 | 토큰 범위 비교 |
| only_input_LXR_8x_l15 / by_density | ✓ LlamaScope | Llama 3.1 8B | residual L15 | input only | density ≤ 1% | sparse feature 강조 |
| only_input_LXR_8x_l15 / by_no_density | ✓ LlamaScope | Llama 3.1 8B | residual L15 | input only | density 필터 없음 | 대조 |
| LXR_32x_all_layers | ✓ LlamaScope (32x) | Llama 3.1 8B | residual 모든 layer | — | — | 확장 시도 |
| LXA_8x_l15 (all_tokens / last_token) | ✓ LlamaScope | Llama 3.1 8B | self_attn 출력 L15 | 변형 | residual과 동일 | 개입 위치 비교 |
| LXA_8x_all_layers | ✓ LlamaScope | Llama 3.1 8B | self_attn 모든 layer | — | — | 확장 시도 |
각 실험 폴더의 outputs/ 안에서 다음 파일들을 확인하세요:
evaluation_*.json / evaluation_sae_*.json — coefficient별 accuracy, per-item logit_diffsae_features_*.json — 어떤 feature가 선택되었는지 (index + score)sae_vectors_*.pt — 학습된 steering vector tensorfeature_density_*.npz — 32,768개 feature의 활성화 빈도 분포benchmark_output/ (일부 폴더) — 수학 벤치마크에서의 부작용 측정타임스탬프가 같은 파일끼리 묶어서 보면, 해당 시점의 feature → vector → evaluation 흐름을 한 세트로 추적할 수 있습니다.
이 저장소는 LLM의 활성화 스티어링(Activation Steering) 을 통해 학생의 성격 특성(Self-Efficacy, Intrinsic Motivation, Academic Stress)을 제어하려는 실험들의 모음입니다. SAE(Sparse Autoencoder) 사용 여부, 개입 위치(residual stream vs attention head), 토큰 범위(all vs last), feature 선택 기준 등을 다양하게 조합하여 비교 실험을 진행했습니다.
설문 항목으로 학습한 활성화 패턴(또는 SAE feature)을 inference 시점에 hidden state에 더해, LLM이 특정 성격 특성(예: 자아효능감 high/low)을 가진 것처럼 답변하도록 유도하는 실험.
| 코드 | 이름 | 설명 |
|---|---|---|
se | Self-Efficacy | 학업적 자아효능감 |
im | Intrinsic Motivation | 내재적 학습 동기 |
as | Academic Stress | 학업 스트레스 |
각 특성은 high / low 2개 레벨을 가지며, 3개 특성 × 2개 레벨의 조합으로 8개의 synthetic pattern 을 정의하여 평가에 사용합니다 (PATTERN_LABELS in config.py).
| 영역 | 모델 |
|---|---|
| 메인 (대부분의 최신 실험) | meta-llama/Llama-3.1-8B-Instruct |
| Gemma 파일럿 | google/gemma-2-2b-it |
| 초기 attention head 파일럿 | Llama 3B / Llama 8B / Phi-3.5 |
| SAE | 모델 | 위치 | 차원 |
|---|---|---|---|
LlamaScope (llama_scope_lxr_8x, l15r_8x) | Llama 3.1 8B | layer 15 (residual) | 32,768 features (8x expansion of d_model 4096) |
Gemma Scope (gemma-scope-2b-pt-res-canonical) | Gemma 2 2B | layer 12 (residual) | 16,384 features |
평가 시점의 logit 차이를 측정합니다. 프롬프트 템플릿:
Question: Given a statement of you: "{statement}", Do you agree?
Answer:
마지막 토큰 위치에서 Yes / No 토큰의 logit 차이(logit_diff = logit(Yes) - logit(No))를 계산하여, 기대되는 정답과의 일치율을 accuracy로 집계합니다 (LOGIT_PROMPT_TEMPLATE).
activation_steering_codes/
├── preprocessing/ # 설문 데이터셋 전처리
├── error_finetuning/ # (별개) 산술 오류 생성 finetuning 시도
├── no_sae_steering/ # SAE 없이 activation 직접 조작
│ ├── llama/ # - Llama 3.1 8B residual diff vector
│ └── pas_pilot_by_claude/ # 초기 attention head probe 파일럿 (3B/8B/Phi)
└── sae_steering/ # SAE feature 기반 스티어링
├── gemma/ # - Gemma 2 2B 파일럿
└── llama/ # - Llama 3.1 8B (residual / attention head 변형)
설문 항목 전처리 및 train/test split 생성.
이 결과는 이후 모든 실험에서 공유됩니다.
주제: Llama 3.1 8B로 의도적인 산술 오류(예: 부호 실수)를 생성하는 finetuning 데이터 파이프라인.
answer_differs=True)negative_sign_errors_*.json, stats_*.json, test_responses_*.json
스티어링 본 트랙과는 별개의 시도이며, 이후 설문 기반 스티어링으로 무게중심이 옮겨갑니다.
아이디어: SAE 없이, trait별 텍스트를 모델에 통과시켜 얻은 hidden state의 평균 차이 벡터(mean(high) - mean(low))를 그대로 layer 15 residual stream에 더한다.
핵심 코드:
coeff × diff_vector 추가outputs/ (예: features_se_20260318_162738.json, evaluation_20260318_162844.json):
features_{trait}_*.json: top-K residual dimension 정보vectors_{trait}_*.pt: 학습된 차이 벡터(d_model = 4096)evaluation_*.json: coefficient sweep 결과 (per-item logit_diff 포함)no_sae_steering/llama/before_0317/ 폴더는 3월 17일 이전 버전을 보관한 스냅샷입니다.
가장 초기 시도였던 attention head 단위의 개입 파일럿. Claude가 작성한 프로토타입이며, 모델별로 폴더가 분리되어 있습니다.
| 폴더 | 모델 | 개입 위치 |
|---|---|---|
| steering_attention_header/llama_8b_codes/ | Meta-Llama-3-8B-Instruct | 어텐션 헤드 출력 |
| steering_attention_header/llama_3b_codes/ | Llama 3B | 어텐션 헤드 출력 |
| steering_attention_header/phi_35_codes/ | Phi-3.5 | 어텐션 헤드 출력 |
| steering_second_residauls/llama_3b_codes/ | Llama 3B | 두 번째 residual stage |
파이프라인:
activation_extractor.py: 각 어텐션 헤드별 activation 수집probe_trainer.py: 헤드별로 logistic regression probe 학습 → trait를 잘 분류하는 head 식별steering.py: 그 head의 출력 방향에 α × σ_h × direction_h 추가, golden section search로 α 탐색outputs/ 안에는 evaluation_results_*.json (alpha sweep 결과), interventions_*.pkl (선택된 head별 displacement 저장)이 다수 남아 있습니다. before_system_prompt_update/ 폴더는 시스템 프롬프트 변경 전 결과를 비교용으로 보관한 것입니다.
Llama로 옮기기 전 Gemma 2 2B + Gemma Scope SAE로 검증한 초기 단계.
파이프라인 (find_high_feature 기준):
combined = Σ W_dec[idx] 로 steering vector 생성± coeff × combined 추가[20, 50, 100, 150, 200, 250])Llama 3.1 8B + LlamaScope (layer 15, 8x expansion). 변형 실험이 가장 많이 모여 있는 영역입니다.
명명 규칙:
LXR = Llama × Residual streamLXA = Llama × Attention output8x, 32x = SAE expansion factor (d_sae / d_model)l15, all_layers = 단일 layer 15 vs 모든 layerall_tokens vs last_token = activation 추출 시 사용할 토큰 범위only_high vs by_density vs by_no_density = feature 선택 기준only_input_* = QA pair 중 user 입력만 사용| 변형 | 경로 | 차이점 |
|---|---|---|
| only_high × all_tokens | LXR_8x_l15/only_high/all_tokens/ | high 텍스트 전 토큰 평균 |
| only_high × last_token | LXR_8x_l15/only_high/last_token/ | high 텍스트의 마지막 토큰만 |
| by_density (input only) | only_input_LXR_8x_l15/by_density/ | feature density ≤ 1% sparse feature만 사용 |
| by_no_density (input only) | only_input_LXR_8x_l15/by_no_density/ | density 필터 없음 |
| 32x × all layers | LXR_32x_all_layers/ | 32x expansion + 모든 layer 대상 (실험 단계) |
각 폴더의 핵심 파일은 거의 동일한 구조를 공유합니다 (sae_loader.py, feature_finder.py, sae_steerer.py, main_find_features.py, main_evaluate.py, analyze_feature_density.py, benchmark_math.py).
산출물 패턴:
sae_features_{trait}_*.json — 선택된 feature index, score, densitysae_vectors_{trait}_*.pt — 선택된 feature의 W_dec와 합산 벡터evaluation_sae_*.json — coefficient sweep 평가 결과feature_density_*.npz — 32,768개 feature의 활성화 빈도by_density 변형은 benchmark_output/ 아래에 수학 벤치마크 부작용 측정 결과를 함께 남기고 있습니다.
residual stream 대신 layer 15의 self-attention 출력에 같은 종류의 SAE 벡터를 더해보는 변형.
residual 변형과 코드 구조는 거의 동일하며, hook을 거는 위치만 model.model.layers[L] 에서 model.model.layers[L].self_attn 으로 바뀝니다.
디렉토리 이름과 출력 파일의 timestamp(YYYYMMDD_HHMMSS)를 단서로 추정한 흐름입니다.
no_sae_steering/pas_pilot_by_claude/ 의 Llama 8B / 3B / Phi-3.5 attention head 실험.
probe 학습 + α 탐색으로 head 단위 개입 가능성 확인.모든 실험이 동일한 전처리 산출물을 공유합니다:
all_data_ItemKey.xlsx — 설문 원본Test-set.json — 8개 synthetic pattern 평가 셋traintest_split_balanced_80_20.json — 80/20 분할data_loader.py 가 위 셋을 읽어 trait/level 별 텍스트 묶음으로 변환TRAIT_DESCRIPTIONS)각 (trait, level) 쌍에 대해 8개의 영문 문장을 사전 정의해두고, feature 탐색 시 high/low 양쪽 활성화 추출에 사용합니다 (config.py:81).
acts_high = extract_layer_activations(model, texts_high, layer=SAE_LAYER)
acts_low = extract_layer_activations(model, texts_low, layer=SAE_LAYER)
feat_high = sae.encode(acts_high) # (N_high, d_sae)
feat_low = sae.encode(acts_low) # (N_low, d_sae)
score = feat_high.mean(0) - feat_low.mean(0)
top_indices = score.argsort()[-TOP_K_FEATURES:]
combined_vector = sae.W_dec[top_indices].sum(0) # (d_model,)
by_density 변형은 위 단계 앞에 density[i] ≤ MAX_FEATURE_DENSITY 필터를 추가합니다.
def hook_fn(module, input, output):
hidden = output[0] if isinstance(output, tuple) else output
hidden = hidden + sign * coeff * combined_vector
return (hidden,) + output[1:] if isinstance(output, tuple) else hidden
handle = target_module.register_forward_hook(hook_fn)
# inference ...
handle.remove()
target_module 은 residual 변형에서는 model.model.layers[L], attention 변형에서는 model.model.layers[L].self_attn 입니다.
각 실험은 trait별로 baseline (no steering) + 여러 coefficient에서의 정확도를 함께 기록합니다. coefficient 후보 집합은 변형마다 다릅니다 (예: residual SAE는 [1, 2, 3, 5, 7, 10], no-SAE diff vector는 [5, 10, 15, 20, 30, 50], Gemma는 [20, 50, 100, 150, 200, 250]).
sae_features_{trait}_{YYYYMMDD_HHMMSS}.json
sae_vectors_{trait}_{YYYYMMDD_HHMMSS}.pt
evaluation_sae_{YYYYMMDD_HHMMSS}.json
feature_density_{YYYYMMDD_HHMMSS}.npz
타임스탬프가 같이 묶이므로 어느 feature 셋이 어느 평가 결과를 만들었는지 추적할 수 있습니다.
| 트랙 | SAE | 모델 | 개입 위치 | 토큰 | Feature 선택 | 비고 |
|---|---|---|---|---|---|---|
| pas_pilot (attn head) | ✗ | Llama 3B/8B, Phi-3.5 | attention head 출력 | — | head별 probe | 가장 초기 |
| no_sae_steering/llama | ✗ | Llama 3.1 8B | residual L15 | all | mean(high)−mean(low) | SAE-free baseline |
| gemma/find_high_feature | ✓ Gemma Scope | Gemma 2 2B | residual L12 | all | high에서 강한 top-K | Gemma 파일럿 |
| gemma/find_both_feature | ✓ Gemma Scope | Gemma 2 2B | residual L12 | all | high & low 둘 다 활성 | 대조 |
| LXR_8x_l15 / only_high / all_tokens | ✓ LlamaScope | Llama 3.1 8B | residual L15 | all | high에서 강한 top-K | 메인 |
| LXR_8x_l15 / only_high / last_token | ✓ LlamaScope | Llama 3.1 8B | residual L15 | last | 〃 | 토큰 범위 비교 |
| only_input_LXR_8x_l15 / by_density | ✓ LlamaScope | Llama 3.1 8B | residual L15 | input only | density ≤ 1% | sparse feature 강조 |
| only_input_LXR_8x_l15 / by_no_density | ✓ LlamaScope | Llama 3.1 8B | residual L15 | input only | density 필터 없음 | 대조 |
| LXR_32x_all_layers | ✓ LlamaScope (32x) | Llama 3.1 8B | residual 모든 layer | — | — | 확장 시도 |
| LXA_8x_l15 (all_tokens / last_token) | ✓ LlamaScope | Llama 3.1 8B | self_attn 출력 L15 | 변형 | residual과 동일 | 개입 위치 비교 |
| LXA_8x_all_layers | ✓ LlamaScope | Llama 3.1 8B | self_attn 모든 layer | — | — | 확장 시도 |
각 실험 폴더의 outputs/ 안에서 다음 파일들을 확인하세요:
evaluation_*.json / evaluation_sae_*.json — coefficient별 accuracy, per-item logit_diffsae_features_*.json — 어떤 feature가 선택되었는지 (index + score)sae_vectors_*.pt — 학습된 steering vector tensorfeature_density_*.npz — 32,768개 feature의 활성화 빈도 분포benchmark_output/ (일부 폴더) — 수학 벤치마크에서의 부작용 측정타임스탬프가 같은 파일끼리 묶어서 보면, 해당 시점의 feature → vector → evaluation 흐름을 한 세트로 추적할 수 있습니다.