본문으로 건너뛰기

Value Network 상세 해설

Policy Network가 AlphaGo에게 '다음 수를 어디에 두어야 하는지' 알려준다면, Value Network는 더 근본적인 질문에 답합니다:

"이 대국, 내가 이길까?"


Value Network란 무엇인가?​

핵심 기능​

Value Network는 심층 컨볼루션 신경망으로, 그 임무는 다음과 같습니다:

현재 바둑판 상태가 주어지면, 최종 승률을 예측한다

수학적으로 표현하면:

v = f_θ(s)

여기서:

  • s: 현재 바둑판 상태
  • f_θ: Value Network (θ는 네트워크 파라미터)
  • v: -1에서 +1 사이의 값

출력의 의미​

출력 값의미
+1현재 플레이어 필승
+0.5현재 플레이어 약 75% 승률
0양측 승률 동등
-0.5현재 플레이어 약 25% 승률
-1현재 플레이어 필패

왜 단일 값이 필요한가?​

다른 선택 비교​

바둑을 둘 때, 우리는 종종 여러 선택지 중에서 결정해야 합니다. Value Network는 이 비교를 간단하게 만듭니다:

선택 A의 국면 가치: 0.3
선택 B의 국면 가치: 0.5
선택 C의 국면 가치: 0.2

→ B 선택 (가장 높은 가치)

단일 값이 없다면, '상대의 돌 한 덩이 잡기'와 '큰 집 둘러싸기' 중 어느 것이 더 좋은지 어떻게 비교할까요?

대량 시뮬레이션 대체​

전통적인 몬테카를로 트리 탐색에서, 국면을 평가하려면 **랜덤 시뮬레이션(rollout)**을 수행해야 합니다:

  1. 현재 국면에서 시작
  2. 양측이 게임 종료까지 무작위로 착수
  3. 승패 기록
  4. 수천 번 반복하여 승률 계산

이것은 매우 느립니다. Value Network는 한 번의 순전파로 평가를 제공하여, 몇 자릿수 더 빠릅니다.

방법평가 시간정밀도
1000회 랜덤 시뮬레이션~2000 밀리초낮음
15000회 랜덤 시뮬레이션~30000 밀리초중간
Value Network~3 밀리초높음 (15000회 시뮬레이션과 동등)

네트워크 아키텍처​

Policy Network와의 유사성​

Value Network의 아키텍처는 Policy Network와 매우 유사하며, 둘 다 심층 컨볼루션 신경망입니다:

입력층 → 컨볼루션층 ×12 → 완전연결층 → 출력
↓ ↓ ↓ ↓
19×19×48 19×19×192 256차원 단일 값

입력층​

Policy Network와 동일하게, 입력은 19×19×49 특성 텐서입니다:

  • 19×19: 바둑판 크기
  • 49: 48개 특성 평면 + 1개 현재 차례 표시 평면

추가된 1개 평면은 중요합니다: Value Network는 누구의 차례인지 알아야 합니다, 같은 국면이라도 흑과 백의 가치는 반대이기 때문입니다.

컨볼루션층​

Policy Network와 동일:

  • 12개 컨볼루션층
  • 192개 필터
  • 3×3 커널 (첫 번째 층은 5×5)
  • ReLU 활성화 함수

출력층의 차이​

이것이 Value Network와 Policy Network의 핵심 차이입니다:

Policy Network 출력​

19×19×192 → 1×1 컨볼루션 → 19×19×1 → 평탄화 → 361차원 → Softmax → 확률 분포

Value Network 출력​

19×19×192 → 1×1 컨볼루션 → 19×19×1 → 평탄화 → 361차원 → 완전연결256 → ReLU → 완전연결1 → Tanh → 단일 값

Tanh 활성화 함수​

Value Network의 마지막 층은 Tanh(쌍곡탄젠트) 함수를 사용합니다:

Tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))

Tanh의 출력 범위는 **(-1, +1)**로, 승패에 정확히 대응합니다.

왜 Sigmoid 대신 Tanh를 사용하는가?​

Sigmoid의 출력 범위는 (0, 1)로, 승률을 표현할 수도 있습니다. 하지만 Tanh에는 몇 가지 장점이 있습니다:

  1. 대칭성: 0을 중심으로, 출력이 양수 또는 음수 가능
  2. 기울기가 더 좋음: 0 근처에서 기울기가 1에 가까움
  3. 의미가 명확: 양수는 이김, 음수는 짐, 0은 무승부

완전한 아키텍처 다이어그램​

