Choose Language
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
language choose
Abak Logo
ABK-GOFAI: 올드스쿨 인공지능

ABK-GOFAI: Abak Evolution Backgammon을 플레이하는 올드스쿨 인공지능.

신경망의 도움 없이 Abak용 인공지능(AI)을 개발하는 일은 도전적이었고, 시간이 지나면서 명백한 한계에 부딪혔습니다. 하지만 개발 과정은 재미있었고, 지금도 "easy", "normal", "advanced" 레벨에서 계속 활약하고 있습니다. 이 글은 그것이 어떻게 작동하는지, 그리고 어떻게 만들어졌는지에 대한 이야기입니다.

1단계, GOFAI PHP

Abak의 첫 AI 버전은 PHP로 작성되었고 'out of memory' 오류로 시스템을 터뜨리는 것으로 악명이 높았지만, C++ 버전으로 가는 길을 닦아 주었습니다. 그곳은 대체 어떻게 AI를 만드는지 알아내기 위한 제 프로토타이핑 놀이터였습니다. 처음 웹서버에 연결해 실행했을 때(즉, 실제로 그것과 대국하고 있었을 때), 수를 고르는 데 길고 긴 15초가 걸렸고, 서버가 혼자 움직이는 모습을 보자 저는 완전히 흥분해서 작은 춤까지 췄을지도 모릅니다. 확실하진 않지만요.

2단계, GOFAI C

그래서 생산 환경에 처음 올라간 AI의 C/C++ 버전, 제가 사랑하는 GOFAI 엔진이 PHP의 재 위에서 태어났습니다. 이 엔진은 수천 개의 포지션에 대해 29개의 분석 알고리즘을 나노초 단위로 실행하며, 흐름은 다음과 같습니다:

  • 보드 포지션과 주사위 세트를 받는다.
  • 상태를 계산한다
  • 가능한 모든 이동을 구한다.
  • 각 이동을 분석하고 점수를 부여한다.
  • '최고' 점수를 선택한다.

다음은 이 과정의 다이어그램입니다.

Diagrama Abak-GOFAI Artificial Intelligence

이 엔진은 네 가지 핵심 함수로 구성됩니다:

  • Get Actions (유효한 이동 계산):

    보드 포지션과 주사위 롤이 주어지면, 가능한 모든 유효 이동을 계산합니다.

    유효 이동 수는 0개에서 수만 개까지 나올 수 있습니다.

    제가 이것을 어떤 언어로 쓰든 불필요할 정도로 재귀적인 접근을 택해 코드 디버깅을 몹시 어렵게 만들곤 했지만, 너무 아름다워서 멈출 수 없었습니다. 코드 줄 수는 수백 줄 정도지만 쓰는 데 몇 주가 걸렸고, 다시 C로 옮기는 데도 몇 주가 더 걸렸습니다.

  • Get state (보드 상태 계산):

    보드 포지션이 주어지면 의미론적 상태를 계산합니다. 이름만 봐도 꽤 자명합니다:

    • Starting
    • MiddleGame
    • 희망 없는 러닝
    • 희망 있는 러닝
    • EndGame
    • 집으로 진입 중
  • Analyse Movement (보드 포지션의 점수 계산):

    이것이 단연 가장 방대한 알고리즘입니다. 보드의 특징들을 분석하고 각각 점수를 반환한 다음, 앞서 계산한 상태를 바탕으로 가중치를 적용해 게임 상태에 따라 분석의 서로 다른 측면에 중요도를 부여합니다.

    AI는 처음 8개의 알고리즘으로 시작해 최종적으로 29개가 되었습니다. 일부를 꼽아보면:

    • 열 높이
    • 히트당할 위험
    • 가둘 수 있는 위험
    • 홈 강도
    • 탈출의 축
    • 바에 있는 체커
    • 안전한 체커

    이 알고리즘들 중 상당수는 처음에는 아주 기본적이었거나 아예 존재하지 않았습니다.

    시간이 지나며 기능을 추가하고 가중치를 미세 조정하면서 계속 다듬었습니다.

  • Select Action ("최선"의 이동 선택):

    가장 높은 점수만 고른다면(Advanced 레벨이 그렇듯) 이 알고리즘은 비교적 단순합니다.

    Normal과 Easy 레벨에서는 최선의 수 목록 중 하나를 무작위로 선택합니다. 목록 크기(또는 나쁜 수에 대한 허용도)는 난이도에 따라 달라집니다.

