16일간의 region region region
끝난 실행
ANDREA-120M v1은 2026-03-22에 시작되어 계획된 200,000 스텝 중 165,000 스텝인 2026-04-15에 종료되었습니다. EMA 손실 최소값: 110K 스텝에서 3.23 (무작위 확률: ln(8449) = 9.04, 따라서 손실은 존경할 만해 보였음). 샘플은 그렇지 않았습니다.
Step 80K: 지역 지역 지역 지역 지역 지역 지역
Step 110K: ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
Step 140K: 게임, 게임, 게임, 게임, 게임, 게임
Step 165K: 부디 부디 부디 부디 부디 부디 부디 부디 부디
RTX 4090 컴퓨트 16일. 130W 연속. 80K 단계 이후 쓰레기.
microGPT는 작동했지만 120M은 왜 실패했나
ANDREA-12M은 동일한 훈련 프록시를 사용하고 통과했습니다. 더 작은 가중치 행렬이 그래디언트 충격에 더 견고함을 입증했습니다. 120M 매개변수로 확장하면서 모든 취약점이 배가되었습니다. 다섯 가지 실패가 복합적으로 발생했습니다.
다섯 가지 복합 실패
실패 1: 그래디언트 클리핑 없음. 소스 전환이 7-42 스텝마다 발생하여 경계 없는 그래디언트 스파이크를 생성했습니다. 120M에서 단일 나쁜 배치가 모델을 옵티마이저가 벗어날 수 없는 퇴화된 어트랙터로 밀어넣을 수 있습니다. 12M 모델은 더 작은 가중치가 충격을 견딜 수 있었기 때문에 살아남았습니다.
실패 2: LR 워밍업 없음. 학습률이 새로 초기화된 가중치에서 즉시 0에서 피크로 점프했습니다. 표현이 형성되기 전에 모델이 나쁜 분기(basin)에 빠졌습니다.
실패 3: 가중치 감소 없음. Vanilla Adam이 120M 용량에서 반복 패턴을 증폭시키는 임의로 큰 가중치를 허용했습니다.
실패 4: 샘플 품질 모니터링 없음. eval_chat_quality()는 레거시 다단계 러너에만 연결되어 있었고, firehose 커리큘럼은 이를 호출하지 않았습니다. 모델이 80K 스텝부터 쓰레기를 생성했지만 10일 이상 탐지되지 않았습니다.
실패 5: Bandit이 반복적인 소스를 보상함. repo-docs, repo-docstrings, & unfirehose-chat이 최고 점수(평균 보상 340-453)를 받았습니다. 왜냐하면 목록 구조 콘텐츠가 교차 엔트로피를 사소하게 줄이기 때문입니다. Bandit이 모델을 퇴화시키는 것을 더 많이 먹였습니다.
복합 효과
단일 실패만으로는 v1이 붕괴되지 않았을 것입니다. 각 실패가 다른 실패들을 증폭시켰습니다. 워밍업(2) 없이 그라디언트 충격(1)이 신선하게 초기화된 모델에 임의로 큰 가중치(3)를 가하며 반복을 생성했고, 밴디트가 이를 보상(5)했으며, 아무도 출력물을 감시하지 않았습니다(4). 다섯 가지 교차하는 원인, 하나의 붕괴.
왜 다섯 가지 실패인가, 하나가 아닌
실패 하나당 수정 하나
v2 구성 (2026-04-15)
| 수정 | 대상 실패 | 구현 |
|---|---|---|
| 그래디언트 클리핑 | F1 (클리핑 없음) | 전역 L2 노름, max_norm=1.0; 세 개의 CUDA 커널 (k_grad_norm_partial, k_grad_norm_final, k_grad_scale)이 pre-Adam 계산 및 적용 |
| LR 워밍업 | F2 (워밍업 없음) | 2000 스텝 동안 0에서 피크까지 선형 램프. lr(t) = lr_scheduled(t) * min(1, (t+1)/warmup_steps) |
| AdamW | F3 (가중치 감소 없음) | 분리된 가중치 감소 (Loshchilov & Hutter 2019), weight_decay=0.01. p -= lr (m_hat/(sqrt(v_hat)+eps) + weight_decayp) |
| 일관성 게이트 조기 종료 | F4 (모니터링 없음) | 모든 샘플 점수화 (bigram/trigram/word/char 다양성). 5개 연속 샘플이 30점 미만이면 자동 중단 |
| 커리큘럼 워밍업 | F5 (밴디트가 반복 섭취) | 처음 20K 스텝은 7개 채팅/산문 소스에 제한; 이후 firehose 활성화; repo-docstrings는 완전히 제외 |
또한 sample_every가 200에서 100 스텝으로 줄음 (감사 주기 2배), & repo-docs 상한이 0.5에서 0.3으로 줄음.
백테스트
일관성 게이트가 v1에서 백테스트됨: 132K 스텝에서 트리거되어 3.8일의 컴퓨트 절약. 게이트만으로 v1의 낭비 컴퓨트 ~30% 감소; 다른 네 가지 수정으로 v1이 그 게이트 트리거에 도달하지 않음.
v2가 수정하지 않은 것
데이터 오염. v2는 hermes3-* 소스를 LLM 교사에서 왔기 때문에 '사전 정리됨'으로 신뢰했습니다. Makefile의 DEEP_CLEAN_SKIP이 hermes3-general, hermes3-creative, & hermes3-roleplay를 make deep-clean에서 제외했습니다. unfirehose-chat이 에이전트 시스템 프롬프트를 사용자 턴으로 캡처했습니다. 이 두 결함은 데이터 계층에 기다리고 있으며, 표면화될 준비가 되어 있었습니다.
수정 사항을 실패에 매핑하기
15K 단계: 두 데이터 결함이 드러남
v2가 본 것
v2는 2026-04-15에 출시됨. 200K 중 ~15K 단계(7.5% 완료)에서, 샘플이 에이전트 하네스 장식(○ ●)과 기사 지배 대체(a = 14,966 단계에서 단어의 26%; the = 14,798 단계에서 21%)를 생성함. v2의 다섯 가지 안정성 수정이 올바르게 작동하고 있었음. 실패가 아키텍처에서 데이터로 이동함.
두 개의 독립적인 파이프라인 결함
결함 A: unfirehose-chat이 에이전트 시스템 프롬프트를 사용자 턴으로 캡처함. unfirehose-chat은 ~/.claude/, ~/.fetch/, ~/.uncloseai/의 하네스 세션 JSONL 파일에서 구축됨. 수집 파이프라인이 다중 섹션 에이전트 시스템 프롬프트(# Agent X, ## Identity, ## Rules 등)를 > user / < assistant 쌍의 사용자 턴 슬롯으로 변환함. 모델이 '사용자'가 다중 섹션 마크다운으로 말한다는 것을 학습하고, 자신의 출력에서 그 장식을 재현함.
결함 B: hermes3-*가 모든 필터를 우회함. Makefile의 DEEP_CLEAN_SKIP이 hermes3-general, hermes3-creative, & hermes3-roleplay를 make deep-clean에서 제외시켰음. LLM 증류 데이터가 사전 세정되었다는 잘못된 가정 때문. 철저한 스캔 결과 기존 필터를 적용하면 hermes3 라인의 87-93%가 거부됨 (block_size=1024를 초과하는 2000자 초과 단락; CJK/키릴/아랍어 번역 응답; 낮은 빅그램 다양성 실행).
v2.5 패치 (커밋 de24332, 2026-04-18)
두 가지 구조적 변경.
변경 1: filter-dataset.c의 has_system_prompt_shape(). 문자 매칭이 아닌 SHAPE로 유출된 시스템 프롬프트를 감지. 세 가지 신호 결합:
1. 한 턴에 3개 이상의 마크다운 헤더 = 삭제.
2. 턴 길이가 500자 이상인 2개 이상의 헤더 = 삭제.
3. 에이전트-샤드 지문 구문(# Agent , Shadow Clone, Your shard, Read it. Become it, This file defines)이 헤더나 길이 >=400과 결합 = 삭제.
격리 규칙: / 구분자(공백 포함, URL 경로를 분할하는 빈 /가 아님)에서 첫 번째 사용자 턴을 확인하여 어시스턴트 응답의 합법적인 마크다운에 대한 오탐지를 피함.
변경 2: hermes3-*가 DEEP_CLEAN_SKIP에서 제거됨. 필터링되지 않은 것은 신뢰하지 마라.
패치 후 드롭율
| 소스 | 인라인 | 아웃라인 | 드롭율 |
|---|---|---|---|
| hermes3-general | 536,858 | 67,395 | 87.7% |
| hermes3-roleplay | 35,191 | 2,481 | 93.0% |
| hermes3-creative | 14,258 | 1,373 | 90.4% |
| unfirehose-chat | 3,816 | 2,653 | 30.5% |
| chat | 45,257 | 44,538 | 1.6% (노이즈) |
| smoltalk | 11,812 | 11,812 | 0.0% |
기존 베이스라인 필터는 hermes3 오염의 87-93%를 이미 포착하고 있었습니다; DEEP_CLEAN_SKIP가 주요 결함이었습니다. 새로운 형태 감지기는 전체적으로 ~0.1% 추가 거부를 더하며, 이는 기존 필터가 놓치는 특정 agent-shard 누출을 제거하는 unfirehose-chat에 집중되어 있습니다.
왜 형태가 문자보다 우수한가
장식은 진화합니다. ○를 제거하는 문자 매칭 필터는 다음 주 ◇에 대해 아무것도 하지 않습니다. 형태 기반 필터(헤더 수 세기, 문자 수 세기, 지문 구문 인식)는 장식 변형에 걸쳐 일반화됩니다. 패턴: 오염 감지는 구조적 휴리스틱을 사용해야 합니다.
왜 형태로 필터링하는가
데이터 없는 Bandit Arm
v3 Launched 2026-04-18
v2와 동일한 아키텍처 & 하이퍼파라미터; v2.5 패치 후 데이터 정리. 샘플 감사에서 장식 누출 제로. v3는 112K 스텝까지 깨끗하게 실행되었습니다.
112,619단계: 샘플 감사에서 패턴 포착
샘플 감사는 일관된 대화 턴(하이쿠, Q&A, 대화)을 드러냈지만, 지식 암(knowledge arms)(gutenberg, repo-docstrings, repo-docs)에 초점을 맞춘 주기적 단계에서 코드 같은 조각과 저장소 토큰화 노이즈가 새어 나왔다. 112,080단계의 한 샘플은 손실 0.13에 도달: 비정상적으로 낮아, 학습된 채팅 분포가 아닌 기억된 repo-docs 부분 문자열을 신호하는.
좀비 암(The Zombie Arm)
진단: exclude_sources는 훈련 시작 시 repo-docstrings를 올바르게 제거했지만, 지속된 bandit 상태가 이전 실행에서 가중치 1.546을 가진 잔여 repo-docstrings 암을 운반했다. 상태 재로드가 .btok이 샘플링에 존재하지 않음에도 UCB 풀에 이를 복원시켜, 탐색 회계를 왜곡하는 좀비 풀(zombie pull)을 생성했다.
교훈: bandit 상태 파일(.state.json)은 재시작 간에 놀랍게 표류한다. 구성 제외는 잔여 암 메모리를 지우지 않는다. 이중 안전장치 필요: cap = 0.0과 함께 exclude.
폴란드어 구성
커리큘럼 교란만 적용. 아키텍처, 옵티마이저 상태, 학습률 스케줄, & 손실 기록은 모두 step_112600.bin에서 보존됨.
| 출처 | v3 기본 | v3 폴란드어 |
|---|---|---|
| repo-docs | 상한 0.3 | 제외 (상한 0.0) |
| repo-docstrings | 제외 | 제외 + 상한 0.0 |
| repo-commits | 상한 0.4 | 상한 0.2 |
| dictionary | 상한 0.5 | 상한 0.25 |
| gutenberg | 상한 0.8 / 하한 0.3 | 상한 0.7 / 하한 0.4 |
| irc-qa-strict | -- | 상한 0.3 |
| unweapon | -- | 상한 0.3 |
| synthetic-chat | -- | 상한 0.4 |
| hermes3-general | 하한 0.5 | 하한 0.7 |
| hermes3-creative | 하한 0.4 | 하한 0.55 |
| hermes3-roleplay | floor 0.4 | floor 0.5 |
| chat | floor 0.4 | floor 0.6 |
| smoltalk | floor 0.3 | floor 0.5 |
| oasst | floor 0.3 | floor 0.5 |
| dolly | -- | floor 0.4 |
| curriculum_warmup_steps | 20000 | 0 |
폴란드 프로토콜
1. SIGUSR1을 CUDA에 보내면 다음 100단계 경계에서 즉시 체크포인트를 강제합니다.
2. Proxy가 중지됩니다.
3. .samples.json & .state.json이 아카이브됩니다 (샘플 로그 & bandit 상태가 역사적 기록으로 저장됩니다).
4. .loss.json 유지 -- 누적 훈련 기록; 절대 아카이브되지 않습니다.
5. Proxy가 재시작됩니다. Polish 설정이 제출됩니다.
6. CUDA가 step_112600.bin에서 새로운 caps & floors 하에 새로운 bandit 상태로 재개합니다.
Loss 기록이 중단 없이 계속됩니다.
왜 폴란드(세련), 재시작이 아닌가
폴란드가 만들어낸 것
피벗 후 몇 시간 후 샘플 감사
폴란드 피벗 후 몇 시간 만에, 샘플 감사에서 원래 네 가지 ANDREA-120M 목표에 대한 수렴이 확인되었습니다.
사실 회상 (생물학), 단계 112,584, 손실 0.30, ppl 1.
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
두 가지 사실이 정확함. 외부 평가: 9.5/10.
사실 회상 (신호 처리), 단계 112,668, 손실 0.74, ppl 2.
> [Fourier 변환 프롬프트]
> < 푸리에 변환은 신호를 주파수 성분으로 분해하여 신호 특성 분석 및 주파수 영역에서의 필터링을 가능하게 합니다.
교과서 한 문장 정의. 외부 평가: 9.5/10.
제약 준수 (하이쿠), 단계 112,248, 손실 1.05, ppl 3.
> 'r'로 시작하는 세 단어를 사용하여 비에 대한 하이쿠를 작성하세요.
> < 비의 리듬 있는 반복, 창문에 흐르는 물줄기, 삶의 고통에서 휴식.
도구 지식 (Python), 단계 112,500, 손실 1.94, ppl 7.
> Python 프로젝트에서 오래된 패키지를 어떻게 찾나요?
> < 프로젝트 관리에서 pip 패키지 목록을 보려면 pip list --outdated names를 사용하세요...
올바른 도구가 등장; 표현이 부정확함.
700 단계 내 6개 도메인
생물학, 신호 처리, 시, python 도구, 대화형 대화, 운영 대화. 700 단계 내 6개의 무관한 도메인은 bandit와 모델이 협력하고 있음을 알려줍니다. 도메인 폭이 수렴 신호입니다.
외부 평가
독립 리뷰어가 샘플을 '120M 파라미터 모델치고 탄탄함 -- 이 규모에서 인상적인 일관성과 지식 유지'라고 평가했으며, Carolina parakeet & Fourier transform 샘플은 9.5/10과 '지식 작업에서 체급 이상의 성능'으로 평가됨.
각 단계가 가르친 것
v1이 가르친 것: 다섯 가지 복합 실패가 훈련을 붕괴시킴. 개별 수정으로는 구제 불가; 다섯 가지 모두 동시에 착지해야 함.
v2가 가르친 것: 아키텍처 수정은 필요하지만 충분하지 않음. 데이터 계층이 이를 조용히 무효화할 수 있음.
v2.5가 가르친 것: 문자자가 아닌 형태로 필터 오염을 걸러내기. 패턴은 안정적이다; 기호는 진화한다.
v3 base가 가르친 것: bandit 상태는 재시작 시 놀라운 방식으로 표류한다. 단독 제외만으로는 충분하지 않다; cap 0.0 벨트-앤-서스펜더가 필요하다.
v3 polish가 가르친 것: 실패가 정책에 있고 모델이 건강할 때, 정책을 교란시키기. 가중치를 유지. 손실 기록을 유지. 앞으로 나아가기.
하나의 진리
수렴은 단일 이벤트가 아닙니다; 그것은 수정의 연쇄입니다. 각 단계가 하나의 결함을 드러내고, 그것을 수정하며, 다음 결함을 드러냈습니다. ANDREA-120M은 112,584단계에서 9.5/10을 읽는 이유는 v1, v2, v2.5, v3 base, 및 v3 polish이 각각의 역할을 했기 때문입니다.