읽는 중입니다.
목차
약어
•
ML = Machine Learning = 기계학습
•
RL = Reinforcement Learning = 강화학습
머릿말 Preface
예제코드가 있는 GitHub 주소
1. 강화 학습이란 무엇인가? What Is Reinforcement Learning?
강화 학습은 시간 경과에 따른 최적의 결정을 자동으로 학습하는 문제를 다루는 기계학습의 하위 분야입니다.
저자는 강아지를 인식하는 모델을 만들고 여행을 다녀왔는데 강아지 헤어스타일의 유행이 변해서 모델이 동작하지 않는 예를 들면서 모든 ML 문제에는 시간 차원이 숨어있다고 얘기해요. RL은 태생적으로 추가적인 차원(필수는 아니지만, 주로 시간) 을 학습 방정식에 통합하는 접근 방식이에요.
강화 학습 Reinforcement learning
(이 글에 포함되지는 않았지만, 앞에서 지도학습과 비지도 학습을 소개했어요)
RL은 완전한 감독과 미리 정의된 라벨의 완전한 결여 사이의 어딘가에 존재하는 3번째 진영이에요.
저자는 미로를 빠져나가는 로봇 쥐에 대한 예시를 들어요. 로봇 쥐가 “에이전트”고 미로가 “환경”이에요. 로봇 쥐는 환경을 관찰하고 행동을 취해요. 치즈에 가까워지거나 전기 충격에 따라 보상이 주어지고, 로봇 쥐는 보상이 커지는 방향으로 행동을 취하도록 학습하는 방식이에요.
RL의 복잡한 문제 RL’s complications
RL은 기본적으로 에이전트의 행동에 기반하기 때문에, 에이전트가 계속해서 엉뚱한 행동을 한다면 큰 보상을 얻을 방법이 없다고 잘못된 관찰을 할 수가 있어요. ML 용어로 non-i.i.d. 데이터를 갖는다고 표현할 수 있어요. i.i.d는 독립 동일 분포 independent and identically distributed를 의미하고, 대부분의 지도 학습 방법에 필수예요.
에이전트를 삶을 복잡하게 만드는 두 번째 사항은 배운 지식을 활용할 뿐만 아니라, 적극적으로 환경을 탐색해야 한다는 점이에요. 어떻게 하느냐에 따라 결과가 크게 달라질 수 있어요. 탐험을 너무 많이 하면 보상이 심각하게 줄어들 수 있어서, 두 활동의 사이의 절절한 균형점을 찾아야 해요. 저자는 이 탐험/활용 딜레마가 사람에게도 늘 일어나는 일이라고 해요. 아는 곳에서 저녁을 먹을까 괜찮아 보이는 새 레스토랑을 갈까? 와 같은 고민 말이죠.
세 번째 복잡성은 행동과 보상 사이에 심각한 지연이 있을 수 있다는 점이에요. 체스를 예를 들면, 게임 도중의 강력한 한 번의 움직임이 균형을 뒤집을 수 있어요.
RL 형식 RL formalisms
다양한 방법에 대한 게임의 규칙을 알고 이해하는 것은 중요해요. 사전에 많은 시간을 절약할 수 있기 때문이죠. RL에도 이러한 형식이 존재해요.
다음 그림에는 두 개의 주요 엔터티 에이전트와 환경, 그리고 그 둘의 통신 채널들인 행동, 보상, 관찰을 보여줘요.
보상 Reward
환경으로부터 주기적으로 얻는 스칼라 값에 불과해요. 기본적으로 강화라는 용어는 에이전트가 얻는 보상이 긍정적 혹은 부정적 방식으로 자신의 행동을 강화해야 한다는 사실에서 나왔어요. 보상은 지역적이에요. 이는 에이전트가 지금까지 달성한 모든 성공이 아니라 최근 활동의 성공을 반영한다는 의미예요. 에이전트가 달성하려고 하는 것은 일련의 행동을 통해 최대의 누적 보상을 얻는 것이에요.
에이전트 The agent
에이전트는 특정한 행동을 하고, 관찰을 하고, 이에 대한 최종 보상을 받음으로써 환경과 상호작용을 하는 사람 혹은 사물이에요.
환경 The environment
환경은 에이전트 외의 모든 것이에요. 에이전트와 환경 사이의 소통은 보상, 행동, 관찰로 제한돼요.
행동 Actions
행동은 에이전트가 환경 안에서 할 수 있는 것들이에요. RL에서는 구 가지 유형의 행동을 구분해요. 이산 discrete와 연속 continuous예요. 이산 행동은 왼쪽이나 오른쪽으로 이동하는 것과 같이, 에이전트가 할 수 있는 상호 배타적이고 유한한 집합을 형성해요. 연속 행동은 바퀴를 돌리는 차의 행동에 조향 각도나 방향이 있는 것처럼, 행동에 어떤 값을 부여해요.
관찰 Observations
보상이 첫 번째라면, 환경의 관찰은 에이전트를 위한 두 번째 정보채널을 형성해요. 왜 분리된 데이터 소스가 필요한지 궁금할지도 몰라요. 답은 편의성입니다. 관찰은 환경에 에이전트 주위에서 일어나는 일을 에이전트에게 제공하는 정보의 조각이에요.
관찰은 다가오는 보상과 관련이 있을 수도 있고 없을 수도 있어요. 관찰은 심지어 보상 정보를 약간 모호하거나 난독화된 형태로 포함하고 있을 수도 있어요. 컴퓨터 게임 화면의 점수처럼요.
환경의 상태와 관찰을 구분하는 것도 중요해요. 환경의 상태는 잔재적으로 우주의 모든 원자를 포함해서, 환경의 모든 것을 측정할 수 없게 해요.
RL의 이론적 기반 The theoretical foundations of RL
이 섹션에서는 방금 논의한 형식(보상, 에이전트, 행동, 관찰, 환경)의 수학적 표현과 표기법을 소개해요.
마르코프 결정 과정 Markov decision processes
그전에, 마르코프 결정 과정 Markov decision processes (MDPs)을 다룰 건데, 러시아 마트료시카 인형처럼 설명될 거예요. 마르코프 과정 Markov process (MP)의 가장 간단한 형태로 시작해서, 보상으로 확장해서, 마르코프 보상 과정 Markov reward process로 전환할 거예요. 그러고 나서, 행동을 더해서 이 아이디어를 추가 봉투에 넣으면, 우리를 MDP로 이끌어 줄 거예요.
MP와 MDP는 컴퓨터 과학과 다른 엔지니어링 분야에 널리 사용돼요. 그래서, 이 챕터를 읽는 것은 RL 문맥에서뿐만 아니라, 훨씬 더 넓을 범위의 주제에 대해 유용할 거예요.
마르코프 과정 The Markov process
마르코프 가족의 가장 간단한 아이인 MP로 시작하죠. 마르코프 체인 Markov chain으로도 알려져 있어요. 여러분 앞에 관찰만 가능한 어떤 시스템이 있다고 상상해 보세요. 여러분이 관찰한 것은 상태 states라고 하며, 시스템은 어떤 역학 법칙에 따라 상태 간에 전환할 수 있어요.
시스템에 모든 가능한 상태는 상태 공간 state space이라고 하는 집합을 형성해요. MP에서는 이 집합이 유한해야 해요. (하지만 이 한계를 보상하기 위해서 매우 클 수 있어요.) 여러분의 관찰은 일련의 상태 혹은 사슬 chain을 형성해요. 그리고 이 상태의 사슬은 히스토리 history라고 불러요.
그러한 시스템을 MP로 부르기 위해서는, 마르코프 속성 Markov property를 충족할 필요가 있는데, 어느 상태에서의 미래 시스템 역학은 그 상태만을 의존해야 한다는 의미예요. 마르코프 속성의 요점은 시스템의 미래를 설명하기 위해서 관찰 가능한 모든 상태를 스스로 포함하는 거이에요. 즉, 마르코프 속성은 시스템의 상태가 서로 구별 가능하고 고유할 필요가 있어요. 이 경우, 시스템의 미래 역할을 모델링 하기 위해 하나의 상태만 필요하고 전체 히스토리나 마지막 N 개의 상태는 필요하지 않아요.
저자는 맑은 날, 비 오는 날의 상태를 가진 날씨 예제로 설명을 해요. 스템 모델이 마르코프 속성을 준수하므로 N × N 크기의 제곱 행렬인 전이 행렬 transition matrix을 사용하여 전이 확률을 나타낼 수 있어요. 여기서 N은 모델의 상태 개수예요. 이 행렬의 행 i와 열 j에 있는 각 성분은 상태 i에서 상태 j로 전이할 시스템의 확률을 포함해요.
MP의 공식적인 정의는 다음과 같아요.
•
시스템이 있을 수 있는 상태 (S)의 집합
•
시스템의 역학을 정의하는 전이 확률이 있는 전이 행렬 (T)
MP의 유용한 시각적 표현은 시스템 상태와 에지에 해당하는 노드가 있는 그래프이며, 상태에서 상태로의 가능한 전환을 나타내는 확률을 레이블로 갖고 있어요.
마르코프 속성은 고정성을 암시한다는 것을 주목할 필요가 있어요. (즉, 어떤 상태에 대한 기본 전이 분포는 시간에 따라 변하지 않아요.) 비고정성은 시스템 역학에 영향을 주는 어떤 숨겨진 요소가 있다는 걸 의미하며, 이 요소는 관찰에 포함되지 않아요. 하지만 이는 전이 히스토리에 상관없이 같은 상태에 대해서 기본 전이 확률이 같아야 한다는 마르코프 속성에 위배돼요.
마르코프 보상 과정 Markov reward process
보상을 도입하기 위해 MP 모델을 조금 확장해야 해요. 우선, 상태에서 상태로의 전이에 값을 추가해야 해요. 이미 확률을 가지고 있어서 (확률은 시스템의 역학을 포착하는 데 사용되고 있지만) 추가 부담 없이 추가로 스칼라 숫자를 가질 수 있어요.
두 번째로 모델에 추가할 것은 할인율 γ (감마)이고, 0에서 1 (포함) 사이의 단일 숫자예요.
모든 에피소드에 대해, 시점 t에서의 반환값을 다음과 같은 양으로 정의해요.
모든 시간 지점에 대해서, 이어지는 후속 보상의 합으로 반환을 계산하지만, 더 먼 보상은 시작점 t에서 멀리 있는 단계만큼 거듭제곱으로 올린 할인율로 곱해집니다. 감마가 1이면, 반환 는 후속 보상의 합과 같고 에이전트는 모든 후속 보상에 대한 완벽한 가시성을 갖게 돼요. 감마가 0이면, 는 후속 상태 없는 즉각적인 보상이 되고 절재적인 근시안이 돼요. 대부분 감마는 0.9나 0.99와 같이 그 사이 값으로 정해져요.
이 반환 양은 실용적이지는 않아요. 마르코프 보상 과정에서 관찰되는 모든 개별 체인에 대해 정의되었기 때문이에요. 같은 상태에 대해서도 매우 다를 수 있어요. 하지만, 극단으로 가서 (많은 수의 체인을 평균화함으로써) 어떤 상태의 반환에 대한 수학적 기댓값을 계산한다면, 훨씬 더 유용한 양을 얻을 수 있고, 이를 상태의 값이라고 해요.
해석은 간단해요. 모든 상태 s에 대해서, 값 V(s)는, 마르코프 보상 과정에 따라서 얻는 평균 (혹은 기대) 반환이다.
( 원문에서는 실제 예를 들어서 이 상태의 값을 구하는 과정을 설명해요. 그 과정에서 감마 1을 쓴다면 상태의 전이가 무한히 반복될 수 있음을 보여주며, 그것이 감마의 도입 이유 중에 하나라고 합니다. )
행동 추가 Adding actions
우선, 유한한 행동의 집합 (A)을 추가해야 해요. 이것이 에이전트의 행동 공간 action space이에요. 두 번째, 전이 행렬을 행동으로 조절할 필요가 있으며, 행렬에 한 차원을 더해야 하고, 결국 큐브가 돼요.
정사각형 행렬일 때는 모든 원본 상태가 확률의 리스트를 포함했다면, 큐브일 때는 깊이 차원에서 행동의 리스트를 갖는 행렬을 포함하게 돼요.
저자는 이렇게 많은 복잡함을 더하는 이유를 로봇의 예를 들어서 설명해요. 현실 세계는 완벽하지 않아서 ‘앞으로 가는’ 행동을 하더라도 바퀴가 미끄러져서 로봇이 제자리에 있을 확률이 10% 생길 수 있죠. 이 모든 세부사항을 포착하기 위해서 일반적인 MDP (마르코프 결정 과정)는 원본 상태, 행동, 대상 상태의 3차원 전이 행렬을 갖는다고 해요.
이제, 공식적으로 정의된 MDP를 가지고, MDP와 RL에서 가장 중요한 것을 다룰 준비가 되었어요. 바로 정책 policy입니다.
정책 Policy
정책의 간단한 정의는 에이전트의 행동을 제어하는 어떤 규칙의 집합이에요. RL에서 에이전트의 주목표는 가능한 많은 보상을 받는 거예요. 그리고, 다른 정책은 다른 양의 보상을 줄 수 있기에, 좋은 정책을 찾는 것이 중요해져요. 정책의 개념이 중요한 이유에요.
공식적으로, 정책은 모든 가능한 상태에 대한 행동에 대한 확률 분포로 정의돼요.
에이전트의 행동의 무작위성을 도입하기 위해서 구체적인 행동이 아닌 확률로 정의돼요. 책의 뒤쪽에서 왜 이것이 중요하고 유용한지 설명한다고 해요.
2 OpenAI Gym
이 챕터의 끝에서는 다음과 같은 것들을 이해할 수 있어요.
•
에이전트를 RL 프레임웍에 연결해 넣기 위해 구현해야하는 고수준의 요구사항
•
무작위 RL 에이전트의 기본적인 순수 파이썬 구현
•
Open AI 짐
에이전트의 해부 The anatomy of the agent
간단한 상황에 대해서 에이전트와 환경을 파이썬으로 구현하는 방법을 살펴볼게요. 에이전트의 행동에 관계없이, 제한된 수의 단계에 대해 무작위의 보상을 주는 환경을 정의할 거예요.
class Environment:
def __init__(self):
self.steps_left = 10
Python
환경을 초기화 하는 코드이고, 유일한 상태는 에이전트에게 남아있는 시간 단계를 제한하는 카운터뿐이에요.
def get_observation(self) -> List[float]:
return [0.0, 0.0, 0.0]
Python
get_observation() 메소드는 현재 환경의 관찰을 에이전트에게 반환해요.
def get_actions(self) -> List[int]:
return [0, 1]
Python
get_actions() 메소드는 에이전트가 실행가능한 행동의 집합을 물어볼 수 있게 해요. 보통 실행 가능한 행동의 집합이 시간에 따라 변하지 않지만, 어떤 행동들은 다른 상태에서 불가능해질 수 있어요. 우리의 단순한 예제에서는, 정수 0과 1로 인코딩된 두가지 행동만 할 수 있어요.
def is_done(self) -> bool:
return self.steps_left == 0
Python
이 메소드는 에이전트의 에피소드가 끝났음을 알려줘요.
def action(self, action: int) -> float:
if self.is_done():
raise Exception("Game is Over")
self.steps_left -= 1
return random.random()
Python
action() 메소드는 환경의 기능 중에 중심 부분이에요. 에이전트의 행동을 처리하고 행동에 대한 보상을 반환해요.
이제 에이전트 부분을 볼게요. 생성자와 한 단계를 수행하는 메소드만 갖고 있어요.
class Agent:
def __init(self):
self.total_reward = 0.0
Python
생성자에서, 에피소드 동안에 에이전트가 얻은 전체 누적 보상을 보관할 카운터를 초기화해요.
def step(self, evn: Environment):
current_obs = env.get_observation()
actions = env.get_actions()
reward = env.action(random.choice(actions))
self.total_reward += reward
Python
step 함수는 환경 인스턴스를 인자로 받아들이고 에이전트가 다음의 행동을 수행하게 해요.
•
환경을 관찰
•
관철에 기반하여 수행할 행동을 결정
•
행동을 환경에 제출
•
이번 단계의 보상을 받기
마지막 조각은 이 두 개의 클래스를 생성하고 에피소드를 실행하는 접착제 코드에요.
if __name__ == "__main__":
env = Environment()
agent = Agent()
while not env.is_done():
agent.step(env)
print("Total reward got: %.4f" % agent.total_reward)
Python
앞에 나온 코드는 이 책의 GitHub 리포지토리에서 찾을 수 있어요. https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition에 Chapter02/01_agent_anatomy.py 파일이에요.
RL 모델의 기본 개념을 보여주기 위해서 간단하게 만든 예제이지만, 복잡한 물리 모델을 따르는 환경이나 거대한 신경망의 에이전트를 구현하더라도 패턴을 동일할 거에요.
패턴이 같기 때문에 이미 구현된 프레임웍을 사용할 수 있어요. 그 얘기를 더 하기 전에, 개발 환경을 준비해봐요.
하드웨어와 소프트웨어 요구사항 Hardware and software requirements
이 책의 예제는 파이썬 3.7을 사용해 구현하고 테스트 했어요. 여러분이 가상환경과 같은 컨셉과 언어에 이미 친숙하다고 가정할 거에요.
이 책에서 사용할 외부 라이브러리는 오픈소스이고, 아래와 같아요.
•
NumPy: 과학 계산 라이브러리. 행렬 연산과 일반 함수를 구현.
•
OpenCV Python bindings: 컴퓨터 비전 라이브러리로 이미지 프로세싱 함수를 제공.
•
Gym: RL 프레임웍으로 다양한 환경과 통일된 방식으로 통신할 수 있음.
•
PyTorch: 유연하고 표현력이 뛰어난 딥 러닝 (DL) 라이브러리. 3장에서 짧은 크래시 코스 제공.
•
PyTorch Ignite: PyTorch에서 동작하는 고차원 도구 집합으로 보일러 플레이트 코드를 줄여줌. 3장에서 가볍게 다룸. 전체 문서는 여기: https://pytorch.org/ignite/
•
PTAN (https://github.com/Shmuma/ptan): 만든 Gym의 오픈 소스 확장으로 저자가 현대적인 딥 RL 방법과 빌딩 블록을 지원하기 위해 만들었음.
이 책의 상당 부분은 최근 몇 년간 개발된 현대적인 딥 RL 방식에 초점을 맞추고 있어요. 딥 러닝은 계산량이 매우 높기 때문에 CPU보다는 GPU를 사용할 것을 추천한다고 해요.
이 책에 나오는 외부 의존 라이브러리의 정확한 버전을 아래와 같아요.
atari-py==0.2.6
gym==0.15.3
numpy==1.17.2
opencv-python==4.1.1.26
tensorboard==2.0.1
torch==1.3.0
torchvision==0.4.1
pytorch-ignite==0.2.1
tensorboardX==1.9
tensorflow==2.0.0
ptan==0.6
Python
이 책의 모든 예제는 PyTorch 1.3으로 작성하고 테스트 했어요. http://pytorch.org 웹사이트의 설치 방법을 따라서 설치할 수 있어요. (보통, conda install pytorch torchvision -c pythorch 명령이에요.)
특히 처음 접하는 개발환경에서 공부할 때는, 예제가 사용한 언어와 라이브러리 버전을 정확하게 맞추는 것이 시간을 버는 길입니다!
The OpenAI Gym API
Gym이라는 파이썬 라이브러리는 OpenAI(www.openai.com)가 개발하고 관리해요. Gym의 주 목적은 통일된 인터페이스를 사용해서 RL 실험을 위한 풍부한 환경 모음을 제공하는 것이에요. 그래서 이 라이브러리의 중심 클래스가 Env라고 하는 환경이라는 건 놀라운 일이 아니죠. 높은 수준에서, 모든 환경은 이런 정보 조각과 기능성을 제공해요.
•
환경 안에서 실행을 허용하는 행동의 집합. 이산과 연속 행동을 모두 지원. 그 둘의 조합도 지원.
•
환경에 에이전트에 제공하는 관찰의 모양과 경계.
•
행동을 수행하는 step()이라는 메소드. 현재의 관찰, 보상, 에피소드의 종료 여부를 반환.
•
reset() 메소드. 환경을 초기 상태로 돌리고 첫번째 관찰을 얻음.
이제 환경의 이런 요소들을 자세히 얘기해 봅시다.