All RL Algorithms from Scratch: 18가지 강화학습 알고리즘을 밑바닥부터 구현한 교육용 저장소

All RL Algorithms from Scratch 소개

All RL Algorithms from Scratch는 강화학습(Reinforcement Learning) 알고리즘 18가지를 파이썬으로 직접 구현해 모아 둔 교육용 저장소입니다. 저자는 이 저장소의 일차적 목표가 교육 이며, 알고리즘이 내부에서 어떻게 동작하는지 깊이 있고 직관적으로 이해하는 데 있다고 밝히고 있습니다. 본 게시물에서는 이 저장소가 다루는 알고리즘 구성과 학습 방식, 사용법을 정리합니다.

핵심은 성능 최적화된 라이브러리가 아니라는 점입니다. 저자는 속도나 고급 기능보다 가독성과 명료함을 우선했다고 못 박으며, 이 저장소를 "강화학습을 위한 인터랙티브 교과서" 로 부릅니다. 복잡한 RL 라이브러리의 추상화 없이 NumPy, Matplotlib, PyTorch 같은 기본 라이브러리만으로 알고리즘의 핵심 로직을 드러내는 것이 설계 방향입니다.

각 알고리즘은 저마다의 주피터 노트북(.ipynb) 파일로 제공되며, 단계별 설명과 구현이 함께 담겨 있습니다. 하이퍼파라미터를 바꾸거나 환경을 수정하며 결과를 눈으로 확인할 수 있도록 구성되어, RL을 처음 접하는 사람도 개념을 실험하면서 익힐 수 있습니다. 저장소에는 핵심 개념과 알고리즘을 한눈에 정리한 치트시트(cheat sheet)도 포함되어 있습니다.

All RL Algorithms from Scratch가 다루는 알고리즘

저장소는 기본 탐색 봇부터 계획 기반 방법까지 18개의 노트북을 담고 있습니다. 알고리즘은 크게 가치 기반, 정책 기반, 액터-크리틱, 계획·모델 기반의 네 계열로 나눌 수 있습니다.

  • 가치 기반(Value-Based): 벨만 방정식으로 최적 행동 가치 함수를 학습하는 Q-Learning, 실제로 취한 행동을 기준으로 갱신하는 온폴리시 방식의 SARSA와 Expected SARSA, 그리고 심층 신경망을 결합해 고차원 상태 공간을 다루는 DQN이 포함됩니다.
  • 정책 기반(Policy-Based): 에피소드 전체 리턴을 기반으로 파라미터화된 정책을 직접 최적화하는 몬테카를로 정책 경사법 REINFORCE, 한 스텝에서 정책 분포가 변하는 정도에 제약을 두는 TRPO가 있습니다.
  • 액터-크리틱(Actor-Critic): 크리틱으로 어드밴티지를 추정해 분산을 줄이는 A2C와 비동기 버전 A3C, 클리핑된 대리 목적함수로 정책 갱신을 안정화하는 PPO, 연속 행동 공간을 위한 DDPG와 최대 엔트로피 기반의 SAC가 있습니다.
  • 계획·모델 기반(Planning / Model-Based): Q-Learning에 학습된 환경 모델 기반 계획을 결합하는 Dyna-Q, 몬테카를로 롤아웃으로 탐색을 이끄는 MCTS, 세계 모델(world model)을 학습해 행동을 계획하는 PlaNet이 포함됩니다.

이 밖에도 다중 에이전트 설정으로 DDPG를 확장한 MADDPG, 협력 과제를 위한 가치 함수 분해 기반의 QMIX, 긴 과제를 하위 문제로 분해하는 계층적 액터-크리틱(HAC)까지 다룹니다.

All RL Algorithms from Scratch로 학습하기

각 노트북에는 에이전트의 행동을 이해하기 위한 시각화가 포함되어 있습니다. 에피소드 보상과 길이, 손실 함수의 학습 곡선, 상태 공간의 Q-값을 보여주는 히트맵, 각 상태에서 학습된 정책을 화살표로 나타낸 정책 그리드 등입니다. 저자는 기본 개념을 다루는 01_simple_rl.ipynb 로 시작해 Q-Learning, SARSA, REINFORCE 같은 핵심 알고리즘을 거쳐 DQN, PPO, PlaNet, 그리고 다중 에이전트 학습으로 점진적으로 나아가는 학습 순서를 제안합니다.

