DQN은 Q-learning에 신경망을 붙인 아이디어입니다. 상태를 입력하면 각 행동의 Q값을 출력하고, 그중 가장 좋아 보이는 행동을 선택합니다. 말만 들으면 단순해 보입니다. "표 대신 신경망을 쓰면 되는 것 아닌가?"라고 생각할 수도 있습니다.
하지만 딥 강화학습은 그렇게 호락호락하지 않습니다. 신경망은 강력하지만 예민합니다. 데이터가 조금만 이상하게 들어와도 엉뚱한 방향으로 학습할 수 있고, 목표값이 계속 흔들리면 무엇을 맞혀야 하는지 모른 채 따라가다가 무너질 수 있습니다.
DQN이 실제로 작동하려면 두 가지 안정 장치가 필요합니다. 하나는 경험 재생이고, 다른 하나는 타깃 네트워크입니다. 이 둘은 DQN을 단순한 아이디어에서 실제로 학습 가능한 알고리즘으로 바꿔 주는 핵심 장치입니다.

신경망은 섞인 데이터를 좋아한다
일반적인 딥러닝을 떠올려 봅시다. 이미지 분류 모델을 학습할 때는 고양이 사진, 강아지 사진, 자동차 사진이 섞인 미니배치를 사용합니다. 데이터가 무작위로 섞여 있으면 신경망은 한쪽 패턴에 과하게 휘둘리지 않고 전체적인 규칙을 배웁니다.
그런데 강화학습의 데이터는 자연스럽게 섞여 있지 않습니다. 에이전트는 환경 안에서 한 걸음씩 움직이며 데이터를 얻습니다.
어떤 게임에서 에이전트가 오른쪽으로 계속 이동하고 있다고 해 봅시다. 그러면 최근 데이터는 대부분 비슷한 화면, 비슷한 행동, 비슷한 보상으로 채워집니다. 로봇이 복도를 걷는 중이라면, 몇 초 동안 들어오는 관측은 거의 같은 복도 장면일 것입니다. Grid World에서도 마찬가지입니다. 에이전트가 벽 근처에서 헤매고 있다면 최근 경험은 대부분 "벽 앞에서 움직이다가 제자리"인 장면이 됩니다.
문제는 이런 연속 데이터가 서로 너무 닮아 있다는 점입니다. 신경망은 방금 본 데이터의 영향을 크게 받습니다. 비슷한 데이터만 연달아 학습하면 모델은 최근 상황에 과하게 맞춰지고, 조금 전까지 배웠던 다른 상황의 Q값을 망가뜨릴 수 있습니다.
지도학습에서는 보통 데이터셋이 고정되어 있고, 그 안에서 샘플을 무작위로 뽑습니다. 반면 강화학습에서는 에이전트의 행동이 곧 다음 데이터를 만듭니다. 잘못된 정책은 편향된 데이터를 만들고, 편향된 데이터는 다시 잘못된 정책을 강화합니다. 마치 길을 잘못 든 사람이 같은 골목만 계속 돌면서 "세상은 전부 이런 골목이구나"라고 믿게 되는 것과 비슷합니다.
연속된 경험이 만드는 불안정성
DQN이 어려운 이유는 단순히 신경망이 크기 때문이 아닙니다. 더 근본적인 문제는 학습 데이터와 학습 목표가 모두 움직인다는 데 있습니다.
먼저 데이터가 움직입니다. 에이전트가 초반에는 무작위로 행동하다가, 어느 정도 학습하면 더 좋은 행동을 자주 선택합니다. 그러면 데이터 분포가 바뀝니다. 처음에는 실패 경험이 많다가 나중에는 성공 근처의 경험이 많아질 수 있습니다. 신경망은 계속 바뀌는 데이터 흐름 위에서 학습해야 합니다.
다음으로 목표값도 움직입니다. Q-learning의 목표값은 다음과 같은 형태였습니다.
목표값 = 현재 보상 + 할인율 × 다음 상태에서 가능한 최대 Q값수식으로 쓰면 다음과 같습니다.
y = r + γ max Q(s', a')여기서 Q(s', a')도 신경망이 예측한 값입니다. 즉, 신경망은 자기 자신이 만든 예측을 목표로 삼아 다시 자기 자신을 학습합니다. 이것을 부트스트래핑이라고 합니다. 부트스트래핑은 "완성된 정답" 없이도 학습할 수 있게 해 주는 강력한 방식이지만, 동시에 위험합니다.
상상해 봅시다. 학생이 문제집을 풀고 있는데, 정답지가 매분 바뀝니다. 조금 전에는 3번이 답이라고 해서 3번을 외웠더니, 잠시 뒤에는 2번이 답이라고 합니다. 학생은 혼란스러워집니다. DQN의 신경망도 비슷합니다. 자신이 맞히려는 목표가 학습 도중 계속 바뀌면, 어느 방향으로 움직여야 할지 안정적으로 알기 어렵습니다.
그래서 DQN에는 두 가지 처방이 들어갑니다. 경험 데이터는 섞어서 학습하고, 목표값은 잠시 고정합니다. 전자가 경험 재생이고, 후자가 타깃 네트워크입니다.
경험을 버리지 않고 저장하기
강화학습에서 한 번의 경험은 보통 다음 다섯 가지로 표현합니다.
(관측, 행동, 보상, 다음 관측, 종료 여부)영어 변수명으로는 흔히 이렇게 씁니다.
(obs, action, reward, next_obs, done)여기서 obs는 현재 에이전트가 본 상태 또는 관측입니다. action은 그 상태에서 선택한 행동입니다. reward는 행동 직후 받은 보상입니다. next_obs는 행동 후 도착한 다음 관측입니다. done은 에피소드가 끝났는지를 나타냅니다.
예를 들어 Grid World에서 에이전트가 (2, 1) 위치에 있고 오른쪽으로 움직였다고 해 봅시다. 그 결과 (2, 2)로 이동했고 보상 -1을 받았으며 아직 목표 지점에 도착하지 않았다면, 하나의 경험은 다음과 같이 저장될 수 있습니다.
obs = (2, 1)
action = 오른쪽
reward = -1
next_obs = (2, 2)
done = False만약 다음 위치가 목표 지점이고 에피소드가 끝났다면 done은 True가 됩니다. 이 값은 매우 중요합니다. 에피소드가 끝났다면 그 뒤의 미래 보상을 더 이상 더하면 안 되기 때문입니다. 종료 상태에서는 다음 상태의 최대 Q값을 사용하지 않고, 현재 받은 보상만 목표값으로 삼습니다.
만약 done이 True라면:
목표값 = reward
그렇지 않다면:
목표값 = reward + γ × 다음 상태의 최대 Q값이 작은 경험 하나는 에이전트가 세상과 상호작용한 기록입니다. 강화학습에서는 이 기록이 곧 학습 재료입니다.
경험 재생 버퍼라는 기억 창고
경험 재생 버퍼는 에이전트가 겪은 경험을 저장해 두는 기억 창고입니다. 에이전트는 매번 환경에서 한 걸음 움직일 때마다 (obs, action, reward, next_obs, done)을 버퍼에 넣습니다. 그리고 학습할 때는 최신 경험 하나만 쓰지 않고, 버퍼에서 여러 경험을 무작위로 뽑아 미니배치를 만듭니다.
이 방식은 간단하지만 효과가 큽니다. 최근 경험만 연달아 학습하지 않고, 과거의 다양한 경험을 섞어서 학습하기 때문입니다. 벽에 부딪힌 경험, 보상을 얻은 경험, 아무 일도 없던 경험, 실패 직전의 경험이 함께 섞입니다. 신경망 입장에서는 훨씬 더 균형 잡힌 데이터가 들어오는 셈입니다.
경험 재생이 주는 이점은 크게 세 가지입니다.
연속된 경험 사이의 강한 상관관계를 줄여 신경망 학습을 안정화합니다.
한 번 얻은 경험을 여러 번 재사용하여 데이터 효율을 높입니다.
드물게 등장하는 중요한 경험이 바로 사라지지 않고 이후 학습에 다시 사용될 수 있게 합니다.
게임을 배우는 사람으로 비유해 봅시다. 초보자가 매번 방금 한 판만 복기한다면 최근 실수에만 집착하게 됩니다. 하지만 지난 100판의 장면을 모아 놓고 무작위로 다시 본다면 어떨까요? 어떤 장면에서는 공격을 너무 빨리 했고, 어떤 장면에서는 방어를 놓쳤고, 어떤 장면에서는 기다리는 편이 좋았다는 사실을 더 넓게 배울 수 있습니다.
경험 재생은 에이전트에게 이런 복습 노트를 만들어 줍니다.
버퍼는 어떻게 동작하는가
경험 재생 버퍼는 보통 정해진 크기를 갖습니다. 예를 들어 최대 100,000개의 경험을 저장할 수 있다고 해 봅시다. 버퍼가 가득 차기 전에는 새 경험을 계속 추가합니다. 버퍼가 가득 찬 뒤에는 가장 오래된 경험을 버리고 새 경험을 넣습니다.
이 구조는 오래된 기억이 무한히 쌓이는 것을 막습니다. 환경이 계속 변하거나 정책이 많이 바뀌면 너무 오래된 경험은 현재 학습에 덜 유용할 수 있습니다. 그래서 버퍼는 적당히 과거를 기억하되, 너무 먼 과거에 갇히지 않도록 설계합니다.
간단한 형태의 재생 버퍼는 다음처럼 생각할 수 있습니다.
class ReplayBuffer:
def __init__(self, capacity):
self.capacity = capacity
self.buffer = []
self.position = 0
def add(self, obs, action, reward, next_obs, done):
experience = (obs, action, reward, next_obs, done)
if len(self.buffer) < self.capacity:
self.buffer.append(experience)
else:
self.buffer[self.position] = experience
self.position = (self.position + 1) % self.capacity
def sample(self, batch_size):
# 실제 구현에서는 무작위 인덱스를 뽑아 batch_size개 경험을 반환한다.
return random_sample(self.buffer, batch_size)여기서 position은 다음 경험을 저장할 위치입니다. 버퍼가 가득 차면 처음 위치로 돌아가 오래된 경험을 덮어씁니다. 이런 구조를 원형 버퍼라고 부르기도 합니다.
실제 DQN 학습은 대략 다음 흐름으로 진행됩니다.
1. 현재 관측 obs를 본다.
2. ε-greedy 방식으로 행동 action을 선택한다.
3. 환경에 행동을 넣고 reward, next_obs, done을 받는다.
4. (obs, action, reward, next_obs, done)을 재생 버퍼에 저장한다.
5. 버퍼에서 무작위 미니배치를 뽑는다.
6. 미니배치로 Q 네트워크를 학습한다.
7. obs를 next_obs로 바꾸고 다음 단계로 간다.이때 중요한 점은 "경험을 쌓는 과정"과 "경험을 학습하는 과정"이 분리된다는 것입니다. 에이전트는 현재 환경과 계속 상호작용하면서 새 데이터를 만들고, 동시에 과거의 다양한 경험을 꺼내 신경망을 훈련합니다.
DQN에서 하나의 미니배치가 학습되는 방식
버퍼에서 미니배치를 뽑았다고 해 봅시다. 미니배치에는 여러 개의 경험이 들어 있습니다.
(obs_1, action_1, reward_1, next_obs_1, done_1)
(obs_2, action_2, reward_2, next_obs_2, done_2)
(obs_3, action_3, reward_3, next_obs_3, done_3)
...DQN은 각 경험에 대해 목표 Q값을 계산합니다. 종료 상태가 아니라면 다음 관측 next_obs를 타깃 네트워크에 넣고, 가능한 행동 중 가장 큰 Q값을 찾습니다. 그 값에 할인율을 곱하고 현재 보상을 더합니다.
목표값 = reward + γ × max_a Q_target(next_obs, a)종료 상태라면 다음 상태가 없으므로 목표값은 보상 자체입니다.
목표값 = reward그다음 현재 Q 네트워크에 obs를 넣어 현재 상태의 행동별 Q값을 구합니다. 여러 행동의 Q값 중 실제로 선택했던 action에 해당하는 Q값만 목표값과 비교합니다.
예를 들어 현재 관측에서 가능한 행동이 왼쪽, 오른쪽, 위, 아래 네 개이고, 에이전트가 실제로 선택한 행동이 오른쪽이었다면, 그 경험으로 직접 업데이트되는 값은 Q(obs, 오른쪽)입니다. 다른 행동들의 Q값은 이 경험의 직접 목표가 아닙니다.
학습의 목적은 다음 차이를 줄이는 것입니다.
예측값: Q_online(obs, action)
목표값: reward + γ × max_a Q_target(next_obs, a)이 차이가 크면 신경망의 가중치를 조정합니다. 이 과정을 많은 경험에 대해 반복하면, 신경망은 점점 더 그럴듯한 Q값을 예측하게 됩니다.
타깃이 계속 움직이면 학습이 흔들린다
이제 두 번째 안정 장치인 타깃 네트워크를 살펴봅시다.
DQN에는 보통 두 개의 Q 네트워크가 있습니다. 하나는 실제로 학습되는 온라인 네트워크이고, 다른 하나는 목표값을 계산하는 데 쓰이는 타깃 네트워크입니다.
온라인 네트워크는 매 학습 단계마다 가중치가 바뀝니다. 미니배치 하나를 학습하면 조금 바뀌고, 다음 미니배치를 학습하면 또 바뀝니다. 반면 타깃 네트워크는 일정 기간 동안 고정됩니다. 즉, 목표값을 계산하는 기준이 잠시 움직이지 않습니다.
왜 이것이 중요할까요?
타깃 네트워크가 없다고 해 봅시다. 그러면 목표값은 다음처럼 계산됩니다.
목표값 = reward + γ × max_a Q_online(next_obs, a)그런데 Q_online은 바로 지금 학습되고 있는 네트워크입니다. 예측값도 온라인 네트워크가 만들고, 목표값도 같은 온라인 네트워크가 만듭니다. 모델이 한 발 움직일 때마다 목표도 함께 움직입니다. 마치 달리는 사람이 결승선을 향해 뛰는데, 결승선도 함께 도망가는 상황입니다.
타깃 네트워크는 이 결승선을 잠시 고정합니다.
목표값 = reward + γ × max_a Q_target(next_obs, a)온라인 네트워크는 고정된 타깃을 향해 여러 번 학습합니다. 그러다가 일정 시간이 지나면 온라인 네트워크의 가중치를 타깃 네트워크에 복사합니다. 그러면 타깃이 한 번 갱신됩니다. 이후 다시 그 타깃을 기준으로 학습합니다.
이 방식은 학습을 완벽하게 안정화하지는 않지만, 목표값이 매 순간 심하게 흔들리는 문제를 크게 줄여 줍니다.
온라인 네트워크와 타깃 네트워크
두 네트워크의 역할을 조금 더 명확히 정리해 봅시다.
온라인 네트워크는 현재 학습되는 주인공이며, 행동 선택과 예측값 계산에 사용됩니다.
타깃 네트워크는 목표 Q값을 계산하는 기준이며, 일정 기간 동안 고정됩니다.
일정 주기마다 온라인 네트워크의 가중치를 타깃 네트워크로 복사해 기준을 갱신합니다.
흔히 온라인 네트워크의 파라미터를 θ, 타깃 네트워크의 파라미터를 θ⁻라고 씁니다. 그러면 목표값은 다음처럼 표현할 수 있습니다.
y = r + γ max_a Q(s', a; θ⁻)온라인 네트워크는 다음 값을 예측합니다.
Q(s, a; θ)그리고 학습은 이 둘의 차이를 줄이는 방향으로 진행됩니다.
손실 = (y - Q(s, a; θ))²이 수식의 의미는 어렵지 않습니다. "현재 네트워크가 예측한 Q값이, 타깃 네트워크로 계산한 목표값에 가까워지도록 조정한다"는 뜻입니다.
타깃 네트워크를 갱신하는 두 가지 방법
타깃 네트워크를 갱신하는 방법은 보통 두 가지로 생각할 수 있습니다. 첫 번째는 하드 업데이트입니다. 일정한 학습 단계마다 온라인 네트워크의 가중치를 타깃 네트워크에 그대로 복사합니다.
매 C단계마다:
θ⁻ ← θ예를 들어 1,000번의 학습 업데이트마다 한 번씩 타깃 네트워크를 갱신할 수 있습니다. 그 사이에는 타깃 네트워크가 고정되어 있으므로 목표값이 비교적 안정적입니다.
두 번째는 소프트 업데이트입니다. 매번 조금씩 온라인 네트워크를 타깃 네트워크에 섞습니다.
θ⁻ ← τθ + (1 - τ)θ⁻여기서 τ는 아주 작은 값입니다. 예를 들어 0.005처럼 작게 잡으면, 타깃 네트워크는 온라인 네트워크를 천천히 따라갑니다. 하드 업데이트가 "가끔 한 번에 복사하기"라면, 소프트 업데이트는 "조금씩 부드럽게 따라가기"입니다.
DQN의 기본 설명에서는 하드 업데이트를 먼저 이해하는 편이 쉽습니다. 중요한 핵심은 하나입니다. 목표값을 계산하는 네트워크를 학습 네트워크와 분리해, 목표가 매 순간 흔들리지 않게 만든다는 것입니다.
경험 재생과 타깃 네트워크가 함께 작동하는 장면
이제 DQN 학습 과정을 하나의 이야기로 묶어 봅시다.
에이전트가 CartPole 환경을 플레이합니다. 막대가 오른쪽으로 기울어지면 카트를 오른쪽으로 밀어 균형을 맞춰야 합니다. 처음에는 거의 아무것도 모르기 때문에 무작위로 움직이다가 금방 실패합니다. 하지만 실패한 경험도 버리지 않습니다. 현재 관측, 선택한 행동, 받은 보상, 다음 관측, 종료 여부를 모두 재생 버퍼에 저장합니다.
어느 정도 경험이 쌓이면 에이전트는 버퍼에서 무작위로 미니배치를 뽑습니다. 미니배치에는 최근 실패뿐 아니라 조금 전의 성공적인 균형 유지 장면도 섞여 있을 수 있습니다. 온라인 네트워크는 이 배치를 보고 Q(obs, action)을 예측합니다. 타깃 네트워크는 다음 관측에서의 미래 가치를 계산해 목표값을 만듭니다. 온라인 네트워크는 그 목표값에 가까워지도록 학습합니다.
몇 번의 학습이 지나도 타깃 네트워크는 바로 바뀌지 않습니다. 그래서 온라인 네트워크는 비교적 고정된 기준을 향해 안정적으로 움직일 수 있습니다. 일정 시간이 지나면 온라인 네트워크의 최신 지식을 타깃 네트워크에 복사합니다. 그러면 타깃도 조금 더 나아진 기준으로 바뀝니다.
이 과정을 반복하면서 에이전트는 점점 더 오래 막대를 세우는 행동을 배웁니다.
구현 흐름으로 보는 DQN 안정화
DQN의 핵심 흐름을 조금 더 구현에 가까운 형태로 써 보면 다음과 같습니다.
온라인 Q 네트워크를 초기화한다.
타깃 Q 네트워크를 온라인 네트워크와 같은 값으로 초기화한다.
경험 재생 버퍼를 만든다.
각 에피소드마다:
환경을 초기화하고 첫 관측 obs를 얻는다.
에피소드가 끝날 때까지:
ε-greedy로 행동 action을 선택한다.
환경에 action을 적용한다.
reward, next_obs, done을 얻는다.
(obs, action, reward, next_obs, done)을 버퍼에 저장한다.
버퍼에 충분한 경험이 있다면:
무작위 미니배치를 샘플링한다.
타깃 네트워크로 목표 Q값을 계산한다.
온라인 네트워크의 예측 Q값과 목표 Q값의 차이를 줄인다.
일정 단계마다:
온라인 네트워크의 가중치를 타깃 네트워크에 복사한다.
obs = next_obs로 갱신한다.이 흐름에서 경험 재생과 타깃 네트워크는 서로 다른 문제를 해결합니다. 경험 재생은 "학습 데이터가 너무 비슷하게 이어지는 문제"를 줄입니다. 타깃 네트워크는 "학습 목표가 너무 빠르게 움직이는 문제"를 줄입니다. 둘 다 없으면 DQN은 훨씬 쉽게 흔들립니다.
재생 버퍼 안의 경험은 정답지가 아니다
여기서 한 가지 오해를 조심해야 합니다. 재생 버퍼에 저장된 경험은 지도학습의 정답 데이터와 다릅니다. (obs, action, reward, next_obs, done) 안에는 "이 상태에서는 반드시 이 행동이 정답이다"라는 정보가 들어 있지 않습니다.
예를 들어 어떤 상태에서 에이전트가 왼쪽으로 움직였고 보상 -1을 받았다고 해 봅시다. 이것만으로 왼쪽이 좋은 행동인지 나쁜 행동인지 바로 알 수 없습니다. 지금 받은 보상은 작아도, 그 행동이 나중에 큰 보상으로 이어질 수도 있습니다. 반대로 당장은 보상이 좋아도 장기적으로는 막다른 길일 수 있습니다.
DQN은 경험을 이용해 장기 가치를 추정합니다. 현재 보상과 다음 상태의 미래 가치를 연결합니다. 그래서 경험 하나는 정답지가 아니라, Q값을 조금 더 정확하게 만들기 위한 단서입니다. 강화학습의 학습 데이터는 정답표가 아니라 여행 기록에 가깝습니다. 여행 기록을 많이 모으고 다시 읽으면서, 에이전트는 어느 길이 결국 좋은 길인지 배워 갑니다.
오래된 경험을 다시 써도 괜찮을까
경험 재생을 처음 보면 이런 질문이 생길 수 있습니다. "정책이 이미 바뀌었는데, 예전 정책으로 얻은 경험을 다시 학습해도 괜찮을까?"
이 질문은 아주 중요합니다. DQN이 기반으로 하는 Q-learning은 오프폴리시 방법입니다. 오프폴리시란 데이터를 만든 행동 방식과, 최종적으로 배우려는 행동 방식이 꼭 같지 않아도 되는 학습 방식을 말합니다.
예를 들어 에이전트가 예전에는 무작위 행동을 많이 했고, 지금은 Q값이 큰 행동을 더 자주 선택한다고 해 봅시다. Q-learning은 예전의 무작위 경험도 활용할 수 있습니다. 왜냐하면 목표값을 계산할 때는 "다음 상태에서 현재 생각하기에 가장 좋은 행동의 Q값"을 사용하기 때문입니다. 즉, 과거에 실제로 어떤 방식으로 행동했는지와 별개로, 현재 추정하는 최적 행동 가치를 업데이트할 수 있습니다.
물론 너무 오래되거나 현재 환경과 맞지 않는 경험은 문제가 될 수 있습니다. 그래서 버퍼 크기, 샘플링 방식, 학습 빈도 같은 선택이 중요합니다. 하지만 기본적으로 DQN이 경험 재생을 사용할 수 있는 이유는 Q-learning의 오프폴리시 성격 덕분입니다.
안정화 장치는 마법이 아니다
경험 재생과 타깃 네트워크는 DQN을 훨씬 안정적으로 만들어 주지만, 모든 문제를 해결하는 마법은 아닙니다. 강화학습은 여전히 어렵습니다.
보상이 너무 드물면 에이전트는 무엇이 좋은 행동인지 알아내기 어렵습니다. 탐험이 부족하면 중요한 경험을 버퍼에 넣지도 못합니다. Q값이 과대평가되면 실제보다 어떤 행동을 지나치게 좋게 믿을 수 있습니다. 신경망 구조나 학습률이 맞지 않으면 학습이 발산할 수도 있습니다.
그럼에도 이 두 장치는 딥 강화학습에서 매우 중요한 전환점입니다. 신경망으로 Q함수를 근사할 때 발생하는 대표적인 불안정성을 직접 겨냥하기 때문입니다.
경험 재생은 에이전트에게 기억을 줍니다. 타깃 네트워크는 에이전트에게 잠시 고정된 기준을 줍니다. 기억과 기준이 생기자, DQN은 비로소 복잡한 환경에서도 조금씩 행동을 개선할 수 있게 됩니다.
작은 예로 다시 정리하기
Grid World를 다시 떠올려 봅시다. 에이전트가 시작점에서 목표 지점까지 가야 합니다. 처음에는 여기저기 부딪히고 돌아다닙니다. 이때 모든 움직임은 경험으로 저장됩니다.
((0, 0), 오른쪽, -1, (0, 1), False)
((0, 1), 오른쪽, -1, (0, 2), False)
((0, 2), 아래, -1, (1, 2), False)
((1, 2), 아래, +10, (2, 2), True)나중에 신경망은 이 경험들을 무작위로 다시 봅니다. 마지막 경험에서는 목표에 도착해 +10을 받았으므로, Q((1, 2), 아래)가 좋아져야 한다고 배웁니다. 그리고 그 앞의 경험은 "아래로 가면 좋은 상태에 가까워진다"는 식으로 조금씩 가치가 전파됩니다.
이때 타깃 네트워크가 고정된 기준을 제공하면, 이 가치 전파가 더 안정적으로 일어납니다. 목표 지점 근처의 가치가 조금씩 앞 상태로 퍼져 나가고, 에이전트는 점차 목표로 향하는 길을 선호하게 됩니다.
이 장면은 Q-learning에서 보았던 가치 전파와 본질적으로 같습니다. 다만 Q-table 대신 신경망을 쓰기 때문에, 경험을 섞고 목표를 고정하는 장치가 더 중요해진 것입니다.
DQN을 떠받치는 두 개의 버팀목
DQN의 핵심 아이디어는 "신경망으로 Q값을 예측하자"입니다. 하지만 실제 핵심은 거기서 한 걸음 더 들어갑니다. 신경망으로 Q값을 예측하려면, 신경망이 배울 수 있는 형태로 경험과 목표를 다뤄야 합니다.
경험 재생은 데이터를 다룹니다. 연속된 경험을 그대로 먹이지 않고, 기억 창고에 쌓아 둔 뒤 무작위로 섞어 학습합니다. 덕분에 데이터 사이의 상관관계가 줄고, 한 번 얻은 경험을 여러 번 활용할 수 있습니다.
타깃 네트워크는 목표를 다룹니다. 학습 중인 네트워크가 만든 흔들리는 목표를 그대로 따라가지 않고, 별도의 네트워크로 목표값을 잠시 고정합니다. 덕분에 온라인 네트워크는 더 안정적인 기준을 향해 학습할 수 있습니다.
두 장치를 함께 사용하면 DQN의 학습 과정은 훨씬 견고해집니다. 에이전트는 환경에서 경험을 모으고, 과거 경험을 섞어 다시 보며, 고정된 목표를 향해 Q값을 조정합니다. 이 반복 속에서 행동은 조금씩 나아집니다.
다음 장에서는 가치 기반 방법이 어디까지 잘 작동하고, 어디서부터 어려워지는지 살펴봅니다. DQN은 강력한 출발점이지만 모든 문제의 해답은 아닙니다. 상태와 행동이 복잡해지고, 행동이 연속적이며, 정책 자체를 직접 다루어야 하는 순간이 오면 우리는 새로운 관점이 필요합니다. 그 길이 바로 정책 기반 학습으로 이어집니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.