메인 콘텐츠로 건너뛰기

비계에서 초인까지: 커리큘럼 학습이 2048·테트리스를 깨는 법

2048이랑 테트리스, 우리에겐 “시간 순삭” 퍼즐 게임이죠. 그런데 이걸 사람도 아닌 인공지능이, 그것도 인간을 훨씬 뛰어넘는 수준으로 푼다면 어떤 마법이 필요할까요?

이 글에서는 강화 학습과 커리큘럼 학습, 그리고 PufferLib 같은 툴킷이 어떻게 평범한 에이전트를 “초인 AI 게이머”로 키워냈는지 이야기합니다. 2048과 테트리스라는 친숙한 게임을 통해, 최신 강화 학습 연구의 핵심 아이디어를 재미있게 풀어볼게요.

마지막에는 “이걸 내 컴퓨터로 직접 돌려보고 싶다”는 분들을 위한 현실적인 조언도 정리했습니다.


커리큘럼 학습이란? AI도 ‘쉬운 문제부터’가 먹힌다

강화 학습은 한마디로 “시도하고, 보상 받고, 다시 시도하며 배우는” 방식입니다. 에이전트(Agent)가 환경(Environment) 안에서 행동(Action)을 하면, 환경이 상태(State)와 보상(Reward)으로 응답하고, 에이전트는 그 경험을 바탕으로 더 높은 보상을 얻는 방향으로 전략(정책, Policy)을 업데이트합니다.1

문제는 현실적인 환경이 너무 복잡하다는 점입니다. 아무런 가이드 없이 완전한 난이도의 게임에 던져놓으면, 에이전트는 의미 있는 보상을 거의 받지 못합니다. 일종의 “무의미한 삽질”이 계속되는 셈이죠. 이것을 샘플 비효율성, 탐색의 어려움 같은 강화 학습의 대표적인 한계로 많이 언급합니다.2

여기서 등장하는 개념이 커리큘럼 학습입니다. 이름 그대로, 인간이 공부하듯 쉬운 문제에서 어려운 문제로 난이도를 단계적으로 올려주는 전략입니다.

커리큘럼 학습의 핵심은 단순합니다.

  1. 처음엔 단순하고 쉬운 상태·과제를 많이 보여준다.

  2. 에이전트가 어느 정도 잘하게 되면, 더 복잡하고 까다로운 상황을 노출한다.

  3. 이렇게 단계적으로 범위를 넓혀가면서, 전체 난이도가 높은 환경도 다룰 수 있게 만든다.

이 방식의 묘미는 “에이전트가 스스로 거의 못 찾아가는 중요한 상태를, 의도적으로 경험하게 만든다”는 데 있습니다. 그 결과, 같은 모델이라도 커리큘럼 유무에 따라 성능 차이가 극단적으로 갈립니다. 이번 2048·테트리스 사례가 그 대표적인 증거입니다.


2048: 테라바이트 테이블 대신 15MB 정책으로 이긴 비결

2048 게임을 살짝 복습해볼까요. 4×4 보드 위에서 숫자 타일이 슬라이드되고, 같은 숫자가 만나면 합쳐집니다. 목표는 2048 타일을 만드는 것. 사람이 해도 꽤 전략이 필요한 게임입니다.3

예전에는 이 게임을 풀기 위해 엄청난 편법(?)이 쓰였습니다. 바로, “엔드게임 테이블”입니다.
가능한 끝부분 상태와 거기서의 최적 행동을 전부 미리 계산해 저장해 둔 데이터베이스죠. 이 테이블을 몇 테라바이트 단위로 만들어두고, 게임 후반에는 그냥 이걸 조회해서 두뇌 대신 쓰는 방식입니다.

하지만 이런 방식은 두 가지 문제가 있습니다.

  1. 저장공간이 말도 안 되게 크고

  2. 새로운 규칙이나 변형 게임에 잘 일반화되지 않습니다.

이번 연구에서 인상적인 포인트는, 겨우 15MB짜리 정책(policy) 모델 하나로 이 엔드게임 테이블 기반 접근보다 더 높은 성공률을 냈다는 점입니다.
몇 테라바이트 vs 15MB. 비약적으로 효율적이죠.

여기서 커리큘럼 학습은 어떻게 쓰였을까요?

2048의 후반부는 난이도가 급격히 올라가고, “한 수 잘못 두면 그대로 게임오버” 같은 미묘한 상황이 많습니다. 에이전트가 무작정 처음부터 끝까지 게임을 돌리면서 이 중요한 엔드게임 상황을 충분히 경험하긴 어렵습니다. 거기까지 가기도 쉽지 않고, 가도 금방 죽어버리니까요.

그래서 연구진은 중요도가 높은 상태들을 선택해, 커리큘럼 형태로 에이전트에게 집중적으로 노출했습니다.
말하자면, “게임 후반부만 따로 잘라서 반복 연습 시킨다”는 느낌에 가깝습니다.

