본문으로 건너뛰기

입력 특성 설계

신경망은 숫자만 처리할 수 있습니다. 바둑을 이해시키려면 바둑판을 숫자로 '번역'하는 방법이 필요합니다.

이 번역 과정이 바로 입력 특성 설계입니다.

AlphaGo는 48개 특성 평면을 사용했고, AlphaGo Zero는 17개로 간소화했으며, KataGo는 22개로 최적화했습니다. 이 글에서는 이러한 설계 선택 뒤의 고려 사항을 상세히 분석합니다.


특성 평면이란 무엇인가?

기본 개념

하나의 특성 평면은 19×19 행렬로, 각 요소는 바둑판의 해당 위치의 특정 속성을 나타냅니다.

예를 들어, '흑돌 위치' 특성 평면:

바둑판 상태:               특성 평면(흑돌):
A B C D E A B C D E
1 . . . . . 1 0 0 0 0 0
2 . ● . . . 2 0 1 0 0 0
3 . . ○ . . → 3 0 0 0 0 0
4 . . . ● . 4 0 0 0 1 0
5 . . . . . 5 0 0 0 0 0
  • 흑돌이 있는 위치 = 1
  • 흑돌이 없는 위치 = 0

여러 특성 평면

신경망은 다양한 정보가 필요하므로, 여러 특성 평면을 쌓습니다:

각 평면의 크기는 19x19입니다.

이것은 컬러 이미지가 R, G, B 세 채널을 가지는 것과 유사합니다. 바둑 '이미지'는 N개 채널을 가집니다.


AlphaGo의 48개 특성 평면

완전한 목록

AlphaGo는 48개 특성 평면을 사용하며, 여러 카테고리로 나뉩니다:

1. 돌 위치 (3개 평면)

평면이름설명
1흑돌흑돌 있음 = 1, 아니면 = 0
2백돌백돌 있음 = 1, 아니면 = 0
3빈 점빈 점 = 1, 아니면 = 0

2. 기록 (16개 평면)

평면이름설명
4-11흑돌 기록흑돌이 1-8수 전의 위치
12-19백돌 기록백돌이 1-8수 전의 위치

기록이 왜 필요할까요?

  • 패 판단: 즉시 되잡기가 가능한지 알아야 함
  • 착수 의도: 최근 몇 수가 양측의 계획을 드러냄
  • 시간 정보: CNN 자체는 시간을 처리하지 않으며, 기록 평면이 이를 보완

3. 활로 수 특성 (8개 평면)

평면이름설명
20-231-4 활로 (아군)아군 돌 그룹이 1/2/3/4 활로 = 1
24-271-4 활로 (상대)상대 돌 그룹이 1/2/3/4 활로 = 1

활로 수는 바둑에서 가장 중요한 전술 개념입니다:

  • 1 활로: 단수, 곧 잡힐 상태
  • 2 활로: 위험 상태
  • 3 활로: 주의 필요
  • 4+ 활로: 일단 안전

4. 단수 특성 (8개 평면)

평면이름설명
28-31단수 위치 (아군)여기 두면 상대 1/2/3/4개 돌을 단수로 만듦
32-35단수 위치 (상대)여기 두면 아군 1/2/3/4개 돌을 단수로 만듦

단수는 바둑에서 가장 흔한 전술입니다:

  • 여러 돌에 단수 = 더 큰 위협
  • 다른 규모의 단수는 다른 대응 필요

5. 축머리 특성 (8개 평면)

평면이름설명
36-39축머리 관련 (아군)아군 축머리와 관련된 위치
40-43축머리 관련 (상대)상대 축머리와 관련된 위치

축머리(Ladder)는 바둑에서 유명한 전술입니다:

  • 대각선을 따라 상대 돌을 추격
  • '축머리 유리' 또는 '축머리 불리' 판단 필요
  • 전역적 시야가 필요하며, 전통적 컴퓨터 바둑의 난제

6. 합법성 특성 (1개 평면)

평면이름설명
44합법 위치합법적으로 착수 가능 = 1

이것은 네트워크가 불법 수를 출력하는 것을 방지합니다:

  • 이미 돌이 있는 위치에는 둘 수 없음
  • 금지점(자살이면서 따낼 수 없음)에는 둘 수 없음
  • 패 즉시 되잡기는 불가

7. 변/귀 특성 (4개 평면)

