2048 게임하는 강화학습 에이전트 만들어보기
포스트
취소

2048 게임하는 강화학습 에이전트 만들어보기

Table of Contents

개요

  • 프로젝트 발단: 2023년 2학기 강화학습 실습 프로젝트
  • 이 글의 목적: 프로젝트 정리

프로젝트 개요

자유롭게 문제를 선택 또는 생성하고 그에 맞는 다양한 강화학습 에이전트를 사용해본다. 이 과정에서 강화학습을 더 깊이있게 이해하고, 데이터의 준비부터 에이전트의 훈련 및 테스트까지 전 과정을 경험하며 각종 문제에 대해 고민해보라.

  • 요즘 코드를 구하는 것은 아주 쉬우니, 코드를 손수 짜는 것이 이 프로젝트의 목적이 아니다. 쉽게 구한 다양한 코드를 빠르게 실행시켜보면서 ‘코드 작성’ 이외의 문제에 대해 고민하라.
  • 일반적으로 유효하고 대체로 좋은 성능을 내는 하이퍼파라미터 값은 이미 알려져있다. 하이퍼파라미터를 처음부터 맞추는 것 또한 이 프로젝트의 목적이 아니다. 하지만 세부 조정은 시도해보는 것도 좋다.

문제

  • 3x3 2048 게임
    • 대부분 규칙은 일반적인 2048 게임과 같다.
    • 2는 90% 확률로, 4는 10% 확률로 보드에 추가된다.
    • 새로운 숫자가 보드에 추가될 때 랜덤 이외에 사용되는 알고리즘은 없다. 딱히 플레이어에게 유리하거나 불리한 위치를 일부러 고르지는 않는다는 말이다.
    • 무효한 이동 금지 → 리워드 차감
    • 숫자가 합쳐질 때마다 합쳐진 결과로 나오는 숫자가 해당 게임의 총점에 가산된다 → 리워드로 이용
    • 빠른 학습과 비교적 작은 가치 공간을 위해 3x3 크기를 이용했다.
  • 선택 사유
    • 랜덤 진행(높은 불확실성)으로 인한 확정적 알고리즘을 통한 해결의 어려움
    • 내가 해도 어려운 게임이라 도전하고 싶었다.

에이전트

  • random: 대조군으로서 모든 이동을 랜덤하게 선택했다. 적어도 이 모델보다는 잘해야 학습을 했다고 할 수 있지 않겠나.
  • TD(0): 현재 상태와 다음 상태를 가치 계산에 이용한다. 행동은 가치 계산에 고려되지 않는다.
  • SARSA: 현재의 (상태, 행동)과 미래의 (상태, 행동) 조합을 가치 계산에 이용한다.
  • Q: SARSA와 계산 방식이 유사하나, 현재 상태에서의 최적의 행동에 대한 가치를 학습한다.

→ 크게 매 순간 최선을 생각하는 것(Q)과 그렇지 않은 것(TD, SARSA)으로 나눌 수 있다.

선택 사유

  • 셋 모두 몬테카를로 방식이라는 공통점이 있다.
  • 내가 세 에이전트의 차이를 계속 헷갈려서 각각에 대한 이해를 높이기 위함이다.
  • 세 에이전트에 대해 배울 때, TD, SARSA, Q 순서로 점점 더 좋은 모델이라고 생각했었다. 이 생각이 맞는지 확인하고자 한다.

