Chapter 4: Actor-Critic — 비평가를 곁에 두다

의문

REINFORCE는 응답 전체에 숫자 하나를 준다. 다음 오답을 보자.

17 × 3 = 10 × 3 + 7 × 3 = 30 + 24 = 54

가장 큰 실수는 “24” 하나다. "10 × 3 + 7 × 3"이라는 분해는 오히려 훌륭한 수였다. 그런데 REINFORCE는 모든 토큰에 똑같이 R−bR - b(응답의 점수 RR 에서 베이스라인 bb, 곧 이 프롬프트에서 평소 받는 점수를 뺀 값)를 곱한다. 좋은 수와 나쁜 수가 함께 벌을 받고, 누가 진짜 범인인지는 수많은 샘플을 평균낸 뒤에야 드러난다.

토큰마다 따로 물을 수는 없을까? “이 토큰 하나가 결과를 얼마나 좋게, 혹은 나쁘게 만들었나?” 그러려면 풀이 중간중간에 "지금 이 풀이가 얼마나 유망한가"를 알려줄 누군가가 필요하다. 그 누군가가 비평가(critic)이고, 행동하는 정책(프롬프트를 받아 답을 고르는 언어모델)을 액터(actor)라 부른다. 둘이 함께 학습하는 구조가 Actor-Critic이다.

어드밴티지: 전망이 얼마나 바뀌었나

"지금 이 풀이가 얼마나 유망한가"를 숫자로 적을 수 있다면, 토큰 하나의 책임은 그 숫자가 토큰 앞뒤로 얼마나 달라졌는지로 잴 수 있지 않을까? 먼저 "유망함"을 셀 수 있는 것으로 만들자.

보상이 정답 1 / 오답 0이라고 하자. 풀이를 어느 지점까지 써 둔 채로 모델에게 나머지를 이어 쓰게 하기를 여러 번 되풀이한다. 100번 가운데 45번이 정답으로 끝나면 그 앞부분의 유망함은 0.45다. 어떤 모델로 “17 × 3” 풀이의 지점마다 이렇게 세어 보니 아래와 같았다고 하자(설명을 위해 정한 값이다).

지금까지 쓴 풀이 결국 맞힐 확률
17 × 3은 0.45
17 × 3은 10 × 3 0.70
17 × 3은 10 × 3 + 7 × 3 = 30 + 0.80
… 30 + 21 0.95
… 30 + 24 0.05

이렇게 앞부분마다 매기는 유망함을 가치함수(value function)라 부른다. 정식으로는 상태 sts_t 에서 출발해 정책 π\pi 를 따를 때 앞으로 받을 보상 합의 기대값이다.

Vπ(st)=Eπ[∑t′≥trt′  ∣  st]\textcolor{#00897b}{V^\pi}(\textcolor{#0093b8}{s_t}) = \mathbb{E}_{\textcolor{#1565c0}{\pi}}\Big[\sum_{t' \ge t} \textcolor{#d9670b}{r_{t'}} \;\Big|\; \textcolor{#0093b8}{s_t}\Big]
Vπ(st)상태 st에서 정책 π를 따를 때 앞으로 받을 보상 합의 기대값rt′시점 t′의 보상st상태: 프롬프트 + 지금까지 쓴 토큰 \small\begin{array}{ll} \textcolor{#00897b}{V^\pi}(\textcolor{#0093b8}{s_t}) & \text{상태 }\textcolor{#0093b8}{s_t}\text{에서 정책 }\textcolor{#1565c0}{\pi}\text{를 따를 때 앞으로 받을 보상 합의 기대값} \\ \textcolor{#d9670b}{r_{t'}} & \text{시점 }t'\text{의 보상} \\ \textcolor{#0093b8}{s_t} & \text{상태: 프롬프트 + 지금까지 쓴 토큰} \end{array}

언어모델에서 상태는 "프롬프트 + 지금까지 쓴 토큰"이다. 보상이 끝에 한 번 정답 1 / 오답 0으로 오면 보상 합의 기대값은 곧 정답일 확률이므로, V(st)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t})는 위 표에서 센 **“여기까지 쓴 풀이에서 계속 써 나갔을 때 결국 맞힐 확률”**이 된다.

"10 × 3"을 쓰는 순간 전망이 0.45에서 0.70으로 좋아졌다. "24"를 쓰는 순간 0.80에서 0.05로 무너졌다. 이 전망의 변화가 바로 우리가 원하던 토큰별 책임이다.