입력: 19×19×49
↓
Conv 5×5, 192 filters
↓
ReLU
↓
Conv 3×3, 192 filters (×11)
↓
ReLU
↓
Conv 1×1, 1 filter
↓
평탄화 (361차원)
↓
완전연결 (256차원)
↓
ReLU
↓
완전연결 (1차원)
↓
Tanh
↓
출력: [-1, +1]

파라미터 수​

층계산파라미터 수
컨볼루션층Policy Network와 동일~3.9M
완전연결층 1361×256 + 25692,672
완전연결층 2256×1 + 1257
총계~4.0M

약 400만 개의 파라미터로, Policy Network보다 약간 많습니다.


학습의 과제​

과적합 문제​

Value Network의 학습은 Policy Network보다 훨씬 어렵습니다. 주요 문제는 과적합입니다.

과적합이란 무엇인가?​

과적합은 모델이 학습 데이터를 '기억'하여 일반화를 학습하지 못하는 것입니다. 다음과 같이 나타납니다:

  • 학습 세트에서 성능이 매우 좋음
  • 테스트 세트에서 성능이 매우 나쁨

왜 Value Network가 과적합에 취약한가?​

한 대국의 데이터를 고려해 봅시다:

국면 1 → 국면 2 → 국면 3 → ... → 국면 200 → 결과: 흑 승리

이 데이터로 직접 학습하면:

  • 이 200개 국면은 강한 상관관계가 있음
  • 같은 대국에서 왔고, 같은 결과를 가짐
  • 모델이 국면을 이해하기보다 이 대국을 '인식'하는 법을 배울 수 있음

DeepMind는 발견했습니다: 같은 인간 기보로 Policy와 Value Network를 학습하면, Value Network가 심각하게 과적합됩니다.

해결책: 셀프 플레이 데이터​

DeepMind의 해결책은 셀프 플레이로 새로운 학습 데이터를 생성하는 것입니다:

1. 학습된 RL Policy Network로 셀프 플레이
2. 각 대국에서 하나의 국면만 취함 (상관관계 방지)
3. 이 국면의 레이블은 해당 대국의 최종 결과
4. 3천만 개의 이러한 샘플 생성

왜 이것이 과적합을 해결하는가?​

  1. 데이터 양이 많음: 3천만 개의 독립적인 국면
  2. 상관관계 없음: 각 대국에서 하나의 국면만 취함
  3. 분포가 다름: 셀프 플레이의 국면 분포는 인간 기보와 다름

학습 데이터 생성​

# 의사 코드
training_data = []

for game_id in range(30_000_000):
# 한 대국 셀프 플레이
states, result = self_play(rl_policy_network)

# 무작위로 하나의 국면 선택
random_index = random.randint(0, len(states) - 1)
state = states[random_index]

# 국면과 결과 기록
training_data.append((state, result))

학습 목표와 방법​

평균 제곱 오차 손실​

Value Network는 **평균 제곱 오차(MSE)**를 손실 함수로 사용합니다:

L(θ) = (1/n) × Σ (v_θ(s) - z)²

여기서:

  • v_θ(s): 모델이 예측한 가치
  • z: 실제 결과 (+1 또는 -1)

왜 교차 엔트로피 대신 MSE를 사용하는가?​

  • 교차 엔트로피는 분류 문제에 적합 (이산 레이블)
  • MSE는 회귀 문제에 적합 (연속 값)

결과가 +1 또는 -1만 있지만, 모델이 예측하는 것은 연속 값(-1에서 +1 사이의 모든 수)입니다. MSE는 모델이 +1 또는 -1에 가까운 값을 예측하도록 학습시킵니다.

학습 과정​

# 의사 코드
for epoch in range(num_epochs):
for batch in dataloader:
states, outcomes = batch

# 순전파
values = network(states) # (batch, 1)

# 손실 계산 (MSE)
loss = mse_loss(values, outcomes)

# 역전파
loss.backward()
optimizer.step()

학습 세부사항:

  • 옵티마이저: SGD with momentum
  • 학습률: 0.003
  • 배치 크기: 32
  • 학습 시간: 약 1주 (50 GPUs)

정확도 분석​

랜덤 시뮬레이션과의 비교​

DeepMind는 논문에서 상세한 비교를 수행했습니다:

평가 방법예측 오차
1000회 랜덤 시뮬레이션높음
15000회 랜덤 시뮬레이션중간
Value Network15000회 시뮬레이션과 동등

이것은 한 번의 Value Network 평가 ≈ 15000회 랜덤 시뮬레이션이지만, 약 1000배 더 빠르다는 것을 의미합니다.

각 단계의 정확도​

Value Network의 정확도는 게임 진행에 따라 달라집니다:

단계남은 수예측 난이도정확도
초반~300매우 어려움낮음
중반~150어려움중간
끝내기~50비교적 쉬움높음
종반~10쉬움매우 높음

