기획자 본인만큼 잡다한 블로그

greentec.egloos.com

포토로그


통계 위젯 (블랙)

11
20
106705

flag counter

Flag Counter


신경망 알고리즘 - BlackJack 게임 학습 AI

오랜만의 포스팅이다. 할 일은 많고 시간도 남는 추석 연휴. 휴일만 되면 의욕이 넘치면서 모든 일을 할 수 있을 것 같은 기분이 든다. 
지난 글에 썼던 신경망 알고리즘을 응용해서 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% 정도 된다고 하는데, 프로그램을 돌려보면 그에 근접하게 승률이 올라간다. 신경망으로 하고 싶었던 것이 많았는데, 많이 적용해봐야겠다.






덧글

  • 기획자 2014/09/11 22:03 # 답글

    어떤 러시아 학생이 내 코드를 그대로 베끼고 주석만 러시아어로 바꿔서 wonderfl에 올려놨다. 별로 대단한 코드도 아닌데. 쩝.
  • 겜블러 2017/07/11 14:29 # 삭제 답글

    지나가다가 블랙잭 게임에 틀린부분이 있어 말씀드립니다.
    1~4 턴을 보면 딜러도 같이 액션을 취하는데,
    블랙잭게임에서는 플레이어의 턴이 모두 끝이나야 딜러턴이 됩니다.
    따라서 저기 예시처럼 1~4턴에 딜러는 아무런 행동도 하지 않습니다.
    또한 딜러의 오픈 카드는 오직 한장입니다. 예시처럼 두장이 오픈되어있지 않습니다.
  • 기획자 2017/07/11 22:21 #

    아... 그렇군요. 오류가 있었네요. 지적해주셔서 감사합니다.
    wonderfl 사이트는 어차피 문을 닫아서, 나중에 javascript 로 수정해서 업데이트해야겠네요.
댓글 입력 영역

애드센스