넓히기와 좁히기

SFT: 좁은 데이터 위로의 m-사영

“프리트레인된 모델은 뭐든 할 수 있지만 뭘 해야 할지 모른다. 질문에 답하는 대신 질문을 이어 붙이기도 한다. '정확하고 도움이 되는 답변’으로 좁히는 과정은 분포의 공간에서 무슨 일인가?”

비유

라디오의 튜닝 — 전 주파수대 스캔이 끝났다. 이제 듣고 싶은 방송을 고른다. SFT는 주파수대 필터와 닮았다. “뉴스 채널 근처로 좁혀라.” AM 주파수대의 뉴스 주파수 근처로 범위를 줄인다. 아직 정확한 주파수는 아니어서 근처의 몇 개 채널이 겹쳐 들린다.

와일드카드({A | B} 가운데 하나를 무작위로 고르게 하는 프롬프트 표기)로 말하면, 쉼표로 조건을 붙이기 시작하는 단계다. {도움이 되는 답변}, {정중한 톤}. 조건을 붙일 때마다 겹치는 영역만 살아남는 것처럼 보인다.

그렇다면 SFT는 조건을 곱하는 곱셈의 길일까, 아직 확률을 섞는 덧셈 쪽일까?

SFT는 m-사영이다 — 좁아진 것은 데이터다

비유만 믿으면 SFT도 "곱셈의 길"처럼 보인다. 식을 보면 그렇지 않다. SFT의 손실도 프리트레인과 똑같은 교차엔트로피다. 바뀐 것은 p 뿐이다. 인터넷 전체 대신, 사람이 쓴 모범 답변들의 분포 pSFT 로.

그러니 SFT는 여전히 KL(pSFT‖q) 를 줄이는 m-사영이다. 빠뜨리는 것을 싫어하는 사영 그대로다. 모범 답변들이 좁은 영역에 모여 있으니, 그것을 덮는 모형도 좁아진다. 좁아지는 것은 데이터이지, 사영의 방향이 아니다.

파이썬

프리트레인 절의 다섯 방송국으로 해 보자. 프리트레인을 마친 모형(데이터 비율 그대로 0.10, 0.20, 0.25, 0.35, 0.10)에, 논문과 코드 쪽으로 몰린 모범 답변 데이터 pSFT 를 같은 교차엔트로피로 학습시킨다. 코드는 프리트레인 때와 한 글자도 다르지 않고, 바뀐 것은 p 뿐이다.

import numpy as np

names = ["셰익스피어", "논문", "코드", "레딧", "레시피"]
p_sft = np.array([0.02, 0.60, 0.30, 0.06, 0.02])  # 모범 답변 데이터의 비율 (좁은 p)
z = np.log(np.array([0.10, 0.20, 0.25, 0.35, 0.10]))  # 프리트레인을 마친 모형의 로짓

def softmax(z):
    e = np.exp(z - z.max()); return e / e.sum()
H = lambda q: -np.sum(q * np.log(q))

for step in range(301):
    q = softmax(z)
    ce = -np.sum(p_sft * np.log(q))               # 프리트레인과 같은 교차엔트로피
    if step in (0, 30, 300):
        print(f"{step:3d}  q={np.round(q, 3)}  CE={ce:.3f}  H(q)={H(q):.3f}")
    z -= 1.0 * (q - p_sft)                        # 기울기도 같은 꼴: q − p
print(f"H(p_sft) = {H(p_sft):.3f}")
#   0  q=[0.1  0.2  0.25 0.35 0.1 ]  CE=1.537  H(q)=1.496
#  30  q=[0.026 0.595 0.294 0.059 0.026]  CE=0.995  H(q)=1.026
# 300  q=[0.02 0.6  0.3  0.06 0.02]  CE=0.993  H(q)=0.993
# H(p_sft) = 0.993

모형의 엔트로피가 1.496 에서 0.993 으로 내려간다. 사영의 방향은 프리트레인과 같고, 모형은 이번에도 데이터를 그대로 덮었다. 덮을 데이터가 좁아졌을 뿐이다.

순서 — 교대가 아니라 차례