0 0.5 1 가치 V (결국 맞힐 확률) 0.45 0.70 0.80 0.95 0.05 +0.25 +0.10 +0.15 −0.75 17 × 3은 10 × 3 + 7 × 3 = 30 + 21 또는 24 (여기까지 쓴 풀이)
역사: 벨먼의 쪼개기

한 상태의 가치를 "지금 받는 보상 + 다음 상태의 가치"로 쪼개어 푸는 생각은 미국의 수학자 리처드 벨먼(Richard Bellman)에게서 왔다. 1949년부터 공군의 일을 맡던 연구소 랜드(RAND)에서 일한 벨먼이 붙든 것은 여러 단계에 걸쳐 결정을 내리는 문제였다. 한 번의 선택이 다음 선택의 처지를 바꾸므로, 가능한 선택의 줄을 모두 늘어놓고 견주면 단계가 늘 때마다 셈이 불어난다. 벨먼의 답은 한 단계씩 떼어 보는 것이었다. 어떤 처지에서 무엇을 먼저 고르든, 남은 선택들은 첫 선택이 만든 새 처지에서 가장 좋은 선택이어야 한다(최적성의 원리). 그러면 한 처지의 가치는 “이번 선택으로 받는 것 + 다음 처지의 가치” 하나로 적히고, 긴 문제가 한 단계짜리 문제의 되풀이로 바뀐다. 1957년 책 『Dynamic Programming』이 이 쪼개기를 여러 단계 결정 문제의 기본 도구로 정리했고, 오늘날 이 식을 벨먼 방정식이라 부른다.

「동적 계획법」이라는 이름에는 일화가 전해진다. 벨먼은 자서전(1984)에서, 당시 국방장관 윌슨이 「연구」라는 말만 들어도 얼굴이 붉어질 만큼 싫어했기에 공군 연구소에서 수학을 한다는 사실을 가릴 이름이 필요했고, 여러 단계에 걸쳐 시간에 따라 변한다는 뜻의 「dynamic」에 계획을 뜻하는 「programming」을 붙였다고 회고했다. 다만 벨먼이 이 말을 처음 쓴 논문(1952)이 윌슨의 취임(1953)보다 앞선다는 지적이 있어, 이 회고가 그대로 사실인지는 확실하지 않다.

가치의 변화량