그 결과, 에이전트는
“초반은 조금 대충 해도, 후반부만 제대로 해도 이긴다” 수준을 넘어
“초반부터 후반까지 전체를 고려한 전략”을 스스로 만들어낼 수 있게 됐습니다. 테이블을 통째로 들고 다니지 않고, 15MB 모델 파라미터 안에 정책을 압축해 넣은 셈입니다.


테트리스: 버그가 만든 우연한 커리큘럼, 그리고 초인적 내구성

테트리스는 2048보다 훨씬 복잡합니다. 상태 공간도 크고, 게임이 길어질수록 작은 실수가 눈덩이처럼 불어나죠. 그러니 강화 학습으로 풀기가 더 까다롭습니다.

이 프로젝트에서 흥미로운 사건이 하나 벌어졌습니다.
학습 코드에 있던 버그가, 결과적으로 “커리큘럼 학습을 구현하는 역할”을 해버린 겁니다.

버그의 효과를 간단히 표현하면 이렇습니다.

  • 에이전트가 학습 초기에부터, 매우 혼란스럽고 어려운 게임 상태를 자주 마주하게 됐습니다.

  • 예를 들면, 이미 블록이 엉망으로 쌓여서 한 수만 잘못 둬도 죽는 상황들 말이죠.

원래 계획대로라면, 에이전트는 초반에는 비교적 깨끗한 상태에서 무난한 플레이를 배우고, 후반의 위기 상황은 나중에 천천히 접했을지도 모릅니다.
그런데 버그 덕분에, “게임의 최악의 순간들”을 강제로 반복해서 경험하게 된 겁니다.

아이러니하게도, 이것이 엄청난 내구성을 만들어냈습니다.

에이전트는
“정상적인 상황”에서 잘하는 것뿐 아니라,
“이미 판이 꼬여버린 지옥 상태”에서도 어느 정도 회복해내는 법을 배웠습니다.

결국 이 버그는 일종의 극단적인 커리큘럼 역할을 하며, 난이도가 높은 상태를 학습 초반부터 노출하는 실험적 장치가 된 셈입니다. 이후 연구진은 이 현상을 의도적으로 재현해 보며, 중요한 상태를 찍어 보여주는 커리큘럼의 힘을 다시 확인했습니다.

교훈은 명확합니다.
에이전트가 절대 스스로 도달하지 못할 법한 까다로운 상황을, 시스템이 강제로 보여주면 “초인적인 회복력”이 생긴다는 것.
즉, 커리큘럼 설계만 잘해도 같은 신경망이 완전히 다른 수준의 플레이를 보여줄 수 있습니다.


PufferLib와 빠른 시뮬레이션: 데스크탑 한 대로 초인 만들기

여기까지 읽으면 이런 생각이 들 수 있습니다.

“좋은 말인데, 이런 거 돌리려면 구글 데이터센터가 있어야 하는 거 아니야?”

생각보다 아닙니다.

이 프로젝트의 또 다른 주인공이 바로 PufferLib입니다.
PufferLib은 강화 학습을 위한 고속 C 기반 환경과 벡터화된 환경 인터페이스를 제공하는 라이브러리입니다. 여기에 LSTM 같은 순환 신경망 구조나 Muon, Protein 같은 고급 기능도 덧붙여, 게임처럼 시계열 의존성이 강한 문제를 효율적으로 다룰 수 있게 해 줍니다.

핵심 포인트를 정리해 보면 이렇습니다.

첫째, 환경이 빠르다
강화 학습의 병목은 종종 “모델 계산”이 아니라 “환경 시뮬레이션”입니다.
PufferLib은 C로 구현된 고속 환경과 벡터화 덕분에, 한 번에 수많은 에피소드를 병렬로 돌려 데이터를 뽑아냅니다. 그 결과, 같은 시간에 훨씬 많은 경험을 쌓을 수 있습니다.

둘째, 시스템적 탐색이 가능하다
강화 학습에서 하이퍼파라미터(학습률, 감가율, KL 계수 등)를 잘 만지면 성능이 두 배 이상 뛰는 경우가 드물지 않습니다.4
빠른 시뮬레이션 환경이 있으면 여러 설정을 동시에, 체계적으로 시도해볼 수 있습니다.
“어디선가 잘 됐다길래 남이 쓴 설정 그대로 복붙”이 아니라, 내 환경에서 진짜 잘 맞는 조합을 찾을 수 있는 거죠.

셋째, 장비 요구가 생각보다 낮다
연구진의 메시지는 의외로 현실적입니다.
게이밍 데스크탑 한 대만 있어도 꽤 많은 걸 할 수 있다는 것.
물론 초대형 LLM을 수십억 스텝 돌리겠다면 얘기가 다르지만, 2048·테트리스 수준의 환경은 적당한 GPU 한 장으로도 의미 있는 결과를 얻을 수 있습니다.5

PufferLib을 쓰면, 누구나 자신의 PC에서 강화 학습 에이전트를 직접 훈련시키고, 2048과 테트리스 위에서 “내가 키운 초인 에이전트”의 플레이를 바로 확인해볼 수 있습니다.

연구용으로도, 취미 프로젝트로도 꽤 매력적인 조합입니다.


네트워크 키우기보다 중요한 것: ‘학습 가능한 경험’을 설계하라