이것은 직관적으로 합리적입니다: 게임 종료에 가까울수록, 결과가 더 확실합니다.

출력 분포​

잘 학습된 Value Network의 출력 분포:

        빈도
|
| *
| * *
| * *
| * *
|* *
+----+----+---- 출력 값
-1 0 +1

대부분의 출력이 -1과 +1 근처에 집중됨
(대부분의 국면이 명확한 승패 경향을 가지기 때문)

불확실한 국면​

Value Network 출력이 0에 가까울 때, 국면이 매우 복잡하고 승패를 예측하기 어렵다는 것을 나타냅니다. 이러한 국면은 보통:

  • 대형 전투 중
  • 양측이 막상막하
  • 여러 가능한 변화가 존재

MCTS에서 이러한 노드는 더 많은 탐색 자원을 얻습니다 (불확실성이 높기 때문).


MCTS에서의 역할​

리프 노드 평가​

Value Network는 MCTS의 Evaluation 단계에서 핵심 역할을 합니다:

MCTS 탐색 트리:

루트 노드 (현재 국면)
/ \
A B
/ \ / \
A1 A2 B1 B2 ← 리프 노드
↓ ↓ ↓ ↓
평가 평가 평가 평가

MCTS가 리프 노드에 도달하면, 이 국면의 가치를 평가해야 합니다. 두 가지 방법이 있습니다:

  1. 랜덤 시뮬레이션(Rollout): 리프 노드에서 게임 종료까지 무작위로 착수
  2. Value Network 평가: 신경망으로 직접 예측

AlphaGo는 둘을 결합합니다:

V(leaf) = (1-λ) × V_network(leaf) + λ × V_rollout(leaf)

여기서 λ = 0.5, 즉 각각 절반의 가중치를 차지합니다.

왜 결합하는가?​

  • Value Network는 더 정확하지만, 체계적 편향이 있을 수 있음
  • 랜덤 시뮬레이션은 덜 정확하지만, 독립적인 추정을 제공
  • 둘을 결합하면 상호 보완 가능

AlphaGo Zero의 단순화​

이후의 AlphaGo Zero는 랜덤 시뮬레이션을 완전히 폐기했습니다:

V(leaf) = V_network(leaf)

이것은 시스템을 크게 단순화하면서, 기력이 더 강해졌습니다. 이것은 Value Network가 충분히 신뢰할 수 있어, 랜덤 시뮬레이션의 '보험'이 필요 없다는 것을 증명합니다.

역전파 업데이트​

리프 노드 평가 후, 이 값은 경로를 따라 역전파됩니다:

v3 = V(leaf) = 0.6
↑
A2의 Q 값 업데이트
↑
A의 Q 값 업데이트
↑
루트 노드의 통계 업데이트

각 노드가 유지하는 Q 값은 그것을 통과한 모든 리프 노드 평가의 평균입니다:

Q(s, a) = (1/N(s,a)) × Σ V(leaf)

시각화 분석​

가치 곡면​

단순화된 3×3 바둑판을 상상해 봅시다. Value Network가 배운 것은 '가치 곡면'입니다:

가치 매트릭스 예시 (흑돌 위치 vs 백돌 위치)

흑\백123
1+0.3-0.1+0.2
2-0.2+0.5-0.3
3+0.1-0.2+0.4

이 곡면은 각 위치 조합의 가치를 알려줍니다. 양수는 흑에게 유리하고, 음수는 백에게 유리합니다.

학습 과정에서의 변화​

학습이 진행됨에 따라, Value Network의 예측은 점점 더 정확해집니다:

훈련 진행에 따른 예측 오차

훈련 스텝예측 오차
01.0
100K0.6
500K0.15
1M0.1

오차는 빠르게 감소한 후 안정화됩니다.

어려운 국면 식별​

Value Network는 어려운 국면을 식별하는 데 도움이 됩니다:

출력의미대응 전략
+1에 가까움크게 유리안정적 착수
-1에 가까움크게 불리역전 기회 모색
0에 가까움복잡한 국면심층 계산 필요

AlphaGo는 0에 가까운 국면에 더 많은 사고 시간을 투자합니다.


구현 포인트​

PyTorch 구현​

import torch
import torch.nn as nn
import torch.nn.functional as F

class ValueNetwork(nn.Module):
def __init__(self, input_channels=49, num_filters=192, num_layers=12):
super().__init__()

# 첫 번째 컨볼루션층 (5×5)
self.conv1 = nn.Conv2d(input_channels, num_filters,
kernel_size=5, padding=2)

# 중간 컨볼루션층 (3×3) ×11
self.conv_layers = nn.ModuleList([
nn.Conv2d(num_filters, num_filters,
kernel_size=3, padding=1)
for _ in range(num_layers - 1)
])

