🎶 훈련을 안정적이고 빠르게 만들어 줄 수 있는 여러 가지 심층 Q-러닝 알고리즘의 변형에 대해 알아보자.
1. 고정 Q-가치 타깃
두 개의 DQN을 사용하는 고정 Q-가치 타깃 모델에서 첫 번째 DQN은 각 스텝에서 학습하고 에이전트를 움직이는 데 사용하는 온라인 모델이고, 두 번째 DQN은 타깃을 정의하기 위해서만 사용하는 타깃 모델이다.
타깃 모델은 온라인 모델의 단순한 복사본인데, python으로 구현하는 과정을 잠깐 살펴보자면,
import tensorflow as tf
target = tf.keras.models.clone_model(model) # 모델 구조를 복사해줌
target.set_weights(model.get_weights) # 가중치도 복사해 줘야 함
... 중략
next_Q_values = target.predict(next_states, verbose=0)
위와 같이 온라인 모델의 복사본을 만들어 준 후, Q-가치를 계산할 때 온라인 모델 대신 타깃 모델을 사용하도록 설정해야 한다.
물론 훈련 반복 구간에서 일정한 간격으로 온라인 모델의 가중치를 타깃 모델로 복사해야 하는 것도 잊지 말아야 한다.
if episode % 50 == 0:
target.set_weights(model.get_weights)
위 코드처럼 타깃 모델은 온라인 모델보다 자주 업데이트 되지 않으므로 Q-가치 타깃이 더 안정적이게 된다.
2. 우선 순위 기반 경험 재생
재생 버퍼에서 경험을 균일하게 샘플링하는 것이 아니라 중요한 경험을 더 자주 샘플링하는 아이디어를 '중요도 샘플링(importance sampling, IS)' 이하 '우선 순위 기반 경험 재생(prioritized experience replay, PER)' 이라고 한다.
구체적으로는 어떤 경험이 학습 진행을 빠르게 만들면 중요한 것으로 간주하는데, TD 오차의 크기를 재는 것으로 중요도를 파악한다. 큰 TD 오차는 전이 (s, a, s')가 괄목할 만하다는 것을 의미하므로, 경험을 샘플링한 후 TD 오차를 계산해 경험 우선 순위를 설정한다.
주의해야 할 점은 샘플이 중요한 경험에 편향되어 있으므로 훈련하는 동안 중요도에 따라 경험의 가중치를 낮춰 이 편향을 보상해줘야 한다는 것이다. 이에 각 경험의 훈련 가중치 w = (n P)^-β 를 정의하는데, n은 재생 버퍼에 있는 경험의 개수를 의미하며 β는 중요도 샘플링 편향을 얼마나 보상할지 조정하는 하이퍼파라미터이다. 일반적으로 β의 크기는 0.4에서 1까지 선형적으로 증가시키며 훈련을 진행해 나간다.
3. 듀얼링 DQN
듀얼링 DQN(dueling DQN) 알고리즘은 상태-행동 쌍 (s, a)의 Q-가치가 Q(s, a) = V(s) + A(s, a)로 표현될 수 있다는 점을 활용한 알고리즘으로, 여기서 V(s)는 상태 s의 가치를, A(s, a)는 상태 s에서 다른 모든 가능한 행동과 비교했을 때 행동 a를 선택해서 얻는 이득(advantage)를 의미한다.
듀얼링 DQN에서는 모델이 상태의 가치와 가능한 각 행동의 이익을 모두 추정하는데, 최선의 행동은 이익이 0이므로 모델이 예측한 모든 이익에서 모든 최대 이익을 뺌으로써 구현한다.
다음은 Python으로 구현한 간단한 듀얼링 DQN 모델이다.
input_states = tf.keras.layers.Input(shape=[4]) # 입력층 -> 상태 공간 크기 4
h1 = tf.keras.layers.Dense(32, activation = "elu")(input_states)
h2 = tf.keras.layers.Dense(32, activation = "elu")(h1)
# 상태 가치 함수 V(s)
state_values = tf.keras.layers.Dense(1)(h2)
# 어드밴티치 함수 A(s, a)
raw_advantages = tf.keras.layers.Dense(n_outputs)(h2)
# 어드밴티지 함수 정규화
advantages = raw_advantages - tf.reduce_max(raw_advantages, axis=1, keepdims=True)
# Q(s,a) = V(s) + A(s, a)
Q_values = state_values + advantages
model = tf.keras.Model(inputs=[input_states], outputs=[Q_values])
위 코드에서 확인할 수 있듯이, 듀얼링 DQN은 Q-값을 직접 계산하기 위해 두 개의 경로, '상태 가치 함수 V(s)를 계산하는 출력 뉴런 개수 1개'와 '어드밴티지 함수 A(s, a)를 계산하는 출력 뉴런 개수 n개'를 거쳐 최종적으로 하나의 Q 값을 계산하는 단 하나의 출력층을 갖는 모델이다.
정리하자면, 듀얼링 DQN 구조는 상태 가치 함수와 어드밴티지 함수를 분리해서 학습하기 때문에 불필요한 행동을 학습하지 않아 학습 속도가 더 빠르고 더 안정적인 Q-값을 추정할 수 있는 것이다.
'머신러닝' 카테고리의 다른 글
오토인코더, GAN(생성적 적대 신경망), 확산 모델의 개념 (0) | 2025.04.24 |
---|---|
[RL] 강화학습 - 근사 Q-러닝과 심층 Q-러닝 개념 및 Python 구현 (0) | 2025.04.18 |
[RL] 강화학습 - Q-러닝 개념, 수식 및 Python 구현, 그리고 입실론-그리디 정책 (2) | 2025.04.14 |
[RL] 강화학습 - 마르코프 결정 과정과 벨만 최적 방정식, Q-가치 반복 알고리즘, 그리고 Python 구현 (0) | 2025.04.10 |
OpenAI Gym - OpenAI Gym 개념과 cartPole-v1, 그리고 정책 하드코딩 (0) | 2025.04.06 |
앙상블(Ensemble) - 배깅(Bagging), 부스팅(Boosting), 스태킹 (0) | 2025.01.30 |
[RL] 강화학습(Reinforcement Learning) - 에이전트, 정책, 정책탐색, 환경, 리턴, 할인율 (2) | 2025.01.16 |
[RL] 강화학습 알고리즘 - PPO (Proximal Policy Optimization) with TRPO, Clipped Surrogate Objective, GAE, 상태가치함수, 엔트로피 보너스 (2) | 2025.01.15 |