프리트레인 → SFT → 강화학습은 한 번씩 차례로 지나가는 파이프라인이다. 숨은 변수를 추정하는 EM 알고리즘처럼 두 단계를 여러 번 번갈아 되풀이하는 것이 아니다. 그리고 강화학습 단계도 두 종류가 있다. InstructGPT(Ouyang 외 2022)가 정착시킨 RLHF(사람 피드백 강화학습)는 사람의 선호를 배운 보상 모델을 쓴다. RLVR(검증 가능한 보상으로 하는 강화학습)은 답이 맞았는지 프로그램이 확인할 수 있는 문제(수학, 코드)에서 쓰고, 정답 검사기가 보상을 준다. 보상의 출처가 다를 뿐, "보상을 올리되 참조에서 너무 멀어지지 말라"는 뼈대는 같다.

호기심 상자: 당신은 이미 EM을 하고 있다

프리트레인과 강화학습은 상당한 비용이 드는 대규모 작업이다. 그런데 넓히기와 좁히기는 거대한 모델 훈련만의 이야기가 아니다.

실리태번(SillyTavern, 언어모델과 캐릭터 채팅을 하는 공개 프로그램)의 채팅 프리셋(캐릭터 설정·말투 지시·생성 설정을 묶어 저장해 둔 것)을 만들어본 적이 있는가? 스테이블 디퓨전의 프롬프트 와일드카드를 다듬어본 적이 있는가? 그렇다면 당신은 EM과 닮은 일을 이미 하고 있었던 것이다.

프리셋은 분포를 조각하는 도구다

혼동하지 않게 확실히 해두자. 프리셋 하나는 하나의 대상을 만드는 도구가 아니다. 그 프리셋으로 실행할 수 있는 무수한 채팅 세션들의 분포를 조각하는 도구다.

와일드카드도 마찬가지다. 하나의 이미지를 만드는 것이 아니라, 그 와일드카드로 생성할 수 있는 무수한 이미지들의 집합을 디자인하는 것이다.

분포 전체를 점 하나로 보듯, 프리셋 하나가 분포 하나다. 프리셋을 고치는 것은 그 점을 옮기는 것이다.

넓히기 — 가능성을 연다

캐릭터를 추가한다. 배경 설정을 확장한다. 와일드카드에 선택지를 넣는다.

{전투 | 일상 | 로맨스 | 미스터리}

이것은 와일드카드 — OR — 그 자체다. 봉우리가 늘어난다. 가능한 세션의 범위가 팽창한다. 엔트로피가 올라간다. 혼합의 방향. m-측지선.

좁히기 — 가능성을 다듬는다

“이 어휘는 절대 쓰지 마.” “항상 존댓말로.” “전투 장면에서는 3문장 이내로.” “선정적인 내용은 안됩니다.”

매 조건이 필터로 곱해진다. 쉼표로 붙인 조건 — AND. 겹치는 영역만 살아남는다. 가능한 세션의 범위가 수축한다. 곱셈의 방향. e-측지선.

교대 — 그리고 멈춤

프리셋 제작자는 이 두 조작을 번갈아 한다.

캐릭터를 추가하고(OR), 결과를 돌려보고, 원치 않는 패턴이 나오면 제약을 추가하고(AND), 다시 돌려보고, 너무 좁으면 다시 풀어주고(OR), 다시 돌려보고, 또 다듬고(AND).

넓히고, 좁히고, 넓히고, 좁히고.

EM 알고리즘도 두 단계를 번갈아 한다. E-스텝(숨은 변수의 가능성을 열어두기)과 M-스텝(파라미터를 확정하기)의 교대. 물론 이것은 비유다. 프리셋 제작자는 KL을 재지 않고, 매 교대가 무언가를 줄인다는 보장도 없다. 닮은 것은 "두 조작을 번갈아 하며 고정점을 찾는다"는 모양이다.

좋은 프리셋이 멈춘 프리셋이다

EM이 매번 목적함수를 줄이는 이유는 교대 최소화 자체에 있다. 각 단계가 한쪽을 고정하고 다른 쪽에서 최선을 고르니, 값이 나빠질 수 없다. 사영한 점을 사이에 두면 KL이 직각삼각형의 변처럼 나뉜다는 성질(KL의 피타고라스 관계)이 그 감소량을 정확히 재 준다.

