9. Actor-Critic: 비평가를 곁에 두다

시간차: 한 스텝만 가고 비평가를 믿는다

문제는 진짜 VV를 모른다는 것이다. 신경망으로 근사한 비평가 VϕV_\phi(첨자 φ(파이, phi)는 비평가 신경망의 파라미터)를 쓸 수밖에 없다(학습법은 이 절 끝에서 본다). 그러면 어드밴티지를 계산할 때 비평가를 어디까지 믿어야 할까? 풀이가 끝날 때까지 기다려 실제 점수를 볼 수도 있고, 한 토큰만 더 본 뒤 나머지는 비평가의 예측에 맡길 수도 있다.

역사: 막대가 넘어진 뒤에야 오는 신호

비평가는 이 장과 똑같은 고민에서 나왔다. 1983년 매사추세츠 대학교의 배로(Andrew Barto), 서튼(Richard Sutton), 앤더슨(Charles Anderson)은 수레 위에 경첩으로 세운 막대를, 수레를 좌우로 밀어 쓰러지지 않게 하는 일을 기계에게 배우게 했다. 기계는 수레와 막대의 운동 방정식을 모르고, 받는 신호는 막대가 일정한 각도 넘게 기울거나 수레가 선로 끝에 닿았을 때 오는 「실패」 하나뿐이었다. 여러 번 민 끝에 온 실패를 어느 밀기 탓으로 돌릴 것인가? 그들은 신경 세포를 흉내 낸 소자 둘을 나란히 두었다. 하나는 밀 방향을 고르고, 다른 하나는 실패 신호만으로는 얻을 수 없는 더 촘촘한 평가를 스스로 만들었다. 둘째 소자의 이름이 적응 비평 소자(adaptive critic element)였다.

그 평가를 고치는 방법, 곧 결과를 기다리지 않고 다음 예측을 목표로 삼아 지금 예측을 고치는 방법이 시간차 학습이다. 비평가는 시간차 학습으로 배우는 가치함수다.

몬테카를로 대 시간차

어드밴티지를 추정하는 두 극단이 있다.

몬테카를로(MC): 끝까지 기다려 실제 점수를 본다.

