2018년에 Google은 AlphaGo Neural Network로 GO 챔피언을 이겼고, 큰 화제가 되었습니다. 새롭고 훌륭한 오픈 소스 Machine Learning 라이브러리들이 등장했고, 가정용 GPU를 활용해 학습 과정을 가속할 수 있었습니다.
저는 Abak에도 이것을 시도해 보기로 결심했지만, 처음 시작했을 때는 신경망이 무엇인지도 거의 모르는 수준이었습니다. 대학 시절(1996)에 조금 관심을 가져본 적은 있었지만, 데이터도 GPU도 목표도 부족해서 접근하기 어려웠습니다. 게다가 수학적으로도 Neural Networks는 무거운 주제이고, 많은 영감이 필요합니다.
강렬하고 집요한 연구를 거듭한 끝에, 저는 모델을 만들고 실제로 학습시키는 데 성공했습니다.
거인의 어깨 위에 서서, 저는 처음에 90년대 TD-Gammon을 개발한 Gerald Tesauro 박사에게서 배우고자 했습니다. 제 기억이 맞다면, 그것은 강화학습 알고리즘의 최초의 실용적 구현이었습니다.
하지만 Abak은 2차원 게임이기 때문에 제안된 모델을 그대로 사용할 수 없었고, 저만의 모델을 개발해야 했습니다. 저는 일부 알고리즘의 출력을 모델의 일부, 즉 전문가 정보로 넣어 신경망이 학습 과정을 좀 더 쉽게 진행하도록 하기로 했습니다. 그렇게 하는 것이 약간 치팅처럼 느껴졌습니다.
다음은 두 모델, 즉 Backgammon 모델과 Abak 모델의 비교입니다.
Backgammon에서 널리 쓰이는 TD 모델은 열을 설명합니다. 보드의 각 열을 설명하기 위해 4개의 입력을 사용합니다.
- 체커 없음: [0,0,0,0]
- 체커 1개: [1,0,0,0]
- 체커 2개: [1,1,0,0],
- 체커 3개: [1,1,1,0]
- 체커가 3개보다 많음: [1,1,1,1].
이런 세트가 28개 있으며(보드의 각 열마다 하나), 각 팀을 표현하기 위해 총 28*2*4개의 입력을 사용하고, 여기에 바에 있는 체커를 세기 위한 몇 개의 입력이 더해집니다. 안타깝게도 이 글은 기억에 의존해 쓰고 있어 정확하지 않을 수도 있습니다.
Abak의 모델은 매우 다릅니다. 이 모델은 체커를 설명하며, 각 체커는 특징 집합을 가집니다. 최신 버전에서는 보드에 대한 단순화된 설명도 보완적으로 추가해 봤지만 결과는 엄청나진 않았고, 그래도 그 특징들은 여전히 남아 있습니다.
게임 설명 모델은 네 부분으로 구성됩니다 [477 inputs]:
- 체커 설명 (14x30): 체커의 상태, 거리, 높이 등의 정보가 포함됩니다. 클래스 자체는 포함되지 않으며, 모델 내 위치로부터 상속됩니다.
- 팀 상태 (4x2): 일부 체커 또는 상태 특성의 집계입니다.
- 힘의 지도 (24x2).
- 게임 상태: 다음에 누가 굴리는가! (1).
아래에서 모델의 전체 설명을 확인할 수 있습니다.
버전:
1.- Python Cumpy (TD-V1).
이 AI의 첫 번째 버전은 GPU에서 실행되는 Numpy 유사 라이브러리인 Cumpy를 사용해 순수 Python으로 학습되었습니다. 저는 밑바닥부터 배우고 싶었기 때문에, Tensorflow를 한동안 만져보았음에도 결국 순수하게 가보기로 했습니다(물론 환상적인 Python + Cumpy 조합은 갖춘 채로요).
특징:
- 팀 0이 게임에서 이길 확률을 추정하는 하나의 네트워크.
- 포인트 정보는 인식하지 못함.
- "다음에 누가 굴리는가" 플래그가 없었음.
- 힘의 지도가 없었음
- 시그모이드 활성화를 사용하는 은닉층 하나.
- 전문가 정보 기반의 이전 AI(GOAFI)를 이기는 데 45.000게임이 걸렸음.
- 4.500.000게임 동안 학습했고 GOFAI 상대로 75% 승률을 기록함.
- 2년 동안 실제 서비스에 사용됨.
2.- Tensorflow (TD-V2).
Version 1에서 제일 고통스러웠던 점은 "다음에 누가 굴리는가" 플래그 없이 학습되었기 때문에 승률 계산이 좋지 않았다는 것입니다. 이상하게도 좋은 수를 고르는 데는 신경망 결과가 꽤 괜찮았지만, 수학적으로는 일관성이 없었습니다. Version 2는 그 문제를 해결하고, 게임이 1점, 2점, 3점으로 끝날 확률을 계산하는 새 네트워크를 추가했습니다.
이번에는 프레임워크를 배우고 싶었기 때문에 새 모델 학습에 Tensorflow를 선택했고, 시작하기에 아주 훌륭한 예제를 찾았습니다.
특징:
- 팀 0의 승률을 계산하는 하나의 네트워크.
- 게임이 1점, 2점, 3점으로 끝날 확률을 계산하는 하나의 네트워크.
- 새로운 힘의 지도를 포함.
- 두 개의 은닉층, 서로 다른 활성화 함수 사용: 은닉층은 Leaky RELU, 출력층은 sigmoid.
- TD-V1을 상대로 50% 승률에 도달하는 데 12.000게임이 걸림.
- 350.000게임 동안 학습했고 TD-V1을 상대로 80% 승률에 도달함.
3.- Version 3: 보류 중.
최선의 수를 고르는 의사결정의 마지막 단계에는 최적의 Equity [%W*%p1+%W*%p2+%W*%p3]를 찾는 단순한 알고리즘이 있습니다.
매치 목표, 각 플레이어가 승리하는 데 필요한 점수 수, 그리고 큐브 값에 따라 네트워크 출력에 서로 다른 가중치를 부여합니다.
이것을 처리하는 NN을 만들고 싶습니다. 그것이 V3가 될 것입니다. 현재는 개발 중이 아닙니다.
Abak의 Neural Network 모델:
체커 설명 (14 inputs x 30 checkers ) :
- 집까지의 거리 x/25
- 위에 있는 체커 수 x/4
- 아래에 있는 체커 수 x/4
- 바에 있는가 [0,1]
- 집에 있는가 [0,1]
- 안전한가 (distance = 0에서). [0,1]
- 다른 체커와 함께 블록을 형성하는가 [0,1]
- druid에게 가둘 수 있는가 [0,1]
- druid에게 갇혀 있는가 [0,1]
- 가두고 있는가 (이 입력은 각 druid에만 해당) [0,1]
- 근거리 구역(앞 6칸)에서 히트당할 위험 [0..1]
- 장거리 구역(앞 12칸)에서 히트당할 위험 [0..1]
- druid에게 갇힐 위험 [0..1]
- 이동 가능성 [0..1]
각 팀에 대한 게임 관련 입력 (4x2):
- 바에 있는 체커 수. x/15
- 안전한 체커 수. x/15
- 모든 체커가 집에 있음. [0,1]
- 안전한 체커 0의 수. [0,1]
힘의 지도: (24*2):
마지막으로, Backgammon에 대해 Doctor Tessauros가 제안한 것과 비슷하지만 단순화된 힘의 지도가 있습니다. 각 위치와 각 팀에 대해 0과 1 사이의 숫자가 있으며, 그 블록이 얼마나 강한지를 나타냅니다:
- 0.0비어 있으면.
- 0.1체커가 하나 있으면.
- 0.5그 체커가 guard이면.
- 1.0체커가 두 개 이상 있으면.