Policy Network를 MCTS에서 사용하기
학습된 policy network가 있으면 MCTS에서 두 가지 방식으로 사용:
🎯 사용법 1: Expand에서 우선순위
PART 3의 MCTS Expand 단계 수정:
# 이전 (무작위)
m = random.choice(node.untried_moves)
# 이후 (policy 활용)
move_probs = policy_net(node.game.board)
m = max(node.untried_moves, key=lambda x: move_probs[x])
또는 더 우아하게 — UCB1을 PUCT로 확장 (PART 5에서):
PUCT = w/n + c · P(s,a) · √(N)/(1+n)
P(s,a)가 policy network의 그 자리 확률. 확률 높은 수에 더 자주 가지치기 자원 배분.
🎯 사용법 2: Simulate (rollout)의 품질 향상
PART 3 rollout은 완전 무작위:
# 이전 (완전 무작위)
g = g.play(random.choice(g.possible_moves()))
# 이후 (policy로 그럴듯한 수)
move_probs = fast_policy_net(g.board)
move = sample_by_probability(move_probs)
g = g.play(move)
"무작위" 자리에 "그럴듯한" 수가 들어감. rollout의 결과가 사람 게임 분포와 가까워져 → MCTS 신호가 정확해짐.
💡 알파고의 두 policy network
알파고는 사실 두 개의 policy network를 씀:
- SL Policy Network (Supervised Learning) — 13층 CNN, 정확함, 느림(~3ms). MCTS의 Expand에 사용.
- Fast Rollout Policy — 단순 선형 모델, 부정확하지만 빠름(~2μs). MCTS의 Simulate(rollout)에 사용.
왜 둘? 한 번의 MCTS iteration에서 Expand는 한 번, Rollout은 수십 수. 속도 / 정확도 트레이드오프. PART 5에서 자세히.
📊 효과 — 알파고 논문 (2016)에서
- Pure MCTS (PART 3): ELO ~2700
- + SL Policy in Expand: ELO ~3000 (+300)
- + Fast Rollout in Simulate: ELO ~3100 (+100)
- + RL Policy (자가 학습): ELO ~3200 (+100)
- + Value Network: ELO ~3500 (+300) — 이세돌급
각 부품이 100~300 ELO씩 기여. 누적 효과로 사람 초월.
다음 챕터에서 Value Network를 본다.