algos/ 폴더의 단일 파일 스크립트를 그대로 돌려보며 확인할 수 있다. 각 스크립트는 유명한 CleanRL 스타일(파일 하나에 알고리즘 전체)을 따른다. 이 문서는 소스를 직접 클론해 "이 저장소에서 강화학습을 어떻게 배울 수 있는가"를 파고든다.
(저장소: alxndrTL/little-book-rl · Python/PyTorch · 알고리즘 6종 구현 + 책 PDF 154쪽 · CC BY-SA 4.0(비상업) · 저자 Alexandre Torres-Leguet · 별 1,123 · 포크 54 · 생성 2026-05-05 · 최신 커밋 2026-07-14 · TrendShift Daily #8)
little-book-rl은 "짧은 강화학습 책 1권 + 그 책에 나오는 알고리즘의 PyTorch 참조 구현 6종 + 동적계획법 증명 부록"이 전부인, 학습 전용 저장소다. 코드베이스가 아니라 교재(courseware)에 가깝다.
책(book.pdf)은 "왜 이렇게 익히는가"를 설명하고, algos/ 폴더의 스크립트는 "그래서 실제로 이렇게 돌아간다"를 보여준다. 이론서는 많고 실행 코드도 많지만, 둘을 같은 저자가 같은 표기법으로 짝지어 놓은 것이 이 저장소의 값어치다.
구체적으로 저장소에는 세 덩어리가 들어 있다.
| 구성물 | 정체 | 분량 |
|---|---|---|
| book.pdf | 강화학습 입문서 본문 (V1, 2026년 6월) | 154쪽 |
| algos/ | 알고리즘 6종 PyTorch/NumPy 구현 (단일 파일 스크립트) | 약 1,728줄 |
| supplementary/ | 동적계획법(DP) 알고리즘의 상세 증명 문서 (저자가 2021년에 씀) | PDF 별첨 |
구현된 알고리즘 6종은 강화학습을 배우는 표준적인 순서를 그대로 따른다: tabular(표 기반: MC·SARSA·Q-러닝·n-step SARSA·SARSA(λ)) → DQN(딥 Q-네트워크) → SPG(단순 정책 경사) → REINFORCE → VPG(바닐라 정책 경사) → PPO. 즉 "값을 배우는 방법"에서 시작해 "정책을 직접 배우는 방법"으로 넘어가는 두 개의 큰 갈래를 모두 담았다.
강화학습 자료는 세상에 넘친다. 그런데도 이 저장소가 TrendShift Daily 상위권(#8)에 오른 데에는 뚜렷한 이유가 있다.
강화학습 입문의 사실상 표준인 Sutton & Barto의 『Reinforcement Learning: An Introduction』은 500쪽이 넘는다. 정확하지만 처음 보는 사람에게는 완주 자체가 벽이다. little-book-rl은 154쪽으로 "MC부터 PPO까지"의 큰 지도를 먼저 손에 쥐여주는 것을 노린다. 세부를 다 담기보다, 전체 지형을 빠르게 훑고 나서 두꺼운 책으로 넘어가게 하는 진입로 역할이다.
두꺼운 정식 교과서가 1:25,000 등산 지도라면, 이 책은 등산로 입구의 안내판이다. 안내판만으로 정상에 오를 수는 없지만, "어느 봉우리가 어디에 있고 어떤 순서로 올라야 하는지"를 5분 만에 파악하게 해준다. 그 다음 상세 지도를 펴면 훨씬 덜 헤맨다.
많은 사람이 강화학습에서 막히는 지점은 "수식은 봤는데 코드로 어떻게 옮기는지 모르겠다"이다. 이 저장소는 각 스크립트 맨 위 주석에 "책에는 없지만 코드에는 넣은 실전 디테일"을 명시한다. 예를 들어 REINFORCE 코드 상단에는 "책과 달리 (1) 정책망 가중치 특수 초기화, (2) 병렬 벡터 환경, (3) 경사하강 대신 Adam 옵티마이저를 썼다"고 적혀 있다. "교과서 버전"과 "돌아가는 버전"의 간극을 저자가 대신 메워 준 것이다.
DQN·PPO 구현은 아예 유명한 오픈소스 CleanRL(vwxyzjn/cleanrl)의 코드를 "완결성을 위해" 그대로 가져왔다고 밝힌다. CleanRL은 "알고리즘 하나 = 파일 하나, 숨은 추상화 없음"을 원칙으로 하는 강화학습 교육용 레포의 사실상 표준이다. TensorBoard·Weights & Biases 로깅, tyro 기반 CLI 인자, 재현용 시드 고정 같은 관행을 그대로 물려받아, 초보자가 "실제 연구자들이 쓰는 실험 코드"의 생김새를 익히게 한다.
저자 Alexandre Torres-Leguet(GitHub alxndrTL, X @AlexandreTL2)는 프랑스 École Centrale Lille 소속으로, ML 논문을 해설·재현하는 유튜브 채널(구독 7천+·영상 70편+)과 인기 오픈소스 mamba.py로 이미 알려진 인물이다. "설명을 잘하는 사람이 쓴 입문서"라는 기대가 초기 확산을 밀어 올렸고, Hacker News·X에서 화제가 되며 며칠 만에 별이 1천 개를 넘었다.
이 레포에는 라이브러리·프레임워크·설치형 패키지가 없다. 별점을 "소프트웨어 인기"로 오해하면 안 된다. 핵심 산출물은 PDF 책이고, 코드는 그 보조 자료(supplementary)다. 심지어 책 자체는 종이책으로 아마존에서 판매되며(유료), 저장소의 PDF는 저자가 무료로 공개한 판본이다.
스택은 의도적으로 단순하다. "학습용"이라는 목적에 맞게, 요즘 파이썬 강화학습 실험에서 가장 널리 쓰는 최소 세트만 골랐다.
| 도구 | 역할 | 왜 이걸 쓰나 |
|---|---|---|
| PyTorch | 신경망(정책망·가치망) 정의와 자동 미분 | 딥러닝 계열(DQN 이후)의 파라미터 학습 전부를 담당. torch.nn·torch.optim.Adam·Categorical 분포. |
| Gymnasium | 학습 환경(게임·시뮬레이션) 표준 인터페이스 | OpenAI Gym의 후계. env.reset()·env.step(a)라는 통일된 규약으로 CartPole·FrozenLake 등을 제공. |
| NumPy | 표(tabular) 알고리즘의 Q-테이블·행렬 연산 | 딥러닝이 필요 없는 tabular.py는 PyTorch 없이 순수 NumPy 배열 Q[s,a]로 구현. |
| tyro | 명령줄 인자(CLI) 자동 생성 | @dataclass Args를 그대로 --learning-rate 0.1 같은 CLI 플래그로 노출. 실험 파라미터 조정을 코드 수정 없이. |
| TensorBoard | 학습 곡선 실시간 시각화 | SummaryWriter로 에피소드 보상·손실·엡실론을 기록 → 브라우저에서 그래프로 확인. |
| Weights & Biases (선택) | 클라우드 실험 추적 | --track 플래그를 켜면 W&B로도 동기화. 기본은 꺼져 있음. |
reset()으로 시작하고 step(행동)으로 (다음 상태, 보상, 종료 여부)를 돌려준다. 이 통일된 인터페이스 덕분에 알고리즘 코드를 환경과 무관하게 재사용할 수 있다.코드가 기본으로 쓰는 환경은 강화학습 교육의 "Hello World" 두 개다.
DQN은 from cleanrl_utils.buffers import ReplayBuffer로 경험 재현 버퍼(replay buffer)를 가져온다. 즉 이 저장소만 클론해서는 DQN이 바로 안 돌고, CleanRL 유틸을 함께 설치해야 한다(뒤 7장 참고). 이는 "이미 검증된 부품은 다시 짜지 않는다"는 교육적 선택이다.
각 스크립트는 import·하이퍼파라미터·환경 생성·학습 루프·평가·로깅까지 파일 하나에 처음부터 끝까지 담겨 있다. 클래스 상속이나 숨은 추상화가 없어서, 위에서 아래로 한 번 읽으면 알고리즘 전체가 머리에 들어온다. 규모가 큰 프로덕션 코드와는 정반대의, 그러나 배우기엔 최고인 설계다.
이 저장소의 "아키텍처"는 소프트웨어 구조가 아니라 알고리즘들이 쌓이는 개념의 사다리다. 이걸 이해하면 강화학습 입문의 절반은 끝난 것이다.
구현이 6개든 60개든, 강화학습은 전부 아래 한 개의 순환 위에서 돈다.
강화학습 알고리즘은 크게 두 진영으로 갈린다. 이 저장소의 algos/ 폴더가 value_based/와 policy_based/로 나뉜 이유가 바로 이것이다.
tabular.py는 상태·행동이 적어서 Q값을 그냥 표(2차원 배열 Q[s,a])에 적어둘 수 있을 때의 방법 5종을 한 파일에 담았다. 여기서 강화학습의 가장 근본 아이디어인 시간차 학습(TD)과 부트스트래핑을 배운다. Q-러닝의 심장은 딱 한 줄이다:
# Q-러닝 갱신 (tabular.py) — "예측을 실제로 조금씩 끌어당긴다"
bootstrap = 0.0 if term else float(np.max(Q[s_next]))
Q[s, a] += args.learning_rate * (r + args.gamma * bootstrap - Q[s, a])
# └── 목표(target) ──┘ └현재추정┘
# 새 추정 = 현재 추정 + 학습률 × (더 나은 목표 - 현재 추정)
np.max(Q[s_next])가 그 "빌려온 미래 예측"이다. 몬테카를로(MC)가 에피소드가 끝나야 배우는 것과 달리, TD는 매 걸음 배울 수 있어 훨씬 빠르다.같은 파일 안에서 SARSA(실제 한 행동으로 배움=on-policy), n-step SARSA(한 걸음 대신 n걸음 뒤를 봄), SARSA(λ)(적격 흔적, eligibility trace로 여러 걸음을 한꺼번에)로 확장하며 "얼마나 멀리 내다볼까"라는 축을 실험한다. 그 다음 dqn.py에서 표가 너무 커지면(연속 상태) Q표를 신경망으로 바꾼다. 이때 딥 강화학습의 두 안정화 장치가 등장한다.
# DQN 핵심 (dqn.py)
# ① 타깃 네트워크: 목표값 계산엔 "천천히 따라오는 복제망"을 씀
target_max, _ = target_network(data.next_observations).max(dim=1)
td_target = data.rewards.flatten() + args.gamma * target_max * (1 - data.dones.flatten())
loss = F.mse_loss(td_target, old_val)
# ② 경험 재현(replay buffer): 과거 경험을 무작위로 꺼내 상관관계를 깬다
타깃 네트워크는 "움직이는 과녁을 맞추기 어려우니, 과녁을 잠시 고정해 두고 조준한 뒤 이따금 옮기는" 트릭이다. 학습 중인 신경망으로 목표까지 계산하면 과녁이 매 순간 흔들려 발산하기 쉽다. 그래서 목표 계산용 복제망을 따로 두고 target_network_frequency(기본 500스텝)마다 천천히 동기화한다.
정책 기반은 "Q값을 거치지 않고 정책 자체를 신경망으로 두고 밀어붙인다". 이 저장소는 가장 단순한 형태에서 시작해, 학습을 불안정하게 만드는 "분산(variance)"을 한 단계씩 줄여가는 아름다운 순서로 배치돼 있다.
| 순서 | 알고리즘 | 정책 경사에 무엇을 곱하나 (핵심 차이) |
|---|---|---|
| 1 | SPG (단순 정책 경사) | 에피소드 전체 보상 합 G(τ)를 그대로. 가장 단순·가장 분산 큼. |
| 2 | REINFORCE | reward-to-go(그 시점 이후의 보상만). "과거는 지금 행동 탓이 아니다"는 통찰로 분산↓. |
| 3 | VPG (바닐라 정책 경사) | 어드밴티지 A(기준선 대비 얼마나 나았나) — 가치망(critic)+GAE 도입. |
| 4 | PPO | 어드밴티지 + 클리핑(clipping)으로 "한 번에 너무 크게 바꾸지 않기". 사실상 현대 표준. |
세 갈래를 관통하는 정책 경사의 코드는 놀랍도록 짧다. SPG의 손실 계산이 대표적이다:
# SPG 손실 (spg.py) — "좋은 결과를 낸 행동의 로그 확률을 높인다"
log_probs = agent.log_prob(batch_obs, batch_actions)
loss = -(batch_G * log_probs).sum() / args.num_trajectories
# └ 보상이 크면(batch_G↑) 그 행동의 확률(log_probs)을 더 강하게 밀어올림
REINFORCE는 batch_G를 "reward-to-go"로, VPG는 아래 GAE(일반화 어드밴티지 추정)로 바꾼다. 이 한 줄만 갈아끼우며 분산을 줄여가는 게 정책 경사 계단의 전부다.
# GAE (vpg.py) — 어드밴티지를 뒤에서 앞으로 굴려 계산
for t in reversed(range(T)):
next_value = values[t + 1] if t + 1 < T else 0.0 # V(종료상태)=0
delta = rewards[t] + gamma * next_value - values[t]
advantages[t] = last_gae = delta + gamma * lam * last_gae
구조가 곧 커리큘럼이다. 폴더 2개(값 기반/정책 기반) × 파일들이 그대로 책의 목차 순서를 반영한다. 특이점 몇 가지:
--algo q_learning처럼 CLI로 골라 돌린다. 표 기반 방법들은 뼈대가 같아 한 파일로 비교하기 좋다.이 저장소에는 의존성 명세 파일이 없다. 코드를 돌리려면 PyTorch·gymnasium·tyro·tensorboard, 그리고 DQN을 위한 cleanrl_utils를 직접 설치해야 한다. "책의 부록"이라는 성격상 당연하지만, 클론하자마자 python dqn.py가 돌 거라 기대하면 ModuleNotFoundError를 만난다(7장 참고).
배울 것: 몬테카를로(에피소드 끝나야 배움) vs TD(매 걸음 배움)의 차이, on-policy(SARSA)와 off-policy(Q-러닝)의 구분, ε-그리디 탐험, n-step으로 "얼마나 멀리 볼지" 조절하기, 적격 흔적(eligibility trace). 신경망이 없어 알고리즘의 순수한 뼈대만 본다.
실습 아이디어: --algo를 mc→sarsa→q_learning으로 바꿔가며 FrozenLake 학습 곡선을 TensorBoard로 겹쳐 보기. 왜 Q-러닝이 더 공격적으로 배우는지 눈으로 확인.
배울 것: 함수 근사(function approximation)가 왜 불안정한지, 그리고 이를 잡는 두 기둥 — 경험 재현 버퍼(데이터 상관관계 깨기)와 타깃 네트워크(과녁 고정). Adam 옵티마이저, 엡실론 선형 감소 스케줄, 벡터화 환경 같은 실전 관행도 함께.
실습 아이디어: target_network_frequency를 1(=타깃망 없음)로 놓고 학습이 얼마나 흔들리는지 관찰 → 안정화 장치의 가치를 체감.
배울 것: 정책 경사 정리(policy gradient theorem)를 코드로. 전체 보상(SPG) → reward-to-go(REINFORCE) → 어드밴티지+GAE(VPG) → 클리핑(PPO)으로 이어지는 개선의 논리. 핵심 손실 계산은 매번 몇 줄만 바뀐다는 걸 직접 비교하며 확인.
실습 아이디어: 네 스크립트를 같은 CartPole·같은 시드로 돌려 학습 안정성·속도를 나란히 비교. PPO의 clip_coef를 크게 키우면 왜 성능이 무너지는지 실험.
하드웨어 요구는 매우 가볍다. 예제 환경(CartPole·FrozenLake)은 작아서 GPU 없이 노트북 CPU로도 몇 분이면 학습된다. DQN·PPO도 CUDA가 있으면 쓰지만(cuda: bool = True) 필수는 아니다.
| 항목 | 필요 |
|---|---|
| Python | 3.10+ 권장 (list[float]·Literal 타입 힌트 사용) |
| 필수 패키지 | torch, gymnasium, numpy, tyro, tensorboard |
| DQN 추가 | cleanrl_utils (경험 재현 버퍼 ReplayBuffer) |
| 선택 | wandb(클라우드 추적), moviepy(capture_video 시) |
| GPU | 불필요 (있으면 딥 계열 가속, 예제 규모에선 체감 작음) |
가장 확실한 설치·실행 순서:
# 1) 저장소 클론
git clone https://github.com/alxndrTL/little-book-rl.git
cd little-book-rl
# 2) 의존성 설치 (requirements.txt가 없으므로 수동)
pip install torch gymnasium numpy tyro tensorboard
pip install cleanrl_utils # DQN용 ReplayBuffer
# 3) 표 기반 Q-러닝부터 (GPU 불필요, 수십 초)
python algos/value_based/tabular.py --algo q_learning --env-id FrozenLake-v1
# 4) 정책 경사 계단 오르기
python algos/policy_based/ppo.py --env-id CartPole-v1
# 5) 학습 곡선 보기
tensorboard --logdir runs
cleanrl_utils는 독립 PyPI 패키지로 항상 매끄럽게 깔리지는 않는다. 막히면 CleanRL 저장소(vwxyzjn/cleanrl)에서 cleanrl_utils/buffers.py만 가져오거나, stable-baselines3의 ReplayBuffer로 대체하는 방법도 있다. tabular·spg·reinforce·vpg는 이 의존성이 없어 바로 돌아간다 — DQN을 잠시 건너뛰고 나머지부터 배워도 된다.
tabular.py를 --algo만 바꿔 mc·sarsa·q_learning·n_step_sarsa·sarsa_lambda 5종 모두 FrozenLake에서 돌리고, TensorBoard의 eval/mean_return 곡선을 한 그래프에 겹쳐라. "누가 가장 빨리, 가장 높이 배우는가"를 한 장의 표로 정리해 본다.
DQN에서 (a) 타깃 네트워크 동기화 주기를 500→1로, (b) 경험 재현 버퍼 크기를 아주 작게(예: 배치 크기만큼) 바꿔 각각 학습해 보라. 학습 곡선이 얼마나 흔들리는지 관찰하고, 왜 두 장치가 딥 강화학습의 필수 부품인지 자기 말로 설명해 본다.
spg → reinforce → vpg → ppo를 같은 시드·같은 CartPole로 각각 5회 돌려, 평균 학습 곡선과 분산(밴드)을 그려라. "SPG는 왜 이렇게 요동치고, PPO는 왜 안정적인가"를 손실에 무엇을 곱하는지(전체보상→reward-to-go→어드밴티지)의 차이로 연결해 설명한다.
PPO를 CartPole 대신 LunarLander-v3(연속적이고 더 어려운 환경)로 옮겨라. 하이퍼파라미터(학습률·num_steps·gae_lambda·clip_coef)를 조정해 착륙에 성공시켜 본다. 어떤 파라미터가 성패를 갈랐는지 기록한다.
tabular.py의 n-step SARSA에서 --n-step을 1, 4, 16, ∞(=MC와 같아짐)로 바꿔 편향-분산 트레이드오프를 실험하라. "n이 작으면 편향↑·분산↓, n이 크면 반대"라는 이론적 주장을 실제 곡선으로 뒷받침할 수 있는지 확인한다.
| 주차 | 목표 | 구체적 활동 |
|---|---|---|
| 1주차 | 표 기반 강화학습 완전 이해 | book.pdf의 MC~TD 파트 읽기 + tabular.py 5종 전부 실행·비교. 벨만 방정식·부트스트래핑·on/off-policy를 자기 말로 설명할 수 있게. |
| 2주차 | 딥 강화학습 진입 | DQN 파트 읽기 + dqn.py 정독. 경험 재현·타깃 네트워크를 손으로 그려 설명. 원논문(Mnih et al. 2015, Atari DQN) 초록 읽기. |
| 3주차 | 정책 경사 계열 마스터 | spg→reinforce→vpg→ppo를 순서대로 읽고 손실 코드 비교. GAE 논문(Schulman et al. 2016)·PPO 논문(2017) 훑기. |
| 4주차 | 두꺼운 교과서로 이관 + 응용 | Sutton & Barto 해당 장으로 넘어가 빈틈 메우기. 관심 응용(로봇 제어·게임·RLHF) 중 하나로 미니 프로젝트 착수. |
이 책의 진짜 가치는 "완주 후 다음"에 있다. 154쪽으로 지형을 익혔다면, 다음 목적지는 세 갈래다 — (1) 이론 심화: Sutton & Barto 완독, (2) 구현 심화: CleanRL·Stable-Baselines3로 더 큰 환경(Atari·MuJoCo) 다루기, (3) 최신 응용: LLM을 강화학습으로 정렬하는 RLHF·GRPO. 이 저장소의 PPO 이해가 (3)의 직접적 전제가 된다.
| 용어 | 뜻 |
|---|---|
| 정책 (Policy, π) | 상태를 보고 어떤 행동을 할지 정하는 규칙. 강화학습이 최종적으로 배우는 대상. |
| 가치/Q값 | 어떤 상태(V) 또는 (상태,행동) 쌍(Q)이 앞으로 얼마나 좋을지의 기대 누적 보상. |
| 할인율 (γ) | 미래 보상을 현재 대비 얼마나 중시할지(0~1). 1에 가까울수록 장기 시야. |
| TD / 부트스트래핑 | 에피소드 끝까지 안 가고 한 걸음 뒤 예측을 빌려 지금 예측을 고치는 학습. |
| on-policy / off-policy | 실제 행한 정책으로 배우면 on(SARSA), 다른(탐욕적) 정책 기준으로 배우면 off(Q-러닝). |
| ε-그리디 | 대부분 최선의 행동을 하되, ε 확률로 무작위 탐험. 탐험-활용 균형의 가장 단순한 방법. |
| 경험 재현 버퍼 | 과거 경험을 저장해 두고 무작위로 꺼내 학습 → 데이터 간 상관관계를 깨 안정화. |
| 타깃 네트워크 | 목표값 계산용으로 따로 둔, 천천히 갱신되는 복제 신경망. "과녁 고정" 효과. |
| 정책 경사 | 좋은 결과를 낸 행동의 확률을 높이는 방향으로 정책망 파라미터를 미는 방법. |
| 어드밴티지 / GAE | "평균 기대보다 얼마나 나았나". GAE는 이를 편향-분산 균형 있게 추정하는 기법. |
| 액터-크리틱 | 행동을 고르는 정책망(액터)+가치를 예측하는 가치망(크리틱)을 함께 쓰는 구조. |
| PPO | 어드밴티지에 클리핑을 더해 "한 번에 너무 크게 안 바꾸도록" 한 현대 표준 알고리즘. |
| CleanRL | "알고리즘 하나=파일 하나"를 원칙으로 한 교육용 강화학습 구현 모음. 이 책이 계보를 따름. |