가설

  1. Q > SARSA > TD 순서로 높은 성능을 낼 것이다.
    • 가치 계산 방식에 근거한다. TD보다는 나머지 둘이 더 상세하게 가치를 계산하고, SARSA와 Q 중에서는 Q가 더 높은 값을 향하는 지향성이 크다.
    • 그러므로 가치를 가장 간단하게 계산하는 TD가 제일 성능이 낮고, 가치를 상세하게 계산하면서도 매번 최대화를 시도하는 Q가 제일 성능이 높으리라 예상했다.
    • TD가 가장 높은 성능을 보였으므로 이 가설은 부정되었다. SARSA가 제일 낮은 성능을 보였다.
  2. Q와 SARSA는 TD가 계산하는 가치의 수에 비해, 매번 취할 수 있는 행동의 수인 4배만큼 상세하게 가치를 계산하기 때문에, 산술적으로만 고려한다면 Q와 SARSA가 TD의 4배 이상 학습한다면 TD의 성능을 따라잡을 수 있을 것이다.
    • Q가 100만 회 학습에서 TD의 성능을 따라잡으며 성공했다.
    • SARSA는 100만 회 학습에서도 초기의 상태에서 크게 벗어나지 못했다.

실험

  • 각 모델마다 1천, 5천, 1만, 5만, 10만, 50만, 100만 회 학습 후 학습된 가치 값 저장.
    • 100만 회 학습의 경우 50만 회 학습에도 너무 오랜 시간이 걸려 50만 회 학습 데이터를 가져와 50만 회 추가 학습시키는 방식으로 했다.
    • 그 외 학습 데이터는 모두 처음부터 백지 상태의 모델로 학습시켰다.
  • 5천 번 이하로 학습한 경우 500번만 테스트했고, 그 이상 학습한 경우 모두 5천 번 테스트했다.
  • 테스트 결과는 각 게임이 종료될 때마다 점수와 해당 보드 내의 가장 큰 숫자를 수집한다. 수집한 데이터는 보드 내 최고 숫자를 key로 삼고 해당 숫자가 최고 숫자였던 게임의 결과 점수 리스트를 value로 삼는 딕셔너리로 저장하고 이후 점수 통계에 사용한다.

결과

  • 성능 판단: 테스트 데이터를 이용해 ‘최고 점수 5분위’, ‘마지막에 보드에 존재했던 가장 큰 숫자의 종류와 수’를 그래프로 그리고 random 모델에 비해 얼마나 좋은 성적을 냈는지 관찰한다.

전체 결과

파란색 흐린 그래프가 random 모델, 주황색은 TD, 초록색은 SARSA, 빨간색이 Q-learning의 결과 그래프다. random 모델은 비교 기준이 될뿐 값이 중요한 게 아니라 마커도 넣지 않았고 그래프도 흐리게 그렸다.

그래프를 그리는 데 사용된 데이터는 모두 테스트 데이터이다. 학습 데이터를 수집하는 것까지는 미처 고려하지 못해 수집된 것이 없다.

학습 횟수별 마지막에 보드에 존재했던 가장 큰 숫자의 종류와 수

1만 회 학습, 보드 내 최고 숫자
10만 회 학습, 보드 내 최고 숫자
50만 회 학습, 보드 내 최고 숫자
100만 회 학습, 보드 내 최고 숫자

TD의 경우 처음부터 random 모델을 벗어나 점차 오른쪽으로 이동하는 모습이 눈에 띈다. 다만 50만 회와 100만 회 학습에서는 서로 큰 차이를 보이지 못했는데 이에 대해서는 이후에 모델별 결과를 따로 보며 다시 논의한다.

SARSA는 처음부터 끝까지 random 모델을 크게 벗어나지 못했다. 기껏해야 random 모델보다 근소하게 나은 수준이다.

Q는 TD보다 성장이 느렸으나, 현재 결과 내에서는 성장세가 감소하는 모습을 보이지 않았으므로 TD보다 더 우수하게 성장할 가능성이 있다.

학습 횟수별 최고 점수 5분위

1만 회 학습, 최고 점수 5분위
10만 회 학습, 최고 점수 5분위
50만 회 학습, 최고 점수 5분위
100만 회 학습, 최고 점수 5분위

전체적으로 최고 숫자 그래프에 비해 성장세가 잘 보이지 않는 편이다. 다시 말하자면 처음부터 최소 점수와 최고 점수의 경우 한계가 정해진 셈이고, 학습을 지속할수록 최고 점수가 나올 수 있는 경우가 증가하도록 학습한 것이라 볼 수 있다.

