글자 크기

AI를 만들다 코치를 만들게 된 이유

바둑 AI 프로젝트를 시작한 지 반년이 지났다.
그 사이 블로그에 글을 열 개 썼다.

MCTS 알고리즘을 설명했고, 자가학습의 한계를 기록했고, KataGo를 연동했고, Streamlit과 씨름했다. 어느새 “늦깎이 바둑코치”라는 앱이 실제로 돌아가고 있다.

이쯤에서 한 번 돌아보려 한다.
어떻게 여기까지 왔는지. 그리고 무엇을 배웠는지.

처음엔 AI를 만들고 싶었다

AlphaGo가 이세돌을 이긴 뒤로 바둑을 배우기 시작한 늦깎이다. AI가 바둑을 정복했다는데, 그 AI는 대체 어떻게 작동하는 걸까. 궁금했다.

그래서 직접 만들어 보기로 했다.

9×9 바둑판. 착수 규칙. 집 계산. 신경망 설계. MCTS 구현. 하나씩 코드로 옮겼다. 2만 개의 프로 기보를 먹이고, 자가대국을 시키고, 손실 그래프가 떨어지는 걸 지켜봤다.

수백 시간의 CPU 연산 끝에 AI는 — 여전히 이상한 수를 뒀다.

멈추는 것도 한 수다

기술적으로 많은 걸 배웠다.

탐색과 평가는 다르다. 신경망이 아무리 좋은 확률을 내놔도, UCB 공식이 틀리면 매번 (0,0)에만 착수한다. 버그를 잡으며 MCTS가 왜 필요한지 몸으로 이해했다.

초보끼리 두면 늘지 않는다. 자가학습은 말 그대로 ‘자기 자신’과 두는 것이다. 초보 AI가 초보 AI와 수천 판을 둬도, 그 안에서 발견할 수 있는 건 한계가 있다. AlphaGo Zero가 “제로”라 불리는 건 그만큼의 연산을 감당할 수 있어서다.

멈추는 것도 한 수다. 손실이 3.49에서 3.35로 떨어졌다. 좋아지고 있다는 증거다. 하지만 나는 멈췄다. 더 돌려서 3.0이 되고, 2.5가 되어도 — 프로 수준의 AI가 나올 가능성은 희박했다. 그걸 깨닫는 데 시간이 걸렸다.

바퀴를 재발명할 필요는 없었다.

방향을 바꿨다

이미 KataGo가 있다. Leela Zero가 있다. 오픈소스이고, 강하고, 잘 작동한다.

내가 만들어야 할 건 ‘더 강한 AI’가 아니었다.

나는 강한 AI를 만들고 싶은 게 아니라
나를 이해하는 도구를 만들고 싶다.

반복되는 실수를 찾아주는 도구. 성장 곡선을 보여주는 도구. “왜 졌는지”가 아니라 “왜 자꾸 이렇게 두는지”를 알려주는 도구.

그래서 “늦깎이 바둑코치”가 시작됐다.

만들면서 부딪힌 것들

기보를 구할 수 없다. 20년치 기보가 타이젬에 있다. 근데 못 꺼낸다. 결국 오로바둑 SQLite를 뒤져서 최근 기보만 추출했다. 벽을 만나면 돌아가는 수밖에.

KataGo 연동. 분석 엔진을 붙이는 건 생각보다 간단했다. JSON으로 쿼리 보내고, JSON으로 응답 받고. 진짜 어려운 건 그 숫자들을 ‘의미 있게’ 보여주는 것이었다.

AI 추천수 시각화. KataGo가 “Q16″이 좋다고 한다. 근데 사용자는 바둑판을 보고 있다. 텍스트를 원으로, 좌표를 그림으로 바꾸는 과정이 의외로 복잡했다. SGF 좌표, GTP 좌표, 화면 좌표 — 세 가지가 다 달랐다.

Streamlit의 함정. 슬라이더를 움직이면 전체 페이지가 리렌더링된다. session_state를 잘못 건드리면 무한 루프에 빠진다. 프론트엔드 프레임워크 없이 인터랙티브 앱을 만드는 건 — 가능하지만 함정투성이다.

실전 테스트. 내 기보를 분석해봤다. AI가 “백 유리”라고 하는데 실제론 흑이 80집 이기고 있었다. maxVisits를 50에서 200으로 올렸다. 분석 시간은 길어졌지만, 적어도 사활은 맞췄다.

열 개의 글을 관통하는 것

돌아보니 하나의 흐름이 보인다.

“직접 해봐야 안다.”

MCTS를 논문으로만 읽었다면 UCB 버그를 이해 못 했을 것이다. 자가학습을 직접 돌려보지 않았다면 “초보끼리 두면 안 는다”는 게 무슨 뜻인지 몰랐을 것이다. Streamlit 문서만 봤다면 session_state 지옥을 예상 못 했을 것이다.

만들어야 배운다.
부딪혀야 안다.

그리고 하나 더.

“멈출 줄도 알아야 한다.”

AI 학습을 멈추고 KataGo를 쓰기로 한 결정. 타이젬 기보를 포기하고 오로바둑으로 우회한 결정. 둘 다 ‘포기’처럼 보이지만, 실은 ‘집중’이었다. 내가 진짜 원하는 게 뭔지 알았기 때문에 돌아갈 수 있었다.

이제부터

앱은 돌아간다. 기보를 불러오고, AI가 분석하고, 추천수를 보여주고, 변화도를 탐색할 수 있다.

하지만 끝이 아니다.

놓아보기 기능을 더 다듬어야 하고, 2패스 분석을 정교하게 만들어야 하고, 좌표 변환 로직을 정리해야 한다. 그리고 무엇보다 — 이 도구로 내 바둑이 나아지는지 확인해야 한다.

다음 글은 아마 “놓아보기” 이야기가 될 것이다.
AI가 추천한 수를 직접 둬보고, 그 뒤로 어떤 변화가 펼쳐지는지 탐색하는 기능.

만들면서 또 배우겠지.
그게 늦깎이의 방식이니까.


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

댓글 달기

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