평면이름설명
45변까지 거리 11선에 있음 = 1
46변까지 거리 22선에 있음 = 1
47변까지 거리 33선에 있음 = 1
48변까지 거리 4+4선 이상 안쪽 = 1

변과 귀는 바둑에서 특별한 의미가 있습니다:

  • 1선: 사선, 돌이 쉽게 잡힘
  • 2선: 살기 선, 하지만 효율이 낮음
  • 3선: 실리 선, 안정적
  • 4선: 세력 선, 영향력 추구

왜 이렇게 많은 특성이 필요한가?

DeepMind의 설계 철학은 가능한 많은 정보를 제공하고, 네트워크가 무엇이 유용한지 스스로 결정하게 하는 것입니다:

원본 바둑판 → 48개 특성 평면 → 신경망 → 결정

특성 공학자의 일: 바둑 지식을 특성으로 인코딩
신경망의 일: 이러한 특성을 조합하는 법을 학습

이것은 "공을 신경망에 넘기는" 전략입니다 — 인간은 특성 설계를 담당하고, 네트워크는 조합 학습을 담당합니다.


AlphaGo Zero의 간소화: 17개 특성 평면

혁명적 변화

AlphaGo Zero는 입력 특성을 대폭 간소화했습니다:

버전특성 평면 수인간 지식 사용
AlphaGo48많음 (활로 수, 축머리 등)
AlphaGo Zero17거의 없음

17개 평면의 구성

1. 돌 위치 기록 (16개 평면)

평면이름설명
1-8흑돌 T-0에서 T-7흑돌의 현재와 과거 7수의 위치
9-16백돌 T-0에서 T-7백돌의 현재와 과거 7수의 위치

2. 색상 (1개 평면)

평면이름설명
17누구 차례흑 차례 = 전부 1, 백 차례 = 전부 0

왜 이렇게 간소화할 수 있는가?

AlphaGo Zero의 핵심 통찰:

충분한 계산 자원과 학습 시간을 주면, 신경망은 이러한 특성을 스스로 학습할 수 있다

'활로 수', '단수', '축머리' 같은 개념은 인간이 수천 년에 걸쳐 발전시켜 왔습니다. 하지만 AlphaGo Zero는 신경망이 며칠 내에 스스로 학습할 수 있음을 증명했습니다 — 어쩌면 인간보다 더 나은 표현을 학습할 수도 있습니다.

효과 비교

놀랍게도, 더 적은 특성을 사용하는 AlphaGo Zero가 오히려 더 강합니다:

버전특성 수학습 시간최종 기력
AlphaGo Master48수개월약 5185 Elo
AlphaGo Zero1740일약 5185 Elo
AlphaGo Zero (3일)173일인간 초월

더 적은 인간 지식이 오히려 더 강한 성능을 가져왔습니다.

왜 인간 지식이 오히려 부담이 되는가?

1. 인간 지식이 틀릴 수 있음

인간이 정리한 바둑 규칙은 경험적이며, 최적이 아닐 수 있습니다. 예를 들어:

  • "금각은변초복피" — 하지만 어떤 국면에서는 중앙이 더 중요
  • "축머리 불리면 두지 마라" — 하지만 때로는 주동적 버림이 가능

2. 특성 인코딩이 표현을 제한

'활로 수'를 1-4 활로 네 개 평면으로 인코딩하면, '활로 수'가 중요한 분류 방식이라고 암묵적으로 가정하게 됩니다. 하지만 어쩌면 더 좋은 분류 방식이 있을 수 있고, 이 인코딩이 네트워크가 그것을 발견하는 것을 막습니다.

3. 표현 병목

48개 평면은 더 많은 계산 자원을 차지합니다. 일부 특성이 불필요하다면, 이 자원은 낭비됩니다.


KataGo의 최적화: 22개 특성 평면

실용주의적 균형

KataGo는 AlphaGo Zero를 기반으로, 소량의 엄선된 인간 지식을 추가했습니다:

항목AlphaGo ZeroKataGo
기록 평면165
돌 위치
누구 차례
패 상태아니오
규칙 변형아니오예 (덤, 자살 규칙 등)
총계1722

KataGo의 특성 목록

기본 특성 (5개)

평면이름설명
1흑돌현재 흑돌 위치
2백돌현재 백돌 위치
3빈 점현재 빈 점 위치
4누구 차례 (1)항상 1인 상수 평면
5누구 차례 (2)흑 차례 = 1, 백 차례 = 0