SARSA의 경우 다른 분위의 숫자는 random과 비슷하나 최고 점수에서 다른 모델에 준하는 기록을 낸 것이 보이는데, 학습 수에 따라 일관된 성장을 보이지는 않고 있다. 이를 단순 운이라고 보기엔, 운이 맞다면 random 모델에서도 한번쯤은 발생할 수 있었어야 한다. 그러니 SARSA의 학습이 수렴하지 못하고 진동하고 있는 것이라고 해석하는 게 더 타당할 것 같다.

TD

TD는 전체적으로 가장 교과서적인 양상을 보였다고 생각한다.

TD 학습 횟수별 결과 변화

TD - 보드 내 최고 숫자 비율
TD - 최고 점수 5분위

최고 숫자 비율을 보면 초기부터 빠르고 꾸준히 성장하였으나, 50만 회 학습 결과와 100만 회 학습 결과가 비슷한 것으로 보아 빠른 만큼 일찍 수렴한 것으로 보인다. 강화학습도 과적합이 있는지는 잘 모르겠고, 학습 데이터를 전혀 재활용하지 않았으니 과적합이 되었는지는 잘 모르겠다. 일단 성능이 떨어지는 모습은 보이지 않았으므로 수렴했다는 것만 알 수 있겠다.

5분위의 경우 처음부터 끝까지 최댓값과 최솟값은 비슷하다. 50%, 75% 분위의 점수가 1만 회 학습에서 10만 회 학습으로 넘어갈 때 올라가는 것이 보이나, 그러한 성장세를 이후까지 유지하지는 못했다. 최고 숫자 비율이 50만 회 학습까지는 계속해서 성장세를 보였다는 점, 2048 게임의 특성상 큰 숫자가 나오는 것이 총점에도 크게 영향을 준다는 점을 고려하면 최고 점수의 경우 최고 숫자가 정해진 순간 범위가 어느 정도 한정된다고 생각해볼 수 있다. 이 경우 50% 분위 점수의 상승은 동일한 최고 숫자의 보드에서 최고 점수의 성장이 아니라, 더 높은 최고 숫자의 비율 자체가 증가했다는 의미로 볼 수 있다.

요약하자면, 최고 수준과 최저 수준은 학습을 시작하는 순간 정해져서 크게 달라지지 않고, 학습을 지속할수록 해당 범위 내에서 결과의 질이 전체적으로 개선되었다는 말이다. 다른 에이전트에서는 학습의 변화가 TD만큼 잘 보이지는 않았지만 경향은 비슷할 것으로 예상된다.

SARSA

SARSA는 사실 좀 뒷전이었다고 할까, TD가 워낙 눈에 띄었고 50만 회 학습까지는 Q도 마찬가지라서 마지막까지 무능할 거라고는 예상하지 못했다.

SARSA 학습 횟수별 결과 변화

SARSA - 보드 내 최고 숫자 비율
SARSA - 최고 점수 5분위

TD와는 다르게(그리고 앞으로 볼 Q와도 다르게) 최고 숫자 비율은 처음부터 끝까지 거의 변하지 않았으면서 최고 점수만 오락가락했다. 학습 수가 많아진다고 오르기만 하는 것도 아니고 100만, 10만, 1만, 50만 회 학습 순서로 골고루 섞인 순위를 보인다.

