검색
← 모듈 로드맵

Hugging Face 딥 강화학습 강좌

강의 · 입문자 · Hugging Face

원제 · Hugging Face Deep RL Course

몬테카를로 · TD · Q-러닝 · SARSA를 손계산하고 DQN의 리플레이 버퍼 · 타깃 네트워크까지 잇는 수업

먼저 알아야 할 것

MDP와 벨만 방정식할인된 반환ε-탐욕경사 하강법

다루는 내용

Hugging Face 딥 강화학습 강좌 1~3단원을 따라 경험만으로 가치를 배우는 방법을 직접 해설합니다. 몬테카를로와 TD(0) 갱신을 강좌 예제 수치로 계산하고, Q-러닝과 SARSA가 같은 경험에서 다른 값을 내는 이유(오프폴리시 vs 온폴리시)를 손계산으로 보입니다. ε 감소, Q-표에서 DQN으로의 전환과 경험 재생 · 고정 Q-목표 · 이중 DQN까지 다룹니다.

해설

경험으로 배우는 강화학습 수업: TD · Q-러닝 · SARSA에서 DQN까지 (Hugging Face 딥 RL 강좌 기반)

환경의 규칙을 모르는 채로, 직접 움직여 본 경험만으로 가치를 배우는 방법을 이 페이지 안에서 손으로 계산하며 익힙니다. Hugging Face 딥 강화학습 강좌 1~3단원의 흐름(가치 기반 학습 → 몬테카를로와 TD → Q-러닝 → 딥 Q-러닝)을 따라갑니다.

항목내용
출처Hugging Face Deep RL Course · Hugging Face(작성 Thomas Simonini 외) · 강좌 첫 페이지 · 원고 저장소 huggingface/deep-rl-class
트랙 · 수준강화학습 · 기초
이 수업이 다루는 범위강좌 1단원(딥 RL 입문), 2단원(Q-러닝 · 몬테카를로 vs TD), 3단원(딥 Q-러닝)의 핵심 개념. 강좌의 예제 수치는 출처를 밝혀 쓰고, 나머지 숫자 예는 설명용으로 이 사이트가 만든 것입니다
먼저 알면 좋은 것MDP · 반환 · 가치 함수 · 벨만 방정식(앞 수업), 기댓값

들어가기 전에

  • 강화학습 입문 (Sutton · Barto, 2판) — 상태 · 행동 · 보상, 할인된 반환 GtG_t, 가치 함수 vπv_\pi · qπq_\pi, 벨만 방정식을 이 수업에서 그대로 씁니다. 앞 수업은 "환경 규칙을 알 때" 푸는 법이었고, 이 수업은 "모를 때" 푸는 법입니다.

한눈에 보기

  • 가치 기반(value-based) 방법과 정책 기반(policy-based) 방법이 무엇을 배우는지 구별합니다.
  • 몬테카를로(Monte Carlo)와 시간차(Temporal Difference, TD) 학습의 갱신식을 강좌 예제 숫자로 직접 계산합니다.
  • Q-러닝과 SARSA가 같은 경험에서 왜 다른 값을 내는지(오프폴리시 vs 온폴리시) 손계산으로 확인합니다.
  • ε-탐욕의 ε를 점점 줄이는 이유와 방법을 압니다.
  • Q-표를 신경망으로 바꾼 DQN에 왜 리플레이 버퍼와 타깃 네트워크가 필요한지 설명할 수 있게 됩니다.

1. 가치 기반 vs 정책 기반

직관(해설용 비유): 길 찾기를 배우는 두 가지 방법이 있습니다. 하나는 "갈림길마다 각 방향의 점수표"를 외워 두고 점수가 높은 쪽으로 가는 것(가치 기반), 다른 하나는 "갈림길에서 어느 쪽으로 갈지"의 습관 자체를 바로 몸에 익히는 것(정책 기반)입니다.

  • 가치 기반: Q(s,a)Q(s, a) 같은 가치 함수를 배우고, 정책은 "가치가 가장 큰 행동 고르기"로 정해 둡니다. Q-러닝 · DQN이 여기 속합니다.
  • 정책 기반: 정책 πθ(a∣s)\pi_\theta(a \mid s)를 직접 배웁니다. 정책 경사 · PPO가 여기 속합니다(다음 수업).

