[CS285] 8. Deep RL with Q-Functions

Date:     Updated:

카테고리:

태그:

💡 이 글은 『2024 PseudoLab 전반기 강화학습팀』으로 진행되었으며, CS285 Fall 2023를 따라 정리했습니다.


1. Q-learning in practice

7장에서 Q-learning의 간단한 형태를 다뤘다. Online Q-learning algorithm을 다음과 같이 나타낼 수 있다.

여기서 두 가지 문제가 있다. 첫 번째는 correlated samples 문제이다. 즉, Q-learning에서 얻게 되는 sequential한 state들은 서로 매우 연관성이 높다. 따라서 $(s_i, a_i, s_i ^ \prime, r_i)$ 쌍을 연속적으로 얻는 동안 유사한 정보를 계속해서 얻게 된다. 이는 iid 가정을 위반하게 되어 학습을 방해한다. 두 번째는 target value가 항상 변한다는 점이다. 7장에서 본 것처럼 $y_i$의 gradient가 반영되지 않음에도 불구하고 $y_i$는 $\phi$에 의해 변하기 때문에 수렴성에 문제가 생긴다. 첫 번째는 replay buffer를 사용하여 해결하고, 두 번째는 target network를 사용하여 해결한다.


1.1. Replay Buffers

Sequential states가 서로 연관성이 높다는 문제를 해결하기 위해 replay buffer를 사용한다. 즉 아래 그림과 같이 특정 policy를 사용하여 $(s_i, a_i, s_i ^ \prime, r_i)$ 쌍을 저장하고, 이를 무작위로 배치 단위로 사용하는 것이다.

이를 알고리즘으로 작성하면 다음과 같다.

이때 $K=1$을 주로 사용하지만, $K$가 더 큰 경우가 더 효과적이라고 한다. 이처럼 replay buffer를 사용하면 correlated sample 문제를 해결할 수 있다. 또한 배치 단위로 학습을 진행하므로 low-variance gradient를 얻을 수 있다는 장점이 있다.


1.2. Target Networks

이제 두 번째 문제인 target value가 항상 변한다는 점을 해결해보자. 아이디어를 얻기 위해, 최적화 관점에서는 양극단에 있다고 할 수 있는 Q-learning과 fitted Q-iteration을 비교해보자.

Q-learning은 one gradient step 이후 바로 $y_i$를 업데이트하기 때문에 수렴이 잘 되지 않고 불안정(unstable)하다. 반면 fitted Q-iteration은 $y_i$를 업데이트하기 전에 여러 번의 gradient step을 거치기 때문에(여기서는 argmin으로 표현하였음) 수렴이 잘 되고 안정적(stable)이다. 다만 우리는 계속 변할 target value에 Q-function을 수렴시킬 필요까지는 없고, 학습의 안정성(stability)만을 원한다. 이를 위해 target network를 사용한다. 즉, 일정 학습 기간동안은 target value에 사용하는 target network parameter $\phi ^ \prime$를 고정시킨 채로 사용한다.

이때 $K=1 \sim 4$, $N=10000$ 정도로 설정한다. 이러한 방법을 사용하면, inner loop에서는 마치 supervised regression과 같이 $\phi$를 업데이트할 수 있고, 따라서 안정적인 학습이 가능하다.

Classic DQN(Deep Q-Network)은 이것의 특별한 형태라고 할 수 있다. 즉 $K=1$인 Q-learning과 같다고 할 수 있다.

한편, alternative target network를 사용하면 더욱 안정적인 학습이 가능하다. $\phi^ \prime$가 $N$ step마다 업데이트되므로 업데이트 직후에 얻은 target value는 거의 현재의 $\phi$에 의해 얻은 것과 같지만 업데이트 직전에 얻은 target value는 $\phi$와 $\phi^ \prime$ 사이의 lagging이 있을 수 있다. 이를 해결하기 위해 Polyak averaging 등을 사용하면 모든 step에서 동일한 정도로 lagging을 줄 수 있다. 즉, classic DQN의 5번째 단계를 다음과 같이 바꾸는 것이다.

\[\phi^ \prime \leftarrow \tau \phi^ \prime + (1 - \tau) \phi\]

일반적으로 $\tau = 0.999$ 정도로 설정한다.


2. Generalized Fitted Q-iteration

이제 지금까지 배운 내용을 통합해보자. 지금까지의 online Q-learning, DQN, fitted Q-iteration은 모두 유사한 방법이며, 아래와 같은 그림으로 표현할 수 있다.

Process 1은 policy를 가지고 샘플 $(s_i, a_i, s_i ^ \prime, r_i)$를 얻는 것이다. Process 2는 현재 parameter $\phi$로 target parameter $\phi^ \prime$를 업데이트하는 것이다. Process 3은 Q-function regression을 진행하는 과정이다. 각 알고리즘에서 이 과정이 어떻게 진행되는지 이해해보자.

먼저 online Q-learning의 알고리즘을 보면 다음과 같다.

