8. DQN: 표를 신경망으로 바꾸면 무엇이 흔들리나

타깃 네트워크: 움직이는 과녁을 잠시 얼린다

경험 리플레이는 연달아 온 샘플의 상관을 풀었지만, 손실 L(θ)\textcolor{#d62728}{\mathcal{L}}(\theta)의 목표에는 지금 배우는 신경망 Qθ\textcolor{#00897b}{Q_\theta}가 그대로 들어 있어서 한 번 업데이트할 때마다 과녁도 함께 움직인다. 과녁이 움직이지 않는 회귀(정해진 정답 숫자를 예측해 제곱 오차를 줄이는 학습)라면 신경망은 과녁에 가까워지기만 하면 된다. 과녁이 내가 다가가는 만큼 함께 움직이면 어떻게 될까?

역사: 매번 처음부터 다시 맞추기, 그리고 가끔 복사하기

과녁을 고정하는 생각은 DQN보다 먼저 있었다. 2005년 마르틴 리드밀러(Martin Riedmiller)의 신경 적합 Q 반복(neural fitted Q iteration, NFQ)은 모아 둔 경험 전부에 대해 지금의 Q로 목표값을 한꺼번에 계산해 고정하고, 신경망을 그 목표에 맞추는 회귀를 끝까지 한 뒤, 새 신경망으로 목표를 다시 계산하기를 되풀이했다. 목표가 회귀 도중에 움직이지 않으니 안정적이었지만, 2015년 DQN 논문은 이런 방법이 반복마다 신경망을 처음부터 다시 학습해야 해서 큰 신경망에는 너무 느리다고 적었다.

2013년의 첫 DQN은 목표를 지금의 파라미터로 계산했다(그 논문의 알고리즘 1). 2015년 『네이처』 판은 목표만 계산하는 신경망을 따로 두었다. 업데이트 C번마다 지금 신경망의 파라미터를 모두 복사해 두고, 다음 C번 동안은 그 사본으로 목표를 만든다. 왜 그렇게 했는지를 논문은 이렇게 적었다. Q(st,at)\textcolor{#00897b}{Q}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t})를 올리는 업데이트는 흔히 다음 상태의 Q(st+1,a)\textcolor{#00897b}{Q}(\textcolor{#0093b8}{s_{t+1}}, \textcolor{#1c9c60}{a})도 함께 올려 목표까지 올리고, 그것이 진동이나 폭주로 이어질 수 있다. 예전 파라미터로 목표를 만들면 업데이트가 목표에 닿기까지 시간차가 생겨 그런 일이 훨씬 드물어진다. DQN은 C를 1만으로 두었다.

L(θ)=E(s,a,r,s′)∼D[(y−Qθ(s,a))2],y=r+γmax⁡a′Qθ−(s′,a′)\textcolor{#d62728}{\mathcal{L}}(\theta) = \mathbb{E}_{(\textcolor{#0093b8}{s}, \textcolor{#1c9c60}{a}, \textcolor{#d9670b}{r}, \textcolor{#0093b8}{s'}) \sim \textcolor{#cc00ff}{\mathcal{D}}}\Big[\big(\textcolor{#0033ff}{y} - \textcolor{#00897b}{Q_\theta}(\textcolor{#0093b8}{s}, \textcolor{#1c9c60}{a})\big)^2\Big], \qquad \textcolor{#0033ff}{y} = \textcolor{#d9670b}{r} + \textcolor{#7a1f5a}{\gamma}\max_{\textcolor{#1c9c60}{a'}} \textcolor{#6f6f78}{Q_{\theta^-}}(\textcolor{#0093b8}{s'}, \textcolor{#1c9c60}{a'})
Qθ−타깃 네트워크: C번마다 Qθ를 복사해 얼려 둔 사본. 그 사이에는 고정된 비교 대상Qθ지금 배우는 신경망 (업데이트마다 바뀐다)y목표값: 얼려 둔 사본으로 계산한다L(θ)손실 (θ에 대해서만 미분하고 θ−는 상수로 둔다)D리플레이 버퍼r, γ보상과 할인율s, s′, a, a′상태, 다음 상태, 행동, 다음 상태의 행동 \small\begin{array}{ll} \textcolor{#6f6f78}{Q_{\theta^-}} & \text{타깃 네트워크: }\textcolor{#206049}{C}\text{번마다 }\textcolor{#00897b}{Q_\theta}\text{를 복사해 얼려 둔 사본. 그 사이에는 고정된 비교 대상} \\ \textcolor{#00897b}{Q_\theta} & \text{지금 배우는 신경망 (업데이트마다 바뀐다)} \\ \textcolor{#0033ff}{y} & \text{목표값: 얼려 둔 사본으로 계산한다} \\ \textcolor{#d62728}{\mathcal{L}}(\theta) & \text{손실 (}\theta\text{에 대해서만 미분하고 }\theta^-\text{는 상수로 둔다)} \\ \textcolor{#cc00ff}{\mathcal{D}} & \text{리플레이 버퍼} \\ \textcolor{#d9670b}{r},\ \textcolor{#7a1f5a}{\gamma} & \text{보상과 할인율} \\ \textcolor{#0093b8}{s},\ \textcolor{#0093b8}{s'},\ \textcolor{#1c9c60}{a},\ \textcolor{#1c9c60}{a'} & \text{상태, 다음 상태, 행동, 다음 상태의 행동} \end{array}

목표값을 계산하려고 따로 두고 가끔씩만 복사하는 신경망 Qθ−\textcolor{#6f6f78}{Q_{\theta^-}}를 타깃 네트워크 (얼려 둔 과녁 계산용 사본 / target network)라 한다. 복사하고 나서 다음 복사까지 C\textcolor{#206049}{C}번 동안 문제는 과녁이 고정된 보통의 회귀가 된다. 리드밀러의 방법이 회귀를 끝까지 하고 목표를 바꿨다면, DQN은 회귀를 끝까지 하지 않고 정해진 스텝마다 목표를 바꾼다.

리플레이 버퍼 무작위 32개 s, a r, s' Qθ 지금 배우는 신경망 업데이트마다 바뀐다 Qθ⁻ 타깃 네트워크 그 사이에는 얼려 둔다 C번마다 복사 제곱 오차 (y − Q)² 추정 목표 y
칸 셋, 숫자 둘

과녁이 움직이는 것이 무엇을 망치는지 보려면 장난감이 하나 더 필요하다. 숫자 하나짜리 두 칸 장난감은 세 재료가 다 있어 어떻게 해도 커지기 때문에, 과녁을 얼린 효과를 따로 보기 어렵다(그 경우는 아래 문제 7에서 본다). 그래서 칸 셋을 숫자 둘로 어림하는, 다음으로 작은 꼴을 고른다. 칸 A, B, C의 요약값은 (1, 0), (2, 1), (2, 2)이고 가치는 요약값과 파라미터 둘의 내적이다. 지금 정책은 A → B → C로 가서 C에 머물고, 보상은 모두 0이라 참값은 0이다. 버퍼 속 기록은 A 20%, B 60%, C 20%로 지금 정책이 머무는 비율과 다르다. γ\textcolor{#7a1f5a}{\gamma} = 0.9, 학습률 0.1, 처음 파라미터는 (1, 1)이고, 버퍼의 비율대로 고르게 쓴 평균 업데이트라 무작위는 없다.

타깃 없이 지금 파라미터로 과녁을 계산하면, B의 목표 0.9 × V\textcolor{#00897b}{V}(C)는 처음 3.6000이다. V\textcolor{#00897b}{V}(B)를 3.0000에서 3.2000으로 올리는 사이 목표는 3.7980이 되고, 그다음 업데이트에서는 V\textcolor{#00897b}{V}(B) 3.4004에 목표 3.9954다. 쫓는 만큼 과녁이 물러난다. 세 칸 가운데 가장 큰 |V\textcolor{#00897b}{V}|는 500스텝 뒤 604, 1,000스텝 뒤 140만으로 커진다. 이 세 칸 장난감에서는 값이 한쪽으로 곧게 커지지 않고 두 파라미터 사이를 돌며 커진다. DQN 논문이 말한 「진동이나 폭주」가 둘 다 들어 있다.

이번에는 과녁을 50스텝마다 복사해 얼린다. 그러면 가장 큰 |V\textcolor{#00897b}{V}|는 500스텝 뒤 0.76, 1,000스텝 뒤 0.14, 2,000스텝 뒤 0.0051로 참값 0에 다가간다. 50스텝 동안은 과녁이 고정된 회귀라 신경망이 과녁에 다가가기만 하고, 다음 과녁은 앞 과녁보다 0에 가깝다. 과녁을 끝까지 맞춘다면 과녁에서 과녁으로 넘어갈 때마다 크기가 0.653배로 줄어드는 구조다. 다만 주기를 늘린다고 늘 좋지는 않아서, 1,000스텝마다 복사하면 2,000스텝 뒤에도 3.39에 머문다. 과녁을 바꾸는 일 자체가 드물어져, 줄어드는 과녁을 따라가는 데 시간이 걸리기 때문이다.

위젯에서 복사 주기 C\textcolor{#206049}{C}를 1부터 조금씩 늘려 보면, 파랑 선이 주황 선과 함께 오르다가 어느 주기부터 내려가기 시작한다. 너무 자주 복사하면 과녁이 다시 움직이는 것과 같고, 너무 드물게 복사하면 배움이 느리다. 그 사이 어딘가에서 스텝당 줄어드는 비율이 가장 크다. 그러나 타깃 네트워크를 달아도 함수 근사, 부트스트랩, 오프폴리시 데이터는 그대로 남으므로 위험한 세 조합이 없어지지는 않는다. 세 재료만 있는 두 칸 장난감에 과녁을 얼리면 어떻게 되는지는 아래 문제 7에서 본다.

ML에서: 고정된 비교 대상을 잠시 두는 자세

타깃 네트워크의 사본은 이 책이 회색으로 칠해 온 「고정된 비교 대상」과 같은 자리에 있다. PPO의 πold\textcolor{#6f6f78}{\pi_\text{old}}도 데이터를 뽑은 정책을 잠시 얼려 두고, 지금 정책이 그것에서 얼마나 멀어졌는지를 잰다. 둘 다 배우는 모델이 자기 자신을 기준으로 삼으면 기준이 함께 흔들리니, 기준을 잠깐 붙잡아 둔다. 복사를 한꺼번에 하지 않고 스텝마다 조금씩 섞는 방법도 널리 쓰인다. 사본을 θ−←(1−τ)θ−+τθ\theta^- \leftarrow (1-\tau)\theta^- + \tau\theta로 천천히 따라오게 하는 것인데(τ(타우)는 한 스텝에 섞는 비율), 언어 모델을 오프라인 강화학습으로 고친 ILQL(2022)도 목표를 계산하는 Q 머리를 이 방식(τ = 0.005)으로 따라오게 했다. 과녁을 얼린 효과가 실제 게임에서 얼마였는지는 아래 문제 8에서 DQN 논문의 표로 읽는다.

문제 7. 두 칸 장난감에 타깃 네트워크를 달면

본문 「함수 근사와 위험한 세 조합」의 두 칸 장난감(요약값 A 1, B 1.5, 버퍼에는 A → B 기록만, γ\textcolor{#7a1f5a}{\gamma} = 0.9, 학습률 0.1, 처음 파라미터 1)에 타깃 네트워크를 단다. 과녁은 얼려 둔 파라미터 w−w^-로 0.9×1.5w−=1.35w−0.9 \times 1.5w^- = 1.35w^-이고, C\textcolor{#206049}{C}스텝마다 w−←ww^- \leftarrow w로 복사한다. (가) C\textcolor{#206049}{C} = 10과 100일 때, 한 주기(C\textcolor{#206049}{C}스텝) 동안 ww는 몇 배가 되는가? (나) 스텝당 배율로 바꿔 타깃 없을 때의 1.035와 비교하라. (다) C\textcolor{#206049}{C}를 얼마로 하면 ww가 커지지 않는가? 위젯의 「문제 7 설정 불러오기」로 확인하라(위젯은 V\textcolor{#00897b}{V}(B) = 1.5w1.5w를 그린다).

선생님 (평상)
선생님
민준 학생, 과녁을 얼리면 한 주기 동안 ww는 어디로 가죠?
김민준 (평상)
김민준
과녁 1.35w−1.35w^-가 고정이니까 그냥 회귀예요. ww가 1.35w−1.35w^- 쪽으로 스텝마다 남은 거리의 10%씩 가요.
선생님 (질문)
선생님
C 스텝 뒤에는 남은 거리가 얼마나 남죠?
김민준 (평상)
김민준
처음 남은 거리가 0.35w−0.35w^- 니까 그 0.9C0.9^C 배요. 그럼 w=1.35w−−0.35w−×0.9Cw = 1.35w^- - 0.35w^- \times 0.9^C 이고, w−w^-로 나누면 C = 10 에서 1.35 − 0.35 × 0.3487 = 1.2280 배예요.
선생님 (평상)
선생님
그럼 C = 100 은요?
김민준 (평상)
김민준
0.9¹⁰⁰ 은 거의 0 이니까 1.3500 배요. 어, 주기마다 1보다 크네요.
선생님 (질문)
선생님
스텝당으로 바꾸면요?
김민준 (평상)
김민준
C = 10 은 1.22801/10=1.02071.2280^{1/10} = 1.0207, C = 100 은 1.351/100=1.00301.35^{1/100} = 1.0030 이에요. 타깃 없을 때 1.035 보다 훨씬 느리게 커져요.
선생님 (평상)
선생님
1,000스텝을 가면 그 차이가 얼마나 벌어질까요?
김민준 (평상)
김민준
타깃 없이 8.7 × 10¹⁴ 인데, C = 10 은 8.3 × 10⁸, C = 100 은 20.1 이에요.
이서연 (생각)
이서연
그런데 C를 아무리 키워도 한 주기 배율은 1.35 쪽으로 갈 뿐이잖아요.
선생님 (질문)
선생님
그 1.35 는 무엇을 뜻하는 배율이었죠?
이서연 (평상)
이서연
과녁을 끝까지 맞춘 뒤의 배율이요. 그러면 얼려도 다음 과녁이 1.35 배 커지는 건 그대로예요. (다)의 답은 「그런 C는 없다」예요.
선생님 (평상)
선생님
그래요. 본문의 세 칸 장난감은 얼려서 끝까지 맞췄을 때 배율이 0.653 이었죠.
이서연 (아하)
이서연
그 장난감은 과녁을 얼리기만 하면 줄어드는 문제였는데, 과녁이 움직여서 커졌던 거고요. 두 칸 장난감은 과녁이 서 있어도 다음 과녁이 커지는 문제라서 얼리는 걸로는 안 되고요. 타깃 네트워크는 앞의 병만 고치는 약이네요.
김민준 (평상)
김민준
매일 몸무게를 재고 그날 식단을 바꾸면 들쭉날쭉하니까 일주일에 한 번만 재고 바꾸는 게 낫지만, 식단 계획 자체가 살찌는 계획이면 일주일에 한 번 재든 매일 재든 살이 찌는 거랑 같네요.

정리 (가) 한 주기 배율 1.35 − 0.35 × 0.9C: C\textcolor{#206049}{C} = 10에서 1.2280, 100에서 1.3500. (나) 스텝당 1.0207, 1.0030으로 1.035보다 느리다. (다) 그런 C\textcolor{#206049}{C}는 없는데, C\textcolor{#206049}{C}를 키우면 한 주기 배율은 1.35로 가고 1.35는 1보다 크기 때문이다. 타깃 네트워크는 과녁이 움직여서 생긴 진동과 폭주를 누를 뿐, 과녁을 얼려도 커지는 문제(얼린 과녁을 끝까지 맞춘 뒤의 배율이 1보다 큰 경우)는 고치지 못한다.

문제 8. 리플레이와 타깃, 무엇이 더 컸나

DQN 논문(2015)의 확장 데이터 표 3은 다섯 게임에서 리플레이와 타깃 네트워크를 켜고 끈 네 조합을 1,000만 프레임씩 학습해 얻은 가장 높은 평균 점수를 보고했다.

게임 리플레이 O, 타깃 O 리플레이 O, 타깃 X 리플레이 X, 타깃 O 리플레이 X, 타깃 X
Breakout 316.8 240.7 10.2 3.2
Enduro 1006.3 831.4 141.9 29.1
River Raid 7446.6 4102.8 2867.7 1453.0
Seaquest 2894.4 822.6 1003.0 275.8
Space Invaders 1088.9 826.3 373.2 302.0

(가) 둘 다 켠 점수는 둘 다 끈 점수의 몇 배인가? (나) 하나만 켤 때, 어느 쪽이 더 큰 차이를 내는 게임이 많은가? (다) Breakout에서 타깃 네트워크를 더한 효과를 리플레이를 켠 채와 끈 채로 각각 배율로 구하고, 차이를 설명하라.

선생님 (평상)
선생님
서연 학생, (가)부터요.
이서연 (평상)
이서연
Breakout 99.0배, Enduro 34.6배, River Raid 5.1배, Seaquest 10.5배, Space Invaders 3.6배예요. 게임마다 차이가 크네요.
선생님 (평상)
선생님
민준 학생, (나)는요?
김민준 (평상)
김민준
리플레이만 켜면 끈 것의 75.2, 28.6, 2.8, 3.0, 2.7배, 타깃만 켜면 3.2, 4.9, 2.0, 3.6, 1.2배예요.
선생님 (평상)
선생님
어느 쪽이 큰 게임이 많아요?
김민준 (평상)
김민준
넷은 리플레이 쪽이 크고 Seaquest만 타깃 쪽이 조금 커요. 그럼 리플레이만 있으면 되고 타깃은 덤이네요.
선생님 (질문)
선생님
리플레이를 켠 채로 타깃을 더하면 Seaquest는 몇 배가 되죠?
김민준 (놀람)
김민준
822.6 에서 2894.4 로 3.52배예요. 덤이 아니네요. River Raid도 1.82배고요.
선생님 (평상)
선생님
(다)는요?
이서연 (평상)
이서연
Breakout에서 리플레이를 켠 채 타깃을 더하면 316.8/240.7 = 1.32배, 끈 채 더하면 10.2/3.2 = 3.19배예요.
선생님 (질문)
선생님
그럼 리플레이를 끈 채로 타깃을 다는 게 더 좋은 걸까요?
이서연 (평상)
이서연
배율만 보면 끈 채가 더 커 보이는데… 점수로 보면 끈 채로는 10점짜리가 된 거라 둘 다 부족해요.
이서연 (생각)
이서연
리플레이가 없으면 연달아 온 장면의 상관이 그대로라, 과녁을 얼려도 그래디언트 어림 자체가 치우쳐요. 두 장치가 고치는 병이 서로 달라서, 하나만으로는 다른 하나의 병이 남는 거예요.
김민준 (평상)
김민준
시험 공부에서 문제집을 섞어 푸는 것(리플레이)과 채점을 하루 묵혔다 하는 것(타깃)이 서로 다른 걸 고쳐서, 둘 다 해야 성적이 제대로 오르는 거네요.

정리 (가) 99.0, 34.6, 5.1, 10.5, 3.6배. (나) 다섯 게임 가운데 넷에서 리플레이 하나가 타깃 하나보다 큰 차이를 냈다(Seaquest만 반대). (다) 1.32배(리플레이 켠 채)와 3.19배(끈 채). 끈 채로는 10.2점에 그친다. 두 장치는 서로 다른 병(샘플의 상관, 움직이는 과녁)을 고치므로 함께 써야 크게 오른다.