Wintersalmon | Blog

270세대의 셀프플레이: 영리한 잔기술은 순수한 용량에 졌다

10 min read

잔기술은 졌고, 용량이 이겼습니다

제 홈 클러스터에서 도는 YINSH 봇은 더 큰 실험 — LLM 주도 개발 흐름의 매일의 매개체로 보드게임을 만드는 실험 — 의 한 갈래이고, 그중에서도 진짜 한계가 어디인지를 계속 가르쳐 주는 갈래입니다. 하드웨어를 업그레이드하기 전에 한 걸음 물러서서 보면, AI가 스스로를 훈련시킨 270세대의 성적표는 단순합니다. 바늘을 움직인 것은 더 큰 네트워크더 엄격한 심판 둘뿐이었고, 같은 GPU에서 더 많은 실력을 짜내려던 값싼 잔기술은 거의 전부 졌습니다. 이것은 실패담이 아닙니다. 다음에 무엇을 해야 하는지에 대한 가장 명확한 신호입니다.

TL;DR

  • AI는 gen-005에서 gen-270까지 올라섰습니다 — RTX 3070 Ti 한 대에서 사람의 기보 없이 스스로와 둔 수십만 판이며, 그 과정에서 실제 봇 하나를 프로덕션에 배포했습니다.
  • 이긴 것: 더 큰 두뇌(96×8 → 128×10 네트워크, 한 세대에 +113 Elo), 더 엄격한 승급 심판, 시간을 고려하는 채점(+150 Elo).
  • 진 것: 플레이 시점의 영리하지만 더 빠른 탐색(−338 Elo), 위협을 “알아차리게” 가르치기(탐지는 됐지만 실력은 그대로), 훈련 데이터를 골라내려는 모든 시도.
  • 패턴: 천장은 주변의 아이디어가 아니라 용량 — 네트워크가 담을 수 있는 양 — 입니다. gen-270은 이미 70세대 동안 승급 0회입니다.
  • 다음: GPU 업그레이드. 그래야 다음 네트워크를 더 크게 만들 수 있고, 이것이야말로 마주친 모든 정체 구간을 뚫어 온 유일한 지렛대입니다.

얼마나 멀리 왔나: gen-005에서 gen-270까지

하나의 “세대(generation)“는 간단한 루프의 한 바퀴입니다. AI가 스스로와 수천 판을 두고, 새 네트워크가 가장 좋은 수들을 따라 하도록 훈련되고, 엄격한 시험이 그것이 정말로 더 강한지를 판정합니다. 실력은 체스 레이팅 척도인 Elo로 매깁니다 — +100 Elo 차이는 더 강한 쪽이 약 64% 이긴다는 뜻입니다.

이정표 무엇이 바뀌었나 결과
gen-005 → gen-077 처음으로 작동한 루프, 96×8 네트워크 독학으로 상승; gen-067을 프로덕션에 배포
gen-201 128×10 네트워크(3.36M 파라미터)로 재구축 한 세대에 +113 Elo — 옛 천장을 뚫음
gen-240 시간을 고려하는 채점(value discount) +150 Elo, 그리고 낮은 탐색 예산에서 더 강함
gen-270 현재 챔피언 이후 70세대, 승급 0회

gen-005 → gen-077 상승은 대부분 측정을 제대로 하는 문제였습니다. 잡음이 많은 승급 시험은 운 좋은 도전자를 통과시키고 진짜 개선을 묻어버립니다. 시험을 엄격하게 조이자([[2026-06-29-capacity-was-the-limiter]]에서 다룹니다) 진짜 향상이 쌓이기 시작했습니다. 그다음 작은 96×8 네트워크가 멈췄습니다 — 긴 실행 세 번이 gen-077을 이기지 못했습니다. 그것을 128×10 네트워크로 더 크게 다시 지었더니 첫 시도에 천장을 넘었습니다. 그것이 증거였습니다. 한계는 훈련이 아니라 네트워크의 크기였던 것입니다.

무엇이 통했나: 더 큰 두뇌, 더 명확한 심판, 시간을 고려한 value