프리셋 제작에는 그런 보장이 없다. 캐릭터를 추가했더니 톤이 깨졌다 — 넓히기가 좁히기의 성과를 되돌려버린 것. 이런 일이 반복되면 제작자는 같은 곳을 맴돈다. 그렇다고 "두 조작이 직교하지 않아서 수렴하지 않는다"고 단정할 근거는 없다. 맴도는 이유는 대개 더 단순하다. 조작이 서로 무엇을 건드리는지 모른 채 고치기 때문이다.

성공적인 프리셋은 표현하고 싶은 것들이 등장할 수 있게 하면서도(OR의 성과가 살아 있고) 등장하지 말아야 할 것들은 안 나오게 하는(AND의 성과가 살아 있는) 지점에서 멈춘 것이다. 넓힘과 좁힘이 더 이상 서로를 되돌리지 않는 지점. EM에서 KL이 더 이상 줄지 않는 점(정류점)과 닮은 모양이다.

수확

“SFT는 좁은 데이터 위로의 m-사영이다. 좁아진 것은 데이터다. 강화학습은 데이터 없이 보상으로 좁힌다. 그 좁힘이 정말 곱셈의 길인지는, 목적식을 풀어 보면 안다.”

“프리트레인과 강화학습만이 넓히기와 좁히기가 아니다. 프리셋을 다듬는 사람, 와일드카드를 조합하는 사람도 이 두 조작을 손으로 번갈아 하고 있다. EM과 달리 그 교대에는 감소 보장이 없다는 것까지가 이 비유의 정직한 크기다.”

문제 3. SFT는 조건부화인가

프리트레인을 마친 모형이 다섯 방송국(셰익스피어, 논문, 코드, 레딧, 레시피)에 (0.10, 0.20, 0.25, 0.35, 0.10) 을 준다. 사람이 쓴 모범 답변을 모아 보니 논문 투와 코드가 반반이었다: pSFT = (0, 0.5, 0.5, 0, 0). (가) 이 데이터로 교차엔트로피 학습을 끝까지 하면 모형 q 는 어디에 앉는가? 모형은 어떤 분포든 될 수 있다고 하자. (나) 프리트레인 모형에 「논문이거나 코드일 것」이라는 조건을 곱해 다시 정규화하면(조건부화) 어떤 분포가 되는가? (다) 두 결과는 같은가? 다르다면 무엇이 그 차이를 정했는가?

함께 풀기

김민준 M01
김민준

이건 둘 다 같은 답이 나와야죠. SFT 데이터가 논문하고 코드뿐이니까, 결국 모형에서 논문과 코드만 남기는 거잖아요. 쉼표로 「논문이거나 코드」 조건을 붙인 거예요.

선생님 T01
선생님

그럼 (나)부터 계산해 봐요.

김민준 M01
김민준

프리트레인 모형에서 논문 0.20, 코드 0.25 만 남기고 합 0.45 로 나누면 (0, 0.444, 0.556, 0, 0) 이요.

선생님 T01
선생님

(가)는요? 학습이 끝나면 q 는 어디에 앉죠?

이서연 S01
이서연

손실이 KL(pSFT‖q) 를 줄이는 거니까, 모형이 어떤 분포든 될 수 있으면 q = pSFT 에서 0 이 돼. (0, 0.5, 0.5, 0, 0).

김민준 M06
김민준

0.444 대 0.556 하고 0.5 대 0.5… 다르네요. 남은 방송국은 같은데 비율이 달라요.

선생님 T01
선생님

두 비율은 각각 어디서 왔죠?

이서연 S07
이서연

조건부화는 남은 것들 사이의 비율을 프리트레인 모형에서 가져와요. 0.20 : 0.25 그대로요. SFT는 비율을 데이터에서 가져와요. 사람이 반반 썼으니 반반이에요. SFT는 모형에 조건을 곱한 게 아니라, 새 데이터를 처음부터 다시 덮은 거네요.

선생님 T01
선생님

그래요. 무엇이 남는지는 같아도, 남은 것들 사이의 비율을 누가 정하느냐가 달라요. 모형이 가진 비율은 그대로 두고 조건만 곱하는 쪽은, 데이터 없이 보상으로 좁힐 때 다시 만나요.

김민준 M01
김민준

동아리 신입 부원을 뽑을 때 「컴공과 수학과만」이라고 조건만 걸면 지원자 가운데 두 학과 비율이 그대로 남는데, 회장이 「두 학과에서 반반 뽑자」고 정해 주면 반반이 되는 거랑 같네요.