200수짜리 기보를 분석한다.
KataGo에게 모든 수를 깊이 분석하라고 시키면 — 10분이 걸린다.
사용자는 기다리지 않는다.
그렇다고 얕게 분석하면? 사활을 틀린다. 죽은 돌을 산 걸로 보고, 80집 차이 나는 바둑을 “백 유리”라고 말한다.
깊이와 속도. 둘 다 포기할 수 없었다.
그래서 2패스 분석을 만들었다.
문제: 모든 수가 중요하진 않다
200수 중에 정말 중요한 수는 몇 개나 될까.
대부분의 수는 “그냥 그런” 수다. 정석 진행, 뻔한 응수, 끝내기 계산. 이런 수를 깊이 분석해봤자 얻는 게 없다.
반면 진짜 중요한 수가 있다. 흐름이 바뀌는 전환점. 승부처에서의 실수. 이런 수는 깊이 봐야 한다. 100수 앞까지 읽어야 사활이 보이는 경우도 있다.
모든 수를 똑같이 취급하는 건 비효율적이다.
해법: 빠르게 훑고, 중요한 곳만 파고들기
1차 분석: 50 visits → 전체 흐름 파악 (빠름)
2차 분석: 500 visits → 전환점만 정밀 분석 (정확)
1차에서 전체를 훑는다. visits 50이면 수당 0.1초도 안 걸린다. 200수 기보도 20초면 끝난다. 대신 정확도가 떨어진다.
하지만 “어디가 문제인지”는 알 수 있다. 승률이 갑자기 떨어지는 구간, 집이 확 손해 나는 수. 이런 후보들을 찾아낸다.
2차에서 후보만 다시 분석한다. visits 500이면 수당 1~2초 걸리지만, 10수만 분석하면 20초다. 그리고 이 정도면 대부분의 사활을 맞춘다.
총 40초. 전부 깊이 분석하면 10분 걸릴 걸, 6분의 1로 줄였다.
전환점 후보 선정
어떤 수를 “중요하다”고 판단할까.
기준 1: 단일 수 급락
if score_drop > 8 or winrate_drop > 0.12:
candidate_turns.add(move_number)
한 수에 8집 이상 손해. 또는 승률 12% 이상 하락. 이 정도면 뭔가 잘못된 거다.
기준 2: 구간 누적 하락
# 10수 사이에 25% 이상 하락
if drop > 0.25:
candidate_turns.add(current_move)
# 해당 구간의 모든 수도 후보에 추가
한 수씩은 괜찮아 보이는데, 모아보니 흐름이 나빠진 경우. 10수 전과 비교해서 승률이 25% 이상 떨어졌으면, 그 구간 전체를 후보로 잡는다.
왜 visits인가
KataGo의 maxVisits는 “얼마나 깊이 읽을 것인가”를 결정한다.
바둑에서 수읽기는 나무를 탐색하는 것과 같다. 한 수를 두면 상대도 수십 가지 응수가 있고, 그 각각에 대해 또 수십 가지 응수가 있다. 이 가지들을 얼마나 뻗어갈지가 visits다.
- 50 visits: 대충 훑는다. 뻔한 수는 맞추지만, 복잡한 사활은 틀린다.
- 200 visits: 웬만한 전투는 읽는다. 대부분의 경우 충분하다.
- 500 visits: 어려운 사활, 큰 싸움도 읽는다. 정밀 분석에 적합.
- 1000+ visits: 프로 수준 분석. 시간이 오래 걸린다.
처음엔 전체를 200으로 돌렸다. 3~4분 걸렸다. 사용자 피드백: “너무 느려요.”
그래서 1차를 50으로 낮추고, 문제 있는 곳만 500으로 올렸다. 더 빠르면서 더 정확해졌다.
실제 효과
최근 대국을 분석해봤다. 282수.
1차 분석 (50 visits): 28초
후보 선정: 23수
2차 분석 (500 visits): 34초
총 소요: 62초
전체를 500으로 분석했다면 약 8분 걸렸을 것이다. 87% 시간 단축.
그리고 중요한 건 — 전환점을 놓치지 않았다. 오히려 1차에서 “이상하다” 싶은 구간을 2차에서 더 정확하게 분석해줬다.
한계와 트레이드오프
완벽한 방법은 아니다.
놓칠 수 있다. 1차 분석이 50 visits밖에 안 되기 때문에, 미묘한 전환점은 후보에서 빠질 수 있다. “승률은 비슷한데 실은 흐름이 나빠진” 그런 수.
임계값이 자의적이다. 왜 8집인가? 왜 12%인가? 경험적으로 정한 값이다. 기력이나 대국 스타일에 따라 다를 수 있다.
복잡한 코드. 한 번에 분석하면 코드가 단순하다. 두 번 나누니까 상태 관리가 복잡해졌다. 버그 가능성도 늘었다.
그래도 트레이드오프는 가치 있다. 8분을 1분으로 줄이면서 정확도는 유지했다. 사용자 경험이 완전히 달라진다.
배운 것
“전체를 똑같이 취급하지 마라.”
이건 바둑 분석만의 교훈이 아니다. 로그 분석, 코드 리뷰, 성능 최적화 — 모든 곳에 적용된다. 중요한 곳에 리소스를 집중하고, 나머지는 가볍게 훑는다.
KataGo는 모든 수를 깊이 분석할 수 있다. 그 능력이 있다. 하지만 “할 수 있다”와 “해야 한다”는 다르다.
진짜 실력은 어디에 집중할지 아는 것이다.
이 글은 늦깎이 바둑코치 시리즈의 열세 번째 글입니다.
