덧글수3
오랜만의 포스팅이다. 할 일은 많고 시간도 남는 추석 연휴. 휴일만 되면 의욕이 넘치면서 모든 일을 할 수 있을 것 같은 기분이 든다.



지난 글에 썼던 신경망 알고리즘을 응용해서 BlackJack 게임을 하는 프로그램을 만들어 보았다.

게임 Rule
간단하게 블랙잭의 룰을 설명하면, 게임을 시작할 때 2장의 카드를 받고, 카드를 더 받을지(hit), 그만 받을지(stand) 선택할 수 있다.
카드 점수 계산은 J, Q, K는 10, 2~10은 그대로 2~10, Ace는 1 또는 11로 계산할 수 있다.
자기가 가지고 있는 카드 점수를 다 합쳐서 21(blackjack)이 되면 무조건 이기고, 그렇지 않을 경우 21을 넘으면 무조건 지고, 딜러 포함 플레이어가 다 21 미만일 경우에는 높은 쪽이 이기게 된다.
기본 설정
프로그램에서 게임의 주체는 일단 딜러(Dealer)와 플레이어(Player)로 나눈다. 딜러는 정해진 룰(총점 16 이하이면 hit, 17 이하이면 stand)에 따라 움직이기 때문에 따로 학습을 하지 않는다.
학습하는 것은 플레이어이다. 플레이어는 3개의 레이어로 구성된 신경망으로 hit / stand를 판단한다.
입력 레이어에는 38개의 뉴런이 있다. 각 뉴런이 받는 input은 플레이어의 점수(2~20), 그리고 딜러의 점수(2~20)이다. 최소값이 2인 이유는 게임을 시작할 때 Ace 2장이 들어올 수 있기 때문이다. 이 경우 계산은 2 또는 12로 계산하게 된다(22인 경우 게임을 지기 때문에 계산하지 않음). 최대값이 20인 이유는 21이면 블랙잭으로 게임이 끝나고, 22 이상이면 계산할 필요 없이 게임을 지기 때문이다. 게임을 질 때 hit / stand를 판단할 필요는 없다.
히든 레이어는 신경망을 구성하는 중요한 요소인데, 입력 레이어의 정보를 적절히 받아서 출력 레이어와 연관시켜 준다. 여기서는 다섯 개의 히든 뉴런과 한 개의 편향된 뉴런(biased neuron, 입력층에서 정보를 받지 않고 출력층에 정보를 주기만 한다. 입력이 0이 들어올 때 결과가 나오지 않는 것을 방지하기 위한 뉴런. 정보를 받지 않기 때문에 무조건 1을 출력한다)으로 총 6개의 뉴런이 있다.
출력 레이어에는 뉴런이 1개 뿐이다. 오직 hit / stand를 판단한다. 출력값이 0.5 보다 크면 hit, 0.5 이하이면 stand가 된다.
학습
결국 중요한 것은 출력 레이어가 학습하는 과정인데, 아래와 같이 생각했다. hit를 했는데 졌으면 원래 stand를 해야 했으므로 0이 목표값이 된다. 반대로 hit를 했는데 이겼으면 원래 hit을 하는 것이 맞았으므로 1이 목표값이 된다.
예) output이 1이면 hit, 0이면 stand.
0.8이 나와서 hit을 했는데 졌음 => stand를 했어야 함 => 0 -0.8 = -0.8 가 error
0.8이 나와서 hit을 했는데 이김 => hit을 한 선택이 옳음 => 1 -0.8 = 0.2 가 error
위에서 계산된 error를 역전파해서 히든 레이어에 있는 뉴런의 w값, 입력 레이어의 뉴런의 w 값에 영향을 미치는 것이 바로 역전파 알고리즘(back-propagation algorithm)이다.
멀티 액션 학습
블랙잭은 한 게임에 들어가는 액션(hit/stand)이 여러 개이기 때문에, 각 액션이 결과에 미친 영향을 고려해야 한다. 여기서는 약간 단순화해서, 각 액션이 게임 결과에서 얼마나 멀리 떨어져 있는가를 판단 정도로 잡았다.
예를 들어 3 turn이 걸린 게임이 있었다면, 3번째 액션은 게임 결과에 직접적인 영향을 미쳤으므로 100%의 에러 값을 받는다. 하지만 2 turn 에서의 결정은 66% 만큼, 1 turn 에서의 결정은 33% 만큼의 에러 값을 받게 된다. 소위 TD-Learning 이라는 것을 간략화한 방법인데, 의외로 잘 돌아갔다.
예) 3 turn의 결정으로 게임이 끝난 경우

결론
실제로 게임 구조에 신경망을 적용해 본 것은 처음인데, 의외로 잘 돌아가서 놀랐다. 완벽한 플레이어의 이론적 승률이 49.48% 정도 된다고 하는데, 프로그램을 돌려보면 그에 근접하게 승률이 올라간다. 신경망으로 하고 싶었던 것이 많았는데, 많이 적용해봐야겠다.





최근 덧글