강좌 1단원은 이 두 갈래를 먼저 나누고, 2~3단원에서 가치 기반을, 4단원 이후에서 정책 기반을 다룹니다. 이 수업은 가치 기반 쪽입니다.

왜 둘로 나누나: 행동이 몇 개뿐(위 · 아래 · 왼쪽 · 오른쪽)이면 행동마다 값을 적고 가장 큰 것을 고르기 쉽습니다. 반면 로봇 관절 각도처럼 행동이 연속값이면 "모든 행동 중 최댓값"을 찾기 어려워서, 정책을 직접 내는 방식이 더 자연스럽습니다.

2. 몬테카를로 vs TD: 언제 고치나

직관: 퇴근길 소요 시간을 예측한다고 합시다. 몬테카를로는 집에 도착한 뒤 실제로 걸린 시간을 보고 예측을 고칩니다. TD는 한 정거장 지날 때마다 "여기까지 온 시간 + 여기서부터의 예측"으로 바로 고칩니다.

단계(공통): 모든 상태의 가치 V(s)V(s)를 0으로 두고 시작 → 경험을 쌓으며 목표값 쪽으로 조금씩 옮깁니다. 차이는 목표값입니다.

몬테카를로: V(St)←V(St)+α[Gt−V(St)]\text{몬테카를로: } V(S_t) \leftarrow V(S_t) + \alpha\big[G_t - V(S_t)\big]
TD(0): V(St)←V(St)+α[Rt+1+γV(St+1)−V(St)]\text{TD(0): } V(S_t) \leftarrow V(S_t) + \alpha\big[R_{t+1} + \gamma V(S_{t+1}) - V(S_t)\big]
기호뜻
V(St)V(S_t)지금 상태 가치의 추정값
α\alpha학습률: 목표값 쪽으로 얼마나 옮길지
GtG_t에피소드가 끝난 뒤 계산한 실제 반환
Rt+1+γV(St+1)R_{t+1} + \gamma V(S_{t+1})TD 목표: 한 걸음 보상 + 다음 상태 추정 가치
괄호 안 전체오차(TD에서는 TD 오차 δt\delta_t)

숫자로 해 보기(강좌 2단원 예제의 설정): 강좌는 생쥐가 미로에서 치즈를 먹는 예로 두 방법을 비교합니다. 학습률 0.1, 할인율 1(할인 없음), 모든 가치는 0에서 시작합니다.

  • 몬테카를로: 생쥐가 에피소드를 끝까지 마쳤고, 그동안 받은 보상이 1, 0, 0, 0, 0, 0, 1, 1, 0, 0이라 반환은 G0=3G_0 = 3입니다. 갱신은 V(S0)=0+0.1×(3−0)=0.3V(S_0) = 0 + 0.1 \times (3 - 0) = 0.3입니다.
  • TD(0): 생쥐가 한 걸음 왼쪽으로 가서 치즈(보상 1)를 먹자마자 갱신합니다. V(S0)=0+0.1×(1+1×0−0)=0.1V(S_0) = 0 + 0.1 \times (1 + 1 \times 0 - 0) = 0.1입니다.

몬테카를로는 실제 결과 전체를 쓰고, TD는 다음 상태의 추정값을 빌려 씁니다. 추정으로 추정을 고치는 이 방식을 부트스트래핑(bootstrapping)이라 합니다.

왜 TD를 많이 쓰나: 몬테카를로는 에피소드가 끝나야 배울 수 있어서, 끝이 없는 과제나 아주 긴 과제에 불리합니다. 또 실제 반환은 운에 따라 크게 흔들립니다(분산이 큼). TD는 매 걸음 배울 수 있고 흔들림이 작지만, 다음 상태 추정이 틀렸으면 그 오차를 물려받습니다(편향). 두 방법은 이렇게 편향과 분산을 맞바꿉니다.

