강화학습 개념정리(1) - 강화학습 정의, state, observation, action space, policy, trajectory, reward, return

JTDK·2021년 7월 17일
3

RL from zero to hero

목록 보기
1/7
post-custom-banner

Intro

최근 몇개월 RL공부를 하다보니, 기본적인 용어나 개념이 헷갈리는 경우가 종종 있어서
이참에 기본부터 개념정리를 싹 하고자 한다. 본 글은 OpenAi Spinning Up - Introduction to RL을 바탕으로 작성하였다.

아마 RL을 정말로 처음 접하는 사람들에게는 어려운 글이 될것같다. 데이비드 실버 선생님의 강의 혹은 그에 준하는 기본 개념 강의를 다 듣고 난 후, 배운 개념을 명확하게 정리하는데 도움이 되면 좋겠다.

한마디로 RL이 뭔데

RL(Reinforcement Learning, 강화학습)은 Agent가 시행착오를 통해서 보상을 극대화 하는 방향으로 학습하는것을 말한다.

예를들어 축구를 잘하는 Agent(이하 슛돌이)를 만들고 싶다고 할때, 일단 슛돌이를 축구장에 풀어놓고 마음대로 행동하게 놔둔다. 슛돌이는 처음에 무작위로 여러가지 행동을 할것이다. 드리블, 역주행, 핸들링, 자살골, 슛 등등을 할건데, 이 중 좋았던 행동(ex/ 골 넣기, 정주행 드리블)에 대해서는 보상(reward)을 줘서 강화하고, 나빳던 행동(자살골, 핸들링, 역주행등)에 대해서는 체벌(?)을 해서 약화시킨다면 슛돌이는 점점 좋은 행동만 하게끔 학습 될것이다. 이러한 방식으로 학습시키는걸 강화학습이라고 한다.

What can RL do?

  • 시뮬레이션이나, Real World 환경에서 로봇제어
  • 바둑이나 Dota2같이 복잡한 게임을 프로게이머 수준으로 플레이 (그 유명한 알파고가 강화학습으로 학습했다)
  • 외 수많은 일들 ㅎㅎ

Key Concepts and Terminology

RL의 핵심은 Agent와 Environment(환경)이다.
Environment는 Agent가 살아가고 상호작용하는 세상이다. 상호작용의 각 단계에서 agent는 Env의 (Possibly partial) observation 을 보고, 어떤 액션을 취할지 정한다. agent가 행동함에 따라서 Env는 바뀌는데, 행동과 관련없이 바뀔수도있다.
Agnet는 env로부터 reward를 받기도 하는데, 여기서 reward는 agent의 action이 얼마나 좋았는지를 말해주는 지표이다. Agent의 목표는 누적보상(cumulative reward)를 극대화하는것이고, 이 누적보상을 Return이라고 부른다.
RL은 이런 Agent의 목표를 달성할 수 있게 해주는 한 방법이다.

비교적 최신 분야인 만큼 용어를 거의 다 영어로 쓰는데, 반드시 알아야 할 Basic Terms를 몇가지 소개한다

  • states and observations
  • action spaces
  • policies
  • trajectories
  • different formulations of return
  • the RL optimization problem
  • value function

states and observations

state는 environment의 현재 상태에 대한 모든 정보를 말한다. 즉 한 step에 있어서 Environment와 State는 동의어이다. 반면 Observation은 state의 부분집합으로 몇몇 정보를 가지고 있지 않을 수 있다.

Deep RL에서 state 와 observation은 vector, matrix, tensor로 표현된다. 예를들어 사진은 픽셀값의 RGB matrix로 표현되고, 로봇의 상태는 (관절의 각도, 가속도)라는 벡터로 표현될 수 있다.

Fully Observed

state와 observation이 같을 때, 이 환경은 fully observed 환경이라고 한다.

Partially Observed

agent가 부분적인 state 밖에 observe 할 수 없을때(즉, state와 observation이 다를때) 이 환경은 partially observed 환경이라고 한다.