즉 Process 1을 사용하여 1개의 샘플만 저장하는 replay buffer를 사용하고, Process 2와 3을 동시에 진행한다. 따라서 이 방식은 Process 1, 2, 3이 같은 속도로 진행되는 알고리즘이다.

다음으로 DQN의 알고리즘을 보면 다음과 같다.

이 경우 데이터를 얻는 Process 1과 Q-function regression을 진행하는 Process 3은 같은 속도로 진행되지만, target network parameter $\phi^ \prime$를 업데이트하는 Process 2는 느리게 진행된다. 이러한 방식을 사용하면 $\phi^ \prime$를 업데이트하는 과정에서 supervised regression과 같은 안정성을 얻을 수 있다.

마지막으로 fitted Q-iteration의 알고리즘을 보면 다음과 같다.

3, 4번 과정은 argmin의 과정을 SGD로 풀어서 나타낸 것이다. 이 알고리즘은 Process 1 내부에서 Process 2가 작동하고, Process 2 내부에서 Process 3이 작동하는 방식이다. 즉 1보다는 2가, 2보다는 3이 더 빠르게 진행된다.

이 모든 것은 결국 각 process를 어느 속도(rate)로 설정할 것인가의 차이이다. 이러한 rate를 어떻게 설정하느냐에 따라 알고리즘의 stability를 결정할 수 있다.


3. Improved Q-learning

3.1. Double Q-learning

여기서는 Q-learning의 개선된 형태인 double Q-learningmulti-step Q-learning을 살펴보자. 먼저 double Q-learning은 Q-learning의 overestimation 문제를 해결하기 위한 방법이다. Overestimation 문제는 Q-function이 actual reward보다 reward를 더 높게 예측한다는 것이다. 아래 그래프는 여러 아타리 게임에서의 실험 결과로, 주황색 수평선은 actual return을 나타내고, 그 위의 복잡한 주황색 선은 Q-value를 나타낸다. Q-value는 reward를 더 높게 예측한다.

이 문제는 target value를 다음과 같이 정의하는 Q-learning의 구조적인 이유로부터 발생한다.

\[y_j = r_j + \gamma \max_ {a ^ \prime _ j} Q_ { \phi ^ \prime} (s ^ \prime _ j, a ^ \prime _ j)\]

학습 시 $Q_ { \phi ^ \prime} (s ^ \prime _ j, a ^ \prime _ j)$는 noisy하다. 즉, actual value에 비해 positive bias를 가질 수도 있고, negative bias를 가질 수도 있다. 그런데 여기서 $\max$를 취하면 어쩔 수 없이 positive bias를 가진 value를 선택하게 된다. 이 문제를 자세히 알아보기 위해 다음과 같이 $\max_ {a ^ \prime _ j} Q_ { \phi ^ \prime} (s ^ \prime _ j, a ^ \prime _ j)$를 다르게 나타내보자.

이제 문제가 더 명확해진다. 어떠한 action이 가장 좋은지 알려주는 Q-function과, value를 계산하는 Q-function이 같기 때문에 결국 Q-function의 $\max$ 값은 noise에 dependent하게 된다. 따라서 이를 해결하기 위해 double Q-learning을 사용한다. 즉, 두 개의 Q-function $Q_{\phi_ A}$와 $Q_{\phi_ B}$를 분리하여 다음과 같이 사용하여 overestimation 문제를 해결한다.

예를 들어 $Q_{\phi_ A}$에서 positive noise를 가지고 있는 action이더라도 $Q_{\phi_ B}$에서는 target value가 낮을 수 있기 때문에 이러한 문제가 해결되는 것이다. 그러나 이를 위해 network를 2배로 늘려야 한다는 것은 여러모로 부담이 되고, 따라서 두 개의 네트워크를 단순히 기존의 $\phi$와 $\phi^ \prime$로 사용하는 방법을 사용한다.

이러면 다시 moving target problem이 발생하지만, 실제로는 $\arg \max$ 값은 쉽게 변하지 않아 큰 문제가 되지 않는다. 또한 $\phi$와 $\phi^ \prime$은 decorrelate 되어 있지 않다는 문제가 있지만, 실제로는 큰 문제가 되지 않는다.


3.2. Multi-step Q-learning

Multi-step Q-learningN-step return을 사용하여 학습 초기 불안정하여 bias가 높은 Q-value를 보완하는 방법이다.

만약 $Q_ { \phi ^ \prime}$이 잘 학습된다면 위의 2번째 항이 유의미하겠지만, 그렇지 않다면 2번째 항은 noise에 가깝고 1번째 항만 중요하게 될 것이다. 이러한 경우를 대비해 N-step return estimator $y_ {j, t}$를 사용하여 bias를 줄이는 방법을 사용한다. 이때 $y_ {j, t}$는 다음과 같이 정의된다.