C 덕분에 이 엔진은 엄청나게 빠르므로, 저는 항상 이것을 기본 get-actions 함수로 사용합니다.

3단계, GOFAI C 튜닝

이 엔진을 디버그하고, 문제를 해결하고, 미세 조정하기 위해 저는 의사결정 과정을 모니터링하는 많은 도구를 만들어야 했습니다. Neural Network와 달리, 여기서는 각 결정이 감사 가능하다는 점이 최소한의 위안이었습니다.

과정은 재미있었지만 고통스러울 만큼 느렸습니다. CPU와 정말 많이 대국했고, 나쁜 수를 볼 때마다 무슨 문제가 있었는지 확인하려고 이 도구들로 돌아왔습니다. 때로는 알고리즘 수정, 가중치 조정, 혹은 새로운 분석 모델 구축으로 이어졌습니다. 때로는, 그리고 그건 정말 아름다웠는데, 제 Abak Evolution 전략을 다시 생각하게 만들었습니다.

Abak-GOFAI Debug Tool Screenshot 1 Abak-GOFAI Debug Tool Screenshot 2

시간이 지나면서 꽤 견고한 AI가 되었지만, 더 완벽하게 만드는 일은 점점 더 어려워졌습니다. 코드 줄 수는 너무 많고, 시나리오는 너무 많고, 연산도 너무 거대해서 코드 레벨 디버깅은 무거운 작업이 되었고, 수동으로 가중치를 조정해도 더 이상 성과가 나오지 않았습니다.

4단계, 절망

하지만 저는 더 원했습니다. 제가 실제로 Abak을 플레이하기 때문에 재미있게 둘 수 있는 탄탄한 상대가 필요했거든요. 당시에는(그리고 지금 이 글을 쓰는 지금도) 사람이 그리 많지 않았습니다.

그리고 이 접근 방식에는 단점이 많습니다:

  • 현재 포지션을 기준으로 보드 상태를 계산하고, 그 상태를 사용해 모든 유효 수에 대한 분석 알고리즘의 가중치를 바꿉니다. 하지만 그 수 자체가 상태를 바꿀 수도 있는데, 엔진은 그것을 고려하지 않습니다.
  • 가중치를 수동으로 미세 조정하는 데는 엄청난 시간이 필요했습니다. 즐거운 시간이긴 했지만, 어마어마하게 많이 들었죠.
  • 가능한 시나리오 수가 너무 많아서 상태 계산은 몹시 어렵습니다. 언제나 결함이 있는 알고리즘이었습니다.
  • Game Equity를 정확하게 계산하는 것은 불가능합니다. 이 엔진은 각 분석 알고리즘마다 임의의 점수 체계를 사용하고, 최종 점수는 승률을 반영하지 않으며, 서로 다른 보드 포지션 사이에서 비교 가능한 점수로만 작동하기 때문입니다. 절대값이 아니라 상대값을 가진다고 할 수 있습니다.

5단계, 각성

그러던 어느 날, 2018년에 Google이 AlphaGo Neural Network로 GO 챔피언을 이겼고, 엄청난 화제가 일어났습니다. 게다가 훌륭한 오픈 소스 Machine Learning 라이브러리들이 등장했고, 가정용 GPU를 사용해 학습 속도를 높일 수 있게 되었습니다.

물론 저는 Neural Network에 대해 이미 조금은 알고 있었지만, 직접 만들어본 적은 없었고 솔직히 제 능력을 넘어서는 일처럼 느껴졌습니다.

그래서 결국 참을 수 없었고, expert 레벨은 get-actions 부분을 제외하면 더 이상 GOFAI 엔진으로 동작하지 않게 되었습니다.

하지만 이 이야기는 여기서 끝납니다.

여기까지 전부 읽으셨다면 정말 놀랍습니다.

이 글은 정직한 Abak Evolution 팀이 SEO 목적으로 작성했습니다.
다시 말해, Samy Garib입니다.

Abak Evolution Backgammon은 클래식 보드게임에 말 그대로 새로운 차원을 더하는 멋진 클래스 기반 Backgammon 변형입니다.