실제 논문에서는 딱히 state와 observation을 구별하지않고 쓰는 경우가 많다. 예를들어, action은 엄밀하게 말해서 observation에 의해 정해지지만, state에 따라 정해진다고도 많이 쓴다.

Action Spaces

주워진 환경에서 가능한 모든 action 의 set을 Action Space 라고 한다.

  • Discrete Action Space: 아타리나 바둑같이 액션의 갯수가 유한한 Space
  • Continous Action Space: 자율주행에서의 속력이나, 로봇의 움직임 등 액션의 갯수가 무한한 Space.

이러한 Action Space의 구분에 따라 사용 가능한 Deep RL 알고리즘이 다르다. 예를들어 DQN Discrete Action Space에서만 사용 가능하고, A2C는 둘 다 사용 가능하다.

Policy

Policy는 Agent가 어떤 액션을 취할지 선택하는 정책이다. Policy는 확정적(Deterministic)일 수도 있고, 확률적(Stochastic)일 수도 있다.

  • Deterministic Policy
    각 state에서 취할 액션이 정해져 있다.
    at=μ(st)a_t = \mu(s_t)

  • Stochastic Policy
    각 state에서 취할 액션이 정해져 있지 않고, 확률적이다(ex/ 오른쪽으로 갈 확률 70퍼, 왼쪽으로 갈 확률 30퍼)
    atπ(st)a_t \sim \pi(\cdot|s_t)

Policy는 Agent의 뇌에 해당하는 개념이기 때문에, 논문에서는 종종 Policy와 Agent를 혼용해서 쓴다.
ex/ “The policy is trying to maximize reward.”

Deep RL에서의 정책은 파라미터화 된 뉴럴넷(parameterized NN) 이다. 정책은 state를 인풋으로 받아 수만~수백만개의 파라미터를 거친 뒤, action(혹은 action의 probability distribution)을 아웃풋으로 낸다. 이 파라미터들은 역전파를 통해 보상을 극대화 하는 방향으로 수정된다. 이러한 파라미터를 표현하기 위해 위 수식을 좀 바꿔 at=μθ(st)a_t = \mu_\theta(s_t) 와 같이 쓴다.

Deterministic Policy

pi_net = nn.Sequential(
              nn.Linear(obs_dim, 64),
              nn.Tanh(),
              nn.Linear(64, 64),
              nn.Tanh(),
              nn.Linear(64, act_dim)
            )

obs_dim 을 input으로 받아서, act_dim을 output으로 반환하는 Deterministic Policy in continous space의 예시.

Stochastic Policy

Stochastic Policy(이하 SP) 중 Deep RL에서 가장 많이 쓰이는 두가지는 Categorical Policy 와 Diagonal Gaussian Policy 이다

SP에서 가장 핵심이 되는 연산 두가지는 1)정책으로부터 액션을 샘플링하는것2)그 액션의 log-likelihood 를 계산하는것이다. log-likelihood : logπθ(as)log\pi_\theta(a|s)

  • Categorical Policy는 Discrete Action Space에 쓰인다.
  • Diagonal Gaussian Policy는 Continous Action Space에 쓰인다

Categorical Policy

Categorical Policy는 DL 에서의 Classifier와 굉장히 흡사하다. obs 를 input으로 받고, 액션들의 logit값들을 반환 후 softmax로 probability distribution으로 바꿔준다.

Sampling
확률분포가 주워지면, 파이토치에서는 이를 샘플링 해주는 Module을 제공한다.

Log-Likelihood
앞서 언급했듯이 Categorical Policy 의 맨끝단은 확률분포이므로, 우리는 액션을 indice로 해서 probability 에 접근 할 수 있다. 이게 말이 좀 어려운데... 예를들어 action_prob=[0.7, 0.2, 0.1] 로 나왔고 sampling을 통해서 0번째 인덱스의 값이 선택됐다고(0번째 action이 뽑혔다고) 가정하자(즉, action = 0.) 이럴때 0을 인덱스로 이용해서 action[0] = 0.7 이렇게 접근 가능하다는 너무나 당연한 얘기였따 ㅎㅎ

