글자 크기

2패스 분석의 비밀: 빠른 훑기와 정밀 분석

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는 모든 수를 깊이 분석할 수 있다. 그 능력이 있다. 하지만 “할 수 있다”와 “해야 한다”는 다르다.

진짜 실력은 어디에 집중할지 아는 것이다.


이 글은 늦깎이 바둑코치 시리즈의 열세 번째 글입니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다