이때 $N$을 조정하여 bias-variance trade-off를 조절할 수 있다. 그러나 이러한 방법은 $t$부터 $t+N$까지의 state, action pair가 policy-dependent하다는 문제가 있다. 즉, policy가 바뀌면 action이 바뀌기 때문에 $N \geq 2$인 경우 현재 policy에서는 예전에 얻었던 sequence를 얻을 수 없고, on-policy가 된다. 이를 해결하는 방법으로 여러 가지를 소개하는데, 무시하거나, on-policy의 것만 얻기 위해 $N$을 조정하거나, importance sampling을 사용할 수 있다.


4. Q-learning w/ continuous actions

만약 action space가 continuous하다면 무엇이 문제가 되는가? Discrete action space에서는 다음 target value를 계산하기 위한 $\max$ 연산이 아주 간단했다.

\[y_j = r_j + \gamma \max_ {a ^ \prime _ j} Q_ { \phi ^ \prime} (s ^ \prime _ j, a ^ \prime _ j)\]

단순히 모든 action에 대하여 $Q_ { \phi ^ \prime} (s ^ \prime _ j, a ^ \prime _ j)$를 계산하고 그 중 가장 큰 값을 선택하면 되기 때문이다. 그러나 continuous action space에서는 이러한 연산이 불가능하다. 이를 해결하기 위해 가장 간단한 방법은 SGD와 같은 iterative method로 최적화를 진행하는 것이다. 그러나 이를 매번 진행하기에는 너무 오랜 시간이 소요된다. 여기서는 derivative-free optimization을 사용하여 최적화를 진행하는 여러 방법을 소개한다.


4.1. Random Sampling

첫 번째 방법은 random sampling이다. 즉, random하게 action 여러 개를 선택하여 그 중 가장 좋은 action을 선택하는 방법이다. 이 방법은 아주 간단하고, 병렬화(Parallelization)가 쉽다는 장점이 있다. 그러나 만약 action을 잘 뽑지 못했다면 정확도가 떨어지게 된다.

정확도가 떨어지더라도 오히려 overestimation 문제를 leverage할 수 있다는 점에서 좋을지도 모른다. 만약 정확도 문제를 해결하고자 한다면 CEM(Cross-Entropy Method), CMA-ES 등의 개선된 방법을 사용할 수 있다.


4.2. Analytic Optimization

두 번째 방법은 최적화가 간단한 function class로 Q-function을 모델링하는 것이다. 예를 들어 quadratic function을 사용하면 간단히 analytic solution을 얻을 수 있다.

이러한 함수를 NAF(Normalized Advantage Function)이라고 하며, 이 함수는 $\arg \max _ a Q_ \phi (s,a) = \mu_ \phi (s)$이고, $\max_ a Q_ \phi (s,a) = V_ \phi (s)$이기 때문에 이를 사용하면 $\mu_ \phi (s)$를 쉽게 얻을 수 있다. 이러한 방법은 quadratic function을 사용하기 때문에 Q-function의 형식을 제한한다는 단점이 있다.


4.3. Second “Actor” Network

세 번째 방법은 second “actor” network를 사용하는 것이다. 즉, approximate maximizer를 사용하여 $\arg \max$를 대신하는 것으로, 다음과 같은 네트워크 $\mu_ \theta$를 학습한다.

\[\mu_ \theta (s) \approx \arg \max_ a Q_ \phi (s,a)\]

학습을 위해서는 간단히 $\theta \leftarrow \arg \max_ \theta Q_ \phi (s, \mu_ \theta (s))$의 방식을 사용하고, 이때 아래와 같은 chain rule을 사용한다.

\[\frac{dQ_ \phi}{d\theta} = \frac{d \mathbf{a}}{d \theta} \frac{dQ_ \phi}{d \mathbf{a}}\]

이러한 방식의 알고리즘 중 유명한 것으로 DDPG가 있으며, 아래와 같이 알고리즘을 요약할 수 있다.


5. Practical Tips for Q-learning

마지막으로 Q-learning을 위한 실용적인 팁들을 소개한다.

  • Q-learning은 안정성 실험이 필요하다. 즉, 먼저 쉽고 간단한 문제에 대해 Q-learning을 적용하여 잘 작동하는지 확인하는 것이 좋다.
  • Large replay buffer를 사용하면 더 안정적인 학습이 가능하다.
  • 학습 초반에는 학습이 원활하지 않을 수 있으나 시간이 지날수록 개선될 수 있음을 알고 기다리는 것이 중요하다.
  • 처음에 high exploration을 사용하는 것이 좋다.
  • Bellman error gradient가 너무 크다면 Huber loss 등을 사용하여 해결할 수 있다.
  • Double Q-learning은 아주 큰 도움이 되고 어떠한 문제도 발생하지 않는다. N-step return도 아주 큰 도움이 되지만 bias를 도입할 수 있다.
  • Scheduling, Adam optimizer 등이 도움이 된다.
  • 여러 random seed를 사용해 실험해보는 것이 좋다. 보통 incosistent한 결과를 내기 때문이다.


CS285 카테고리 내 다른 글 보러가기

댓글 남기기