- 강화학습 시작하기 (CartPole 게임)
- 환경 (Environments)
- 관찰 (Observations)
- 공간 (Spaces)
- 첫번째 알고리즘
- 첫번째 뉴럴 네트워크
- 강화학습 (Reinforcement Learning)
- Q-learning
- Deep Q-learning
- Epsilon-greedy 정책
- 첫번째 훈련
- Epsilon의 영향
- Python Tutorial
- NumPy Tutorial
- Matplotlib Tutorial
- PyQt5 Tutorial
- BeautifulSoup Tutorial
- xlrd/xlwt Tutorial
- Pillow Tutorial
- Googletrans Tutorial
- PyWin32 Tutorial
- PyAutoGUI Tutorial
- Pyperclip Tutorial
- TensorFlow Tutorial
- Tips and Examples
관찰 (Observations)¶
매번 임의의 행동 (action)을 하는 것보다 게임을 더 잘하고 싶다면, 우리의 행동이 게임 환경에 정확히 무엇을 하는지 이해하고 있어야 합니다.
게임 환경 (env)의 step()
함수는 우리가 필요로 하는 것을 반환하는데, 정확히는 관찰, 보상, done, info 라는 네 개의 값을 반환하게 됩니다. 각각에 대한 설명은 아래와 같습니다.
관찰 (observation)
(object): 환경에 대한 관찰을 나타내는 객체이며, 환경에 따라 달라집니다. 예를 들어, 카메라에서 얻어지는 픽셀값, 로봇 연결부의 각도 또는 속도, 그리고 보드 게임의 상태같은 것들이 될 수 있습니다.보상 (reward)
(float): 이전의 행동을 통해 얻어지는 보상의 양. 그 크기는 환경에 따라 달라지지만 목표는 언제나 보상의 총량을 높이는 것입니다.done
(boolean): 환경을 reset 해야할지 나타내는 진리값입니다. done=True
라면 에피소드가 종료되었음을 나타냅니다.info
(dict): 디버깅에 유용한 진단 정보이며, 때때로 학습에 있어서 유용합니다. (예를 들어, 환경의 마지막 상태 변화를 위한 확률 같은 정보가 될 수 있습니다.) 하지만 학습에 있어서 에이전트가 공식적인 평가에 이것을 사용할 수는 없습니다.아래의 그림은 일반적인 ‘에이전트-환경’ 사이의 반복 과정을 나타낸 것입니다.
각 시간 스텝마다 에이전트는 행동을 선택하고, 환경은 관찰값과 보상을 반환합니다.
이 과정은 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 시간 스텝 만에 에피소드가 종료되었음을 알 수 있습니다.
아래와 같은 화면을 볼 수 있습니다.