비율을 곱하면 옛 정책이 뽑은 배치로도 지금 정책의 그래디언트를 어림할 수 있다. 그렇다면 한 배치로 몇 번이든 마음껏 업데이트해도 될까?
어드밴티지가 양수인 토큰을 하나 떠올려 보자. 비율을 곱한 대리 목적함수 L(θ)=E[rt(θ)A^t]는 그 토큰의 확률을 올릴수록, 곧 비율 rt를 키울수록 계속 커진다. 옵티마이저는 멈출 까닭이 없다. 그런데 이 목적함수는 옛 정책 πold 지점에서 진짜 목표에 접하는 근사, 말하자면 "접선"이다. πold 근처에서만 진짜 목표를 잘 흉내 내고, 멀리 갈수록 둘은 벌어진다.
지도학습이라면 한 번 너무 크게 가도 다음 배치에서 되돌아온다. 데이터가 고정돼 있으니까. 강화학습에서는 정책이 다음 데이터를 만든다. 한 번 크게 망가진 정책은 망가진 응답만 생성하고, 그 응답으로 다시 학습한다. 예컨대 어떤 말버릇 토큰의 확률이 한 번에 0.01에서 0.9로 뛰면, 이후 모든 응답이 그 말버릇으로 시작하고 다양성이 사라져 비교할 거리도 사라진다. 되돌아올 길이 없다.
그래서 필요한 것은 한 번의 반복에서 정책이 움직일 수 있는 거리의 상한이다.
역사: 벌점에서 울타리로, 울타리에서 잘라내기로
이 상한을 식으로 세운 방법이 슐먼(John Schulman)과 버클리의 동료들이 2015년에 낸 TRPO(Trust Region Policy Optimization, 신뢰 영역 정책 최적화)다. 그들의 이론은 원래 벌점 꼴이었다. 대리 목적함수에서 옛 정책과의 KL 거리에 계수를 곱해 빼면 그 값이 진짜 성능의 아래 경계가 되고, 이 경계를 올리는 한 성능은 떨어지지 않는다. 문제는 계수였다. 이론이 주는 계수로는 걸음이 너무 작았고, 여러 문제에 두루 맞는 계수 하나를 고르기도 어려웠다. 그래서 TRPO는 벌점 대신 울타리를 쳤다.
“이전 정책과의 KL 거리가 δ 이내인 신뢰 영역(trust region) 안에서만 목적함수를 믿고 최대화하라.” 이론의 보장은 실용 알고리즘으로 옮기며 몇 가지 어림을 거치는 사이 엄밀함을 잃었지만, 논문의 실험에서 TRPO는 대체로 꾸준히 좋아졌다. 대가는 계산이다. 울타리 안에서 최대화하려면, 정책이 조금 움직일 때 KL이 얼마나 빨리 커지는지를 재는 2차 미분 행렬(피셔 정보 행렬)을 다뤄야 하고, 그 행렬이 든 연립방정식을 반복 계산(켤레 그래디언트)으로 풀어야 한다. 수십억 파라미터 모델에 쓰기엔 무겁고 구현도 까다롭다.
2년 뒤 슐먼은 OpenAI의 동료들과 PPO(Proximal Policy Optimization, 근접 정책 최적화)를 내며 TRPO의 번거로움을 이렇게 적었다: 비교적 복잡하고, 드롭아웃처럼 잡음이 섞인 구조나 정책과 비평가가 파라미터를 나눠 쓰는 구조와는 맞지 않는다. 그들은 1차 미분만 쓰는 대안 몇 가지를 로봇 시뮬레이션 일곱 과제에서 견주었다. 무작위 정책을 0, 가장 좋은 결과를 1로 맞춘 점수로, 아무 장치 없이 비율 목적함수만 여러 번 최적화하면 −0.39 — 무작위 정책보다도 나빴다. 옛 정책과의 KL 벌점을 고정 계수로, 또는 스스로 조절하는 계수로 달면 0.62~0.74였고, 아래의 잘라내기가 0.82로 가장 좋았다.
잘라낸 목적함수
PPO는 TRPO와 같은 목표를 1차 미분만으로 흉내 낸다. 제약식 대신 목적함수 자체를 잘라낸다.
원 논문의 비교에서 ϵ(엡실론) = 0.1, 0.2, 0.3 가운데 0.2가 가장 좋았고, 지금도 흔히 이 값을 쓴다.
숫자로. "서울"이라는 토큰을 πold가 0.20의 확률로 골랐고 어드밴티지가 +1이라 하자. ϵ=0.2면 이번 반복에서 이 토큰의 확률은 0.20×1.2=0.24까지만 “이득을 보며” 올라갈 수 있다. 0.24를 넘으면 min이 잘린 쪽, 곧 θ가 들어 있지 않은 상수 1.2×1을 고르므로 이 샘플의 그래디언트는 0이 된다.
식이 짧지만 min과 clip이 겹쳐 있어 경우를 나눠 읽어야 한다.
어드밴티지
비율 rt
두 항 중 작은 것
그래디언트
해석
A^>0 (좋은 행동)
r<1+ϵ
rA^
살아 있음
아직 올릴 여지가 있다 → 올린다
A^>0
r>1+ϵ
(1+ϵ)A^ (상수)
0
이미 충분히 올렸다 → 멈춘다
A^<0 (나쁜 행동)
r>1−ϵ
rA^
살아 있음
아직 내릴 여지가 있다 → 내린다
A^<0
r<1−ϵ
(1−ϵ)A^ (상수)
0
이미 충분히 내렸다 → 멈춘다
주목할 것은 표에 없는 경우다. 좋은 행동인데 확률이 오히려 줄었거나(A^>0, r<1−ϵ), 나쁜 행동인데 확률이 오히려 늘었다면(A^<0, r>1+ϵ)? 비율이 허용 범위 밖이니 잘릴 것 같다. 하지만 min이 두 항 가운데 어느 쪽을 고르는지는 직접 넣어 봐야 안다. 아래 문제 6에서 해 보자.
위젯에서 ϵ을 줄였다 늘렸다 하며, 목적함수가 평평해지는 구간(그래디언트 0)이 어디서 시작하는지 보라. 단추는 아래 문제 5·6의 비율과 어드밴티지를 불러와 그래프 위에 점으로 찍는다.
ML에서: 언어모델 학습의 한 반복
한 번의 반복(iteration)은 다섯 단계다.
생성 — 현재 정책을 πold로 얼려두고, 프롬프트 배치에 응답을 생성한다. 각 토큰의 logπold를 저장한다.
여러 번 업데이트 — 같은 배치를 미니배치로 쪼개 K 에폭 동안 아래 손실을 줄인다. 에폭은 같은 배치를 처음부터 끝까지 한 번 다 쓰는 것이다. 원 논문의 실험은 과제에 따라 3~15 에폭을, 요약 과제의 RLHF 논문은 한 배치에 4 에폭을 썼다.
L=−LCLIP+c1(Vϕ(st)−G^t)2−c2H[πθ(⋅∣st)]LVϕ,G^tHc1,c2한번에줄이는전체손실비평가의예측과그목표값정책의엔트로피항별계수
첫째 항은 정책, 둘째 항은 비평가의 회귀 손실, 셋째 항은 엔트로피 보너스(너무 빨리 한 답으로 수렴하지 않도록 무작위성을 조금 남긴다)다.
교체 — πold←πθ. 1로 돌아간다.
5단계를 눈여겨보자. 클리핑이 재는 비율의 분모 πold는 반복이 끝날 때마다 새 정책으로 바뀐다. 그렇다면 클리핑이 묶어 두는 것은 무엇으로부터의 거리일까? 이 물음은 KL 페널티 절의 마지막 문제에서 다시 만난다.
빈칸 Φt — 정책 그래디언트 E[∑tΦt∇logπθ] 에서 각 토큰에 곱하는 가중치 — 로 PPO를 적으면:
알고리즘
빈칸 Φt
무엇을 개선했나
PPO
min(rtA^t,clip(rt)A^t)의 기울기
비싼 샘플을 여러 번 쓰되, 한 번에 멀리 가지 않게
문제 3 — 누가 만든 데이터인가
다음을 온폴리시/오프폴리시로 분류하시오. (가) REINFORCE (나) PPO 한 반복의 첫 번째 미니배치 업데이트 (다) 같은 반복의 세 번째 에폭 (라) UltraFeedback(여러 모델의 응답에 GPT-4가 매긴 평가를 모은 공개 선호 데이터셋)으로 학습하는 DPO
선생님
기준은 하나예요. 지금 그래디언트를 계산하는 정책이, 그 데이터를 만든 정책과 같은가. 네 경우 각각 어떤가요?
김민준
(가)는 온폴리시, (라)는 오프폴리시. 쉽네요. (나)(다)는 PPO니까 둘 다 온폴리시요. 방금 자기가 생성한 거잖아요.
이서연
(나)는 온폴리시 맞아. 첫 업데이트 전엔 π_θ랑 π_old가 똑같으니까 비율이 전부 1이야.
이서연
근데 (다)는 이미 두 에폭 업데이트한 뒤라 π_θ가 π_old랑 달라. 데이터는 π_old가 만든 거고.
김민준
아, 같은 배치라도 몇 번째로 쓰느냐에 따라 다르구나.
선생님
그래서 PPO를 "살짝 오프폴리시"라고 불러요. 그 "살짝"을 비율 r로 보정하고 클리핑으로 한계를 두는 거죠.
김민준
지난 학기 보고서 초안에 조교님 코멘트 받은 거랑 비슷하네요. 첫 수정 때는 코멘트가 딱 맞는데, 세 번 고치고 나면 코멘트가 가리키는 문장이 이미 바뀌어 있어서 적당히 걸러 들어야 했거든요.
정리 (가) 온폴리시 (나) 온폴리시 — 첫 업데이트 전이라 rt=1 (다) 오프폴리시 — 같은 배치라도 정책이 이미 바뀌었다 (라) 오프폴리시(이자 오프라인).
문제 4 — 적립 한도에 닿은 카드
어떤 카드는 결제액의 5%를 적립해 주되, 한 달에 1만 원까지만 준다. 이번 달에 벌써 25만 원을 썼다. (가) 이번 달 적립금은 얼마인가? (나) 이번 달에 5만 원을 더 쓰면 적립금은 얼마나 늘어나는가? (다) 20만 원을 쓰기 전까지는 1만 원을 더 쓸 때마다 적립금이 얼마씩 늘었는가?
선생님
25만 원을 썼으면 이번 달 적립금은 얼마죠?
김민준
25만 원의 5%니까 12,500원이요.
이서연
한도가 1만 원이잖아. min(12,500, 10,000) = 10,000원.
선생님
그럼 여기서 5만 원을 더 쓰면 적립금은 얼마나 늘죠?
김민준
5만 원의 5%, 2,500원이요. 쓴 만큼 붙는 거니까요.
이서연
이미 한도에 닿아 있잖아. 30만 원이면 5%는 15,000원이지만 한도 때문에 그대로 1만 원이야. 늘어나는 건 0원.
김민준
아, 적립금 1만 원은 받아 두었는데, 더 써도 늘지는 않는 거네요. 20만 원까지는 1만 원 쓸 때마다 500원씩 늘었는데.
선생님
받아 둔 값과, 더 쓸 때 늘어나는 빠르기는 다른 거예요.
정리 (가) min(12,500,10,000)=10,000원. (나) 0원 — 한도 위에서는 더 써도 늘지 않는다. (다) 500원. 받아 둔 값(1만 원)이 0이 아니어도, 더 쓸 때 늘어나는 빠르기는 0일 수 있다.
문제 5 — 비율이 3까지 간 토큰
어떤 토큰을 πold는 0.1, 현재 πθ는 0.3의 확률로 고른다. 어드밴티지는 A^=+2, ϵ=0.2. (가) 클리핑 없는 목적함수 값과 LCLIP 값을 구하고, 이 토큰이 그래디언트에 기여하는지 답하시오. (나) 같은 반복 안에서 ϵ=0.2로 클리핑했는데, 이 토큰의 비율은 어떻게 1.2를 넘어 3까지 갔을까?
2.4는 (1+ε)·Â라서 θ가 안 들어 있어요. 아까 적립 한도랑 같네요. 1만 원은 받아 두었지만 더 써도 안 늘던 거요. 기울기는 0이에요.
이서연
값이 0이 아닌 거랑 기울기가 0이 아닌 건 다른 얘기구나. 목적함수에 "값"으로는 남아 있어도 정책을 더 밀지는 않네.
선생님
그럼 (나)예요. 이 토큰은 비율이 1.2를 넘는 순간부터 스스로는 밀지 않아요. 그런데 어떻게 3까지 갔을까요?
김민준
그건 문제가 이상한 거 아니에요? 클리핑이 있으면 1.2 위로는 못 가잖아요.
선생님
모델의 파라미터는 토큰마다 따로 있나요?
이서연
아뇨, 모든 토큰이 같이 써요. 아, 다른 토큰들의 그래디언트가 파라미터를 움직이면 이 토큰의 확률도 덩달아 움직여요. 비슷한 문맥의 다른 토큰을 올리다 보면 이 토큰도 같이 올라갈 수 있고요.
김민준
한 걸음이 크면 1.1에서 한 번에 1.5로 건너뛸 수도 있겠네요. 멈추라는 신호는 1.2를 넘은 다음에야 켜지니까.
선생님
그래요. 클리핑은 울타리가 아니라 "선을 넘은 샘플은 더 밀지 않는다"는 약속이에요. 2020년 MIT의 엥스트롬(Logan Engstrom)과 동료들이 로봇 제어 과제에서 재 보니, PPO로 학습하는 동안 비율의 최댓값은 1 + ε를 꾸준히 넘었어요.
김민준
과제 제출 마감이랑 비슷하네요. 마감이 지나면 더 고쳐도 점수는 안 바뀌지만, 마감 직전에 한꺼번에 많이 고쳐 넣는 건 막을 수가 없는.
정리 (가) r=3, 클리핑 없는 값 6, LCLIP=min(6,1.2×2)=2.4. 이 값은 θ와 무관한 상수이므로 그래디언트는 0 — 기여하지 않는다. (나) 파라미터는 모든 토큰이 함께 쓰므로 다른 토큰의 업데이트가 이 토큰의 확률도 움직이고, 한 걸음이 크면 1+ϵ을 한 번에 넘을 수도 있다. 클리핑은 선을 넘은 샘플을 더 밀지 않을 뿐, 비율 자체를 가두지는 않는다.
문제 6 — 나쁜 행동의 확률이 올라가 버렸다
나쁜 행동(A^=−1)인데, 여러 에폭을 도는 사이 이 토큰의 확률이 오히려 50% 늘었다(r=1.5). ϵ=0.2일 때 이 샘플은 잘리는가? 그래디언트는 어느 방향인가?
위젯의 ‘문제 6’ 단추가 이 값을 불러온다.
선생님
나쁜 행동인데 확률이 50% 늘었어요. r = 1.5는 허용 범위 [0.8, 1.2] 밖이죠. 잘릴까요?
김민준
범위 밖이니까 잘려요. 아까 비율 3짜리처럼 기울기도 0이겠죠.
이서연
식에 넣어볼게. r·Â = −1.5, clip(r)·Â = 1.2 × (−1) = −1.2. min(−1.5, −1.2)는 −1.5야. 잘리지 않은 쪽이 골라졌어.
김민준
어? 범위 밖인데 안 잘려?
이서연
그런데 그러면 이상하지 않아요? 클리핑은 멀리 못 가게 하려는 건데, 여기선 안 막잖아요. 이러면 r이 계속 커질 수도 있는 것 아닌가요?
선생님
서연 학생, 이 항의 그래디언트는 r을 어느 쪽으로 밀죠?
이서연
r·Â = −r 이니까 이걸 최대화하면 r을 줄이는 쪽이요. 아, 커지는 게 아니라 1 쪽으로 되돌리는 방향이네요.
이서연
그러니까 잘못된 방향으로 벗어난 건 막을 이유가 없는 거구나. 오히려 계속 교정해야 하니까.
선생님
맞아요. 클리핑은 "이득 보는 쪽으로 너무 멀리"만 막아요. 손해 보는 쪽으로 벗어났다면 끝까지 바로잡죠. 그래서 비관적인 하한이라고 불러요.
이서연
해석학에서 하한으로 누르는 거랑 같네요. 위쪽 추정은 믿을 만한 데까지만 쓰고, 아래쪽 나쁜 소식은 전부 반영하는.
정리min(−1.5,−1.2)=−1.5 — 잘리지 않는다. 그래디언트는 r을 줄이는 방향(나쁜 행동의 확률을 다시 낮춤). 클리핑은 이득 방향의 이탈만 멈춘다. 한 문장으로 줄이면: 이득 보는 방향으로 선을 넘으면 멈추고, 손해 보는 방향으로 넘으면 계속 바로잡는다. 그래서 LCLIP은 잘리지 않은 목적함수의 비관적인(pessimistic) 하한이다.