기록 특성 (5개)

평면이름설명
6직전 수 위치상대가 직전에 둔 위치
72수 전 위치내가 직전에 둔 위치
83수 전 위치상대가 2수 전에 둔 위치
94수 전 위치내가 2수 전에 둔 위치
105수 전 위치상대가 3수 전에 둔 위치

패 특성 (3개)

평면이름설명
11패 금지점현재 둘 수 없는 패 금지점
12잠재적 패점 (아군)아군이 여기 두면 패가 됨
13잠재적 패점 (상대)상대가 여기 두면 패가 됨

규칙 특성 (9개)

평면이름설명
14-22규칙 인코딩덤, 자살 규칙, 슈퍼 패 등

왜 이러한 특성을 추가했는가?

KataGo의 저자 lightvector의 설명:

1. 패가 너무 중요함

패는 바둑에서 가장 복잡한 개념 중 하나입니다. 순수하게 원시 바둑판 상태에서 패 규칙을 학습하려면 대량의 샘플이 필요합니다. 패 금지점을 명시적으로 표시하면 학습을 가속할 수 있습니다.

2. 규칙의 다양성

바둑에는 여러 규칙이 있습니다:

  • : 중국 규칙 7.5집, 일본 규칙 6.5집
  • 자살 규칙: 일부 규칙은 자살 허용
  • 슈퍼 패: 긴 순환을 처리하는 다른 방식

입력에 규칙을 명시적으로 인코딩하면, 하나의 네트워크로 모든 변형을 처리할 수 있습니다.

3. 학습 효율

소량의 인간 지식을 추가하면 학습을 크게 가속할 수 있습니다. KataGo는 50 GPU 일로 AlphaGo Zero가 5000+ TPU 일로 도달한 기력에 도달했습니다.


특성 설계의 철학

세 가지 방법

방법대표특성 수인간 지식계산 요구
많은 인간 지식AlphaGo48많음중간
최소 인간 지식AlphaGo Zero17거의 없음매우 높음
적절한 인간 지식KataGo22소량 엄선비교적 낮음

트레이드오프 고려

자원이 제한될 때

계산 자원이 제한되면(대부분 연구자의 상황), 일부 인간 지식을 추가하는 것이 현명합니다:

  • 학습 수렴 가속
  • 필요한 학습 데이터 감소
  • 바퀴를 다시 발명하지 않음

극한을 추구할 때

계산 자원이 충분하면, 인간 지식을 줄이면 더 높은 기력에 도달할 수 있습니다:

  • 인간 편향 방지
  • 인간이 알지 못하는 전략 발견
  • 진정한 '제로에서 시작'

시사점

AlphaGo 시리즈의 진화가 알려주는 것:

  1. 특성 공학은 여전히 중요 — 하지만 형태가 바뀜
  2. End-to-end 학습이 트렌드 — 네트워크가 스스로 특성을 학습하게 함
  3. 유일한 정답은 없음 — 자원과 목표에 따라 다름

구현 예제

특성 추출 (AlphaGo 스타일)

import numpy as np

def extract_features_alphago(board, history, current_player):
"""
AlphaGo 스타일의 48개 특성 평면 추출

board: 19×19 바둑판, 0=빈, 1=흑, 2=백
history: 최근 8수의 기록
current_player: 1=흑, 2=백
"""
features = np.zeros((48, 19, 19))

# 1-3: 돌 위치
features[0] = (board == 1) # 흑돌
features[1] = (board == 2) # 백돌
features[2] = (board == 0) # 빈 점

# 4-19: 기록 위치
for i, hist_board in enumerate(history[:8]):
features[3 + i] = (hist_board == 1) # 흑돌 기록
features[11 + i] = (hist_board == 2) # 백돌 기록

# 20-27: 활로 수 특성
liberties = compute_liberties(board)
for i, lib_count in enumerate([1, 2, 3, 4]):
my_color = current_player
opp_color = 3 - current_player
features[19 + i] = (liberties == lib_count) & (board == my_color)
features[23 + i] = (liberties == lib_count) & (board == opp_color)

# 28-35: 단수 특성
capture_counts = compute_captures(board)
for i, cap_count in enumerate([1, 2, 3, 4]):
features[27 + i] = (capture_counts[current_player] == cap_count)
features[31 + i] = (capture_counts[3-current_player] == cap_count)

