가치함수, 시간차, GAE를 모두 모으면 학습 한 바퀴는 어떤 모습일까? 그리고 토큰마다 책임을 묻는 대가로 무엇을 치르게 될까?
역사: 기억 창고 대신 여러 일꾼
딥러닝으로 게임을 배우던 2010년대 중반, 딥마인드의 앞선 방법 DQN은 지나간 경험을 커다란 기억 창고(리플레이 버퍼)에 쌓아 두고 무작위로 꺼내 학습했다. 바로 이어진 장면끼리는 너무 비슷해서 학습이 흔들리기 때문이다. 대신 창고는 메모리와 계산을 많이 먹었고, 예전 정책이 만든 데이터로도 배울 수 있는 방법에만 쓸 수 있었다. 지금 정책이 뽑은 데이터로만 배우는 Actor-Critic은 창고를 쓸 수 없었다.
2016년 므니(Volodymyr Mnih)와 딥마인드 동료들은 창고 대신 일꾼 여럿을 두었다(ICML 2016). 여러 작업자가 각자 게임을 동시에 돌리면 한순간에도 서로 다른 장면을 겪으므로, 창고 없이도 데이터가 고르게 섞인다. 이렇게 어드밴티지로 액터와 비평가를 함께 갱신한 A3C(Asynchronous Advantage Actor-Critic, 서로 기다리지 않고 따로 도는 어드밴티지 Actor-Critic)는 GPU 없이 16코어 CPU 한 대로 나흘을 학습해, GPU로 8~10일 학습한 방법들보다 아타리(Atari 2600) 게임 57개의 평균 점수를 높였다. 작업자들이 발맞춰 도는 버전인 A2C와 함께, 이 구조가 딥러닝 시대 Actor-Critic의 표준 틀이 되었다.
Actor-Critic 한 바퀴
단계
액터(정책 πθ)
비평가(가치 Vϕ)
① 생성
응답을 뽑는다
—
② 채점
(보상 R을 받는다)
—
③ 평가
—
모든 앞부분의 Vϕ(st)를 예측
④ 어드밴티지
δt와 GAE로 A^t 계산
⑤ 갱신
−∑tA^tlogπθ(at∣st)로 한 걸음
(Vϕ(st)−G^t)2로 한 걸음
ML에서: 언어모델에서 비싼 이유
비평가는 공짜가 아니다. 언어모델에서 특히 비싸다.
크기. "이 풀이 앞부분에서 결국 맞힐 확률"을 예측하려면 풀이를 정책만큼 이해해야 한다. 그래서 비평가는 흔히 보상 모델이나 정책을 복사해 시작하고, 크기도 그만큼 크다. 오픈AI의 InstructGPT(2022)는 1.3B·6B·175B(파라미터 13억·60억·1,750억 개) 정책 모두에 6B 보상 모델에서 시작한 6B 비평가를 붙였다. 175B 비평가를 쓰면 PPO의 계산량이 크게 늘고, 175B 보상 모델은 학습이 불안정했기 때문이다. 비평가를 정책과 같은 7B(파라미터 70억 개)로 두고 혼합 정밀도 Adam(널리 쓰는 옵티마이저 Adam을 16비트와 32비트 수를 섞어 돌리는 방식)으로 학습하면, 파라미터 값뿐 아니라 그래디언트와 옵티마이저 상태도 메모리에 올라간다. 두 모델에 얼마나 드는지는 아래 문제 6에서 세어 본다.
정확도. 게임의 비평가는 점수가 수시로 들어오는 장면을 아주 많이 보며 배운다. 언어모델의 비평가는 "천 토큰짜리 풀이의 300번째 토큰 시점에서 결국 맞힐 확률"을, 끝에 한 번 주어지는 0/1 점수만 보고 배워야 한다. 학습 초기의 비평가는 거의 무작위이고, GAE의 λ<1 부분은 그 무작위 예측을 어드밴티지에 섞는다.
두 모델의 춤. 정책이 바뀌면 "정책을 따를 때의 기대 점수"인 Vπ도 바뀐다. 비평가는 움직이는 과녁을 쫓고, 정책은 그 비평가의 판단을 따른다. 둘의 학습 속도가 어긋나면 불안정해진다.
세 번째 항목의 위험, 곧 비평가가 틀린 예측이 정책을 어떻게 비트는지는 아래 문제 8에서 숫자로 본다. 아래 위젯의 비평가 단추를 「‘24’ 뒤 +0.3」으로 바꾸면, 오답 풀이에서 ‘24’를 쓴 뒤의 앞부분을 실제보다 0.3 높게 보는 비평가가 된다.
문제 6 — 비평가의 메모리
7B 정책과 7B 비평가를 혼합 정밀도 Adam으로 함께 학습한다. 파라미터 값·그래디언트·옵티마이저 상태만 따졌을 때 메모리는 얼마나 필요한가? 80GB GPU(H100 같은 데이터센터용 GPU 한 장의 메모리) 몇 장인가?
김민준
7B에 fp16(16비트 부동소수점)이면 파라미터당 2바이트니까 14GB, 두 개면 28GB요. 80GB 한 장이면 충분하네요.
선생님
민준 학생, 생성만 할 때와 학습할 때, GPU에 올라가는 게 같나요?
김민준
학습하면… 그래디언트가 파라미터만큼 더 있고, Adam은 기울기 평균이랑 기울기 제곱 평균, 두 개를 들고 있어요. 그리고 혼합 정밀도면 fp32로 된 파라미터 사본도 따로 들고 있고요.
김민준
2 + 2 + 4 + 4 + 4 = 16바이트. 7B × 16 = 112GB, 두 모델이면 224GB. 80GB로 나누면 2.8장, 최소 세 장이에요. 활성값은 빼고요.
선생님
그래요. 그리고 RLHF에서는 여기에 보상 모델과 레퍼런스 모델(학습 전 모델을 고정한 비교 기준)이 더해져요. 그 둘은 학습하지 않으니 파라미터만 올리지만요.
김민준
과제 서버 신청할 때 모델 크기만 보고 GPU 한 장 신청했다가 조교님한테 옵티마이저 상태 계산하라고 혼났던 거 생각나네요.
정리 혼합 정밀도 Adam 학습은 파라미터당 약 16바이트: 7B 하나에 112GB, 정책+비평가 224GB → 80GB GPU 최소 3장(활성값 제외). 비평가를 정책과 같은 크기로 두면 정책과 거의 같은 비용을 추가로 청구한다.
문제 7 — 겹쳐 쓰는 5% 할인 쿠폰
어느 가게는 5% 할인 쿠폰을 몇 장이든 겹쳐 쓰게 해 준다. 쿠폰 한 장은 그때의 가격에서 5%를 깎는다. 10,000원짜리 물건에 쿠폰을 20장 겹쳐 쓰면 얼마가 되나? 100장이면? 몇 장째부터 원래 값의 절반 아래로 떨어지나?
김민준
5%씩 20장이면 100% 깎이니까 0원이요. 100장이면 오히려 돈을 받아야 하고요.
선생님
민준 학생, 두 번째 쿠폰은 10,000원의 5%를 깎나요, 첫 쿠폰을 쓰고 남은 값의 5%를 깎나요?
김민준
남은 값의 5%요. 그럼 한 장마다 0.95를 곱하는 거라 20장이면 10,000 × 0.95²⁰ ≈ 3,585원, 100장이면 약 59원이에요.
이서연
0.95를 13번 곱하면 0.513, 14번이면 0.488이니까 14장째부터 절반 아래야. 한 장은 5%뿐인데 스무 장이면 원가의 64%가, 백 장이면 99% 넘게 사라져.
선생님
그래요. 「0.95면 거의 1」이라는 느낌은 곱하는 횟수가 적을 때만 맞아요.
정리 한 장마다 0.95를 곱한다. 20장이면 약 3,585원(원가의 36%), 100장이면 약 59원(0.6%). 14장째부터 절반 아래로 떨어진다. 작은 비율도 곱이 쌓이면 빠르게 0에 가까워진다.
문제 8 — (킬러) "따라서"를 사랑하는 비평가
비평가가 학습 데이터의 우연 때문에 "따라서"라는 단어가 들어간 모든 앞부분의 가치를 실제보다 0.3 높게 예측한다(다른 상태는 정확). 응답 중간의 k번째 토큰이 "따라서"다. (가) λ=0일 때 “따라서” 토큰과 마지막 토큰의 어드밴티지는 진짜 값에서 얼마나 벗어나는가? (나) λ=1이면? (다) 이대로 오래 학습하면 정책은 무엇을 배우는가? λ=0.95는 안전한가? 위젯의 「문제 8 값」 단추는 ‘24’를 “따라서” 자리에 둔 같은 설정을 불러온다. (가)(나)를 푼 뒤 λ 를 0과 1로 바꿔 수치판과 견주어 보라.
칠판: 비평가는 "따라서"가 들어간 모든 앞부분을 실제보다 +0.3 높게 본다.
선생님
먼저 λ=0이요. 어떤 토큰이 영향을 받죠?
김민준
δt가 V(st+1)−V(st)니까, "따라서"를 쓰기 직전 상태는 멀쩡하고 직후 상태만 +0.3이에요. 그래서 "따라서"의 δt가 +0.3 커져요.
김민준
그 다음 토큰들은 앞뒤 상태가 둘 다 +0.3이라 차이가 지워지고요. 그럼 영향받는 건 “따라서” 하나예요.
이서연
하나 더 있어. 마지막 토큰. 마지막 δ는 R−V(sT−1)인데, R은 진짜 점수라 +0.3이 없고 V(sT−1)에는 +0.3이 있어. 그래서 마지막 토큰은 −0.3.
선생님
좋아요. 그럼 λ=1은요?
이서연
λ=1이면 R−V(st)니까 “따라서” 토큰은 직전 상태만 보고 멀쩡해요. 대신 그 뒤의 모든 토큰이 V(st)가 부풀려져서 −0.3씩 손해를 봐요. 이건 더 나쁜 것 같아요. 억울한 토큰이 훨씬 많잖아요.
선생님
서연 학생, 베이스라인이 치우침을 만들지 않는 조건이 뭐였죠?
이서연
베이스라인이 그 상태에서 고른 행동에 의존하지 않을 것… 부풀려진 V(st)도 결국 상태 st만의 함수네요. 틀린 값이어도 "상태의 함수"이긴 해요.
이서연
그럼 λ=1에서 뒤쪽 토큰의 −0.3은 베이스라인이 좀 틀린 것일 뿐이라, 기대값으로는 치우침이 없어요. 분산은 좀 늘겠지만요. 반대로 λ=0의 +0.3은 “따라서를 고른 행동” 자체에 붙어 있으니까 진짜 치우침이고요.
선생님
바로 그거예요. 억울한 토큰의 개수가 아니라, 그 오류가 "행동"에 붙었는지 "상태"에 붙었는지가 중요해요. 그럼 (다), 오래 학습하면요?
김민준
λ=0이면 "따라서"를 쓸 때마다 +0.3을 받으니까… 정책이 "따라서"를 남발하게 돼요. 채점기는 속이지 못해도 비평가는 속이는 거네요.
선생님
그래요. 보상 모델만 해킹당하는 게 아니라, 비평가도 해킹당할 수 있어요. 그럼 λ=0.95면 안전할까요?
김민준
0.95면 거의 MC니까 안전하죠.
이서연
잠깐, “따라서” 토큰의 어드밴티지를 풀어 보면 +0.3이 한 번 더해지고, 마지막 토큰의 −0.3이 λT−1−k배로 줄어서 더해져. 그러니까 치우침이 0.3(1−0.95T−1−k)야.
김민준
계산해 보니까 뒤에 20토큰 남았으면 0.19, 100토큰이면 0.298… 거의 0.3 전부네요. 응답이 길면 0.95도 거의 TD예요.
선생님
그래서 긴 추론 응답에서는 λ를 응답 길이에 맞춰 1에 더 가깝게 두자는 연구(VAPO, 2025년에 나온, 비평가를 쓰는 PPO를 긴 추론에 맞게 고친 방법)까지 나왔어요. "0.95는 거의 1"이라는 직관은 수천 토큰 앞에서는 틀려요.
김민준
아까 쿠폰 문제랑 같네요. 한 장에 5%면 별것 아니어도 백 장을 겹치면 원가가 거의 사라지듯이, 마지막 토큰의 −0.3도 0.95를 백 번 곱하면 거의 안 돌아와요.
정리 (가) λ=0: "따라서"의 어드밴티지 +0.3, 마지막 토큰 −0.3. 오류가 행동에 붙어 진짜 치우침이 된다. (나) λ=1: "따라서"는 영향 없음. 이후 토큰들이 −0.3씩 받지만 상태에만 의존하는 베이스라인 오류라 기대값은 치우치지 않는다(분산만 증가). (다) 정책이 "따라서"를 남발한다 — 비평가 해킹. λ=0.95의 치우침은 0.3(1−0.95n)이라, 뒤에 남은 토큰 수 n이 20이면 0.19, 100이면 0.30. 긴 응답에서는 거의 순수 TD다.