파이썬과 케라스로 배우는 강화학습 | 강화학습 기초 11
파이썬과 케라스로 배우는 강화학습 Chapter 4 정리
책 정보 📖
- 책 제목: 파이썬과 케라스로 배우는 강화학습
- 글쓴이: 이웅원, 양혁렬, 김건우, 이영무, 이의령
- 출판사: 위키북스
- 발행일: 2020년 04월 07일
- 챕터: Chapter 4. 강화학습 기초 3: 그리드월드와 큐러닝
책소개
강화학습의 기초부터 최근 알고리즘까지 친절하게 설명합니다! ‘알파고’로부터 받은 신선한 충격으로 많은 사람들이 강화학습에 관심을 가지기 시작했다. 하지만 처음 강화학습을 공부하는 분들을 위한 쉬운 자료나 강의를 찾아보기 어려웠다. 외국 강의를 통해 어렵게 이론을 공부하더라도 강화학습을 구현하는 데는 또 다른 장벽이 있었다. 이 책은 강화학습을 처음 공부하는 데 어려움을 겪는 독자를 위해 이론부터 코드 구현까지의 가이드를 제시한다.
특히 이번 개정판에서는 텐서플로 버전업에 맞춰서 코드를 업데이트하고 전반적인 이론 및 코드 설명을 개선했다. 그리고 실무에서 많이 활용될 수 있는 연속적 액터-크리틱 알고리즘을 추가했다.
주요 내용
- 강화학습의 기초 - Q-Learning
SARSA의 한계를 극복하기 위해 등장한 큐러닝(Q-Learning) 알고리즘에 대해 알아보자. 큐러닝은 오프-폴리시 방법을 통해 탐험과 활용의 딜레마를 해결한다.
오프-폴리시의 개념
오프-폴리시란?
오프-폴리시의 말 그대로 현재 행동하는 정책과 독립적으로 학습한다는 것이다.
행동하는 정책과 학습하는 정책을 따로 분리한다:
- 에이전트는 행동하는 정책에 따라 지속적인 탐험을 한다
- 행동과 별개로 에이전트는 따로 목표 정책을 둬서 학습은 목표 정책에 따라 한다
큐러닝의 핵심 아이디어
SARSA와의 차이점
SARSA는 정책이 없이 큐함수에 따라 행동을 선택하는 것이 정책인데 큐러닝은 오프-폴리시를 어떻게 구현했을까?
SARSA의 방식
- 현재 상태 s에서 행동 a를 ε-탐욕 정책에 따라 선택
- 환경으로부터 보상 r을 받고 다음 상태 $s^\prime$을 받음
- $s^\prime$에서 또다시 ε-탐욕 정책에 따라 다음 행동을 선택
- 그것을 학습에 샘플로 사용
큐러닝의 방식
- 현재 상태 s에서 행동 a를 ε-탐욕 정책에 따라 선택
- 환경으로부터 보상 r을 받고 다음 상태 $s^\prime$을 받음
- 에이전트가 다음 상태 $s^\prime$을 일단 알게 되면 그 상태에서 가장 큰 큐함수를 현재 큐함수의 업데이트에 사용
- 에이전트는 실제로 다음 상태에서 어떤 행동을 했는지와 상관없이 현재 상태 s의 큐함수를 업데이트할 때는 다음 상태의 최대 큐함수를 이용
필요한 샘플
큐러닝에 필요한 샘플은 < $s, a, r, s^\prime$ >이다. SARSA와 달리 다음 행동 $a^\prime$이 필요 없다.
큐러닝 업데이트 식
\[Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha(R_{t+1} + \gamma \underset{a^\prime}{\max}Q(S_{t+1}, a^\prime) - Q(S_t, A_t))\]업데이트 식의 특징
- 다음 행동을 해보는 것이 아니라 다음 상태에서 가장 큰 큐함수를 가지고 업데이트하는 것이다
- 기댓값 E를 빼면 큐함수에 대한 벨만 최적 방정식과 동일하다
- SARSA에서는 큐함수를 업데이트하기 위해 벨만 기대 방정식을 사용하고 큐러닝에서는 큐함수를 업데이트하기 위해 벨만 최적 방정식을 사용한다
알고리즘 발전 과정
벨만 기대 방정식 → 정책 이터레이션 → SARSA
벨만 최적 방정식 → 가치 이터레이션 → 큐러닝
오프-폴리시의 장점
큐러닝에서 학습에 사용했던 다음 상태에서의 행동과 실제로 다음 상태로 가서 한 행동은 다르기 때문에 안 좋은 행동을 하더라도 큐함수 업데이트에는 포함되지 않는다.
실제 환경에서 행동을 하는 정책과 큐함수를 업데이트할 때 사용하는 정책이 다르기 때문에 큐러닝을 오프-폴리시라고 한다.
탐험과 활용의 균형
- 행동 선택: ε-탐욕 정책 사용
- 업데이트: 벨만 최적 방정식 이용
이를 통해 탐험과 최적 정책 학습의 문제를 해결했다.
큐러닝 코드 구현
SARSA 코드와 다른 점은 에이전트가 샘플을 가지고 학습하는 부분이다.
1
2
3
4
5
6
7
# <s, a, r, s'> 샘플로부터 큐함수 업데이트
def learn(self, state, action, reward, next_state):
state, next_state = str(state), str(next_state)
q_1 = self.q_table[state][action]
# 벨만 최적 방정식을 사용한 큐함수의 업데이트
q_2 = reward + self.discount_factor * max(self.q_table[next_state])
self.q_table[state][action] += self.step_size * (q_2 - q_1)
코드 설명
self.q_table[next_state]에서 max 값을 업데이트에 사용하기 때문에 오프-폴리시가 된다- max 값을 취하면 되기에 다음 상태에서의 행동을 알 필요가 없다
SARSA vs 큐러닝
핵심 차이점
SARSA와 큐러닝의 차이는 온-폴리시와 오프-폴리시의 차이다.
SARSA (온-폴리시)
- 지속적인 탐험으로 갇히는 현상이 나타난다
- 탐험을 위한 행동이 학습에 직접 영향을 미침
- 안전하지만 최적 정책 학습이 어려울 수 있음
큐러닝 (오프-폴리시)
- 큐함수의 max 값으로 업데이트하기 때문에 갇히지 않고 벗어나는 정책을 학습
- 탐험 행동과 무관하게 최적 정책을 학습
- 더 빠르고 효율적인 학습 가능
강화학습 알고리즘 총정리
몬테카를로 예측
- 다이내믹 프로그래밍에서 강화학습으로 넘어가는 가장 기본적인 아이디어다
- 기댓값을 샘플링을 통한 평균으로 대체하는 기법이다
- 에피소드를 하나 진행하고 에피소드 동안 지나온 상태의 반환값을 구한다
- 반환값이 하나의 샘플이 되어서 각 상태의 가치함수를 업데이트한다
- $V(s) \leftarrow V(s) + \alpha(G(s) - V(s))$
시간차 예측
- 몬테카를로 예측과는 달리 타임스텝마다 가치함수를 업데이트한다
- 벨만 기대 방정식을 이용해 가치함수를 업데이트한다
- $V(S_t) \leftarrow V(S_t) + \alpha(R_{t+1} + \gamma V(S_{t+1}) - V(S_t))$
SARSA
- 강화학습 제어에서 행동을 선택할 때 ε-탐욕 정책을 사용하는데, 가치함수를 사용하면 환경의 모델을 알아야 하기 때문에 제어에서 큐함수를 사용한다
- 큐함수를 사용할 때 시간차 제어에서는 하나의 샘플로 $(s, a, r, s^\prime, a^\prime)$이 필요하다
- 시간차 제어를 SARSA라고 한다
- $Q(S_t, A_t) \leftarrow Q(S_t,A_t) + \alpha(R_{t+1} +\gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t))$
큐러닝
- SARSA는 온-폴리시 강화학습이다
- 온-폴리시의 단점을 개선하는 것이 오프-폴리시이며 큐러닝이 대표적이다
- 큐러닝은 행동 선택에선 ε-탐욕 정책을 사용하고 큐함수의 업데이트는 벨만 최적 방정식을 이용한다
- $Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha(R_{t+1} + \gamma \underset{a^\prime}{\max}Q(S_{t+1}, a^\prime) - Q(S_t, A_t))$
강화학습 알고리즘의 체계
| 구분 | 방정식 | DP | 강화학습 |
|---|---|---|---|
| 온-폴리시 | 벨만 기대 방정식 | 정책 이터레이션 | SARSA |
| 오프-폴리시 | 벨만 최적 방정식 | 가치 이터레이션 | 큐러닝 |
이러한 체계를 통해 강화학습이 다이내믹 프로그래밍의 한계를 극복하면서도 그 수학적 기반을 유지하고 있음을 알 수 있다.
큐러닝은 현대 강화학습의 기초가 되는 알고리즘으로, 딥러닝과 결합한 DQN(Deep Q-Network) 등 더 발전된 형태로 계속 발전하고 있다.