다만 저자는 이 저장소가 학습 목적이라는 점을 분명히 하며, HAC 같은 복잡한 노트북에는 버그나 미완성 구현, 명료함을 위한 단순화가 있을 수 있다고 안내합니다. 이 점은 코드를 참고할 때 함께 감안할 부분입니다.

All RL Algorithms from Scratch 설치 및 사용법

저장소를 클론한 뒤 가상 환경을 만들어 의존성을 설치합니다. 저자는 python -m venv 보다 빠른 대안으로 uv 사용을 안내합니다.

git clone https://github.com/fareedkhan-dev/all-rl-algorithms.git
cd all-rl-algorithms

uv venv
source .venv/bin/activate   # Windows는 .venv\Scripts\activate

uv add -r requirements.txt

이후 각 .ipynb 노트북을 열어 알고리즘별 설명과 구현을 따라가면 됩니다. 단, A3C는 주피터 노트북에서 멀티프로세싱 관련 문제가 생길 수 있어, a3c_training.py 를 터미널에서 직접 실행하도록 안내하고 있습니다.

RL 알고리즘 치트시트: 핵심 수식 한눈에 보기

저장소에 포함된 치트시트(cheatsheet.md)는 18개 알고리즘의 핵심 개념과 업데이트 식을 정리해 둔 참고 자료입니다. 노트북을 매번 열어보지 않고도 각 알고리즘의 뼈대를 확인할 수 있도록, 여기서는 핵심 수식과 한 줄 요약만 계열별로 간추립니다.

바탕이 되는 개념