3. Q-러닝과 SARSA: 같은 경험, 다른 목표

상태 가치 V(s)V(s)만으로는 "어느 행동을 할지" 바로 정할 수 없습니다. 그래서 행동 가치 Q(s,a)Q(s, a)를 표로 배웁니다. 이 표를 Q-표(Q-table)라 합니다.

Q-러닝 갱신식(오프폴리시):

Q(St,At)←Q(St,At)+α[Rt+1+γmax⁡aQ(St+1,a)−Q(St,At)]Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha\Big[R_{t+1} + \gamma \max_{a} Q(S_{t+1}, a) - Q(S_t, A_t)\Big]

SARSA 갱신식(온폴리시):

Q(St,At)←Q(St,At)+α[Rt+1+γ Q(St+1,At+1)−Q(St,At)]Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha\Big[R_{t+1} + \gamma\, Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)\Big]
기호뜻
Q(St,At)Q(S_t, A_t)상태 StS_t에서 행동 AtA_t의 가치 추정
max⁡aQ(St+1,a)\max_a Q(S_{t+1}, a)다음 상태에서 가장 좋은 행동의 값(실제로 그 행동을 할지와 무관)
Q(St+1,At+1)Q(S_{t+1}, A_{t+1})다음 상태에서 실제로 고른 행동의 값
SARSA갱신에 쓰는 다섯 값 St,At,Rt+1,St+1,At+1S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}의 머리글자

숫자로 해 보기 ①(강좌 2단원 예제의 설정): 강좌의 생쥐 미로는 학습률 0.1, 할인율 0.99, 작은 치즈 +1, 독 −10입니다. Q-표가 모두 0일 때 오른쪽으로 가 작은 치즈를 먹으면 0+0.1×(1+0.99×0−0)=0.10 + 0.1 \times (1 + 0.99 \times 0 - 0) = 0.1이 됩니다. 다음에 아래로 가 독을 먹으면 에피소드가 끝나 다음 상태 값을 0으로 두므로 0+0.1×(−10−0)=−10 + 0.1 \times (-10 - 0) = -1이 됩니다.

숫자로 해 보기 ②(해설용, 두 방법의 차이): 상태 S0S_0에서 '오른쪽'을 해서 보상 0을 받고 S1S_1에 왔습니다. 지금 Q-표는 Q(S0,오른쪽)=0Q(S_0, \text{오른쪽}) = 0, Q(S1,오른쪽)=0.5Q(S_1, \text{오른쪽}) = 0.5, Q(S1,왼쪽)=0.2Q(S_1, \text{왼쪽}) = 0.2입니다. 학습률 α=0.5\alpha = 0.5, γ=0.9\gamma = 0.9이고, ε-탐욕이 이번에는 탐험으로 S1S_1에서 '왼쪽'을 골랐습니다.

  • Q-러닝: 목표 =0+0.9×max⁡(0.5,0.2)=0.45= 0 + 0.9 \times \max(0.5, 0.2) = 0.45 → Q(S0,오른쪽)=0+0.5×0.45=0.225Q(S_0,\text{오른쪽}) = 0 + 0.5 \times 0.45 = 0.225
  • SARSA: 목표 =0+0.9×Q(S1,왼쪽)=0.18= 0 + 0.9 \times Q(S_1, \text{왼쪽}) = 0.18 → Q(S0,오른쪽)=0+0.5×0.18=0.09Q(S_0,\text{오른쪽}) = 0 + 0.5 \times 0.18 = 0.09

같은 경험인데 Q-러닝은 "앞으로는 최선을 다할 것"이라 가정하고, SARSA는 "지금처럼 가끔 탐험하며 행동할 것"을 반영합니다.

왜 '오프폴리시 · 온폴리시'인가: Q-러닝은 행동은 ε-탐욕으로 하면서 목표는 탐욕 정책(최댓값)으로 계산합니다. 행동하는 정책과 배우는 정책이 달라 오프폴리시(off-policy)입니다. SARSA는 실제로 행동한 정책 그대로를 배우므로 온폴리시(on-policy)입니다. 절벽 옆 길처럼 탐험 한 번이 큰 손해인 환경에서는 SARSA가 더 조심스러운 길을 배우는 경향이 있다고 Sutton · Barto 책 6장이 예제로 보여 줍니다.

