보상 구조 — 끝에 한 번 vs 매 스텝
또 하나의 큰 차이 — 보상이 들어오는 방식.
📖 두 종류의 보상
- 희소 보상 (sparse): 게임 끝에서 한 번만. 체스/쇼기/바둑이 이 부류.
- 승: +1, 무: 0, 패: -1
- 중간 수에는 보상 없음 — 좋은 수든 나쁜 수든 즉시 점수가 안 매겨짐
- 학습 어려움: "긴 시퀀스 끝의 한 신호로 모든 수를 평가해야 함"
- 밀집 보상 (dense): 매 스텝마다 들어옴. 아타리가 이 부류.
- 매 프레임 게임 점수 변화량이 보상
- 대부분의 프레임은 0이지만, 가끔 +10, +100 등
- 학습 좀 더 쉬움 — 즉시 신호가 자주 들어옴
🎯 MuZero가 두 경우를 다루는 방식
같은 backup 공식을 쓴다:
value = node.reward + γ · value (위로 올라가며)
- 희소 보상 환경 (보드): node.reward = 0 거의 항상 → value 한 신호가 길게 흐름. γ ≈ 1.
- 밀집 보상 환경 (아타리): node.reward 자주 0 아님 → 단계마다 값이 누적. γ ≈ 0.997.
공식 자체는 그대로다. 차이는 "실제 데이터의 분포"에서만 일어남.
💡 알고리즘이 보상 구조에 무관한 이유
일반적인 강화학습 공식 G_t = r_t + γ G_{t+1}은 보상이 매 스텝이든 끝에 한 번이든 그대로 작동한다.
- 끝에만 r이 있으면 → 중간 r=0이라 그냥 value가 흘러 내려옴
- 매 스텝 r이 있으면 → 각 노드의 r이 누적되며 흘러 내려옴
두 경우 모두 같은 한 줄 코드. MuZero가 같은 알고리즘으로 처리할 수 있는 핵심 이유 중 하나.
📖 한 가지 미묘한 점 — 부호 뒤집기
보드 게임은 양 플레이어가 번갈아 두기 때문에 한 노드의 "내 가치"가 다음 노드에서는 "상대 가치"가 된다.
- 이걸 처리하려고 backup에서
value = -value부호 뒤집기를 추가 - 아타리는 1인 게임이라 부호 안 뒤집음
이건 환경 명세의 차이로 자동 처리할 수 있다(two_player=True/False 플래그 같은 것). 알고리즘 본체는 안 바꿈.