이로부터 2가지 문제를 예상해볼 수 있다. 첫째는 100만 회 학습마저도 SARSA에게는 부족했다는 것, 둘째는 애초부터 SARSA 에이전트의 코드가 잘못 작성되었다는 것. 우선 프로젝트를 진행하는 중에는 저렇게 그래프를 그려보지 않아서(내 실책임. 생각을 못했음) 테스트 결과가 수렴하거나 한쪽 방향으로 향하지 못하고 진동하고 있다는 걸 알지 못했다. 또한 100만 회 학습은 프로젝트 마감 직전에 고민하다가 ‘진짜 마지막이다’ 하고 실행했던 거라, 당시 최고 학습 수였던 50만 회의 결과까지 봐서는 Q도 비슷한 문제를 보이니 학습 수의 부족을 의심하는 게 편했다. 왜냐하면, 만약 코드가 잘못되었을 경우 이미 작성해서 며칠동안 돌리던 코드를 다시 면밀하게 훑어야 하고, 고칠 부분을 찾았다면 처음부터 50만 회까지 아예 다시 학습시켜야 했는데, 이게 너무 손실이 큰 일이라 가능하면 시도하고 싶지 않았다. 그러니 학습이 부족했다는 문제는 내 희망사항에 가까웠지만, 아무래도 코드가 잘못 쓰였을 가능성이 훨씬 높은 것 같다.

이 프로젝트에 사용한 모든 코드는 ChatGPT가 생성해준 것으로부터 비롯했으므로 문제를 찾으려면 내가 직접 찾는 게 나을 거라고 본다. GPT는 거짓말을 너무 잘해서 문제다.

Q-learning

내가 보기에 TD나 SARSA나 Q나 비슷한 모델 같은데, 결과는 무엇 하나 같은 게 없더라.

Q-learning 학습 횟수별 결과 변화

Q-learning - 보드 내 최고 숫자 비율
Q-learning - 최고 점수 5분위

최고 숫자 비율을 보면 10만 회 학습까지는 별 의미를 보이지 않다가 50만 회 학습부터 급성장해 100만 회 학습까지 유지되는 성장세를 보였다. 최고 점수 5분위 그래프도 비슷한 흐름을 보인다.

처음부터 한계가 정해졌던 TD와 달리 전체적인 성장과 함께 최고 점수도 성장하는 결과를 보였다. 50만 회 학습에서 100만 회로 넘어갈 때 성장의 폭은 줄었더라도 성장하지 않은 것은 아니었으므로 학습 수를 늘리면 더 높은 성능을 보이리라 기대할 수 있다. 다만 Q의 성장세가 좋다고 한들 아직 TD보다 월등한 수준은 아니다. 그러니 아주 높지 않더라도 빠른 학습이 필요하고 전체적인 답안의 질보다 가장 잘한 것 하나만 필요한 경우라면 TD를 쓰는 게 낫고, 그 반대라면 Q를 쓰는 게 낫다고 볼 수 있겠다.

결과 분석

  • TD가 가치 계산에 행동을 고려하지 않긴 하지만, 이 문제는 취할 수 있는 행동이 4가지로 적었고, 각 행동에 따른 다음 상태의 시뮬레이션이 용이하였기 때문에 생각만큼 성능이 떨어지지 않았던 것으로 짐작된다.
  • Q가 10만 회 학습까지는 별다른 발전을 보이지 못했지만 50만 회 학습에서 성장하기 시작한 모습을 보건대, 문제 상황과 에이전트에 따라 어느 정도 유의미한 결과를 내기 위해 필요한 최소한의 학습량이 달라짐을 알 수 있다. 이번 문제 상황에서는 Q가 TD보다 많은 학습 횟수를 필요로 했던 것이라고 판단했다.
  • SARSA의 경우 100만 회를 학습해도 유의미한 결과를 보이지 못했다. 이 문제에 대한 원인은 2가지를 추측해볼 수 있다.
    1. 학습이 부족했다: 가장 단순하고, 확인하는 것도 단순한 원인이다. 부족한 것은 시간과 컴퓨팅 자원이었다.
    2. 에이전트 자체가 잘못 코딩되었다: 프로젝트를 진행할 당시에는 미처 확인하지 못하고 학습 부족 문제를 먼저 확인하고자 시도하였으나, 이 프로젝트에서 사용한 모델이 모두 ChatGPT로부터 생성된 코드를 이용하였으므로 충분히 가능성이 있는 원인이다. 이 문제는 발표 당시에도 ‘ChatGPT가 특정 모델의 코드를 잘못되게 생성하는 문제가 있다’며 지적받은 바 있다.