A^tMC=R−Vϕ(st)\textcolor{#8e44ad}{\hat A_t^\text{MC}} = \textcolor{#d9670b}{R} - \textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_t})

시간차(TD, temporal difference): 한 스텝(토큰 하나)만 가고, 그 다음은 비평가의 예측을 믿는다.

A^tTD=δt=rt+γVϕ(st+1)−Vϕ(st)\textcolor{#8e44ad}{\hat A_t^\text{TD}} = \textcolor{#8e44ad}{\delta_t} = \textcolor{#d9670b}{r_t} + \textcolor{#7a1f5a}{\gamma} \textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_{t+1}}) - \textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_t})

A^tMC몬테카를로 어드밴티지: 실제 최종 점수에서 비평가 예측을 뺀 값δtTD 오차: 한 스텝 뒤의 예측으로 만든 어드밴티지R응답의 최종 점수rt시점 t의 보상 (언어 모델은 마지막 토큰에서만 0이 아님)Vϕ비평가의 가치 예측γ할인율 (언어 모델 강화학습에서는 보통 1) \small\begin{array}{ll} \textcolor{#8e44ad}{\hat A_t^\text{MC}} & \text{몬테카를로 어드밴티지: 실제 최종 점수에서 비평가 예측을 뺀 값} \\ \textcolor{#8e44ad}{\delta_t} & \text{TD 오차: 한 스텝 뒤의 예측으로 만든 어드밴티지} \\ \textcolor{#d9670b}{R} & \text{응답의 최종 점수} \\ \textcolor{#d9670b}{r_t} & \text{시점 }t\text{의 보상 (언어 모델은 마지막 토큰에서만 0이 아님)} \\ \textcolor{#00897b}{V_\phi} & \text{비평가의 가치 예측} \\ \textcolor{#7a1f5a}{\gamma} & \text{할인율 (언어 모델 강화학습에서는 보통 1)} \end{array}

δt\textcolor{#8e44ad}{\delta_t}를 TD 오차라 부른다. γ\textcolor{#7a1f5a}{\gamma}는 먼 미래의 보상을 깎는 할인율인데, 언어 모델 RLHF(사람의 선호로 학습한 보상 모델의 점수를 강화학습으로 올리는 절차)에서는 보통 γ=1\textcolor{#7a1f5a}{\gamma} = 1(할인 없음)을 쓴다.

MC: R−V(st)\textcolor{#d9670b}{R} - \textcolor{#00897b}{V}(\textcolor{#0093b8}{s_t}) TD: δt\textcolor{#8e44ad}{\delta_t}
무엇을 믿나 실제로 받은 점수 다음 상태에 대한 비평가의 예측
편향 없음 (비평가가 틀려도 베이스라인일 뿐) 비평가가 틀리면 그대로 편향
분산 큼: 이후 모든 토큰의 운이 섞인다 작음: 한 토큰의 운만 섞인다
“24” 오답에서 "10 × 3"의 추정 0−0.45=−0.450 - 0.45 = -0.45 (좋은 수가 벌을 받음) 0.70−0.45=+0.250.70 - 0.45 = +0.25 (정확히 짚음)

MC의 문제는 이 표의 마지막 줄이다. “10 × 3” 뒤에 우연히 "24"라는 실수가 나왔다는 이유로, 좋은 수가 벌을 받는다. 여러 샘플을 평균내면 “10 × 3” 뒤에 "21"이 나온 샘플들이 상쇄해 주므로 결국 바로잡히지만, 그만큼 샘플이 많이 든다. 샘플마다 추정이 이렇게 크게 달라지는 오류를 분산이라 한다.

TD의 문제는 반대여서, 비평가가 정확하면 한 샘플만으로 범인을 짚는다. 하지만 비평가가 "10 × 3을 쓰면 오히려 불리하다"고 잘못 믿고 있다면, 그 오해가 어드밴티지에 그대로 들어간다. 샘플을 아무리 많이 모아도 사라지지 않는 이런 오류를 편향(bias)이라 한다.

같은 오답 풀이의 네 토큰에 두 방법을 모두 대어 보면(비평가가 진짜 가치를 안다고 할 때) 차이가 한눈에 보인다. MC는 네 토큰을 모두 벌하고, TD는 "24"에 벌을 몰아준다.

몬테카를로: 실제 점수 − 지금 예측 −0.45 −0.70 −0.80 −0.05 시간차: 다음 예측 − 지금 예측 +0.25 +0.10 −0.75 −0.05 10 × 3 + 7 × 3 = 30 + 24 = 54
ML에서: 비평가를 학습한다

진짜 V\textcolor{#00897b}{V}는 알 수 없으니 비평가를 학습한다. 보통 트랜스포머에 스칼라 하나를 출력하는 머리(value head)를 달고, 각 앞부분(프롬프트 + 지금까지 쓴 토큰)에 대해 "결국 받을 점수"를 회귀(숫자 하나를 예측해 목표값과의 제곱 오차를 줄이는 학습)로 맞춘다.

LV(ϕ)=∑t(Vϕ(st)−G^t)2\textcolor{#d62728}{\mathcal{L}_V}(\phi) = \sum_t \big(\textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_t}) - \textcolor{#5d4037}{\hat G_t}\big)^2
LV비평가의 회귀 손실Vϕ(st)비평가(파라미터 ϕ)가 예측한 가치G^t맞춰야 할 목표값 (끝까지 기다린 점수, 또는 한 스텝 뒤의 예측)\small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_V} & \text{비평가의 회귀 손실} \\ \textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_t}) & \text{비평가(파라미터 }\phi\text{)가 예측한 가치} \\ \textcolor{#5d4037}{\hat G_t} & \text{맞춰야 할 목표값 (끝까지 기다린 점수, 또는 한 스텝 뒤의 예측)} \end{array}

목표값 G^t\textcolor{#5d4037}{\hat G_t} 로는 끝까지 기다린 실제 점수 R\textcolor{#d9670b}{R} 을 쓸 수도, 한 스텝 뒤의 예측 rt+Vϕ(st+1)\textcolor{#d9670b}{r_t} + \textcolor{#00897b}{V_\phi}(\textcolor{#0093b8}{s_{t+1}}) 을 쓸 수도 있는데, 위의 두 극단과 같은 선택이다. 한 번의 순전파로 모든 앞부분의 가치가 나온다는 점은 다행이어서, 응답이 1,000토큰이어도 비평가를 1,000번 돌릴 필요는 없다.

문제 3: 사용자가 끼어들면

모델이 한 차례 말을 마치는 토큰 「[말 끝]」을 고르면, 사용자가 「네」나 「아니요」로 답한 뒤에야 모델이 다시 말한다. 사용자는 반반의 확률로 답한다. 대화가 결국 성공할 확률(가치)은 「네」 뒤 0.9, 「아니요」 뒤 0.3이고, 「[말 끝]」을 고르기 직전의 가치는 0.55다. 이번 대화에서 사용자는 「아니요」라고 답했다. 비평가는 진짜 가치를 안다고 하자(γ=1\textcolor{#7a1f5a}{\gamma} = 1, 중간 보상 0). (가) 「[말 끝]」의 TD 오차 δt\textcolor{#8e44ad}{\delta_t} 를 구하시오. (나) 이 δt\textcolor{#8e44ad}{\delta_t} 는 「[말 끝]」의 어드밴티지 그 자체인가? 어드밴티지는 얼마인가? (다) 사용자 없이 모델 혼자 풀이를 써 내려갈 때와 무엇이 다른가?

김민준 (평상)
김민준
0.3 − 0.55 = −0.25요. 언어 모델은 토큰을 고르면 다음 상태가 정해지니까 δt\textcolor{#8e44ad}{\delta_t} 가 어드밴티지랑 정확히 같잖아요. 「[말 끝]」은 나쁜 수였어요.
선생님 (질문)
선생님
민준 학생, 「[말 끝]」을 고른 순간 다음 상태가 하나로 정해졌나요? 모델이 다시 말할 때 앞에 무엇이 붙어 있죠?
김민준 (난처함)
김민준
사용자의 답이 붙어 있어요. 「네」가 붙을지 「아니요」가 붙을지는 모델이 고른 게 아니고요.
이서연 (평상)
이서연
그럼 고른 뒤의 가치는 두 경우의 평균이야. Q=0.5×0.9+0.5×0.3=0.6\textcolor{#00897b}{Q} = 0.5 \times 0.9 + 0.5 \times 0.3 = 0.6 이고, 어드밴티지는 0.6−0.55=+0.050.6 - 0.55 = +0.05. 「[말 끝]」은 오히려 조금 좋은 수였어. −0.25는 「아니요」를 들은 운이 섞인 한 샘플이고, 「네」였다면 +0.35였겠지.
선생님 (흐뭇함)
선생님
그래요. 두 샘플을 확률대로 평균하면 +0.05로 어드밴티지와 같아요. 무작위가 모델 밖에 있으면 δt\textcolor{#8e44ad}{\delta_t} 는 어드밴티지의 한 샘플이고, 평균을 내야 어드밴티지가 돼요.
이서연 (아하)
이서연
모델 혼자 쓸 때는 다음 상태가 고른 토큰으로 정해져서 평균 낼 대상이 없었던 거네요. 확률론 수업에서 조건부 기댓값 E[X | Y]가 X가 Y의 함수이면 그냥 X가 되는 거랑 같아요. 여기서는 다음 상태가 고른 토큰만의 함수가 아니라서 평균이 남고요.
김민준 (평상)
김민준
검색이나 계산기를 부르는 에이전트도 그렇겠네요. 도구가 돌려주는 결과가 매번 다르면요.

정리 (가) δt=0.3−0.55=−0.25\textcolor{#8e44ad}{\delta_t} = 0.3 - 0.55 = -0.25. (나) 한 샘플일 뿐이다. 어드밴티지는 (0.5×0.9+0.5×0.3)−0.55=+0.05(0.5 \times 0.9 + 0.5 \times 0.3) - 0.55 = +0.05 이고, 「네」였다면 δt=+0.35\textcolor{#8e44ad}{\delta_t} = +0.35 로 두 경우의 평균이 +0.05다. (다) 모델 혼자 쓸 때는 고른 토큰이 다음 상태를 정하므로, 진짜 가치를 쓰면 δt\textcolor{#8e44ad}{\delta_t} 가 어드밴티지 그 자체다. 사용자나 도구처럼 모델 밖의 무작위가 끼면 δt\textcolor{#8e44ad}{\delta_t} 는 어드밴티지의 한 샘플이 되어, 비평가가 정확해도 사용자의 답에서 오는 분산이 남는다.