오늘 끝나면
Deep Q-Network
- ✓Deep Q-Network의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 Deep이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
2013 딥마인드, Atari를 정복한 혁명 (Flappy Bird DQN) 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
AI · Day 14 / 강화학습
픽셀만 보고
게임을 깨다
화면 픽셀과 점수만 받아 Atari 49종을 사람 수준으로 플레이하는 에이전트 하나. 2013년, 7페이지 논문 한 편이 구글이 DeepMind를 약 6억 달러에 사게 만듦. 오늘은 그 논문을 손으로 복원함.
6억 달러짜리 7페이지
게임 규칙도 공략법도 안 가르침. 오직 화면 픽셀과 점수만 줌.
Breakout에서 200에피소드쯤 지나자, 이 녀석이 벽 뒤로 공을 빼서 점수를 자동으로 긁는 터널 전략을 스스로 찾아냄. 누구도 안 가르친 전략임. 보상 최대화 명령 하나로 창발한 거임.
2013년 NIPS 워크숍 논문 한 편으로 시작된 일임. 구글의 DeepMind 인수, AlphaGo, AlphaFold, 2024년 하사비스 노벨 화학상. 논문 한 편이 10년에 걸쳐 한 산업을 만듦.
논문 한 편이 한 회사 · 한 분야 · 노벨상을 만듦
Q-table은 왜 무너지나
Day 13에선 Q(s, a) 테이블로 FrozenLake를 풂. 상태 16개 × 액션 4개 = 64칸짜리 엑셀 시트. 귀여웠음.
근데 Atari 화면은 210×160 픽셀, 3채널, 8비트임. 가능한 상태 수는 256^100,800, 대략 10^242,800임. 우주 원자 수 10^80을 3,000번 곱해도 모자람. 모든 상태를 저장한다는 발상 자체가 물리적으로 불가능함.
그래서 DQN은 발상을 뒤집음. 모든 값을 저장하는 대신 값을 계산하는 함수를 학습함. MNIST에서 손글씨를 DB에 다 넣는 대신 신경망이 숫자를 계산하게 한 것과 같은 전환임.
| 환경 | 상태 수 | 테이블? |
|---|---|---|
| FrozenLake 4×4 | 16 | 가능 |
| 틱택토 | 약 5,478 | 가능 |
| 체스 | 약 10^45 | 불가 |
| 바둑 19×19 | 약 10^170 | 불가 |
| Atari 화면 | 256^100,800 | 불가 |
Atari 상태 수 = 우주 원자 수(10^80)를 3,000번 곱해도 모자람
Q-table을 신경망으로
핵심은 한 줄임. Q(s, a)를 lookup하지 말고 CNN이 계산하게 함.
입력에 트릭이 하나 있음. 한 프레임만 보면 공이 올라가는지 내려가는지 모름. 속도 정보가 없어서임. 그래서 최근 4프레임을 채널로 쌓아 84×84×4 텐서를 만듦. 이제 CNN이 속도와 가속도를 암묵적으로 읽음.
출력도 영리함. Q값 하나가 아니라 모든 액션의 Q값 벡터를 한 번에 내보냄. forward 한 번 + argmax면 최선의 액션이 바로 나와서 빠름.
Q. terminal 상태일 때 타깃 y는 어떻게 될까?
미래 보상이 없으니 y = r임. 구현할 땐 (1 - done)을 곱해 γ·max Q 항을 0으로 만듦. 이거 빼먹으면 학습이 무한히 발산함.2015 Nature 아키텍처 — 출력은 모든 액션의 Q값 벡터임
안정화 트릭 두 개
여기까지가 절반임. "CNN + Q-Learning"만으로는 학습이 그냥 터짐. DQN의 진짜 혁신은 이 두 트릭임.
첫째, Experience Replay. 연속된 경험은 서로 너무 닮아서(상관성) 신경망의 i.i.d 가정을 깸. 그래서 경험을 100만 개짜리 버퍼에 쌓아두고 무작위로 꺼내 학습함. 시간적 상관이 깨짐 / 한 경험을 여러 번 재사용해 표본 효율도 오름.
둘째, Target Network. 타깃 y를 학습 중인 네트워크로 계산하면 화살 쏘는 순간 과녁이 움직임. 그래서 과거 복사본을 따로 얼려두고 N=10,000 스텝마다 한 번씩만 동기화함. 과녁이 멈추니 학습이 안정됨.
파이썬 코드 보기
# 두 트릭의 핵심
batch = random.sample(buffer, 32) # Replay: 무작위
with torch.no_grad():
q_next = target_net(s_next).max(1)[0] # 얼린 과녁
y = r + gamma * q_next * (1 - done) # terminal이면 r만
loss = smooth_l1_loss(q_net(s).gather(1, a), y) # Huber
if step % 10000 == 0:
target_net.load_state_dict(q_net.state_dict())켬 — 과녁을 얼림
Rainbow와 비즈니스
DQN은 출발점임. 이후 개선이 줄줄이 나옴. Double DQN은 과대평가를 한 줄로 잡고, Dueling은 가치와 이점을 분리하고, Prioritized Replay는 어려운 경험을 더 공부함.
2017년, Rainbow가 이 일곱 가지를 전부 합침. Atari 57종에서 사람 대비 median 223%. 하나씩 떼봤을 때 가장 아쉬운 건 Prioritized Replay와 Multi-step이었음.
비즈니스에선? 순차 의사결정 + 장기 보상 + 시뮬레이터 삼박자가 맞으면 DQN 후보임. 생산 라인 스케줄링, 데이터센터 냉각(구글 DC 에너지 40% 절감), 개인화 랭킹이 대표 사례임. 시뮬레이터가 없으면 Offline RL을 먼저 봐야 함.
Q. Target Network가 없으면 Q값이 왜 발산할까?
양의 피드백 루프 때문임. Q가 조금 커지면 타깃 y도 커짐 / 그 그래디언트가 Q를 더 키움. Target Network로 참조점을 잠깐 얼리면 이 루프가 끊김.일곱 개선을 합친 Rainbow — Atari 57종에서 사람의 2배 이상임