Search
Duplicate
🤷

DQN 알고리즘으로 Cartpole 게임과 Snake Game 학습시키기

소속팀
위키 팀
팀명
어쩌다 강화학습
데모

강화학습

강화학습이란?

불확실성 하에서, 최종적으로 최대의 보상을 받을 수 있도록 연속적으로 이어지는 일련의 결정들을 내리도록 학습시키는 것
(How can an intelligent agent learn to make a good sequence of decision under uncertainty? - CS234 1강)

강화학습의 핵심

(예제) CS234 2강에서 나온 화성 탐사선 예시
화성탐사선이 현재 S4에 있고, S3와 S5로 가는 행동을 결정한다고 가정합니다. 단 이 때 보상은 S1과 S3에서 1, S7에서는 10, 나머지는 0이라고 가정합니다.
일련의 결정들
당장의 결정만 내리고 끝나는 것이 아닌 의사 결정의 과정이 계속해서 반복 됨
예제를 통한 설명
불확실성
이전에 내린 결정의 결과가 후의 상황에 영향을 미침. 즉, 이전의 결정에 의해 상황이 계속해서 변하기 때문에 미래의 상태가 어떨지 불확실함
예제를 통한 설명
지연된 보상
강화학습에서는 여러 번 결정을 내리기 때문에 그에 따른 보상도 여러 번받는데 , 강화 학습의 궁극적인 목표는 최종에 받는 보상을 최대화 하는 것
예제를 통한 설명
용어
1.
Agent : 결정을 내리는 인공지능을 의미하며, 위 예제에서는 화성탐사선으로 볼 수 있습니다.
2.
State : Agent가 결정을 내릴 때 사용되는 상황들을 의미합니다.
3.
Action: Agent가 내리는 결정을 의미합니다.
4.
Policy : State를 입력받았을 때 어떤 행동을 취할 지 출력하는 함수입니다. 즉, 해당 State에서 보상을 최대화 하기 위한 Action을 알려줍니다.
탐색
다른 머신러닝, 딥러닝의 학습과정과는 다르게 사전에 주어진 데이터를 사용하는 것이 아니라, Agent가 학습하면서 얻은 데이터만을 사용합니다.
일반화
이전에 학습하지 않은 상황에 대해서도 지금까지 학습한 것을 바탕으로 policy를 만들어 문제 상황을 해결할 수 있습니다.

강화학습의 강점

규칙이 이미 정해진 모델이나, 주어진 경험을 토대로 학습하는 다른 모델들과 비교해보았을 때, 새로운 상황에 적용하기 수월하며 성능이 뛰어나다는 강점이 있습니다.
이러한 강점을 살려 혈관수술에서 경로 탐색, 드론과 자동차의 자율주행, 네트워크 분산처리, 게임분야에서 두드러지게 사용되고 있습니다.

2. DQN

DQN : Q-Learning에 Function Approximator로 Deep learning을 적용한 방법으로, Neural Network를 이용한 function approximator로 기존 딥러닝 방식의 강화학습이 가진 문제를 Experience Replay BufferFixed Q Targets로 해결했습니다.
(그렇다면 Q-Learning이 무엇인가?)

2-1. Q-Learning