mermaid
flowchart LR
  A[상태 S_t] --> B[ε-탐욕으로 행동 A_t]
  B --> C[보상 R_t+1 · 다음 상태 S_t+1]
  C --> D{목표값 계산}
  D -->|Q-러닝| E[R + γ · max Q S_t+1]
  D -->|SARSA| F[R + γ · Q S_t+1, A_t+1]
  E --> G[Q-표 갱신]
  F --> G
  G --> A

4. ε를 점점 줄이기

직관: 새 동네로 이사 오면 처음 몇 주는 이 식당 저 식당 다 가 보다가(탐험), 맛집을 알게 되면 주로 거기 갑니다(활용). ε-탐욕의 ε도 학습 초반에는 크게, 후반에는 작게 둡니다.

강좌는 학습이 진행될수록 탐험 확률을 줄이는 방식을 씁니다. 자주 쓰는 형태 하나를 예로 들면 다음과 같습니다(형태와 숫자는 설명용).

εn=εmin⁡+(εmax⁡−εmin⁡) e−λn\varepsilon_n = \varepsilon_{\min} + (\varepsilon_{\max} - \varepsilon_{\min})\, e^{-\lambda n}
기호뜻
εn\varepsilon_nnn번째 에피소드의 탐험 확률
εmax⁡\varepsilon_{\max}, εmin⁡\varepsilon_{\min}시작값과 바닥값
λ\lambda감소 속도

숫자로 해 보기(해설용): εmax⁡=1\varepsilon_{\max} = 1, εmin⁡=0.05\varepsilon_{\min} = 0.05, λ=0.01\lambda = 0.01이면

  • n=0n = 0: ε=1\varepsilon = 1 (전부 무작위)
  • n=100n = 100: 0.05+0.95×e−1≈0.400.05 + 0.95 \times e^{-1} \approx 0.40
  • n=300n = 300: 0.05+0.95×e−3≈0.0970.05 + 0.95 \times e^{-3} \approx 0.097

왜 0까지 내리지 않나: 환경이 조금씩 변하거나 아직 덜 가 본 상태가 있을 수 있어서, 작은 탐험은 남겨 두는 경우가 많습니다. 평가할 때는 ε를 0으로 두고 탐욕 행동만 씁니다.

5. Q-표에서 DQN으로

문제: 아타리 게임 화면처럼 상태가 이미지라면, 가능한 상태의 수가 너무 많아 Q-표를 만들 수 없습니다. 그래서 강좌 3단원은 Q-표를 신경망 Qθ(s,a)Q_\theta(s, a)로 바꿉니다. 화면을 넣으면 행동마다 Q-값을 내는 함수입니다. 이것이 딥 Q-네트워크(Deep Q-Network, DQN)입니다.

학습 손실: Q-러닝의 목표값과 지금 예측의 차이를 제곱해 줄입니다.

