- 강화학습 시작하기 (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
첫번째 알고리즘¶
CartPole 게임을 더 잘하기 위해서 우리의 알고리즘을 적용해볼 수 있습니다.
그전에 우선 CartPole 게임에서 하나의 행동이 정확히 어떤 영향을 미치는지 다시 한 번 확인해봅니다.
앞에서도 설명했듯이 취할 수 있는 행동은 오직 0과 1입니다.
예제1 - 행동 0의 효과¶
1 2 3 4 5 6 7 8 9 10 | import gym
env = gym.make('CartPole-v0')
observation = env.reset()
print(observation)
observation, reward, done, info = env.step(0)
print(observation)
env.close()
|
[ 0.00766095 -0.04000024 0.02519945 -0.0459994 ]
[ 0.00686094 -0.2354743 0.02427946 0.25452646]
observation의 값은 각각 [카트의 위치, 카트의 속도, 막대기의 각도, 막대기의 회전율] 을 나타냅니다.
env.step()에 0을 입력하면, 카트의 속도가 왼쪽 방향으로 증가하고 막대기의 회전율이 오른쪽으로 기우는 방향으로 변했습니다.
행동 0은 카트에 왼쪽 방향으로 힘을 가하는 것을 알 수 있습니다. 행동 1은 오른쪽 방향으로 힘을 가합니다.
예제2 - 행동 0을 반복¶
1 2 3 4 5 6 7 8 9 10 11 12 13 | import gym
from gym.wrappers import Monitor
env = gym.make('CartPole-v0')
env.reset()
for i in range(10):
env.render()
observation, reward, done, info = env.step(0)
print(observation, done)
if done:
break
env.close()
|
[-0.03793191 -0.23736549 0.0445555 0.2800849 ] False
[-0.04267922 -0.43309376 0.05015719 0.58648092] False
[-0.05134109 -0.628881 0.06188681 0.89453248] False
[-0.06391871 -0.82478512 0.07977746 1.20600922] False
[-0.08041442 -1.02084216 0.10389765 1.52258913] False
[-0.10083126 -1.21705447 0.13434943 1.84581146] False
[-0.12517235 -1.41337713 0.17126566 2.17702177] False
[-0.15343989 -1.60970224 0.21480609 2.51730735] True
행동 0을 반복적으로 수행하면 카트의 속도는 왼쪽 방향으로 증가하면서, 막대기의 각도가 수직에서 오른쪽으로 증가하는 것을 알 수 있습니다.
막대기의 각도가 12도, 즉 0.20944보다 커졌을 때, done=True가 되면서 에피소드가 종료됩니다.
이 과정은 아래의 영상과 같습니다.
예제3 - 행동 1을 반복¶
1 2 3 4 5 6 7 8 9 10 11 12 13 | import gym
from gym.wrappers import Monitor
env = gym.make('CartPole-v0')
env.reset()
for i in range(10):
env.render()
observation, reward, done, info = env.step(1)
print(observation, done)
if done:
break
env.close()
|
[-0.02082118 0.23393106 -0.02717276 -0.34714004] False
[-0.01614256 0.42942876 -0.03411557 -0.64826615] False
[-0.00755398 0.62500897 -0.04708089 -0.95149378] False
[ 0.0049462 0.82073184 -0.06611076 -1.25858944] False
[ 0.02136083 1.0166345 -0.09128255 -1.57122391] False
[ 0.04169352 1.21271955 -0.12270703 -1.89092674] False
[ 0.06594791 1.40894161 -0.16052557 -2.21903212] False
[ 0.09412675 1.60519166 -0.20490621 -2.55661463] False
[ 0.12623058 1.80127914 -0.2560385 -2.90441439] True
행동 0을 반복적으로 수행하면 카트의 속도는 오른쪽 방향으로 증가하면서, 막대기의 각도가 수직에서 왼쪽으로 증가하는 것을 알 수 있습니다.
막대기의 각도가 -12도, 즉 -0.20944보다 커졌을 때, done=True가 되면서 에피소드가 종료됩니다.
이 과정은 아래의 영상과 같습니다.
예제4 - 첫번째 알고리즘¶
첫번째 알고리즘을 시도해봅시다.
만약 막대기가 오른쪽으로 기울어져 있다면, 즉 observation[2] > 0 이라면 오른쪽으로 힘을 가하고, 그렇지 않다면 왼쪽으로 힘을 가하도록 해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import gym
from gym.wrappers import Monitor
env = gym.make('CartPole-v0')
observation = env.reset()
for i in range(100):
env.render()
# 알고리즘1:
# 막대기가 오른쪽으로 기울어져 있다면, 오른쪽으로 힘을 가하고
# 그렇지 않다면, 왼쪽으로 힘을 가하기.
if observation[2] > 0:
action = 1
else: action = 0
observation, reward, done, info = env.step(action)
print(observation, done)
if done:
print(i+1)
break
env.close()
|
[-0.02904037 0.20052606 0.04294506 -0.2595151 ] False
[-0.02502985 0.39500947 0.03775476 -0.53834927] False
[-0.01712966 0.58958087 0.02698777 -0.81890112] False
[-0.00533805 0.78432324 0.01060975 -1.10297486] False
[ 0.01034842 0.97930403 -0.01144974 -1.39231037] False
[ 0.0299345 0.78432649 -0.03929595 -1.10322938] False
[ 0.04562103 0.58974284 -0.06136054 -0.82312928] False
[ 0.05741589 0.39551159 -0.07782313 -0.55035939] False
[ 0.06532612 0.20156404 -0.08883031 -0.2831755 ] False
[ 0.0693574 0.00781398 -0.09449382 -0.01977808] False
[ 0.06951368 -0.18583473 -0.09488938 0.24165927] False
[ 0.06579698 -0.37948219 -0.0900562 0.5029681 ] False
[ 0.05820734 -0.5732271 -0.07999684 0.76596706] False
[ 0.0467428 -0.7671618 -0.0646775 1.03244478] False
[ 0.03139956 -0.96136662 -0.0440286 1.304141 ] False
[ 0.01217223 -1.15590341 -0.01794578 1.58272317] False
[-0.01094584 -1.35080731 0.01370868 1.86975617] False
[-0.03796198 -1.15583786 0.05110381 1.5813597 ] False
[-0.06107874 -0.96136004 0.082731 1.3050418 ] False
[-0.08030594 -0.76737879 0.10883184 1.03936029] False
[-0.09565352 -0.57385793 0.12961904 0.78272984] False
[-0.10713068 -0.38073299 0.14527364 0.53347393] False
[-0.11474534 -0.18792074 0.15594312 0.28986248] False
[-0.11850375 0.00467364 0.16174037 0.05013815] False
[-0.11841028 0.1971514 0.16274313 -0.18746571] False
[-0.11446725 0.38961622 0.15899382 -0.42471269] False
[-0.10667493 0.58217089 0.15049956 -0.66335419] False
[-0.09503151 0.77491424 0.13723248 -0.90512111] False
[-0.07953322 0.96793771 0.11913006 -1.15171439] False
[-0.06017447 1.16132121 0.09609577 -1.40479226] False
[-0.03694805 1.35512766 0.06799992 -1.665952 ] False
[-0.00984549 1.54939575 0.03468088 -1.9367041 ] False
[ 0.02114242 1.74413048 -0.0040532 -2.21843641] False
[ 0.05602503 1.54904743 -0.04842193 -1.92700588] False
[ 0.08700598 1.35447683 -0.08696204 -1.64972256] False
[ 0.11409552 1.16047224 -0.1199565 -1.38534996] False
[ 0.13730496 0.96703281 -0.14766349 -1.13245864] False
[ 0.15664562 0.77411939 -0.17031267 -0.88949304] False
[ 0.17212801 0.58166671 -0.18810253 -0.65482089] False
[ 0.18376134 0.38959245 -0.20119895 -0.42676815] False
[ 0.19155319 0.1978037 -0.20973431 -0.20364245] True
41
41회의 시간 스텝 동안 에피소드가 종료되지 않았습니다.
하나의 행동을 반복해서 선택했을 때와 비교해서 실력이 꽤 많이 향상된 것을 알 수 있습니다.
이 과정은 아래의 영상과 같습니다.