강화학습 문제는 마르코프 결정 과정(Markov Decision Process, MDP) (S, A, P, R, \gamma) 로 정식화됩니다. S 는 상태 집합, A 는 행동 집합, P(s'|s,a) 는 전이 확률, R 은 보상 함수, \gamma 는 할인율(discount factor)입니다. 상태가치함수 V^\pi(s) 와 행동가치함수 Q^\pi(s,a) 는 각각 상태 s, 상태-행동 쌍 (s,a) 에서 정책 \pi 를 따랐을 때 기대되는 누적 보상이며, Q-Learning이 사용하는 벨만 최적 방정식은 다음과 같습니다.

Q^*(s, a) = \sum_{s', r} P(s', r \mid s, a) \left[r + \gamma \max_{a'} Q^*(s', a')\right]

탐험(exploration)과 활용(exploitation)의 균형은 흔히 입실론 그리디(\epsilon-greedy) 로 맞춥니다. 확률 \epsilon 로 무작위 행동을 시도(탐험)하고, 확률 1-\epsilon 로 현재까지 알려진 최선의 행동을 선택(활용)하며, \epsilon 은 학습이 진행될수록 줄어드는 것이 일반적입니다.

가치 기반 및 표 기반 방법

  • Q-Learning: 오프폴리시로 다음 상태의 최댓값을 이용해 갱신합니다. Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha[r_t + \gamma \max_{a'}Q(s_{t+1},a') - Q(s_t,a_t)]
  • SARSA: 온폴리시로, 실제로 다음에 선택한 행동 a_{t+1} 의 값을 이용해 갱신합니다. Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha[r_t + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t)]
  • Expected SARSA: 다음 행동 하나가 아니라 정책이 부여하는 확률로 가중 평균한 기댓값을 사용해 SARSA보다 분산을 줄입니다.
  • Dyna-Q: 실제 경험으로 Q-테이블을 갱신하는 동시에 환경 모델을 학습하고, 그 모델로 만든 가상 경험까지 추가로 Q-테이블 갱신에 사용해 샘플 효율을 높입니다.

정책 기반 방법

  • REINFORCE: 에피소드 전체의 할인 리턴 G_t 를 이용한 몬테카를로 정책 경사법입니다. \nabla_\theta J(\theta) \approx \sum_t G_t \nabla_\theta \log \pi(a_t|s_t;\theta)
  • TRPO: 정책 경사 업데이트에 KL 발산 제약을 걸어 한 스텝에서 정책이 지나치게 바뀌지 않는 신뢰 영역(trust region) 안에서만 갱신합니다. 켤레 기울기법과 라인 서치로 근사적으로 풉니다.

액터-크리틱 방법

  • A2C: 액터(정책)와 크리틱(가치 함수)을 동기적으로 함께 학습하며, 어드밴티지 \hat{A}_t = R_t - V(s_t) 로 REINFORCE보다 분산을 줄입니다.
  • A3C: 여러 워커가 각자 환경에서 경험을 모아 비동기적으로 전역 네트워크를 갱신하는, A2C의 병렬 버전입니다.
  • DDPG: 연속 행동 공간을 위한 오프폴리시 방법으로, 결정론적 정책(액터)과 Q-함수(크리틱)를 리플레이 버퍼 및 타깃 네트워크와 함께 학습합니다.
  • SAC: 최대 엔트로피 프레임워크 기반의 오프폴리시 방법으로, 기대 보상뿐 아니라 정책의 엔트로피 H(\pi) 까지 함께 최대화해 탐험과 안정성을 높입니다. 목적함수는 J(\pi) = \mathbb{E}[\sum \gamma^t (R_t + \alpha H(\pi(\cdot|s_t)))] 입니다.
  • PPO: TRPO의 제약 최적화를 클리핑된 대리 목적함수(surrogate objective)로 단순화합니다. L^{CLIP}(\theta) = -\mathbb{E}_t[\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)]

가치 기반 심층 학습

  • DQN: Q-Learning에 심층 신경망을 결합하고, 경험 재플레이와 타깃 네트워크로 학습을 안정화합니다. y = r + \gamma(1-d)\max_{a'}Q'(s',a';\theta^-)

다중 에이전트 강화학습(MARL)

  • MADDPG: DDPG를 다중 에이전트로 확장해, 전체 상태와 행동을 보는 중앙집중형 크리틱과 자신의 관측만 보는 분산형 액터를 둡니다. 이른바 "중앙집중 학습, 분산 실행" 방식입니다.
  • QMIX: 협력 과제를 위한 가치 기반 방법으로, 에이전트별 Q-값을 단조 증가 조건을 만족하는 혼합 네트워크로 합쳐 전역 Q_{tot} 를 만듭니다.

계층적 강화학습(HRL)

  • HAC: 상위 레벨이 하위 레벨에게 부여할 하위 목표(subgoal)를 정하고, 하위 레벨은 제한 시간 안에 그 목표를 달성하도록 학습합니다. 내재적 보상과 하인드사이트(hindsight) 재라벨링으로 희소 보상 문제를 완화합니다.

계획 및 모델 기반 방법

  • MCTS: 시뮬레이션 롤아웃으로 탐색 트리를 만들고, UCT 기준 Q(s,a) + C\sqrt{\ln N(s)/N(s,a)} 로 탐험과 활용의 균형을 맞추는 온라인 계획 알고리즘입니다.
  • PlaNet: 잠재 공간에서 동역학 모델(흔히 RSSM)을 학습한 뒤, CEM 같은 방법으로 잠재 공간 안에서 직접 계획을 수행해 행동을 선택합니다.

치트시트의 정리 팁 중 하나는, 어드밴티지나 리턴을 배치 또는 에피소드 단위로 표준화(평균을 빼고 표준편차로 나누는 것)하면 학습이 눈에 띄게 안정된다는 것입니다. 또한 오프폴리시 계열(SAC, DDPG)은 샘플 효율이 높은 대신, 온폴리시 계열(PPO, A2C)은 상대적으로 안정적이고 튜닝이 쉬운 경향이 있다고 정리합니다.

여기 실은 것은 요약이며, 각 알고리즘의 의사코드와 코드 스니펫, 하이퍼파라미터, 자주 발생하는 함정 같은 세부 내용은 원본 치트시트에서 확인할 수 있습니다.

All RL Algorithms from Scratch의 라이선스

All RL Algorithms from Scratch는 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:github: All RL Algorithms from Scratch GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

2개의 좋아요