요즘은 A3C 같은 것을 많이 사용한다고 하지만, DQN도 나름 구현하기도 쉽고, 베이스 코드 설명이 쉬워서 DQN으로 gym 에 있는 내용들로 강화학습 하는 내용을 간단하게 공유합니다.
gym과 python 환경
DQN 이 무엇인가
DQN으로 Cart-Pole 학습하기
올려놓은 yaml 파일은 제가 학습 시킬 때 사용했던 anaconda 의 enviroment 입니다
해당 파일대로 anaconda 환경을 구축하고 싶으시다면
conda env create -f universe2.yaml # 이 명령어로 yaml파일 내용의 환경 구성
conda activate universe2 # 이 명령어로 universe2 환경 사용
이렇게 생긴 게임이고, 왼쪽으로 이동할거냐, 오른쪽으로 이동할거냐 하는 입력을 받을 수 있는 게임입니다.
cartpole 을 직접 플레이 해보고 싶다면 해당 링크로 웹에서 플레이 가능합니다.
우선은 CartPole 의 게임의 상태 공간과, 가능한 행동, 보상이 어떻게 이루어지는지를 확인해 보겠습니다.
사진에서 보는 것 처럼
가능한 Action 은 (0, 1) 로 두가지 이고
관측 공간의 행렬의 크기는 4입니다. 4 가지의 변수가 들어온다는 것인데요,
(카트의 위치, 카트의 속도, 막대의 각도, 막대의 각속도) 네 가지의 형태로 들어온다는 것을 알았습니다.
그리고 보상은 단순히 버틴 시간이 길 수록 더 큰 보상을 주고 있습니다.
마지막으로 게임이 종료되는 것은,
강화학습을 할 때 필요한 정보는
위 세가지를 알아야 합니다. 자 위에 있는 내용을 보고 위 1,2,3 에 대한 답을 내릴 수 있겠죠?
그렇다면 우리는 강화학습을 할 준비가 된 것입니다.
이제부터 코드를 섞어서 완성해가면서 설명 해 드리겠습니다.
import gym
import torch
import torch.nn as nn
import torch.optim as optim
import random
import math
import matplotlib
import matplotlib.pyplot as plt
from collections import namedtuple, deque
우선 필요한 패키지를 전부 import 해 줍니다.
env = gym.make('CartPole-v1', render_mode="human")
env.action_space.seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
다음으로는 환경을 세팅 해 줘야합니다.
render_mode="human"
이면 우리가 볼 수 있는 게임 화면이 나온다고 생각하시면 됩니다.
저 argument 를 빠뜨리면 게임 화면은 안 나와요 (화면이 출력은 되지 않지만 게임 자체는 구동이 되고 있는 상태가 됩니다.)
다음 상태공간에 seed를 주입해주고, torch가 gpu를 사용할 수 있는지, 없는지를 체크해서 gpu를 쓸 수 있다면 gpu를 cpu를 써야한다면 cpu를 device 에 저장합니다.
torch에서는 gpu를 명시할 때 cuda
라고 명시 합니다. gpu 번호까지 명시하고 싶다면 cuda:0
과 같이 쓰면 됩니다.
다음으로는 namedtuple 을 사용해서 우리가 사용할 데이터셋의 형식을 지정하겠습니다.
DataSegment = namedtuple('DataSegment', ('state', 'action', 'next_state', 'reward'))
각 항에는 상태 / 행동 / 다음 상태 / 보상
네 가지의 항목이 들어갑니다.
Q-Network, Deep-Q-Network 둘 다 우선 지금 현재 에이전트가 처해있는 상태에서 어떤 행동을 했고, 그게 다음 상태로 어떻게 변경이 됐는지가 필요하기 때문에 같이 저장합니다.
namedtupled 은 특별히 다른 기능이 있는 것은 아니고, 일반적인 tuple 처럼 사용 할 수 있지만, 가독성과 유지보수를 하기 쉽다는 장점이 있어서 자주 사용됩니다.