관찰 (Observations)

매번 임의의 행동 (action)을 하는 것보다 게임을 더 잘하고 싶다면, 우리의 행동이 게임 환경에 정확히 무엇을 하는지 이해하고 있어야 합니다.

게임 환경 (env)의 step() 함수는 우리가 필요로 하는 것을 반환하는데, 정확히는 관찰, 보상, done, info 라는 네 개의 값을 반환하게 됩니다. 각각에 대한 설명은 아래와 같습니다.

1. 관찰 (observation) (object): 환경에 대한 관찰을 나타내는 객체이며, 환경에 따라 달라집니다. 예를 들어, 카메라에서 얻어지는 픽셀값, 로봇 연결부의 각도 또는 속도, 그리고 보드 게임의 상태같은 것들이 될 수 있습니다.

2. 보상 (reward) (float): 이전의 행동을 통해 얻어지는 보상의 양. 그 크기는 환경에 따라 달라지지만 목표는 언제나 보상의 총량을 높이는 것입니다.

3. done (boolean): 환경을 reset 해야할지 나타내는 진리값입니다. done=True 라면 에피소드가 종료되었음을 나타냅니다.

4. info (dict): 디버깅에 유용한 진단 정보이며, 때때로 학습에 있어서 유용합니다. (예를 들어, 환경의 마지막 상태 변화를 위한 확률 같은 정보가 될 수 있습니다.) 하지만 학습에 있어서 에이전트가 공식적인 평가에 이것을 사용할 수는 없습니다.


아래의 그림은 일반적인 ‘에이전트-환경’ 사이의 반복 과정을 나타낸 것입니다.

각 시간 스텝마다 에이전트는 행동을 선택하고, 환경은 관찰값과 보상을 반환합니다.


_images/aeloop.svg

에이전트-환경의 반복.


이 과정은 reset() 함수를 호출함으로써 시작하는데 이 때 첫 관찰과 반환이 이루어집니다.

예제1 - observation

import gym

env = gym.make('CartPole-v0')
observation = env.reset()

print(observation)
[ 0.02358474  0.02489212 -0.04537435 -0.0449337 ]

각 에피소드를 시작할 때, 첫번째 관찰 observation = env.reset()을 통해 반환되는 값은 순서대로

[카트의 위치, 카트의 속도, 막대기의 각도, 막대기의 회전율] 입니다.


예제2 - action

import gym

env = gym.make('CartPole-v0')
observation = env.reset()
action = env.action_space.sample()

print(action)
0

env.action_space.sample()는 게임 환경에서 선택할 수 있는 행동 (action_space) 중 하나의 값을 샘플링합니다.

언제나 0 또는 1의 값을 출력함을 확인할 수 있습니다.


예제3 - step

import gym

env = gym.make('CartPole-v0')
observation = env.reset()
action = env.action_space.sample()
step = env.step(action)

print('First observation:', observation)
print('Action:', action)
print('Step:', step)
First observation: [ 0.02012    -0.0454016  -0.01061782 -0.04912093]
Action: 1
Step: (array([ 0.01921197,  0.14987098, -0.01160024, -0.34513487]), 1.0, False, {})

env.step()은 action을 선택했을 때, (observation, reward, done, info)를 반환합니다.

샘플링된 행동은 1이고, 그때의 observation인 [ 0.01921197, 0.14987098, -0.01160024, -0.34513487]을 확인할 수 있습니다.

한 시간 스텝 당 보상 1이 주어집니다. 그리고 아직 에피소드가 종료되지 않았음을 알 수 있습니다.

행동 0과 1이 각각 카트에 어느 방향으로 힘을 가하는지 확인해보세요.


마지막으로, env.step()이 반환하는 done 값을 잘 확인해서 코드를 더 효율적으로 작성할 수 있습니다.

코드는 아래와 같습니다.

예제4 - Finish if done

import gym

env = gym.make('CartPole-v0')

for i_episode in range(20):
  observation = env.reset()                   # First observation

  for t in range(100):                        # For 100 time steps
      env.render()
      print(observation)
      action = env.action_space.sample()      # Take a random action
      observation, reward, done, info = env.step(action)

      if done:                                # Finish the episode if done
          print('Episode finished after {} timesteps'.format(t+1))
          break
env.close()
[ 0.05610716  1.13613895 -0.07447961 -1.69986611]
[ 0.07882993  0.94195011 -0.10847693 -1.43126714]
[ 0.09766894  0.74832139 -0.13710228 -1.17436095]
[ 0.11263536  0.94493242 -0.1605895  -1.50669197]
[ 0.13153401  0.75208082 -0.19072334 -1.26814729]
Episode finished after 13 timesteps
[ 0.02393135  0.00940266 -0.01094674  0.00955947]
[ 0.0241194   0.20467988 -0.01075555 -0.28655709]
[ 0.028213    0.00971296 -0.01648669  0.00271431]
[ 0.02840726 -0.18516872 -0.01643241  0.29015023]

20회의 에피소드와 각 에피소드에서 100 시간 스텝 동안 게임을 진행합니다. 위의 결과값을 보면, 13 시간 스텝 만에 에피소드가 종료되었음을 알 수 있습니다.

아래와 같은 화면을 볼 수 있습니다.



이전글/다음글

다음글 :