Q 는 현재 상태에서 취한 행동의 보상에 대한 Quality를 의미합니다. 수식으로는 다음과 같이 표현합니다.
Qπ=Eπ[Rt+1+γRt+2+...+St=s,At=a]Qπ=Eπ[Rt+1+γRt+2+...+∣St=s,At=a]
상태 s에서 행동 a를 했을 때 그 행동의 가치는 Q(s,a)Q(s,a)로 나타내며, 이때 Q-value는 시간 t에서 정책 ππ에 따른 행동 a를 할 때 받게 되는 미래 보상 총합의 기댓값입니다.
Q-Learning은 초기에 정해진 모델 없이 학습하는 model-free 알고리즘으로, agent가 특정 state에서 특정 action을 하도록 하는 policy를 exploration을 통해 학습하는 것을 말합니다.
model-free 알고리즘에 반대되는 개념으로 model-based 알고리즘이 있습니다.
딥러닝에서 모델이라는 단어는 Neural-Net 구조 내지는 그 NN이 표현하는 함수를 의미합니다. 예를 들어 ‘ResNet 모델을 학습시킨다’, ‘이 데이터에 적합한 모델은 BERT이다’, 와 같이 사용됩니다. 다른 말로, 일반적인 딥러닝의 영역에서는 함수에 대한 가정을 model이라고 표현하지만, 강화학습에서는 환경에 대한 가정을 model이라고 합니다. (함수는 input과 output이 존재하며, 딥러닝이나 머신러닝의 경우 과거 데이터를 기반으로 잘 학습된 model에 새로운 input값을 넣었을 때 어느정도의 정확도를 갖는지를 보여주는 반면, 환경은 input/output 없이 환경 그 자체를 관찰하고, 다음 action을 선택하는데에 있어 정보를 제공할 뿐입니다.) 환경이 어떻게 동작할지 기존 지식을 활용하거나 학습해서 사용하는 방식을 model-based 알고리즘, state 마다의 환경을 real-time으로 반영하는 방식을 model-free 알고리즘이라고 합니다.
model-based 알고리즘은 기존 지식을 활용하는 만큼 적은 양의 데이터로 효율적인 학습이 가능하다는 장점이 있고, model-free 알고리즘은 환경에 대한 model을 세우기 어려운 상황에서도 사용할 수 있어 baseline 알고리즘을 다양한 domain에 걸쳐 적용할 수 있다는 장점이 있습니다.
model-free 알고리즘이 넓은 분야에 범용적으로 사용되어 보편적으로 사용되지만, 데이터의 효율성 측면이나 데이터의 안전성이 중요한 경우 model-based 알고리즘이 사용되기도 합니다.
각각의 대표 예시로, model-based 알고리즘은 AlphaGo, model-free 알고리즘은 DQN이 있습니다.
흔히 ML에서 ‘model’이라고 하면 앞서 언급한 딥러닝에서의 model을 의미하고, 강화학습에서의 model을 지칭할 때는 model-free, model-based 와 같이 영어로 적습니다. 또한, 이 둘은 사전적으로 구분하여 정의되지만 actual하게 사용되는 경우 적절히 혼용하여 사용합니다.
이 방식은 현재 state에서부터 이어지는 연속적인 단계들에 대한 전체 보상의 기대값을 최대화 하는것을 목표로 합니다.
이 개념은 특정 state에서 다른 state로 이동하는 전이(transition)가 확률적으로 발생하거나, 보상이 확률적으로 주어지는 환경에서 적용 가능합니다.

2-2. Deep Q-Learning (DQN)

DQN이라는 개념은 AlphaGo를 개발한 DeepMind의 “Playing Atari with Deep Reinforcement Learning” 이라는 논문에서 처음 소개되었습니다.
Q-Learning에 Function Approximator로 Deep Learning (Convolution Neural Network) 을 이용한 방법으로, 기존 Q-Learning이 가진 단점들을 Experience ReplayFixed Q Targets로 해결합니다.
Function Approximator ( In RL, usually denoted as Value Function Approximator, VFA)
함수를 근사하여 추정합니다.
사분원의 넓이 공식은 익히 아실겁니다. (pi/4r2pi/4 * r^2)
원의 넓이같이 간단한 공식은 이미 주어져 있고 쉽게 적용할 수 있는 small numbers of states and actions 입니다. 현실 세계를 설명하는 정해진 함수가 있으면, 이를 구해서 적용하면 됩니다.
하지만 현실의 문제는 매우 복잡한 환경에서 이루어집니다. 이미 주어진 공식으로는 ‘small numbers of states and actions’로 이루어진 간단한 task에만 적용할 수 있다는 한계가 있으며, generalization의 issue가 있습니다. 지금까지는 모두 간단하고 직관적인 환경에서 적용하며 개념을 익혔다면, 이제는 현실의 문제로 generalization할 방법을 다루는데, 이런 맥락에서 나온것이 FA 입니다.
환경이나 상황을 설명하는 정확한 함수가 존재하고, 이를 알고 있다면 좋겠지만 이는 현실적으로 불가능합니다. 원의 넓이를 구하는 공식은 모르지만, 기준선의 내부/외부에 찍힌 점의 개수로부터 넓이를 근사하여 계산할 수 있습니다.
다른 예시를 보겠습니다.
좌측이 실제 데이터, 그리고 우측이 이를 표현하는 예측값입니다. 명확한 함수를 대신하여 데이터들이 일정한 경향성을 가지고 있고, 이를 함수화 시켜놓는다면 실측값에 근사하여 사용할 수 있습니다. 방대한 양의 데이터를 모두 사용하는 것 대신, 몇개의 parameter로 이를 근사시키면 실제로 갖고있지 않는 데이터도 근사하여 구할 수 있고, 실제 데이터의 노이즈를 일정부분 상쇄시킬 수 있습니다. 또한 고차원의 데이터도 효율적으로 저장 및 처리가 가능합니다.
강화학습에서는 FA를 정책을 결정하고 환경을 파악하는데에 사용합니다. 환경에 대한 모든 정보를 수집하는 것은 불가능하고, 정해지지 않은 환경에서 어떤 정책을 채택할지 명확하게 주어진 가이드라인이 없기 때문에, 일정부분 근사하여 다음 스텝으로 나아갑니다.

