본문 바로가기
개념공부/강화학습(Reinforcement Learning)

강화학습 5 <Policy-based RL의 시작 : REINFORCE>

by Zach Choi 2021. 12. 26.
728x90
반응형

MDP를 푸는 강화학습 방법은 'Value based RL'과 'Policy based RL'로 분류 가능하다. 'Value based RL'에는 바로 이전에 학습한 DeepSARSA, Table 저장 방식을 사용하고 환경을 모를 때 적용 가능한 SARSA, Q-Learning을 포함한다. 그 이유는  Value function(Q function 포함)을 기반으로 행동을 선택하고, 이를 업데이트 하면서 학습하기 때문이다. 

 

금일 정리하는 내용은 'Policy-based RL'이라 지칭한다. 그 이유는 Policy를 학습하고 이를 기반으로 행동하기 때문이다. Policy라는 단어 의미와 이 문장이 잘 연결되지 않는데, 기존의 Value function 학습- 행동 결정 으로 이어지는 과정 전체를 인공신경망으로 치환한것으로 이해하는게 더 직관적이다. 즉, 'Policy based RL'에서는 인공신경망의 입력으로 상태(state)가 입력되면 행동(action)을 출력한다. 

 

# 인공신경망을 구성할 때 Value-based function 방식의 출력층은 Activation function으로 ReLU를 사용한다. 이는 Q함수를 출력해야 하므로 0 이상의 값을 출력하는 ReLU를 선택한것이다. Policy-based function 방식은 출력층의 Activation function으로 Softmax를 사용한다. 이는 행동 별 확률(0부터 1까지의 값)을 출력하고, 각 행동 별 확률 총합을 1로 만들기 위함이다. 

 

  • Policy-Gradient

Policy-based 방식은 Policy를 인공신경망으로 근사해 업데이트한다. 이를 위해 Policy의 성능을 판단할 수 있는 기준인 목표함수를 설정하고, 인공 신경망의 가중치에 대한 Gradient를 계산해서, Gradient Ascent 방법을 활용해 정책을 최적화 하는 방법이다. 즉, Policy-based 방식은 목표 함수를 최대화하는 인공신경망의 가중치를 학습하는 것이다. 학습 방식은 gradient로 이루어지며, 목표 함수는 비용이 아닌 점수(score)이므로 경사 상승방식이 사용된다. 이를 수식으로 표현하면 아래와 같다.

 

$$  정책=\pi_{\theta}(a|s),\,\, maximize\, J(\theta),\,\, \theta_{t+1} = \theta_{t} + \alpha\triangledown_{\theta}\,J(\theta) $$ 

 

목표함수 J 는 MDP 문제에서 보상의 최대 합이다. 이는 정의 상 초기 state에서의 value function과 동일하다. 따라서 목표함수의 Gradient는 다음과 같이 표현 가능하다.

 

$$ J(\theta)\,=v_{\pi_{\theta}}(s_{0}),\,\, \triangledown_{\theta}\,J(\theta)\,=\,\triangledown_{\theta}v_{\pi_{\theta}}(s_{0}) $$

 

목표함수 J의 Gradient를 계산하기 위해선 state value function의 Gradient를 계산해야 한다. 하지만 이를 Numeric 하게 계산하기에는 인공신경망 모델에 가중치 개수가 많으면 비효율적이다. 그리고 state value function이 식 자체로 미분가능하지 않다. 그래서 Policy Gradient Theorem에 의해 식을 아래와 같이 정리한다.

 

\begin{align}
\triangledown_{\theta}\,J(\theta)\,&=\,\triangledown_{\theta}v_{\pi_{\theta}}(s_{0})\\
&=\sum_s d_{\pi_\theta}(s)\,\sum_a \triangledown_{\theta}\pi_{\theta}(a|s)q_{\pi}(s,a)\\
&=\sum_s d_{\pi_\theta}(s)\,\sum_a \pi_{\theta}(a|s)  \times  \frac{\triangledown_{\theta}\pi_{\theta}(a|s)}{\pi_{\theta}(a|s)} \\
&=\sum_s d_{\pi_\theta}(s)\,\sum_a \pi_{\theta}(a|s) \times \triangledown_{\theta}\,log\pi_{\theta}(a|s)q_{\pi}(s,a)\\
&=E_{\pi_\theta}[\triangledown_{\theta}\,log\pi_{\theta}(a|s)q_{\pi}(s,a)]
\end{align}

 

위 식 전개는 '파이썬과 케라스로 배우는 강화학습, 이웅원 저 196p ~ 198p 및 Policy Gradient Methods for Reinforcement Learning with Function Approximation - Richard Sutton' 을 참고하자 

 