L(θ)=(r+γmax⁡a′Qθ−(s′,a′)⏟TD 목표−Qθ(s,a))2L(\theta) = \Big(\underbrace{r + \gamma \max_{a'} Q_{\theta^-}(s', a')}_{\text{TD 목표}} - Q_\theta(s, a)\Big)^2
기호뜻
QθQ_\theta학습 중인 신경망(온라인 네트워크)
Qθ−Q_{\theta^-}목표값 계산에만 쓰는, 가중치를 잠시 고정한 복사본(타깃 네트워크)
(s,a,r,s′)(s, a, r, s')한 번의 경험: 상태 · 행동 · 보상 · 다음 상태

숫자로 해 보기(해설용): 경험 하나가 r=1r = 1이고, 타깃 네트워크가 본 다음 상태의 최대 Q-값이 2.0, γ=0.99\gamma = 0.99, 온라인 네트워크의 현재 예측이 Qθ(s,a)=2.5Q_\theta(s, a) = 2.5라 합시다. TD 목표는 1+0.99×2.0=2.981 + 0.99 \times 2.0 = 2.98, 오차는 2.98−2.5=0.482.98 - 2.5 = 0.48, 손실은 0.482=0.23040.48^2 = 0.2304입니다. 경사 하강법은 예측을 2.98 쪽으로 끌어올리도록 θ\theta를 고칩니다.

강좌가 꼽는 안정화 방법 세 가지(3단원):

  1. 경험 재생(experience replay): 경험 (s,a,r,s′)(s, a, r, s')을 리플레이 버퍼에 쌓아 두고, 무작위로 뽑은 묶음으로 학습합니다. 같은 경험을 여러 번 쓸 수 있고, 연달아 일어난 비슷한 경험끼리의 상관을 끊어 줍니다. 강좌는 이것이 새 데이터만 보다가 예전 행동을 잊어버리는 '파국적 망각'을 막는 데도 도움이 된다고 설명합니다.
  2. 고정 Q-목표(fixed Q-target): 목표값과 예측을 같은 네트워크로 계산하면, 예측을 고칠 때마다 목표도 같이 움직여 학습이 흔들립니다. 그래서 목표값은 별도의 타깃 네트워크로 계산하고, 그 가중치는 CC 걸음마다 온라인 네트워크에서 복사해 옵니다.
  3. 이중 DQN(Double DQN): 다음 상태의 최선 행동을 고르는 것은 온라인 네트워크가, 그 행동의 값을 매기는 것은 타깃 네트워크가 나눠 맡습니다. 최댓값을 고르고 매기는 일을 한 네트워크가 하면 Q-값이 부풀려지는(과대 추정) 문제를 줄이기 위해서입니다.

왜 이렇게 하나: 지도 학습은 데이터가 서로 독립이고 정답이 고정되어 있다고 가정합니다. 강화학습 경험은 연달아 붙어 있고(상관), 정답(TD 목표)이 학습하면서 계속 바뀝니다. 경험 재생은 첫째 문제를, 타깃 네트워크는 둘째 문제를 누그러뜨려 신경망 학습을 지도 학습에 가깝게 만듭니다.

연습 문제

문제 1. V(S0)=0.3V(S_0) = 0.3에서 시작해, 한 걸음 뒤 보상 0, 다음 상태 가치 V(S1)=0.5V(S_1) = 0.5, γ=1\gamma = 1, α=0.1\alpha = 0.1로 TD(0) 갱신을 하세요.

풀이: TD 오차 =0+1×0.5−0.3=0.2= 0 + 1 \times 0.5 - 0.3 = 0.2, 새 값 =0.3+0.1×0.2=0.32= 0.3 + 0.1 \times 0.2 = 0.32.

문제 2. 3절 예제 ②에서 탐험 없이 S1S_1에서 '오른쪽'을 골랐다면 SARSA 결과는 어떻게 되나요?

풀이: 목표 =0+0.9×Q(S1,오른쪽)=0.45= 0 + 0.9 \times Q(S_1, \text{오른쪽}) = 0.45로 Q-러닝과 같아지고, 새 값은 0.2250.225입니다. 행동 정책이 탐욕 행동을 고르면 두 방법의 목표가 같아집니다.

문제 3. 5절 DQN 예제에서 같은 경험이 에피소드를 끝내는 경험(종료)이었다면 TD 목표와 손실은?

풀이: 종료 상태 다음은 가치가 0이므로 목표 =r=1= r = 1, 오차 =1−2.5=−1.5= 1 - 2.5 = -1.5, 손실 =2.25= 2.25입니다.

문제 4. 4절 식에서 n=200n = 200일 때 ε는 약 얼마인가요?

풀이: 0.05+0.95×e−2≈0.05+0.95×0.1353≈0.1790.05 + 0.95 \times e^{-2} \approx 0.05 + 0.95 \times 0.1353 \approx 0.179.

스스로 점검

  1. 몬테카를로와 TD의 목표값은 각각 무엇인가요?
    • 답: 몬테카를로는 에피소드 끝까지의 실제 반환 GtG_t, TD(0)는 한 걸음 보상과 다음 상태 추정 가치의 합 Rt+1+γV(St+1)R_{t+1} + \gamma V(S_{t+1})입니다.
  2. Q-러닝이 오프폴리시인 이유는?
    • 답: 행동은 ε-탐욕 정책으로 고르지만, 목표값은 다음 상태에서 최댓값을 고르는 탐욕 정책으로 계산해, 행동하는 정책과 배우는 정책이 다르기 때문입니다.
  3. DQN에서 타깃 네트워크를 따로 두는 이유는?
    • 답: 목표값과 예측을 같은 네트워크로 계산하면 예측을 고칠 때 목표도 함께 움직여 학습이 흔들리기 때문입니다. 목표 쪽 가중치를 일정 걸음 동안 고정해 안정시킵니다.

용어 정리

용어쉬운 뜻
가치 기반 방법가치 함수를 배워 간접적으로 정책을 얻는 방법
정책 기반 방법정책을 직접 배우는 방법
몬테카를로 학습에피소드가 끝난 뒤 실제 반환으로 가치를 고치는 방법
시간차(TD) 학습한 걸음 뒤의 추정 가치를 빌려 바로 고치는 방법
부트스트래핑다른 추정값으로 지금 추정값을 고치는 것
Q-표(Q-table)상태 × 행동마다 가치를 적어 둔 표
Q-러닝다음 상태의 최댓값으로 목표를 잡는 오프폴리시 TD 방법
SARSA다음에 실제로 고른 행동의 값으로 목표를 잡는 온폴리시 TD 방법
온폴리시 / 오프폴리시행동하는 정책과 배우는 정책이 같음 / 다름
경험 재생(experience replay)경험을 버퍼에 쌓아 두고 무작위로 다시 뽑아 학습하는 방법
타깃 네트워크(target network)목표값 계산용으로 가중치를 잠시 고정한 신경망 복사본
과대 추정(overestimation)최댓값을 고르는 과정 때문에 Q-값이 실제보다 크게 잡히는 현상

더 깊이 보려면

강좌는 단원마다 이론 · 코랩 실습 · 과제로 짜여 있습니다(원고 저장소 목차 기준).

단원내용
1딥 강화학습 입문(첫 에이전트 학습) · 보너스 Huggy
2Q-러닝 입문(벨만 방정식, 몬테카를로 vs TD) — 이 수업의 2~4절
3아타리 게임으로 하는 딥 Q-러닝 — 이 수업의 5절
4PyTorch로 구현하는 정책 경사
5Unity ML-Agents 입문
6로봇 환경에서의 액터-크리틱
7다중 에이전트와 AI 대 AI 대결
8근접 정책 최적화(PPO)
보너스모델 기반 RL, 오프라인 RL, RLHF, 결정 트랜스포머, 모방 학습 등

실습 노트북은 구글 코랩에서 돌아갑니다. 강좌는 현재 저유지보수 상태라 일부 기능(7단원 AI 대 AI 리더보드 등)이 작동하지 않는다고 안내합니다. 이 사이트의 논문 항목으로는 딥 강화학습으로 아타리 게임하기 (DQN) 뒤로 Double DQN · Dueling · 우선순위 경험 재생 · Rainbow가 이어집니다.

다음에 볼 것

라이선스

원고 저장소(huggingface/deep-rl-class)는 Apache 2.0 라이선스입니다. 이 페이지는 강좌의 구성과 예제 설정을 출처를 밝혀 참고하고, 설명 · 예제 대부분을 이 사이트가 직접 썼습니다. 강좌 그림은 별도 데이터셋에서 불러오므로 옮기지 않았습니다.

출처

AI 원리부터 이해하기 · 강화학습 모듈

강화학습 모듈 학습

이 글은 강화학습 모듈의 학습 자료입니다. 전체 31개 자료 중 3번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

번역가능

Apache 2.0