해결책1. Experience Replay Buffer

기존의 Q-Learning에서는 관측치를 생성하고, 즉각적으로 Q function을 업데이트 하는 과정을 반복해서 학습했는데, 이 과정에서 이전의 관측치가 다음 관측치에 영향을 주어 학습이 잘 안되는 문제가 발생했습니다. 다시 말해, sample간에 상관관계가 형성되어 target value가 converge하지 못하고 oscillate할 수 있습니다. 또한, 기존 Q-Learning에서는 업데이트에 사용된 관측치는 1회 사용 후 버려져 데이터를 비효율적으로 사용했습니다.
이를 해결하기 위해 uniform random sampling으로 관측값을 추출하여 데이터간 상관관계를 제거하였고, Replay Buffer에 관측값을 담아두어 이전의 데이터들이 사라지지 않고 Q-Learning 업데이트에 재사용되도록 했습니다.

해결책2. Fixed Q Targets

기존 Q-Learning으로 추정치 Q-value를 예측할 때, 추정치 Q로 NN을 업데이트하면 target에서 Q-value의 가중치(weight)도 같이 업데이트 되므로 target도 변하게 됩니다. 추정치 Q를 target에 수렴하도록 오차를 줄여나가야 하는데, target의 가중치가 같이 변경되어 학습이 비효율적으로 이루어지는 문제가 발생했습니다.
이는 target network와 local network의 업데이트 주기를 다르게 설정함으로써 해결했습니다. 논문마다 적용되는 비율은 상이하지만, 보편적으로 local network가 4번 업데이트 될때마다 target network는 1번 업데이트 하는 방식으로 target의 가중치를 고정합니다.
이는 target network와 local network의 업데이트 주기를 다르게 설정함으로써 해결했습니다. 논문마다 적용되는 비율은 상이하지만, 보편적으로 local network가 4번 업데이트 될때마다 target network는 1번 업데이트 하는 방식으로 target의 가중치를 고정합니다.

3. CartPole

*spyder 환경을 통해 Python 코드를 구현하였습니다.
*Baseline과 DQN 방식 모두 사용하였습니다.
cartpole 게임의 목적은 간단합니다 - 막대의 중심을 잡는 게임입니다. 다음과 같습니다.
goal of Cartpole-v0 game.
Cartpole 게임(Cartpole-v0)은 OpenAI에서 강화학습 실험용도로 제공되는 알고리즘으로, cart를 agent로 하여 +1, -1의 action을 취하게 됩니다 (+1 : 좌, -1 : 우). 위 gif에서 cart는 지면과 맞닿아 움직이는 물체이고, pole은 cart에 수직으로 연결된 막대 입니다.
Pole이 수직 상태를 유지하는 행동에 대해 +1의 보상(reward)가 주어지며, Pole이 기울어지는 방향의 반대 방향으로 cart를 이동하도록 학습됩니다. 이때, pole의 기울기 변화량에 따른 cart의 이동량은 exploration을 통해 학습하게 됩니다.
위 게임의 최종 목표는 pole이 넘어지지 않도록 하는 것입니다. 즉, 총 보상을 최대화하는 정책을 학습합니다.
한 에피소드는 다음의 경우에 종료됩니다
pole이 지면에 수직인 축에 대하여 15도 이상 기울어졌을 경우
cart가 시작 지점으로부터 2.4 단위만큼 이동했을 경우

Baseline

1. 패키지 설치 및 하이퍼파라미터 튜닝

import gym import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.distributions import Categorical # Hyperparameters learning_rate = 0.0002 gamma = 0.98
Python
복사
Hyperparameters
learning_rate: 학습률
gamma: Expectation Reward 계산 시 존재하는 Discount Factor, 0~1사이의 값을 가집니다. 1에 가까운 값은 미래에 받을 보상에 집중하고, 0에 가까우면 현재 보상에 충실한 것으로 해석할 수 있습니다.

2. Policy 클래스 정의하기