# 36-43: 축머리 특성 (간소화)
ladder_status = compute_ladder(board)
# ... 상세 구현 생략 ...

# 44: 합법 위치
features[43] = compute_legal_moves(board, current_player)

# 45-48: 변/귀 거리
for i in range(19):
for j in range(19):
dist = min(i, j, 18-i, 18-j)
if dist == 0:
features[44, i, j] = 1
elif dist == 1:
features[45, i, j] = 1
elif dist == 2:
features[46, i, j] = 1
else:
features[47, i, j] = 1

return features

특성 추출 (AlphaGo Zero 스타일)

def extract_features_zero(board_history, current_player):
"""
AlphaGo Zero 스타일의 17개 특성 평면 추출

board_history: 최근 8수의 바둑판 상태 리스트
current_player: 1=흑, 2=백
"""
features = np.zeros((17, 19, 19))

# 1-8: 흑돌의 T-0에서 T-7 위치
for i, board in enumerate(board_history[:8]):
features[i] = (board == 1)

# 9-16: 백돌의 T-0에서 T-7 위치
for i, board in enumerate(board_history[:8]):
features[8 + i] = (board == 2)

# 17: 누구 차례
if current_player == 1: # 흑
features[16] = np.ones((19, 19))
else:
features[16] = np.zeros((19, 19))

return features

성능 비교

import time

# 1000회 특성 추출 시뮬레이션
board = np.random.randint(0, 3, (19, 19))
history = [np.random.randint(0, 3, (19, 19)) for _ in range(8)]

# AlphaGo 스타일 (복잡한 계산 포함)
start = time.time()
for _ in range(1000):
features = extract_features_alphago(board, history, 1)
alphago_time = time.time() - start

# AlphaGo Zero 스타일 (간단)
start = time.time()
for _ in range(1000):
features = extract_features_zero(history, 1)
zero_time = time.time() - start

print(f"AlphaGo 스타일: {alphago_time:.2f}s")
print(f"AlphaGo Zero 스타일: {zero_time:.2f}s")
# 일반적 결과: AlphaGo 스타일이 5-10배 느림

특성 평면 시각화

실제 국면 예제

실제 바둑판:
A B C D E F G H J K L M N O P Q R S T
19 . . . . . . . . . . . . . . . . . . .
18 . . . . . . . . . . . . . . . . . . .
17 . . . ● . . . . . . . . . . . ○ . . .
16 . . . . . . . . . . . . . . . . . . .
15 . . . . . . . . . . . . . . . . . . .
...

특성 평면 1(흑돌):
A B C D E F G H J K L M N O P Q R S T
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...

특성 평면 2(백돌):
A B C D E F G H J K L M N O P Q R S T
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...

특성 평면의 통찰

다른 특성 평면을 관찰하면 모델이 무엇을 '보는지' 이해할 수 있습니다:

특성직관적 의미모델이 학습할 수 있는 것
흑돌/백돌 위치누가 어디에돌 모양, 연결성
기록최근에 무슨 일이착수 의도, 전투 방향
활로 수누가 위험한가공격/방어 대상
단수전술 기회국소 전술
변/귀 거리위치 중요성초반 선점, 변/귀 정석

애니메이션 대응

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

번호개념물리/수학 대응
🎬 A8특성 인코딩텐서 표현
🎬 A10입력 정규화특성 공학
🎬 D1컨볼루션 입력다채널 이미지
🎬 E3Zero의 간소화최소 표현

추가 읽기


핵심 포인트

  1. 특성 평면은 바둑판의 수치화된 표현: 각 평면은 19×19 행렬
  2. AlphaGo는 48개 평면 사용: 많은 인간 바둑 지식 포함
  3. AlphaGo Zero는 17개로 간소화: 네트워크가 스스로 특성을 학습할 수 있음을 증명
  4. KataGo는 22개로 최적화: 효율과 성능의 균형
  5. 특성 설계는 트레이드오프: 인간 지식 vs 계산 자원

입력 특성 설계는 '인간이 이해하는 바둑'과 '기계가 처리할 수 있는 숫자'를 연결하는 다리입니다.


참고 자료

  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. Wu, D. (2019). "Accelerating Self-Play Learning in Go." arXiv:1902.10565.
  4. KataGo Documentation: https://github.com/lightvector/KataGo