logπθ(as)=log[Pθ(s)]alog \pi_{\theta}(a|s) = \log \left[P_{\theta}(s)\right]_a

Diagonal Gaussian Policies

이름에서도 알 수 있듯, Diagonal Gaussian Policy는 다분히 수리통계학적인 개념이다. 그러나 RL을 (얕게)이해하는데 있어서 나같은 일반인에게는 수식이 오히려 방해가 되므로, 직관적으로 이해하려고 노력해보자

다변수 정규 분포(Multivariate Normal Distribution)는 평균값(정확하게는 Mean Vector)인 μ\mu와 공분산 행렬(Covariance Matrix) \sum로 표현될 수 있다. 평균이야 직관적으로 뭔지 알겠는데, 공분산 행렬이란건 뭘까?

Covariance Matrix?
공분산 행렬은 다변수 정규 분포에서 각각의 변수들의 상관관계(Correlation)을 나타내기 위한 지표로, 수식으로 표현하면 다음과 같다.

COV(X,Y)=E{(XμX)(YμY)}COV(X,Y) = E\{(X-\mu_X)(Y-\mu_Y)\}

그러나 앞서 언급했듯이 RL에서 쓰이는 COV의 직관적 이해에 초점을 맞추자면, 그냥 분산이라고 생각하면 편하다. 즉 정규분포에서의 분산에 대응되는, '값들이 얼마나 퍼져있는지'에 대한 개념이라고 이해하면 된다. 어떤 정규분포가 평균μ\mu과 분산σ\sigma으로 표현될 수 있듯이, 다변수 정규 분포도 똑같이 평균과 공분산 행렬로 표현 할 수 있는것이다.

다시 본론으로 돌아와서, Diagonal Gaussian Policies는 state(혹은 obs)를 input으로 받아 다변수 정규 분포의 평균값을 아웃풋으로 반환한다. COV를 표현하는 방법에는 두가지가 있다

  • 첫번째 방법
    logσlog\sigma를 Standalone Parameter로 두는 방법. 즉, 뉴럴넷을 거쳐서 계산한 function값이 아니라, 그냥 혼자 존재하는(?) 값으로 두는 방법이다. (VPG, TRPO, PPO에서 이 방법을 사용한다.)

  • 두번째 방법
    평균값처럼 State를 인풋으로 받아 logσlog\sigma를 아웃풋으로 반환하는 뉴럴넷을 만드는 방법이다. mean을 반환하는 NN과 일부 레이어를 공유할 수도 있다.

위 두가지 방법에서 모두 σ\sigma를 직접 구하지 않고 로그값을 반환받는 이유는 σ\sigma의 범위는 양수로 한정되는데 반해 logσlog\sigma의 범위는 (,)(-\infty, \infty)이기 때문이다. 뉴럴넷에 '양수를 반환해야한다'는 제약을 주는것이 학습 성능을 저해하므로 값의 범위가 자유로운 logσlog\sigma를 대신 산출하는 것이다. 제곱만 해주면 바로 σ\sigma값을 얻을 수 있으므로, 우리는 잃는게 없다

Sampling
앞의 방법들로 μθ\mu_\thetaσθ\sigma_\theta를 구했다면, 노이즈값(zN(0,1))z\sim N(0,1))을 더해서 다음과 같이 액션을 샘플링 할 수 있다.

a=μθ(s)+σθ(s)za=\mu_\theta(s)+\sigma_\theta(s)\odot z

노이즈는 torch.normal 등을 통해 생성할 수 있다.