class Policy
__init__ 함수
초기값을 설정해 주는 함수입니다.
data는 리스트 형태, []로 들어옵니다.
input data가 들어오면, 첫번째 Fully Connected layer를 만나게 되는데, dimension이 4로 들어와 128로 출력하는 fc1를 정의합니다.
마찬가지로, input값이 128이고 output 차원이 2인 fully connected layer, fc2를 정의합니다.
fc1과 fc2를 지난 데이터는 최적화 과정으로 Adam Optimizer를 사용합니다.
forward 함수
데이터 x가 fc1을 거치고, 활성화 함수 relu를 거친 후, fc2를 통과해 0과 1사이의 값으로 나타내는 softmax함수를 지나갑니다.
put_data 함수
기존의 data리스트에 새로운 데이터를 추가하는 함수입니다.
train_net 함수
역전파 과정을 의미합니다.
처음 리워드는 0으로 지정합니다.
본격적인 역전파를 시작하기 전에, gradients를 0으로 만들어주고 시작합니다. (역전파 과정 중에서 gradients값들이 계속 더해지기 때문)
각 상태별 보상을 이용해 Expected Return 값을 계산합니다. R=r+γRR=r+\gamma *R (R: discounted reward의 총합, r은 현재 상태의 보상)
손실함수를 정의하고, 역전파 시행합니다.

3. main함수

직접 실행되는 코드
def main()
gym 패키지를 이용해 env라는 게임환경을 만들어줍니다.
policy는 위에서 정의한 Policy() 클래스를 활용합니다.
총 만 번 에포크를 시행하면서 학습합니다.
에포크가 시행되 기 전, 환경을 리셋하는 상태를 만들어줍니다.
현재 env의 상태를 나타내는 porb를 정의합니다.
prob의 확률 분포를 갖는 객체(m)을 정의한 뒤, 특정 인덱스(행동, action)을 추출합니다.
추출된 행동이 현재 환경에서 시행되었을 때 next_state, reward, done, info값을 정의합니다.
data에 reward(현재)와 특정행동을 하였을 때 확률을 추가하고, score에 현재 reward를 더한 후 ,다음 단계로 진행합니다.

결과

epoch가 진행될 수록 score 성능 향상됨을 보여줍니다.

DQN

source_code

학습 과정 영상

*용량문제로 영상을 10초 이내로 생성할 수밖에 없는 점 양해부탁드립니다.

4. 뱀 게임

뱀 게임 규칙

뱀 게임은 1970년대에 처음 등장해서 지금까지 다양한 형태의 변종이 존재합니다. 이번 프로젝트에서는 강화학습의 효과를 쉽게 확인하기 위해서 간단한 형태의 뱀 게임 환경을 구현하겠습니다. 우리의 뱀 게임은 다음과 같은 규칙을 따라 진행됩니다.
m×n 크기의 필드가 주어집니다. 각 칸은 비어 있거나 장애물, 먹이, 혹은 뱀의 일부로 이루어져 있습니다. 뱀은 하나의 실 형태로 존재합니다.
뱀은 일정 시간마다 앞, 왼쪽, 오른쪽 방향 중 하나를 선택해 움직입니다. 이때, 몸통 부분은 고정되어 있고 머리 부분이 늘어나고 꼬리 부분이 줄어듭니다.
뱀이 장애물 혹은 자신의 몸통에 부딪히거나 필드 밖으로 나가면 게임이 종료됩니다.
뱀이 먹이에 닿으면 길이가 증가합니다. 이때, 먹이는 빈 칸 중 하나에 무작위로 생성됩니다.
게임의 목표는 뱀을 최대한 길어지게 만드는 것입니다. 이를 위해서 뱀이 자신의 몸통과 장애물을 피해가면서 먹이를 많이 먹을 수 있도록 이동하는 전략이 필요할 것입니다.
agent의 이동 방향

1. Snake-game _ numpy

Pygame 모듈을 이용하여 Snake Game을 구현하였습니다.

numpy를 제외한 ML관련 라이브러리는 사용하지 않습니다.

해당 코드는 Deep Learning 없이 numpy로 최적값을 업데이트 하는 코드입니다.

evolution.py / genome.py / snake.py
evolution.py
genome.py
snake.py

시연 영상.

generation 271 - Best Fitness 410
generation 816 - Best Fitness 410
generation 1467 - Best Fitness 410

2. Snake-game _ Deep Q-Learning

pygame 모듈 사용
snake_game.py / agent.py / model.py / plot.py
snake_game.py
agent.py
model.py

시연 영상.

# of games : 364
# of games : 2110
# of games : 4103