# 출력 컨볼루션층
self.conv_out = nn.Conv2d(num_filters, 1, kernel_size=1)

# 완전연결층
self.fc1 = nn.Linear(361, 256)
self.fc2 = nn.Linear(256, 1)

def forward(self, x):
# x: (batch, 49, 19, 19)

# 컨볼루션층
x = F.relu(self.conv1(x))
for conv in self.conv_layers:
x = F.relu(conv(x))
x = self.conv_out(x)

# 평탄화
x = x.view(x.size(0), -1) # (batch, 361)

# 완전연결층
x = F.relu(self.fc1(x))
x = torch.tanh(self.fc2(x))

return x.squeeze(-1) # (batch,)

학습 루프​

def train_value_network(model, optimizer, states, outcomes):
"""
states: (batch, 49, 19, 19) - 바둑판 특성
outcomes: (batch,) - 게임 결과 (+1 또는 -1)
"""
# 순전파
values = model(states) # (batch,)

# MSE 손실
loss = F.mse_loss(values, outcomes)

# 역전파
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 정확도 계산 (승패 예측 정확도)
predictions = (values > 0).float() * 2 - 1 # +1/-1로 변환
accuracy = (predictions == outcomes).float().mean()

return loss.item(), accuracy.item()

과적합 방지 기법​

# 1. 데이터 증강 (8중 대칭성)
def augment(state, outcome):
augmented = []
for rotation in [0, 90, 180, 270]:
s = rotate(state, rotation)
augmented.append((s, outcome))
augmented.append((flip(s), outcome))
return augmented

# 2. Dropout
class ValueNetworkWithDropout(ValueNetwork):
def __init__(self, *args, dropout_rate=0.5, **kwargs):
super().__init__(*args, **kwargs)
self.dropout = nn.Dropout(dropout_rate)

def forward(self, x):
# ... 컨볼루션층 ...
x = self.dropout(x) # 완전연결층 전에 dropout
# ... 완전연결층 ...

# 3. 조기 종료 (Early Stopping)
best_val_loss = float('inf')
patience = 10
counter = 0

for epoch in range(max_epochs):
train_loss = train_one_epoch()
val_loss = evaluate()

if val_loss < best_val_loss:
best_val_loss = val_loss
save_model()
counter = 0
else:
counter += 1
if counter >= patience:
print("Early stopping!")
break

Policy Network와의 협력​

상호 보완 관계​

Policy Network와 Value Network는 AlphaGo에서 상호 보완합니다:

네트워크답하는 질문출력MCTS 역할
Policy다음 수를 어디에?확률 분포탐색 방향 안내
Value이 대국을 이길까?단일 값리프 노드 평가

통합된 이중 헤드 네트워크​

AlphaGo Zero에서는 이 두 네트워크가 하나의 이중 헤드 네트워크로 통합되었습니다:

이 설계의 장점:

  • 파라미터 공유: 계산량 감소
  • 특성 공유: Policy와 Value가 같은 특성 사용
  • 학습이 더 안정적: 두 목표가 서로를 정규화

자세한 내용은 이중 헤드 네트워크와 잔차 네트워크를 참조하세요.


애니메이션 대응​

이 글에서 다루는 핵심 개념과 애니메이션 번호:

번호개념물리/수학 대응
🎬 E2Value Network퍼텐셜 에너지면
🎬 D4가치 함수기대 보상
🎬 C6리프 노드 평가함수 근사
🎬 H3시간차 학습부트스트래핑

추가 읽기​


핵심 포인트​

  1. Value Network는 승률을 예측: -1에서 +1 사이의 단일 값 출력
  2. Tanh 출력: 출력이 올바른 범위 내에 있도록 보장
  3. MSE 손실: 예측 값을 실제 결과에 근사
  4. 과적합 과제: 셀프 플레이 데이터로 방지 필요
  5. 랜덤 시뮬레이션 대체: 한 번 평가 ≈ 15000회 시뮬레이션

Value Network는 AlphaGo의 '판단력'입니다 — AI가 모든 가능성을 다 탐색하지 않고도 어떤 국면의 좋고 나쁨을 평가할 수 있게 해줍니다.


참고 자료​

  1. Silver, D., et al. (2016). "Mastering the game of Go with deep neural networks and tree search." Nature, 529, 484-489.
  2. Silver, D., et al. (2017). "Mastering the game of Go without human knowledge." Nature, 551, 354-359.
  3. Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction. MIT Press.
  4. Tesauro, G. (1995). "Temporal difference learning and TD-Gammon." Communications of the ACM, 38(3), 58-68.