Log-Likelihood
로그 우도는 다음과 같은 수식으로 구할 수 있는데, 복잡한 식이기도 하고 어차피 파이토치가 알아서 해주므로 참고로만 알고 지나가자
logπ(as)=12(i=1k((aiμi)2σ2+2logσi)+klog2π)log\pi(a|s)=-\frac{1}{2}(\displaystyle\sum_{i=1}^{k} (\frac{(a_i-\mu_i)^2}{\sigma^2}+2log\sigma_i)+klog2\pi)

Trajectories

Trajectory τ\tau는 states와 actions의 sequence이다.

τ=(s0,a0,s1,a1,...)\tau = (s_0,a_0,s_1,a_1,...)

가장 처음의 state인 s0s_0start-state distribution 에서 랜덤으로 샘플링 되는데, 이를 수식으로 표현하면 다음과 같다.

s0ρ0()s_0 \sim \rho_0(\cdot)

상태변화(state transition)는 stst+1s_t\rightarrow s_{t+1}로부터 생기는 변화를 의미하는데, 이는 오직 가장 최근의 action인 ata_t에만 의존적이다(MDP의 정의로 부터.)

상태변화는 확정적(Deterministic)일 수도 있고,

st+1=f(st,at)s_{t+1} =f(s_t,a_t)

혹은 확률적(Stochastic)일 수도 있다.

st+1P(st,at)s_{t+1} \sim P(\cdot|s_t,a_t)

위 수식에서의 action은 agent의 policy로 부터 나온다.

Trajectory는 Episode나 rollout이라고도 종종 불린다.

Reward and Return

보상(Reward)은 RL에서 아주 매우 정말 중요한 개념이다. reward rtr_t는 현재 상태 sts_t, 가장 최근의 액션 ata_t, 그리고 다음 상태인 st+1s_{t+1}에 의존적이다.

rt=R(st,at,st+1)r_t = R(s_t,a_t,s_{t+1})

논문이나 실전에서는 단순화해서 rt=R(st)r_t = R(s_t)rt=R(st,at)r_t = R(s_t,a_t) 처럼 종종 쓰이기도 한다.

위에서 언급했듯, Agent의 목표는 한 Trajectory 전체 보상의 합을 극대화 하는것이고, 이때 보상의 합을 Return R(τ)R(\tau)이라고 한다.

리턴의 종류에는 크게 두가지가 있다.

finite-horizon undiscounted return

위에서 말한 직관적인 리턴, 즉 특정 범위 내의 보상의 총합이다.

R(τ)=t=0TrtR(\tau) = \displaystyle\sum_{t=0}^{T}r_t

infinite-horizon discounted return

무한한 Trajectory에서 agent가 얻은 보상과 Discount Fator의 곱의 총합이다.

R(τ)=t=0Tγtrt(0<γ<1)R(\tau) = \displaystyle\sum_{t=0}^{T}\gamma^t r_t(0<\gamma<1)

Discount Factor?
할인계수는 왜 곱하는 걸까? 이에는 두가지 이유가 있다

  • 직관적 이유
    먼 미래의 보상보다 지금의 보상이 더 중요하다(오늘 100만원 받을래 한달후에 101만원 받을래?)
  • 수학적 이유
    무한한 Trajectory에서 보상에 할인계수를 곱해주지 않으면 R(τ)R(\tau)는 발산하고, 계산하기 상당히 어려워 진다. 반면 할인계수를 곱해주면 reward는 점점 줄어들어 결국 R(τ)R(\tau)는 수렴하게 된다.

Conclusion

RL 공부에 필요한 기본 개념의 일부를 정리해봤는데, 혼자 공부하는것과 공개된 장소에 글로 정리해서 올리는것 사이에는 상당한 괴리가 있다는걸 알게 됐다. 아직 마크다운 문법이 익숙하지 않은것도 한몫 했지만 적어도 세배 이상의 시간이 소요된것같다. 그러나 모호하게 알고 있던 개념을 확실히 글로 정리 하므로써 얻는것도 많다. 가능하면 쭉 달려보고싶다 ㅎ

profile
RL, 퀀트 투자 공부 정리
post-custom-banner

0개의 댓글