세 가지 승리에는 하나의 주제가 있습니다 — 각각은 값싼 지름길이 아니라 더 많은 용량이거나 더 많은 엄정함입니다.

  • 더 큰 네트워크. 96×8 → 128×10(1.73M → 3.36M 파라미터)이 즉시 +113 Elo를 벌었습니다(#1284). 더 큰 두뇌는 단지 탐색이 발견한 것을 더 많이 담을 뿐입니다.
  • 더 엄격한 심판. 승급 시험을 조인 것 — 승률 기준선과 최대 1000판의 확인 대국 — 이 거짓 승급을 막고 진짜 향상이 쌓이게 했습니다. 초기 상승 전체를 떠받친 조용한 열쇠였습니다.
  • 시간을 고려한 채점. value 추정치가 더 빨리 이기는 것을 선호하도록 가르치자(최종 결과에 작은 discount) +150 Elo가 붙었고, 더 좋게는 덜 생각할 때 AI가 더 강해졌습니다 — 배포된 봇에 딱 필요한 것입니다([[2026-07-05-winning-sooner-not-just-winning]]).

내부적으로 루프 자체도 더 빠르고 튼튼해졌습니다. 훈련 데이터를 스트리밍하니 호스트 메모리가 19.2 GB에서 1.5 GB로 줄었고(#1241), 심판의 대국을 임계 경로 밖으로 옮기니 승급 확인이 약 2.8배 빨라졌습니다(#1314, #1315). 어느 것도 AI를 더 똑똑하게 만들지는 않았습니다 — 하지만 위의 모든 실험을 감당할 수 있게 만들었습니다.

무엇이 통하지 않았나: 영리한 잔기술의 무덤

흥미로운 절반입니다. 각각은 새 하드웨어 없이 실력을 얻으려는 그럴듯하고 값싼 아이디어였습니다. 각각 실패했고, 실패들은 서로 운율이 맞습니다.

영리한 잔기술 아이디어 결과
플레이 시점의 Gumbel 탐색 800번 대신 ~50번의 look-ahead로 같은 수 품질 −338 Elo — 덜이 아니라 생각해야 했음
위협 탐지 헤드 ”상대가 곧 득점한다”를 표시하는 출력 탐지 99.7% 정확, 실력 변화 없음
공격 / 위협 편중 데이터 압박 속 지는 국면을 더 많이 학습 대조군 대비 측정 가능한 효과 없음
데이터 큐레이션 ”고품질” 셀프플레이 게임만 남김 신호 없음 — 빠른·느린·공격적 게임 모두 똑같이 유용
오프라인 value 패치 지는 국면에 대한 AI의 낙관을 수동 보정 probe에서는 통했으나 실제 플레이를 왜곡 — 보류

관통하는 줄기는 이렇습니다. 저는 고정된 크기의 네트워크가 정보를 더 잘 쓰도록 — 위협을 알아차리고, 오프닝을 다양화하고, 선별된 게임을 공부하도록 — 계속 시도했고, 네트워크의 대답은 언제나 같은 어깨 으쓱이었습니다. 위협 실험이 가장 날카로운 예입니다. 10시간짜리 세션 동안 AI는 임박한 위협을 99.7% 정확도로 세는 법을 배웠지만, “내가 이기고 있나?”를 판단하는 부분은 이전과 똑같이 눈이 멀어 있었습니다(그 눈멂의 사람 눈높이 버전이 [[2026-06-30-yinsh-missed-mate]]입니다). 위험을 탐지하는 것과 그에 따라 행동하는 것은 다른 기술이었고, 작은 곁가지 출력은 이 크기에서 둘을 잇지 못했습니다.

그것은 진짜 한계가 머릿속에 얼마나 담을 수 있느냐일 때 학생에게 더 선명한 플래시카드를 쥐여 주는 격이었습니다. 더 빠른 탐색, 추가 데이터, 위협 라벨 — 모두 실재했고, 모두 무시당했습니다. 그릇이 이미 가득 찼기 때문입니다.

패턴: 처음부터 용량 문제였습니다

두 절반을 나란히 놓으면 모양이 분명합니다. 용량을 더한 지렛대(더 큰 네트워크)나 잡음을 없앤 지렛대(더 엄격한 gate, 더 깨끗한 채점)는 모두 통했습니다. 같은 용량에서 더 짜내려던 지렛대는 모두 졌습니다. gen-270은 이제 70세대(271–340) 동안 단 한 번의 승급도 없이 돌았고, 최고의 도전자도 상대 승률 0.45–0.48에 갇혀 있습니다. 이것은 아이디어 부족이 아닙니다 — 아이디어 백로그는 있습니다. 그릇이 가득 찬 것입니다.

다음: 지렛대는 또 다른 잔기술이 아니라 하드웨어

그래서 다음 수는 데이터가 줄곧 가리켜 온 것입니다. 더 많은 용량, 곧 더 많은 GPU입니다. 더 큰 네트워크(160×12 이상)는 마주친 모든 정체 구간을 뚫어 온 유일한 지렛대이고, 저는 그것을 gen-270에서 warm-start 할 수 있어 처음부터 시작하는 대신 이미 배운 모든 것을 물려받습니다. 그러려면 RTX 3070 Ti 한 대에 없는 VRAM 여유가 필요합니다 — 그래서 업그레이드입니다.

값싼 잔기술이 전부 죽은 것도 아닙니다. 몇몇은 여유 용량이 있을 때에야 값을 하기 때문에 보류된 것입니다. 적은 look-ahead의 Gumbel 셀프플레이(2–4배 더 많은 연습 게임), 탐색 깊이를 바꾸는 playout-cap, 그리고 진짜로 열려 있는 아이디어 하나 — 이미 탐지할 수 있는 위협에 따라 행동하도록 AI를 가르치기 — 가 모두 준비되어 있습니다. 하지만 그것들은 승객입니다. 엔진은 더 큰 GPU 위의 더 큰 네트워크입니다.

270세대에 이르러 얻은 교훈은 거의 맥이 빠질 정도입니다. 저는 영리함이 용량보다 싸지만 좀처럼 그 대체재는 되지 못한다는 것을 몇 주에 걸쳐 증명한 셈입니다. 다음 글은 하드웨어 업그레이드 건너편에서 시작합니다.

핵심 용어

  • Self-play — AI가 스스로와 게임을 두어 사람의 기보 없이 자신의 훈련 예제를 만드는 것.
  • Generation(세대) — 루프의 한 바퀴: 스스로와 두고, 새 네트워크를 훈련하고, 챔피언으로 승급할 자격이 있는지 시험하는 것.
  • Elo — 하나의 실력 숫자(체스 레이팅 척도); +100 차이는 강한 쪽이 약 64% 이긴다는 뜻.
  • Search / look-ahead (MCTS) — 매 수 전에 AI가 많은 이어짐을 상상해 가장 잘 버티는 수를 두는 것; look-ahead가 많을수록 강하지만 느림.
  • Network capacity(파라미터) — 네트워크가 가진 조정 가능한 숫자의 수(여기서는 1.73M, 이후 3.36M); 용량이 클수록 배운 것을 더 많이 담음.
  • Promotion gate(승급 심판) — 도전자가 확실히 더 많이 이길 때에만 새 챔피언으로 인정하는 엄격한 통계 시험.
  • Value discount — 늦게 오는 승리보다 빨리 오는 승리를 조금 더 좋게 채점해, AI가 늑장 부리지 않고 끝내기를 선호하게 하는 것.
  • Warm-start — 더 큰 네트워크를 새로 짓되 옛 네트워크의 학습된 가중치를 먼저 복사해 넣어, 이미 아는 것에서 출발하게 하는 것.
  • VRAM — GPU의 메모리; 큰 네트워크는 더 많이 필요하며, 이것이 큰 두뇌에 큰 카드가 필요한 물리적 이유.

참고 자료

  • [[2026-06-29-capacity-was-the-limiter]] — 첫 천장 돌파를 깊이 다룸: 96×8 세 번의 실행이 멈춘 이유와 128×10 재구축이 첫 시도에 +113 Elo를 넘은 과정.
  • [[2026-07-05-winning-sooner-not-just-winning]] — +150 Elo를 더하고 낮은 탐색 예산에서 가장 도움이 된 시간 고려 value discount.
  • [[2026-07-05-the-speedup-that-sped-up-nothing]] — 플레이 시점 Gumbel의 막다른 길(−338 Elo); 덜이 아니라 더 생각해야 했음.
  • [[2026-07-04-thinking-smarter-not-harder]] — Gumbel 탐색이 제자리를 찾는 곳(더 값싼 셀프플레이)과 덜 창의적이 되어선 안 된다는 규칙.
  • [[2026-06-30-yinsh-missed-mate]] — aux-head 실행이 고치려다 실패한 위협 눈멂의 사람 눈높이 버전.
  • docs/task-log/20260614-yinsh-ai-impl-plan/23-bigger-net-128x10-result.md — 멈춘 96×8 세 실행을 대조군으로 둔 +113 Elo 용량 돌파.
  • docs/task-log/20260708-yinsh-strategy-diversity/03-training-threat-detection-plan.md — 위협 탐지 헤드: 99.7% 탐지 정확도, 실력 이득 0, 그리고 B2 후속.
  • #1284 더 큰 네트워크 · #1241 스트리밍 트레이너(19.2 GB → 1.5 GB) · #1314, #1315 gate 처리량(~2.8배) · #1400 보조 위협 헤드.
  • AlphaZero (DeepMind) — 이 파이프라인이 본뜬 self-play + search + train 루프.
  • Policy improvement by planning with Gumbel (Danihelka et al., 2022) — 훈련 데이터에는 통했지만 플레이 시점에는 진 탐색 아이디어.
  • KataGo (Wu, 2019) — value 네트워크를 도운 보조 헤드(ownership/score)의 선례; 여기서는 같은 기법이 전이되지 않음.

AI 작업 노트

리서치와 초안 작성을 의도적으로 분리했습니다. Claude Code Explore 에이전트가 먼저 약 15개의 task-log 문서와 generation history를 훑어 출처가 달린 사실 브리프 — 모든 세대 번호, Elo 차이, PR 번호 — 를 반환했고, 산문 한 문장을 쓰기 전에 그것을 확보했습니다. 그 브리프를 바탕으로 초안을 쓰니 기억으로 숫자를 재구성하는 대신 “실제 데이터 인용” 기준을 정직하게 지킬 수 있었습니다. 짚어 둘 실패 모드: 이 프로젝트 초반에 저는 한 세대의 결과를 추세로 거듭 과대 해석했고(+13% 반짝임이 돌파처럼 보였다가 되돌아갔습니다), 그래서 이 회고는 모든 숫자를 한 점이 아니라 여러 세대 평균으로 다룹니다. 통한 패턴은 회고를 “용량이나 엄정함을 더한 것”과 “둘 다 없이 영리하려 한 것”으로 가르도록 강제한 것이며, 그 구분이 하드웨어 결론을 저절로 떨어지게 했습니다.


Hungjoon

I'm Hungjoon, a software engineer based in South Korea. This is my long-form notebook — homelab, Kubernetes, AI infra, and whatever else keeps me up at night.