위 식에서 목표함수의 Gradient는 기댓값으로 정리됐다. 저번학습에서 기댓값을 직접 계산하기 어려운 경우, 이를 샘플링으로 대체하는 방법인 Monte Carlo 방법을 배웠다. 이를 여기에 적용한다. 그럼 Gradient Ascent 식은 다음과 같이 정리 된다.

 

\begin{align}
\theta_{t+1} &= \theta_{t} + \alpha \triangledown_{\theta}\,J(\theta) \\
& \approx \theta_{t} + \alpha[\triangledown_{\theta}log\pi_{\theta}(a|s)q_{\pi}(s,a)]\\
& \approx \theta_{t} + \alpha[\triangledown_{\theta}log\pi_{\theta}(a|s)G_{t}]
\end{align}

 

위 2번째 수식에서 특정 상태 및 행동에 대한 Q함수 값이 필요하다. 그런데 Policy-based 방식은 Q함수와 행동을 통째로 인공신경망으로 치환하는 방법이다. 그래서 Q함수를 알지 못한다. 따라서 Q함수를 '적절히' 근사할 수 있는 다른 함수로 치환하는 것이 포인트이다. 어떻게 하면 '정확하게' Q함수를 치환할 수 있을까는 지금까지 연구 되어온 주제이다. 그 중 Q함수를 반환 값 G_t로 대체하는 방법이 있다. 이 방법을 REINFORCE 알고리즘이라고 한다. 이 치환이 가능한 이유는, Q함수의 정의가 특정 state에서 특정 action을 취했을 때 얻는 반환 값의 기댓 값이기 때문이다. 위 수식 중 가장 마지막 수식이 REINFORCE 방법을 의미한다. REINFORCE 알고리즘은 에피소드가 끝날 때마다 반환값을 사용해 인공신경망을 업데이트 하므로, Moneta Carlo Policy Gradient로도 지칭한다. 

 

REINFORCE 알고리즘을 코드로 구성할때는 몇가지 주의할 점이 있다.

1. 목적 함수의 근사 식은 크로스 엔트로피 형태이다. 이에 대한 이해는  '파이썬과 케라스로 배우는 강화학습, 이웅원 저 207p ~ 208p'를 참고하자.

2. REINFORCE 알고리즘은 Gradient Ascent 방식이므로 업데이트 시 부호가 + 이다.

 

REINFORCE 방식은 매 에피소드마다 반환 값을 사용해 가중치를 업데이트 한다. 따라서 Monte Carlo 방식과 동일하게 높은 variance를 가진다는 단점이 있다. 그래서 이를 낮추기 위해 아래와 같은 연구가 진행되었다.

 

1. 기존 REINFORCE : 데이터 별 업데이트 = 에피소드에서 여러개의 반환값 존재 시, 반환값 수만큼 개별 업데이트

2. 한 에피소드에서 발생한 반환 값을 총합하여 한번에 업데이트 = 에피소드 별 업데이트 한번

$$ \theta_{t+1} = \theta_{t} + \alpha[ \sum_{t=1}^T \triangledown_{\theta}\,ln\pi_{\theta}(A_{t}|S_{t})G_{t} ] $$

3. 여러 에피소드에서 발생한 반환 값을 총합하여 한번에 업데이트 = 여러 에피소드에서 업데이트 한번

$$\theta_{t+1} = \theta_{t} + \alpha[ \frac{1}{N}  \sum_{i=1}^N\sum_{t=1}^T \triangledown_{\theta}\,ln\pi_{\theta}(A^{(i)}_{t}|S^{(i)}_{t})G^{(i)}_{t} ]$$

2-3번 방식을 Batch 방식이라고 하는데, 3>2>1 번 순서로 업데이트 횟수 대비 빠르게 학습이 완료됨을 알 수 있다. (에피소드 수 대비가 아닌 업데이트 횟수 대비)

 

4. 그 밖에도 반환 값을 에피소드 별 반환 값을 모아 표준화(정규화, 표준편차 구해서)한 값을 사용하는 방법도 있다. 그러면 variance가 적어질 수 있다. ex) Ep1 G_t 값 :  10, 50, 100 / Ep2 G_t 값 : -10, -20, -50  보다 표준화한 Ep1 G_t 0.1, 0.5, 1 / Ep2 G_t 값 : -0,1, -0.2, -0.5 가 variance가 더 적음을 알 수 있다.  그런데 이러면 기댓값을 의미하는 G_t 값이 정규화된 값으로 학습되는거 아닌가? 이래도 학습이 되나? 크로스엔트로피의 의미 상 문제가 없나?

5. Q함수의 variance를 줄이기 위해 Q 함수 대신 (Q함수 - b(s))를 사용하고 이러한 방식을 baseline 방식이라 한다. b(s)를 어떻게 설정해주는지가 주요 연구 주제이다.

728x90
반응형