본문 바로가기

머신러닝

[강화학습 LR] 1. Cartpole 예제 돌려보기

728x90

안녕하세요 강화학습으로 다시 돌아왔습니다. 

 

오늘은 가장 기본 예제인 Cartpole 예제를 작동시켜볼겁니다. 

 

Cartpole 이 뭐냐면 바로이겁니다.

 

https://gymnasium.farama.org/environments/classic_control/cart_pole/

 

Gymnasium Documentation

A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)

gymnasium.farama.org

카트 위에 막대를 쓰러뜨리지 않게 하는 게임입니다.

 

우선 이 게임을 하기 전에 지난 시간에 올린 강화학습의 요소를 잠깐만 보고 가자면

 

1. 환경

2. 행동(액션)

3. 점수

 

가 있습니다. 정해진 환경에서 특정한 행동을 취했을 때 점수를 가장 높게 하는 것

 

위에 문서를 들어가보시면 세세한 정보가 디테일하게 나와있겠지만 이 카트폴 게임에 대한 대략적인 조건들만 나열을 해보면

 

 

(환경) 4가지 조건에 따라서 카트는 제멋대로 움직입니다. 카트의 위치, 카트의 가속도, 막대의 각도, 막대의 각속도

 

(행동) 우리는 각 step마다 카트를 왼쪽으로 밀지 오른쪽으로 밀지 정할 수 있습니다. 

 

(점수) 점수는 오랫동안 기둥을 유지하는 것이 목표기 때문에 step을 진행할 때마다 +1점씩 부여됩니다.

 

 

처음에 주어진 환경에 임의의 값이 랜덤하게 주어지고 우리는 step마다 행동을 취할 수 있습니다. 이렇게 해서 제일 오래 버티게되면 점수가 높게 나오겠죠?

 

자 그럼 여기서 종료 조건은 다음과 같습니다.

 

1. 극 각도가 12도 이상 클때

2. 카트 위치가 +- 2.4 보다 클때 (카트의 위치가 오른쪽이랑 왼쪽 밖으로 나가버렸을 때)

3. 500점이상 얻었을때

 

자 이런 조건을 가지고 코드를 한번 볼까요?

 

 

* 첫번째 예시 코드에선 우선 제대로 gym 라이브러리를 가져오는지 확인하기 위해서 종료조건을 넣지 않았습니다.

 

 

사용한 환경은

python 3.8.10 

gym 0.26.2

tensorflow 2.3.1 

tensorflow-docs 0.0.0.dev0  버전입니다.

 

이 tensorflow-docs를 어떻게 설치하냐고 궁금해하실 분들은 pip로 직접 git에 들어가서 설치하셔야합니다.

!pip install git+https://github.com/tensorflow/docs

 

지난 시간에 구축한 주피터 노트북을 활용합시다.

import tensorflow as tf

import gym

max_steps_per_episode = 200

render_env = gym.make("CartPole-v1", render_mode='rgb_array')

gym라이브러리에서 Cartpole-v1버전을 가져옵니다.

 

from IPython import display as ipythondisplay
from PIL import Image

def render_episode(env: gym.Env, max_steps: int): 
  state, info = env.reset()
  state = tf.constant(state, dtype=tf.float32)
  screen = env.render()
  images = [Image.fromarray(screen)]
 
  for i in range(1, max_steps + 1):
    state = tf.expand_dims(state, 0)
    #     action_probs, _ = model(state)    
#     action = np.argmax(np.squeeze(action_probs))
    action = 1 # 오른쪽으로 가속
        
    state, reward, done, truncated, info = env.step(action)
    state = tf.constant(state, dtype=tf.float32)

    # Render screen every 10 steps
    if i % 1 == 0:
      screen = env.render()
      images.append(Image.fromarray(screen))
  
    if done:
        pass
#       break
  
  return images

에피소드를 작성해주는데 이게 중요합니다. gym버전이 바뀌어서 예전에는 저 env.step()부분에 대한 리턴값이 4개여서 인수가 맞지 않다는 에러가 계속떴는데 버전을 맞춰주고 나서는 해결됐습니다.

해당 코드에 대한 해석은 대략적으로 for문을 돌면서 위에 action을 오른쪽으로 +1만큼 주고 매 스탭마다 image를 저장하는 코드입니다. 원래 코드는 done (종료조건) 이되면 break지만 테스트기때문에 한 번 이미지가 저장되는 것 까지 보고 갑시다.

 

images = render_episode(render_env, max_steps_per_episode)
image_file = 'cartpole-v1.gif'
# loop=0: loop forever, duration=1: play each frame for 1ms


images[0].save(
    image_file, save_all=True, append_images=images[1:], loop=0, duration=1)

저장된 이미지를 gif파일로 저장하는 코드입니다.

 

 

import tensorflow_docs.vis.embed as embed
embed.embed_file(image_file)

저장된 gif를 불러와봅시다.

액션에서 +1만 줬기때문에 카트가 오른쪽으로만 움직이는걸 확인할 수 있습니다.

 

 

 

그럼 이문제를 해결하기 위해 제가 사용한 예제를 봐볼까요?

 

https://github.com/tensorflow/docs-l10n/blob/master/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb

 

GitHub - tensorflow/docs-l10n: Translations of TensorFlow documentation

Translations of TensorFlow documentation. Contribute to tensorflow/docs-l10n development by creating an account on GitHub.

github.com

 

저는 해당 예제를 그대로 실행해봤습니다. 

 

해당 예제를 그대로 실행해보면. 다음과같은 결과를 얻을 수 있습니다.

 

 

 

다음시간엔 간단한 아타리 게임 예제를 가져와보겠습니다. 감사합니다.

반응형

'머신러닝' 카테고리의 다른 글

[강화학습 LR] 0. python 가상환경 구성하기  (0) 2023.01.26