딥러닝 붐 이후, 우리가 너무 자주 쓰는 해결책이 하나 있습니다.
“모델이 안 되면 더 크게 키워라.”

파라미터 수를 늘리면 분명 모델의 표현력이 커지고, 많은 문제에서는 효과가 있습니다.6 그런데 강화 학습, 특히 2048·테트리스 같은 환경에서는 이것만으로는 한계가 분명히 드러납니다.

이 프로젝트가 보여주는 메시지는 단순하지만 강력합니다.

“에이전트가 어떤 경험을 얼마나, 어떤 순서로 하느냐가
네트워크를 얼마나 크게 키우느냐보다 중요하다.”

2048의 엔드게임처럼,
테트리스의 위기 상황처럼,
에이전트가 평범한 탐험으로는 거의 접하기 힘든 상태들을 커리큘럼으로 던져주면, 같은 모델이 전혀 다른 전략을 만들어냅니다.

반대로, 아무리 거대한 네트워크여도

  • 중요한 상태를 거의 경험하지 못하거나

  • 보상 설계가 엉뚱하거나

  • 환경이 너무 느려서 충분한 샘플을 못 모으면

결국 “머리만 크고 경험은 없는” 모델이 됩니다.

이번 연구는 빠른 시뮬레이션, 잘 설계된 커리큘럼, 체계적인 하이퍼파라미터 탐색이 합쳐지면, 비교적 작은 정책 모델로도 슈퍼휴먼 수준의 성능을 만들 수 있다는 걸 보여줍니다.
2048에서 테라바이트 엔드게임 테이블을 15MB 정책으로 대체한 사례가 그 상징적인 결과죠.


시사점: 내 컴퓨터에서 커리큘럼 강화 학습 시작해보기

이제 “그래서 이걸 내 프로젝트에 어떻게 써먹지?”라는 질문으로 마무리해 볼게요. 2048·테트리스 사례에서 얻을 수 있는 실전 인사이트를 정리하면 다음과 같습니다.

첫째, 문제를 난이도 단계로 쪼개 보세요
이미 하고 있는 게임 AI, 로봇 시뮬레이션, 추천 시스템 등 어떤 문제든 “쉬운 버전 → 어려운 버전”으로 나눌 수 있는지 고민해 보세요.
예를 들어:

  • 짧은 에피소드 → 긴 에피소드

  • 노이즈 없는 상태 → 센서 노이즈 추가

  • 제한된 액션 → 풀 액션 공간

둘째, 중요한 상태를 인위적으로 많이 보여주세요
일반적인 플레이로는 잘 나오지 않는, 하지만 매우 중요한 상태들을 따로 샘플링해서 학습에 자주 섞어 넣으세요. 2048 엔드게임, 테트리스 지옥판처럼 말이죠. 이게 커리큘럼의 핵심입니다.

셋째, 환경 속도를 먼저 높이세요
모델 구조를 고민하기 전에, 환경이 초당 몇 스텝이나 돌아가는지를 확인해 보세요.
PufferLib처럼 C 기반·벡터화 환경을 쓰거나, 파이썬 루프를 최소화하는 것만으로도 학습 효율이 크게 올라갑니다. 빠른 환경은 곧, 많은 실험과 튜닝을 가능하게 합니다.

넷째, 하이퍼파라미터를 “생각보다 공격적으로” 바꿔보세요
논문 설정에만 집착하지 말고, 학습률, 배치 크기, 할인율, exploration 계수 등을 체계적으로 스윕해 보세요.
실제로 이런 튜닝 하나만으로 성능이 두 배로 뛰는 경우도 흔합니다.4

다섯째, 버그도 때론 힌트가 된다
테트리스 실험처럼, 우연히 성능이 올라간 버그는 “환경 설계의 새로운 아이디어”일 수 있습니다.
물론 버그는 고쳐야 하지만, 그 버그가 어떤 분포의 상태·보상을 만들어냈는지 살펴보면, 새로운 커리큘럼 전략을 얻을 수도 있습니다.

마지막으로, “게이밍 데스크탑 한 대”로도 시작할 수 있다는 점을 기억해 두세요.
2048이나 테트리스 같은 환경은, 요즘 기준의 소비자용 GPU로도 충분히 실험이 가능합니다. PufferLib을 이용해 직접 에이전트를 학습시키고,
“내가 설계한 커리큘럼 vs 그냥 학습”을 비교해 보는 것만으로도 많은 걸 배울 수 있을 겁니다.

비계에서 초인까지.
강화 학습 에이전트에게도, 결국 중요한 건 “어떤 경험을 어떤 순서로 쌓아주는가”입니다.
2048과 테트리스를 푼 이 사례는, 앞으로 우리가 더 복잡한 현실 문제에 AI를 적용할 때도 강력한 힌트를 줄 것입니다.


참고

1Reinforcement learning

2Reinforcement Learning: An Overview

32048 (video game)

4Gunner: playing FPS game Doom with scalable deep reinforcement learning

5Tuning Large Language Models with Reinforcement Learning on a Single GPU

6Deep learning

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.