문제 및 논의점

  • 모든 모델에서 공통적으로, 가치 공간이 너무 커서 모델의 학습이 불완전하다는 문제가 있었다. 50만 회를 학습한 TD의 가치 공간의 크기가 198만 6천 정도 되었다. 이는 학습량을 늘림으로써 해결할 수 있고, 학습량을 늘릴 수 없는 상황이라면 다른 대안이 필요하다.
    • 2048 게임의 경우 큰 숫자는 한 쪽에 몰아놓고 작은 숫자를 차곡차곡 쌓아올려 큰 숫자를 더 커지게 만드는 것이 일반적인 공략이다. 에이전트가 이 공략을 학습할 수 있도록 하기 위해 CNN을 이용한 특징점 추출 후 이를 입력으로 사용하는 것을 고려해 보았으나, 적용 방법을 찾지 못해 포기했었다.
    • 지금 생각해보니, 보드의 상태와 함께 참고자료로서 특징점 추출 결과를 제공했다면 판단에 도움이 될 수 있었을 것 같고, 이에 맞는 ‘상태’ 정의는 더 고민이 필요할 것 같다.
  • TD 모델의 경우 보드에 무효한 이동을 시도하여 무한 루프에 빠지는 문제가 발견되었다.
    • TD가 사전에 학습된 가치를 이용해 행동하는 것은 다른 모델과 같으나, 그 상태 각각에 적합한 행동이 무엇인지는 알기 어렵고, 어떠한 행동을 취했을 때 이전의 상태와 동일한 상태가 되는 것이 ‘나쁜’ 것이라는 걸 내부적으로 판단할 수 없었기 때문에 발생한 문제라고 본다.
    • 프로젝트 진행 당시에는 임시방편으로 TD가 가치가 너무 낮은 행동을 선택할 경우 그 선택을 무시하고 랜덤한 선택을 하도록 하여 무한 루프에 빠지는 것만 피했다.
  • 본 프로젝트에서 이용한 2048 게임의 시스템 상, 같은 상태에서 같은 행동을 시도하더라도 매번 다음 상태가 달라지는 특징이 있다. 이 점이 모델의 가치 계산과 행동 선택에 뭔가 영향을 주지는 않았을까? 학습 중 가치 계산의 경우 이미 발생한 일을 기반으로 하기 때문에 그 영향이 적었으리라 짐작하지만, 에이전트가 행동을 선택할 때에는 선택 과정에서 확인한 미래와 실제로 발생하는 미래가 다르다. 이 점이 에이전트의 학습에 방해되었으리라 예상이 된다.

개선점

  • 모델의 성능을 판별할 척도가 부족했다: random 모델과 비교하긴 하였으나, 수치적 비교에 이르지 못하고 그래프를 이용한 육안 비교에 머물렀다.
  • 학습의 수를 더 늘리고 에이전트도 다양화하면 새롭게 보이는 것이 더 있을 것이다.
  • 학습 도중의 데이터를 저장하지 않아 정확히 어느 시점에서 모델이 발전하는지 확인하기 어렵다: 딥러닝처럼 학습과 테스트를 번갈아가며 진행하거나, 학습 데이터를 시간순으로 저장해 확인할 수 있다.
  • 리워드 설정에 대한 고려가 부족했다. 숫자가 합쳐지면 무조건 그 숫자만큼 리워드를 부여하고, 숫자가 합쳐지는 것과 동시에 게임이 끝나더라도 그 방침은 동일하다. 그러므로 모델의 입장에서는 게임을 오래 지속하기 위해 작은 숫자를 합쳐, 또다른 작은 숫자를 합칠 수 있는 자리를 내는 것보다 지금 당장 큰 숫자를 합쳐 더 큰 점수를 얻고 게임을 종료하는 것이 이득이라고 판단할 수 있다. 그러므로 에이전트가 부적절한 방향으로 그리디하게 학습했을 가능성이 있다.
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.