Frozen Lake?
Frozen Lake는 RL의 hello world와 같은 환경입니다.
게임은 굉장히 간단합니다. 4x4의 환경이 설치됩니다. (0,0) 시작지점에서 (3,3)까지 agent가 이동을 하면 게임이 종료됩니다.
이 때 환경에는 구덩이(H)가 있을 수 있습니다. 그 구덩이를 피해서 목표지점(3,3)까지 이동해야합니다.
구덩이(H)에 빠질경우 캐릭터는 죽게됩니다.
(이 각각의 칸을 우리는 state라고 부르죠.)
agent는 상하좌우 4개의 action을 할 수 있습니다. 그런데 이 action에 따라 원하는 방향으로 이동하지는 않습니다. 왜냐하면 얼음이기 때문에 미끄러져 다른 state로 이동할 수 있기 때문이죠. 위 예에서 출발을 할 때 아래로 가고 싶어 아래로 이동을 명령하였는데 미끄러져 오른쪽으로 이동할 수도 있다는 뜻입니다.
만약 미끄러진다는 문제가 없었다면 구덩이에 reward를 (-)로 주어 굉장히 쉽게 문제를 해결할 수 있습니다.
하지만, 미끄러지는 상황이 있다면 어떻게 해결해야할까요?
$pip install gym
gym이 설치되어 있지않다면 설치를 하여주세요!
간단한 코드
import gym
env = gym.make("FrozenLake-v1",new_step_api=True) # is_slippery = False
- gym이라는 라이브러리에 있는 FrozenLake를 사용하고자 합니다.
- gym.make로 FrozenLake 환경을 생성할 수 있습니다.
- new_step_api는 step에 대한 새로운 정보를 주도록 하는지에 대한 설정 여부입니다.(뒤에서 설명하겠습니다.)
- is_slippery는 값을 주지 않았을 때 default로 True입니다. 만약 False를 준다면 agent는 미끄러지지 않게 됩니다.
env.observation_space
# Discrete(16)
- state에 대한 정보입니다.
- discrete한 16개의 state가 있습니다.
env.action_space
# Discrete(4)
- action에 대한 정보입니다.
- discrete한 4개의 action(상,하,좌,우)가 있습니다.
env.P[0][2]
환경의 액션에 대한 정보를 담고 있습니다. env.P[0][2]는 환경중 0(P[0])번째 환경(시작지점)을 의미하고 이 때 2번째 action(오른쪽 이동)을 취하는 것에 대한 다음 이동에 대한 정보입니다.
말이어려우니 결과로 알아보죠.
위 결과는 다음과 같이 나옵니다.
[(0.3333333333333333, 4, 0.0, False),
(0.3333333333333333, 1, 0.0, False),
(0.3333333333333333, 0, 0.0, False)]
리스트 형태로 나옴을 알 수 있죠.
이 때 앞에서부터 transition probability, 다음 위치, reward, 종료여부 입니다.
transition probability는 미끄러지는 확률입니다.
다음 위치는 다음 state의 번호를 의미합니다.
종료여부는 구덩이나 종료지점으로 도달했으면 True, 아니면 False가 됩니다.
다음 위치를 보면 0,1,4입니다. 0의 위치에서 시작했죠. 미끄러져서 아무곳도 못갈 수 도 있죠. 그 때가 0이 됩니다. 그리고 안 미끄러져서 오른쪽으로 갈 수도 있겠죠. 그게 1입니다. 마지막으로 미끄러져서 밑으로 갈수도 있어요. 그게 4가 됩니다. 그렇게 될 확률이 전부 약 0.33으로 균등함을 알 수 있죠.
이 결과가 리스트로 3개가 나오는 이유는 미끄러질 수 있기 때문입니다. P는 해당 환경에서의 action에 대한 다음 상태에 대한 정보를 주는 것이기 때문에 모든 경우의 수가 나오게 되는 것입니다. 만약 환경에서 미끄러지지 않게 설정했다면 하나의 action에 따라 한가지 다음 state정보만 제공하였을 것 입니다.
env.reset()
환경을 초기화 해줍니다.
env.render()
환경을 실행시켜 줍니다.
env.step(2)
환경에서 2(오른쪽이동) 액션을 취해주는 결과를 얻습니다.
그 결과를 보도록 하겠습니다.
(0, 0.0, False, False, {'prob': 0.3333333333333333})
결과 값이 다음과 같이 나왔습니다. 앞에서부터 (이동한 위치, reward, termination, truncation, info)를 얻습니다.
미끄러져서 자신의 원래 위치로 이동한 상태임을 알 수 있습니다.
여기서 termination과 truncation만 알아보도록 하겠습니다. 둘 다 종료되었음을 의미합니다.
하지만 게임이 어떻게 종료되었느냐에 따라 다릅니다.
만약 게임이 정상적으로 진행되어 구덩이에 빠지거나 최종목적지에 도달하였다면 termination이 True, Truncation은 False가 됩니다.
그리고 게임이 만약에 비 정상적으로 Frozen Lake기준 50번 진행이 되었다면 Time적으로 종료를 시켜줍니다. 그 때는 Truncation이 True, termination이 False가 됩니다.
(Truncation을 보여주기 위해서 환경을 make할 때 new_step_api를 True로 만들어준 것 입니다.)
env.action_space.sample()
수행할 수 있는 action 중에서 random하게 하나 뽑아줍니다.
다음 글에서는
이번 시간에는 간단하게 Frozen Lake와 구현을 위한 기본적인 코드와 환경을 보는 방법을 배웠습니다.
다음 시간에는 Frozen Lake를 강화학습하는 방법을 소개하고 직접 학습해보겠습니다.
'Artificial intelligence > Etc' 카테고리의 다른 글
[Error] hdbscan 패키지 설치 에러 (0) | 2023.01.02 |
---|---|
Attention - Query, Key, Value의 의미? (1) | 2022.09.24 |
Object Detection의 개요 (0) | 2022.07.30 |
모델 평가(Evaluation) (0) | 2022.07.12 |
Sklearn 라이브러리를 활용하여 데이터 전처리하기 (0) | 2022.07.08 |