강화 학습(Reinforcement Learning)

강화학습 CartPole 예제 구글 Colab으로 이렇게? 여기서부터?

coding art 2022. 2. 5. 15:46
728x90

Frozen Break 에 이은 강화학습(reinforcement learning) 예제는 CartPole 이다.  이는 밸런싱 로봇과 같이 폴대를 넘어뜨리 않도록 하부의 대차를 적절히 움직여야 하는 PID 제어공학적 문제로 알려져 있으나 강화학습에서는 PID 제어와 같은 개념을 사용하는 것이 아니라 Cost  함수를 설정하고 최소화 해 나가는 과정일 것이다.

이 블로그 내용은 인터넷 사이트에 올려둔 구글 Colab 코드 즉 GymRendering.ipynb (https://colab.research.google.com/drive/16gZuQlwxmxR5ZWYLZvBeq3bTdFfb1r_6#scrollTo=6L4YayzR4FYj)를 불러 그대로 실행해 보는 것으로 한다.

 

게임에서의 Reinforcement Learning 알고리듬은 Frozen Break든 CartPole 이든 아래 그림과 같이 마르코프연쇄(Markov Chain) 문제로 볼 수 있다. 즉 상태 St에서 현재 보상 Rt 를 가진  Agent 가 action At를 취하하여 Environment에 입력하면 Environment는 세로운 상태 St+1과 보상(reward) Rt+1 을 제공하게 된다. 즉 (St, Rt)->Agent->At->Environment->(Rt+1,St+1)->Agent 가 되풀이 되게 되며 loop 가 지속되게 될 경우 최종적인 게임 승리 상태로 접근해야 할 것이다.

코드 특징 중의하나로서 겉보기에 tensorflow 를 불러 학습시키지 않는 간단한 코드인듯하므로 CartPole 코드 구조를 연구하는 시발점으로 보면 좋을 것이다.

한편 Environment에서 제공하는 observation 을 출력해보면 4개의 숫자 데이터를 포함하는 리스트이며 그 내용은 다음과 같다. [카트의 위치, 카트의 속도, 막대기의 각도, 막대기의 회전율] 

따라서 GymRendering.ipynb 코드를 일부 수정하여 observation을 출력해 보자. 빨간색 코드를 추가하면 된다.

아울러 매회 loop 마다 done을 출력하여 False에서 True 로 바뀌는 시점을 관찰해보자.

#xvfb 설치

!apt-get install -y xvfb python-opengl > /dev/null 2>&1

gym 설치
!pip install gym pyvirtualdisplay > /dev/null 2>&1
 
#헤더 영역 라이브러리 import
import gym
import numpy as np
import matplotlib.pyplot as plt
from IPython import display as ipythondisplay
from pyvirtualdisplay import Display
 
#디스플레이 선언
display = Display(visible=0, size=(400300))
display.start()
 
#gym 코드
observation = []
env = gym.make("CartPole-v0")
env.reset()
prev_screen = env.render(mode='rgb_array')
plt.imshow(prev_screen)

for i in range(50):
  action = env.action_space.sample()
  #action은 출력해 보면 항상 0 아니면 1이다.
  obs, reward, done, info = env.step(action)
  screen = env.render(mode='rgb_array')
  observation.append(obs)
  print(done)
 
  plt.imshow(screen)
  ipythondisplay.clear_output(wait=True)
  ipythondisplay.display(plt.gcf())

  if done:
    break
    
ipythondisplay.clear_output(wait=True)
env.close()
print(observation)
 

다음은 observation 출력 결과이다.for loop  범위가 50회인데 10여회 출력이 되어 끝났다는 것은  done 조건이 만족되었다는 의미이다. done 조건이 어떤 경우에 만족되는지 알아보도록 하자.

[array([-0.00606309, -0.19403451, -0.04254987, 0.30064545]), 

array([-0.00994378, -0.38852497, -0.03653696, 0.5796112 ]), 

array([-0.01771428, -0.19291056, -0.02494474, 0.27564594]), 

array([-0.02157249, -0.3876679 , -0.01943182, 0.56035807]), 

array([-0.02932584, -0.58251181, -0.00822466, 0.84685617]), 

array([-0.04097608, -0.7775206 , 0.00871247, 1.13694144]), 

array([-0.05652649, -0.97275543, 0.03145129, 1.43234399]), 

array([-0.0759816 , -1.16825105, 0.06009817, 1.73468756]), 

array([-0.09934662, -0.97386391, 0.09479193, 1.46129148]), a

rray([-0.1188239 , -0.78002316, 0.12401776, 1.19966281]), 

array([-0.13442436, -0.58670439, 0.14801101, 0.94827961]), 

array([-0.14615845, -0.39385177, 0.1669766 , 0.70552009]), 

array([-0.15403549, -0.59084528, 0.18108701, 1.04576392]), 

array([-0.16585239, -0.39852825, 0.20200228, 0.81495446]), 


array([-0.17382296, -0.20666026, 0.21830137, 0.59199 ])]

 
 

Under Construction ,,,