대형 VLM 이전에 강화학습의 최소 구성부터 확인하기 위한 바둑 환경이다. 외부 딥러닝 프레임워크 없이 NumPy MLP, 합법수 마스크와 REINFORCE 업데이트를 구현해 데이터 흐름을 투명하게 볼 수 있다.

바둑 NumPy REINFORCE: 19×19 합법수 정책을 직접 만들기 핵심 도식
그림. 작은 NumPy 정책망으로 합법수 마스킹과 에피소드 정책 경사를 직접 확인한다.

에피소드 진행

환경을 초기화한 뒤 정책이 흑 또는 백을 무작위로 맡는다. 정책 차례에는 판을 벡터로 인코딩하고 합법수 mask를 적용한 분포에서 행동을 샘플링한다. 상대는 합법수 중 무작위로 둔다. 정책 쪽 transition만 저장한다.

합법수 마스크가 중요한 이유

361개 좌표에 그대로 softmax를 적용하면 이미 돌이 있거나 규칙상 금지된 수에 확률이 배정된다. 불법 action logit을 선택 불가능하게 만든 뒤 정규화해야 학습 신호가 유효한 수에만 간다. mask가 모두 0인 종료 상태도 별도로 처리한다.

보상과 한계

기본 실험은 제한된 step 뒤 정책 색의 돌 개수 차이를 보상으로 사용한다. 구현은 단순하지만 바둑의 승패·집 계산과는 다르므로 강한 바둑 AI가 아니라 REINFORCE 기초 검증용이다. 무작위 상대에서 좋아진 정책이 실제 상대에게 일반화된다고 해석하면 안 된다.

for episode in range(N):
    transitions, reward = play(policy, random_opponent)
    policy.update_episode(transitions, reward)

다음 실험

고정 seed 재현, random baseline, 합법률, 평균 보상과 행동 entropy를 기록한다. 이후 자기대국, value baseline, advantage 정규화, 더 정확한 종료 보상을 한 번에 하나씩 추가한다.

관련 소스

  • `rl_env/env.py`: 바둑 환경과 합법수
  • `rl_env/policy_numpy.py`: 관측 인코딩과 MLP
  • `rl_env/train_reinforce.py`: 정책 대 무작위 상대
  • `rl_env/train_selfplay.py`: 자기대국 확장