토큰 하나의 몫을 재려면 두 전망을 견주면 된다. 토큰 at\textcolor{#1c9c60}{a_t} 를 고르기 전의 전망 V(st)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) 와 고른 뒤의 전망이다. 고른 뒤의 전망에서 고르기 전의 전망을 뺀 값을 어드밴티지(advantage) A(st,at)\textcolor{#8e44ad}{A}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) 라 한다. 그 행동이 "이 상태에서의 평균적인 행동"보다 얼마나 나았나를 잰다. (고른 뒤의 전망은 따로 행동 가치 Q(st,at)\textcolor{#00897b}{Q}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) 라 부른다. 어드밴티지는 Q−V\textcolor{#00897b}{Q} - \textcolor{#00897b}{V} 다.)

언어모델에는 특별한 성질이 하나 있다. 상태 전이가 결정론적이다. 토큰 at\textcolor{#1c9c60}{a_t}를 고르면 다음 상태는 무조건 st+1=st⊕at\textcolor{#0093b8}{s_{t+1}} = \textcolor{#0093b8}{s_t} \oplus \textcolor{#1c9c60}{a_t}(뒤에 이어 붙이기)다. 로봇처럼 “앞으로 가려 했는데 미끄러졌다” 같은 일이 없다. 그래서 고른 뒤의 전망은 이번에 받은 보상에 다음 상태의 가치를 더한 것 그대로다.

Q(st,at)=rt+V(st+1),A(st,at)=rt+V(st+1)−V(st)\textcolor{#00897b}{Q}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) = \textcolor{#d9670b}{r_t} + \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_{t+1}}), \qquad \textcolor{#8e44ad}{A}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) = \textcolor{#d9670b}{r_t} + \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_{t+1}}) - \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t})
Q(st,at)행동 at를 고른 뒤 기대되는 보상 합V(st)행동을 고르기 전의 기대 보상 합A(st,at)어드밴티지: 그 행동이 평균보다 얼마나 나은가rt시점 t의 보상 (토큰 보상)at고른 토큰 \small\begin{array}{ll} \textcolor{#00897b}{Q}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) & \text{행동 }\textcolor{#1c9c60}{a_t}\text{를 고른 뒤 기대되는 보상 합} \\ \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) & \text{행동을 고르기 전의 기대 보상 합} \\ \textcolor{#8e44ad}{A}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) & \text{어드밴티지: 그 행동이 평균보다 얼마나 나은가} \\ \textcolor{#d9670b}{r_t} & \text{시점 }t\text{의 보상 (토큰 보상)} \\ \textcolor{#1c9c60}{a_t} & \text{고른 토큰} \end{array}

이 식은 기대값 없이 정확히 성립한다. 중간 보상 rt\textcolor{#d9670b}{r_t}는 마지막 토큰을 빼면 0이므로, 어드밴티지는 그냥 가치의 변화량이다. "10 × 3"의 어드밴티지는 0.70−0.45=+0.250.70 - 0.45 = +0.25, "24"의 어드밴티지는 0.05−0.80=−0.750.05 - 0.80 = -0.75.

ML에서: 정책 그래디언트의 빈칸

정책 그래디언트는 E[∑tΦt∇log⁡πθ]\mathbb{E}[\sum_t \textcolor{#8e44ad}{\Phi_t} \nabla\log\textcolor{#1565c0}{\pi_\theta}] 꼴이고, 빈칸 Φt\textcolor{#8e44ad}{\Phi_t} 에 무엇을 넣느냐로 방법이 갈린다. REINFORCE는 모든 토큰에 같은 R−b\textcolor{#d9670b}{R} - \textcolor{#00897b}{b} 를 넣었다. 빈칸에 어드밴티지를 넣으면:

∇θJ=E[∑tA(st,at) ∇θlog⁡πθ(at∣st)]\nabla_\theta \textcolor{#d62728}{J} = \mathbb{E}\Big[\sum_t \textcolor{#8e44ad}{A}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t})\, \nabla_\theta \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{a_t} \mid \textcolor{#0093b8}{s_t})\Big]
A(st,at)빈칸 Φt 자리에 들어간 어드밴티지J목적함수πθ학습 중인 정책 (액터)\small\begin{array}{ll} \textcolor{#8e44ad}{A}(\textcolor{#0093b8}{s_t}, \textcolor{#1c9c60}{a_t}) & \text{빈칸 }\textcolor{#8e44ad}{\Phi_t}\text{ 자리에 들어간 어드밴티지} \\ \textcolor{#d62728}{J} & \text{목적함수} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책 (액터)} \end{array}

이 그래디언트도 여전히 치우침이 없다(unbiased). A=Q−V\textcolor{#8e44ad}{A} = \textcolor{#00897b}{Q} - \textcolor{#00897b}{V}에서 빼는 V(st)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t})는 상태에만 의존하고 그 상태에서 고른 행동에는 의존하지 않는 베이스라인이기 때문이다. 상태를 고정하면 Ea∼πθ[∇θlog⁡πθ(a∣s)]=∑a∇θπθ(a∣s)=∇θ1=0\mathbb{E}_{\textcolor{#1c9c60}{a} \sim \textcolor{#1565c0}{\pi_\theta}}[\nabla_\theta \log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{a} \mid \textcolor{#0093b8}{s})] = \sum_{\textcolor{#1c9c60}{a}} \nabla_\theta \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{a} \mid \textcolor{#0093b8}{s}) = \nabla_\theta 1 = 0 이므로, 여기에 상태만의 함수를 곱한 항은 기대값이 0이다. REINFORCE의 베이스라인이 "이 프롬프트의 평균"이었다면, 가치함수는 "풀이의 이 시점에서의 평균"이다. 베이스라인이 토큰마다 새로 매겨진다.

문제 1 — 학기 중에 바뀌는 예상 학점

조교가 과제를 채점할 때마다 「이대로 가면 A를 받을 확률」을 고쳐 알려 준다. 학기 초에는 0.5였고, 과제 1 뒤 0.7, 과제 2 뒤 0.6, 과제 3 뒤 0.9가 되었다. 기말고사를 치고 A를 받았다(확률 1). (가) 과제 1·2·3과 기말고사는 각각 A를 받을 확률을 얼마나 바꿨나? 가장 크게 기여한 것은 무엇인가? (나) 학기 끝에 「A를 받았다」는 결과 하나만 보고 네 번을 똑같이 칭찬하면, 과제 2는 어떤 평가를 받게 되나?

선생님 (질문)
선생님
민준 학생, A를 받는 데 가장 크게 기여한 건 무엇이라고 봤어요?
김민준 (평상)
김민준
기말고사요. A가 기말 성적으로 확정됐으니까요.
선생님 (평상)
선생님
기말고사를 치기 직전에 조교가 알려 준 확률은 얼마였죠?
김민준 (당황)
김민준
0.9요. 기말은 0.9를 1로 만든 거라 +0.1뿐이네요. 차례로 +0.2, −0.1, +0.3, +0.1이니까 가장 크게 바꾼 건 과제 3이에요.
이서연 (평상)
이서연
과제 2는 오히려 확률을 0.1 깎았어. 그런데 (나)처럼 결과만 보고 네 번을 똑같이 칭찬하면 과제 2도 칭찬을 받네. 누가 얼마나 보탰는지는 결과가 아니라 예상이 어떻게 바뀌었는지를 봐야 보여.
김민준 (평상)
김민준
조별과제가 A 나왔다고, 중간에 일을 망친 사람까지 똑같이 칭찬받는 거랑 같네요.

정리 (가) 과제 1 +0.2, 과제 2 −0.1, 과제 3 +0.3, 기말고사 +0.1. 가장 크게 기여한 것은 과제 3이다. 결과를 확정한 마지막 단계가 가장 크게 기여한 것은 아니다. (나) 확률을 깎은 과제 2까지 칭찬받는다. 기여는 결과가 아니라 예상의 변화로 나눠야 보인다.

문제 2 — 어느 토큰이 결말을 정했나

이번에는 다른 작은 모델이 “17 × 3은” 뒤를 세 토큰으로 이어 쓴다. 첫째 토큰에서 풀이 방법을, 둘째 토큰에서 중간 계산을, 셋째 토큰에서 답을 쓴다. 답이 51이면 보상 R=1\textcolor{#d9670b}{R} = 1, 아니면 0이다. 모델이 고르는 확률은 바로 아래 나무 그림과 같다.

V(st)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) 를 토큰 tt개를 쓴 뒤의 가치(결국 맞힐 확률)라 하자. (가) 「10 × 3 + 7 × 3」 → 「= 30 + 21」 → 「= 51」 경로에서 V(s0),…,V(s3)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_0}), \dots, \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_3}) 과 토큰마다의 어드밴티지, 곧 가치의 증분 ΔVt=V(st+1)−V(st)\Delta\textcolor{#00897b}{V}_t = \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_{t+1}}) - \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) 를 구하시오. (나) 모든 경로에 걸쳐 자리마다 증분 제곱의 평균 E[(ΔVt)2]\mathbb{E}[(\Delta\textcolor{#00897b}{V}_t)^2] 를 구하고, 셋을 더해 결말의 분산 Var(R)=V(s0)(1−V(s0))\mathrm{Var}(\textcolor{#d9670b}{R}) = \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_0})\big(1 - \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_0})\big) 과 비교하시오. 결말을 가장 많이 정한 자리는 어디인가? (다) 이 합이 맞아떨어지는 까닭을 설명하시오.

0.5 0.5 0.8 0.2 1 0.9 0.1 1 0.5 0.5 17 × 3은 10 × 3 + 7 × 3 17 + 17 + 17 = 30 + 21 = 30 + 24 = 34 + 17 = 51 ✓ = 41 ✗ = 54 ✗ = 51 ✓ = 41 ✗ 첫째 토큰 둘째 토큰 셋째 토큰
선생님 (질문)
선생님
민준 학생, 세 자리 가운데 결말을 가장 많이 정한 건 어디라고 봤어요?
김민준 (평상)
김민준
첫 자리요. 「10 × 3 + 7 × 3」과 「17 + 17 + 17」이 딱 반반으로 갈리니까 제일 큰 갈림길이죠. (가)는 V\textcolor{#00897b}{V} 가 0.61 → 0.72 → 0.9 → 1 이라 증분이 +0.11, +0.18, +0.10 이고요.
선생님 (평상)
선생님
그건 한 경로예요. (나)대로 모든 경로를 확률로 가중해서 자리마다 E[(ΔVt)2]\mathbb{E}[(\Delta\textcolor{#00897b}{V}_t)^2] 를 재 보면요?
김민준 (평상)
김민준
첫 자리 0.0121, 둘째 0.0648, 셋째 0.1610이요.
김민준 (난처함)
김민준
셋째가 제일 크고, 반반으로 갈리는 첫 자리가 제일 작네요.
선생님 (평상)
선생님
반반으로 갈린다는 건 다음 토큰이 얼마나 흩어져 있나예요. 결말이 얼마나 흔들리나는 따로 재야 하죠. 첫 자리는 어느 방법을 골라도 가치가 0.72와 0.5라 결말이 조금만 움직여요. 셋째 자리는 고르는 순간 결말이 0 아니면 1로 확정되고요.
이서연 (의심)
이서연
그런데 셋을 더하면 0.2379 이고 Var(R)=0.61×0.39=0.2379\mathrm{Var}(\textcolor{#d9670b}{R}) = 0.61 \times 0.39 = 0.2379 네. 우연 아니야? 증분끼리 상관이 있으면 교차항 2 E[ΔVs ΔVt]2\,\mathbb{E}[\Delta\textcolor{#00897b}{V}_s\, \Delta\textcolor{#00897b}{V}_t] 가 남아야 하잖아.
선생님 (질문)
선생님
서연 학생, 둘째 토큰을 뽑기 직전에 서 있다고 해요. 앞으로 생길 증분 ΔV1\Delta\textcolor{#00897b}{V}_1 의 기대값은 얼마죠?
이서연 (생각)
이서연
E[V(s2)∣s1]=E[E[R∣s2]∣s1]=E[R∣s1]=V(s1)\mathbb{E}[\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_2}) \mid \textcolor{#0093b8}{s_1}] = \mathbb{E}\big[\mathbb{E}[\textcolor{#d9670b}{R} \mid \textcolor{#0093b8}{s_2}] \mid \textcolor{#0093b8}{s_1}\big] = \mathbb{E}[\textcolor{#d9670b}{R} \mid \textcolor{#0093b8}{s_1}] = \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_1}) … 조건을 더 붙여 평균 낸 것을 다시 평균 내면 원래 평균이 되는 반복 기대값이라 0이에요.
이서연 (아하)
이서연
그러면 앞선 증분 ΔV0\Delta\textcolor{#00897b}{V}_0 는 그 시점에 이미 정해진 숫자라 밖으로 빠지고, 교차항은 그 숫자 곱하기 0이네요. 증분들이 서로 직교해서 제곱만 남는 거예요.
이서연 (평상)
이서연
선형대수 시간에 서로 직교하는 벡터를 더하면 길이 제곱이 그냥 더해졌잖아요. 피타고라스가 확률변수에서 다시 나온 거네요.
선생님 (흐뭇함)
선생님
그래요. 다음 값의 평균이 늘 지금 값과 같은 수열을 마팅게일(martingale)이라 불러요. 공정한 내기에서 한 판 더 해도 기대 자산이 그대로인 것과 같죠. 조건이 하나 있어요. 그 반복 기대값은 다음 토큰을 모델 자신의 확률로 뽑을 때만 성립해요.
이서연 (평상)
이서연
그러면 결말을 빨리 보려고 확률 높은 토큰 몇 개만 골라 강제로 갈라 보고 똑같이 평균 내면, V(st)\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) 의 흐름이 치우치겠네요.
김민준 (평상)
김민준
아까 학점 문제랑 같네요. 조교가 공정하게 매기면 다음 과제 뒤에 예상이 오를지 내릴지 미리 알 수 없고, 학기 전체의 불확실성이 과제마다 겹치지 않게 나눠 떨어지는 거고요.

정리 (가) V\textcolor{#00897b}{V} = 0.61 → 0.72 → 0.9 → 1, 증분 +0.11, +0.18, +0.10. (나) E[(ΔVt)2]\mathbb{E}[(\Delta\textcolor{#00897b}{V}_t)^2] = 0.0121, 0.0648, 0.1610 (5%, 27%, 68%), 합 0.2379 = Var(R)\mathrm{Var}(\textcolor{#d9670b}{R}). 결말을 가장 많이 정한 것은 반반으로 갈리는 첫 자리가 아니라 셋째 자리다 — 다음 토큰의 흩어짐과 결말의 흔들림은 다른 양이다. (다) 반복 기대값 때문에 E[V(st+1)∣st]=V(st)\mathbb{E}[\textcolor{#00897b}{V}(\textcolor{#0093b8}{s_{t+1}}) \mid \textcolor{#0093b8}{s_t}] = \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) 인 마팅게일이고, 증분의 교차항이 0이라 Var(R)=∑tE[(ΔVt)2]\mathrm{Var}(\textcolor{#d9670b}{R}) = \sum_t \mathbb{E}[(\Delta\textcolor{#00897b}{V}_t)^2] 가 정확히 성립한다. 불확실성이 토큰마다 빠짐없이, 겹침 없이 나뉘므로 「어느 토큰이 얼마나 결정했나」를 임의의 가중치 없이 정의할 수 있다. 증분은 곧 어드밴티지다. 단, 모델 자신의 확률로 뽑은 경로에서만(온폴리시: 지금 학습하는 모델이 직접 뽑은 샘플로 배우는 것) 성립한다.