Llama 2의 RLHF: reward model을 두 개로 쪼갠 이유
Llama 2: Open Foundation and Fine-Tuned Chat Models (Touvron et al., Meta AI, arXiv 2023)
Introduction
이 시리즈가 지금까지 다룬 논문은 대부분 “reward를 어떻게 설계해야 하는가”라는 질문에 이론적·실험적으로 답하는 연구였다. 이번 글은 다르다. Llama 2는 논문이라기보다 실제로 수억 명이 쓴 제품의 개발 일지에 가깝다. 그래서 이 글이 다루는 질문도 조금 다르다 — “이론적으로 최선인 reward 설계는 무엇인가”가 아니라, “제한된 시간과 인력으로 실제 배포 가능한 모델을 만들려면 reward를 어떻게 타협해야 하는가”다.
이 시리즈 #3 HH-RLHF 글은 helpfulness와 harmlessness를 하나의 preference model에 욱여넣으면 두 목표가 서로를 반비례로 갉아먹는다는 것을 정량적으로 보여줬다 — 한쪽 데이터 100%로만 학습하면 반대 축 정확도가 찍기(chance)보다 낮아질 정도였다. Llama 2는 이 문제에 대해 아주 실무적인 답을 낸다. 아예 처음부터 두 개의 별도 reward model을 학습시킨다. Helpfulness RM과 Safety RM이다. 이후 #7 ArmoRM 글이 제안하는 “하나의 모델 안에서 여러 목표를 분해하고 게이팅 네트워크로 결합”하는 정교한 접근과, Llama 2의 “아예 두 개의 파라미터 집합으로 쪼개고 규칙 기반으로 스위칭”하는 접근은 같은 문제에 대한 서로 다른 답이다. 이 글의 절반은 그 대비를 다룬다.
나머지 절반은 두 가지 추가 설계 결정을 다룬다. 하나는 margin loss — 사람이 “이게 확실히 낫다”고 답했는지 “그냥 살짝 낫다”고 답했는지를 손실 함수에 직접 반영하는 장치다. 다른 하나는 iterative RLHF — 매주 새 데이터를 모아 reward model과 정책을 번갈아 갱신하는 루프인데, 이 시리즈 #1 Christiano 글이 제시한 “정책·라벨 수집·RM 학습이 비동기로 돌아야 distribution shift를 막을 수 있다”는 원형을 LLM 스케일에 맞게 라운드 기반으로 단순화한 버전이다.
구체적인 숫자로 미리 요약하면 이렇다. Meta가 직접 수집한 preference comparison은 1,418,091건(14주에 걸쳐 매주 수집), 오픈소스 데이터와 합치면 총 2,919,326건이다. Helpfulness RM과 Safety RM은 각자 자기 도메인 테스트셋에서 GPT-4를 포함한 모든 베이스라인을 이겼다. 그리고 안전 데이터를 늘릴수록 모델이 무해한 요청까지 거절하는 false refusal 문제가 실제로 관찰됐고, 저자들은 이를 데이터 배합이 아니라 reward model 자체를 게이트로 쓰는 방식으로 다스렸다. 이 모든 결정이 이 글의 본론이다.
Background
Llama 2는 7B·13B·34B·70B 네 가지 크기로 사전학습됐다(34B는 안전성 검토가 끝나지 않아 논문에만 등장하고 실제로 공개되지는 않았다). 아키텍처는 Llama 1과 크게 다르지 않은 표준 decoder-only Transformer이고, 40% 더 많은 2조 토큰으로 학습됐으며 context length가 4096으로 늘었다는 정도만 짚고 넘어간다. 이 글의 관심사는 사전학습이 아니라 그 뒤의 파인튜닝, 그중에서도 3절(Fine-tuning)의 RLHF 부분이다.
파인튜닝은 세 단계로 진행된다. SFT로 초기 정책을 만들고, 그 정책으로부터 RLHF(reward model 학습 + 정책 최적화)를 반복한다. SFT 단계에서 흥미로운 결정 하나만 짚자면, 저자들은 공개 instruction-tuning 데이터의 품질이 들쭉날쭉하다고 판단해 자체적으로 27,540건의 고품질 annotation만 수집하고 거기서 멈췄다. 데이터 양보다 품질이 SFT 단계에서는 훨씬 중요하다는 것을 실험으로 확인했기 때문이다. 이 글의 본론은 그 다음, 즉 RLHF 단계에서 reward를 어떻게 설계했는가다.
Method
Helpfulness RM과 Safety RM — 왜 하나로는 안 됐나
먼저 데이터 수집 방식부터 보자. Llama 2는 사람에게 절대 점수 대신 이진 비교(binary comparison)를 묻는다 — 이 시리즈의 #1 글부터 이어지는 표준 방식이다. 다만 한 가지 특이점이 있다. 비교할 두 응답을 서로 다른 두 모델 변형에서, 서로 다른 temperature로 샘플링한다. 같은 모델이 만든 두 응답을 비교시키면 응답이 서로 비슷해 변별이 어려워지는데, 모델과 temperature를 다르게 하면 프롬프트당 얻을 수 있는 정보(다양성)가 늘어난다는 게 저자들의 판단이다.
여기까지는 #3 HH-RLHF와 크게 다르지 않다. 진짜 차이는 그 다음이다. HH-RLHF는 helpful·harmless 데이터를 하나의 preference model에 섞어 학습시켰다가 반비례 충돌을 겪었다. Llama 2는 애초에 파라미터를 통째로 분리한다.
“다른 연구들도 helpfulness와 safety가 종종 서로 트레이드오프 관계에 있다는 것을 발견했고, 이는 하나의 reward model이 둘 다에서 잘 작동하기 어렵게 만든다. 이를 해결하기 위해 우리는 두 개의 별도 reward model을 학습시킨다 — 하나는 helpfulness에, 다른 하나는 safety에 최적화된 모델이다.”
두 RM 모두 사전학습된 chat 모델 체크포인트에서 초기화한다. 처음부터 새로 학습시키지 않는 이유는 명확하다 — RM이 chat 모델과 같은 사전지식을 공유해야, 예를 들어 chat 모델은 모르는 사실을 RM이 “그럴듯하다”고 착각해 hallucination을 선호하는 것 같은 정보 불일치를 막을 수 있다. 구조는 사전학습 LM과 동일하고, next-token classification head만 스칼라를 출력하는 regression head로 바뀐다.
학습 손실은 시리즈 #2 InstructGPT 글과 동일한 Bradley-Terry cross-entropy다.
\[\mathcal{L}_{ranking} = -\log(\sigma(r_\theta(x, y_c) - r_\theta(x, y_r)))\]\(x\)는 프롬프트(이전 대화 포함), \(y_c\)는 사람이 선택한(chosen) 응답, \(y_r\)은 거부된(rejected) 응답, \(r_\theta\)는 RM이 매기는 스칼라 점수다. 두 RM은 이 손실로 각자 다른 데이터셋(helpfulness 비교, safety 비교)만 보고 학습된다 — 파라미터도, 데이터도, gradient도 완전히 분리된다.
이렇게 나온 두 RM을 실제 다른 preference 벤치마크와 GPT-4까지 포함해 비교한 결과가 아래 표다.
| 모델 | Meta Helpful | Meta Safety | Anthropic Helpful | Anthropic Harmless | OpenAI Summ. | Stanford SHP | Avg |
|---|---|---|---|---|---|---|---|
| SteamSHP-XL | 52.8 | 43.8 | 66.8 | 34.2 | 54.7 | 75.7 | 55.3 |
| Open Assistant | 53.8 | 53.4 | 67.7 | 68.4 | 71.7 | 55.0 | 63.0 |
| GPT-4 (zero-shot 판단) | 58.6 | 58.1 | - | - | - | - | - |
| Safety RM | 56.2 | 64.5 | 55.4 | 74.7 | 71.7 | 65.2 | 64.3 |
| Helpfulness RM | 63.2 | 62.8 | 72.0 | 71.0 | 75.5 | 80.0 | 70.6 |
굵게 표시한 대로 Helpfulness RM은 Meta Helpful 테스트셋에서, Safety RM은 Meta Safety 테스트셋에서 각각 최고 정확도를 낸다. 저자들은 이 패턴의 원인을 이렇게 설명한다 — 하나의 모델이 두 축 모두에서 잘하려면 “더 나은 응답을 고르는 능력”뿐 아니라 “적대적 프롬프트와 안전한 프롬프트를 구분하는 능력”까지 동시에 배워야 하는데, 이 두 능력이 학습 중 서로를 혼란(confuse)시킨다는 것이다. 두 모델로 쪼개면 각자 하나의 능력만 집중해서 배우면 된다.
이 지점에서 같은 시리즈의 다른 두 접근과 비교해보면 문제의 구조가 더 선명해진다.
| 항목 | #3 HH-RLHF | #7 ArmoRM | #8 Llama 2 (본 글) |
|---|---|---|---|
| 목표 결합 시점 | 학습 시 — 하나의 PM에 helpful·harmless 라벨을 섞어 학습 | 추론 시 — 하나의 모델이 다차원 속성을 각각 예측하고, 게이팅 네트워크가 문맥별 가중합 | RL 단계 — 완전히 분리 학습된 두 RM을 규칙 기반으로 스위칭 |
| 파라미터 구조 | 1개 모델, 1개 head | 1개 모델, 다중 head(속성별) + 게이팅 | 2개의 완전히 독립된 모델 |
| 트레이드오프 처리 | 처리 못 함 — 한쪽 100% 데이터면 반대 축 정확도가 chance 이하로 붕괴 | head를 속성별로 나눠 충돌을 흡수, 문맥별로 가중치를 다르게 줌 | 아예 충돌이 발생할 여지를 없앰 — 대신 결합 로직을 별도로 설계해야 함 |
| 결합 방식의 정교함 | 없음(암묵적 혼합) | 세밀함(학습된 게이팅) | 거칢(사람이 정한 임계값 규칙) |
| 실무 비용 | 낮음(RM 1개) | 높음(다차원 라벨링 + 게이팅 학습) | 중간(RM 2개 학습 + 결합 규칙 튜닝) |
즉 세 글은 “하나의 스칼라로 여러 목표를 표현할 수 없다”는 같은 진단에서 출발해 서로 다른 처방을 낸다. HH-RLHF는 문제를 처음 드러냈고, ArmoRM은 한 모델 안에서 세밀하게 풀고, Llama 2는 모델 자체를 쪼개는 거친 방법으로 빠르게 푼다. 정교함과 실무 비용은 대체로 반비례한다 — Llama 2가 택한 건 그 스펙트럼에서 “당장 배포 가능한” 쪽 끝이다.
그런데 RM을 두 개로 쪼갰다고 문제가 끝나는 게 아니다. PPO는 결국 스칼라 하나를 최적화해야 한다. 두 RM의 점수를 어떻게 하나로 합칠까? Llama 2의 답은 규칙 기반 라우팅이다. 프롬프트에 안전 관련 태그가 붙어 있거나, safety RM 점수가 낮으면 safety 점수를 쓰고, 그렇지 않으면 helpfulness 점수를 쓴다.
\[R_c(g \mid p) = \begin{cases} R_s(g \mid p) & \text{if is_safety}(p) \text{ or } R_s(g \mid p) < 0.15 \\ R_h(g \mid p) & \text{otherwise} \end{cases}\]\(g\)는 정책이 생성한 응답, \(p\)는 프롬프트, \(R_s\)·\(R_h\)는 각각 safety·helpfulness RM 점수, \(\text{is_safety}(p)\)는 이 프롬프트가 안전 관련(적대적) 프롬프트로 태깅됐는지 여부다. 0.15라는 임계값은 Meta Safety 테스트셋에서 precision 0.89·recall 0.55가 나오도록 튜닝됐다 — “안전하지 않다고 판단하면 대부분 진짜 안전하지 않지만(precision 높음), 안전하지 않은 응답의 절반 정도는 놓친다(recall 낮음)”는 뜻이다. 이후 두 점수의 스케일을 맞추기 위해 로짓으로 뒤집고 whitening(평균 0, 분산 1로 정규화)한다.
\[\tilde R_c(g \mid p) = \text{whiten}(\text{logit}(R_c(g \mid p)))\]비유: 병원 응급실을 생각해보자. 트리아지 담당자는 환자가 오면 먼저 “이 환자가 위급한가”부터 스크리닝한다. 위급하다고 판단되면 그 즉시 응급 프로토콜(safety RM)이 모든 판단을 넘겨받고, 위급하지 않으면 일반 진료(helpfulness RM)로 넘어간다. 두 팀을 한 명이 겸직시키는 대신, 스크리닝 규칙 하나로 담당을 스위칭하는 것과 같은 구조다.
Margin loss — 선호 강도를 손실에 새기기
Llama 2의 annotation 인터페이스는 단순한 “A가 낫다/B가 낫다”에서 한 걸음 더 나간다. 어느 쪽이 나은지 고른 뒤, 얼마나 나은지도 4단계로 함께 묻는다 — significantly better, better, slightly better, negligibly better/unsure. 위 Eq. (1)의 기본 손실은 이 정보를 버린다. “확실히 낫다”고 답한 쌍과 “거의 구분 안 된다”고 답한 쌍을 똑같은 손실로 취급한다.
이건 시리즈 #5 Secrets of RLHF II 글이 지적하는 모호한 선호 쌍(ambiguous pair) 문제와 정확히 같은 지점을 건드린다. 두 응답의 차이가 사실상 노이즈 수준인데도 RM이 억지로 뚜렷한 순서를 매기도록 강요받으면, RM은 그 노이즈를 과적합한다. Llama 2의 해법은 데이터를 걸러내는 대신 손실 함수 자체에 여유(margin)를 두는 것이다.
\[\mathcal{L}_{ranking} = -\log(\sigma(r_\theta(x, y_c) - r_\theta(x, y_r) - m(r)))\]\(m(r)\)은 선호 등급 \(r\)에 따라 값이 달라지는 이산 함수다. 확실히 다른 쌍에는 큰 margin을, 비슷한 쌍에는 작은 margin을 준다. 논문 부록이 실제 사용한 두 가지 스케일을 표로 공개한다.
| 선호 라벨 | Margin Small | Margin Large |
|---|---|---|
| Significantly Better | 1 | 3 |
| Better | 2/3 | 2 |
| Slightly Better | 1/3 | 1 |
| Negligibly Better / Unsure | 0 | 0 |
토이 예제로 margin이 손실을 어떻게 바꾸는지 직접 계산해보자. 어떤 시점에 RM이 chosen·rejected 응답에 각각 \(r_\theta(y_c) = 2.0\), \(r_\theta(y_r) = 1.8\)을 예측했다고 하자. 순서는 이미 맞았지만 격차가 매우 작다(0.2).
- 사람 라벨이 “significantly better”였다면 (모델이 명백한 차이를 흐릿하게 예측한 상황): margin 없이는 손실이 \(-\log(\sigma(0.2)) = -\log(0.550) \approx 0.598\). Margin Large(\(m=3\))를 쓰면 \(-\log(\sigma(0.2-3)) = -\log(\sigma(-2.8)) = -\log(0.0573) \approx 2.86\) — 약 4.8배 큰 손실이다. RM은 이 쌍의 격차를 훨씬 더 크게 벌리라는 강한 그래디언트를 받는다.
- 사람 라벨이 “negligibly better/unsure”였다면 (\(m=0\)): margin의 유무와 무관하게 손실은 그대로 0.598이다. 애매한 쌍에는 추가 페널티가 붙지 않는다.
즉 margin loss는 “사람이 확신한 만큼 RM도 확신을 갖게” 강제하고, 사람도 확신하지 못한 쌍은 그대로 놔둔다. 모호한 쌍을 걸러내는 대신, 그 쌍이 손실에 미치는 압박 자체를 사람의 확신도에 비례하게 조절하는 셈이다. 실제 ablation 결과는 이 설계가 의도대로 작동함을 보여준다.
| 선호 라벨 | No margin | Margin Small | Margin Large |
|---|---|---|---|
| Significantly Better | 79.1 | 80.4 | 80.7 |
| Better | 66.9 | 67.3 | 67.5 |
| Slightly Better | 59.8 | 60.4 | 60.5 |
| Negligibly Better/Unsure | 54.5 | 55.0 | 54.3 |
| Avg | 62.5 | 63.0 | 62.9 |
뚜렷하게 다른 쌍(Significantly Better)일수록 margin의 이득이 크고, 애매한 쌍(Negligibly Better)에서는 오히려 큰 margin이 정확도를 살짝 깎는다 — 표 맨 아래 행에서 Margin Large의 평균이 Margin Small보다 낮은 이유다. 다만 이 개선에는 대가가 있다. margin을 걸수록 RM이 출력하는 점수 분포가 양극단으로 쏠리는(binary split) 현상이 관찰됐고, 저자들 스스로 “PPO 같은 RL 알고리즘은 reward 분포 변화에 민감할 수 있어 향후 reward calibration 연구가 필요하다”고 남겨둔다. 이 부채는 이 시리즈 3부의 overoptimization 논의와 이어진다.
Iterative RLHF — RLHF-V1에서 V5까지
RM이 한 번 학습되고 고정되면 #1 Christiano 글이 경고한 distribution shift가 그대로 재현된다. 정책이 좋아질수록 RM이 한 번도 못 본 새로운 응답 분포로 이동하고, RM의 판단은 그 영역에서 신뢰할 수 없어진다. Llama 2의 대응은 매주 새 배치를 수집해 RM과 정책을 번갈아 갱신하는 것이다. Christiano 논문의 세 프로세스(정책 롤아웃·라벨 수집·RM 학습)가 완전히 비동기로 돌았다면, Llama 2는 이를 “주 단위 라운드”로 이산화한 버전이다.
| 배치 | 비교 수 | 평균 턴 수 | 예시당 평균 토큰 |
|---|---|---|---|
| Batch 1 | 5,561 | 4.4 | 547.1 |
| Batch 7 | 84,388 | 3.9 | 662.2 |
| Batch 14 | 249,356 | 4.3 | 1,008.0 |
| 합계(14주) | 1,418,091 | 3.9 | 798.5 |
뒤로 갈수록 배치가 커지는 이유는 단순하다 — annotator가 더 많이 투입되고 작업에 익숙해지면서 처리량이 늘었다. 흥미로운 부수 효과도 있다. 배치가 쌓일수록 “negligibly better/unsure” 라벨의 비중이 점점 늘어난다 — 정책이 좋아질수록 두 응답을 구분하기가 더 어려워진다는 뜻이다. 이는 #3 HH-RLHF가 online RM 정확도를 base·RS·online 순으로 측정했을 때 74%→70%→67%로 떨어졌던 패턴과 정확히 같은 현상이다 — RM이 좋아질수록 남은 과제는 더 어려워진다.

위 그림은 Helpfulness RM 정확도가 배치가 늘어남에 따라(x축) 어떻게 오르는지를 모델 크기별(7B/13B/70B)로 보여준다. 왼쪽은 전체 테스트셋 정확도, 오른쪽은 “significantly better” 라벨만 뽑은 정확도다. 두 그래프 모두 14개 배치를 거치며 꾸준히 오르고, 큰 모델일수록 더 빨리·더 높이 오른다 — GPT-4·Open Assistant 기준선(점선)을 5~7번째 배치 즈음 넘어선다.
이 갱신 루프에서 저자들은 정책 학습 알고리즘을 두 가지 섞어 쓴다.
“RLHF (V4)까지는 오직 Rejection Sampling fine-tuning만 사용했고, 그 이후부터는 두 방법을 순차적으로 결합해 — Rejection Sampling으로 나온 체크포인트 위에 PPO를 적용한 뒤 다시 샘플링하는 방식으로 — 사용했다.”
즉 RLHF-V1~V4는 순수 rejection sampling, V5부터 그 위에 PPO를 얹는다.
Rejection Sampling 먼저, PPO는 나중에 — 왜 이 순서인가
두 알고리즘의 차이를 저자들은 breadth(폭)와 depth(깊이)로 요약한다. Rejection sampling은 한 프롬프트당 \(K\)개의 출력을 탐색한 뒤 reward가 가장 높은 것 하나를 골라 SFT처럼 그래디언트 업데이트를 한다(폭 우선). PPO는 한 프롬프트당 생성 1개뿐이지만, 그 생성 자체가 직전 스텝에서 갱신된 정책의 함수다(깊이 우선). 논문은 \(K\)의 정확한 값을 본문에 명시하지 않지만, 아래 그림으로 그 근거를 보여준다.

\(N\)개 샘플 중 최댓값 reward와 중앙값 reward의 격차(주황 음영)가 곧 rejection sampling으로 얻을 수 있는 잠재적 이득이다. \(N\)이 10만 넘어가도 최댓값과 중앙값의 격차는 계속 벌어진다 — 단순히 여러 개 뽑아서 최선을 고르는 것만으로도 상당한 reward 개선 여지가 있다는 뜻이다. Rejection sampling을 먼저 쓰는 이유가 여기 있다. SFT와 거의 같은 형태의 안정적인 지도학습으로, RL 특유의 불안정성 없이 이 “손쉬운 이득”부터 확보할 수 있다. RM과 정책이 아직 초기 라운드라 신뢰도가 낮을 때는 이 안전한 방법이 유리하다. PPO는 RM이 여러 라운드를 거쳐 충분히 성숙한 뒤(V5), 그 위에 얹어 rejection sampling으로는 못 잡는 미세한 깊이 방향 개선을 짜낸다.
실무적 디테일 하나도 짚을 만하다. Rejection sampling은 가장 큰 70B 모델에만 적용하고, 더 작은 모델들은 70B가 만든 rejection-sampled 데이터로 파인튜닝된다 — reward 신호 자체를 모델 크기 간에 재사용(distillation)하는 셈이다.


위 두 그림은 SFT-v1부터 RLHF-v5까지 helpfulness·harmlessness 두 축이 실제로 어떻게 움직였는지를, 각각 자체 Meta RM(위)과 외부 심판인 GPT-4(아래)로 평가한 결과다. 두 심판 모두 같은 이야기를 한다 — SFT-v1은 harmlessness·helpfulness 둘 다 낮고(각각 10~20%대), RLHF 버전이 올라갈수록 점진적으로 오르며, RLHF-v5에 PPO를 얹은 시점에 확실한 도약이 한 번 더 일어난다. 자체 RM 기준으로는 helpfulness·harmlessness 모두 약 70~80%대까지, GPT-4 기준으로도 확연한 상승이 관찰된다. RM으로 채점한 결과와 독립적인 외부 judge의 결과가 같은 방향을 가리킨다는 점이 “자기 RM으로 자기 정책을 검증한 것 아니냐”는 의심에 대한 반박 근거이기도 하다.
Safety RM의 함정 — false refusal
안전 데이터를 늘리면 예상대로 safety RM 점수가 오른다.

왼쪽 그래프에서 안전 데이터 비율을 0%에서 100%로 늘리는 동안 safety RM 평균 점수는 꾸준히 오르고(빨강), helpfulness RM 점수는 거의 변화가 없다(파랑) — safety를 강화해도 helpfulness가 크게 희생되지는 않는다는 좋은 소식처럼 보인다. 하지만 저자들은 정성적으로 다른 문제를 포착한다. 안전 데이터가 많을수록 모델이 특정 질문에 더 보수적으로 답한다는 것이다. 이를 정량화하기 위해 false refusal을 정의한다 — 적대적이지 않은 정상 요청을 무관한 안전 우려 때문에 잘못 거절하는 것. (“2024년은 제 지식 범위 밖입니다”처럼 정당한 능력 한계로 거절하는 것은 false refusal이 아니다.)
비유: 공항 보안검색대를 극도로 엄격하게 세팅하면, 물통을 든 평범한 승객까지 매번 별도 검사에 걸린다. 실제로 논문에 등장하는 예시가 이렇다 — “크리스마스 크랙(Christmas Crack, 사탕 이름)” 레시피를 물었는데, “crack”이라는 단어가 마약을 연상시킨다는 이유로 모델이 거절한다.
| Safety 데이터 비율 | Helpfulness 테스트셋 false refusal | Borderline 테스트셋(210건) false refusal |
|---|---|---|
| 0% | 0.006%(1건) | 약 15% |
| 50% | 약 0.05%(8건) | 약 23% |
| 100% | 약 0.05%(8건) | 약 27% |

정상적인 helpfulness 프롬프트에서는 false refusal이 안전 데이터 100%에서도 0.05%(8건)로 여전히 드물다. 문제는 일부러 “bomb”, “crack” 같은 트리거 단어를 넣었지만 실제로는 무해한 210개 borderline 테스트셋이다(OpenAI의 유사 boundary test 방법론을 참고해 구성). 여기서는 안전 데이터 비율에 따라 거절률이 15%에서 27%까지 뛴다. 즉 문제는 “안전 데이터를 넣으면 전반적으로 덜 도움이 된다”가 아니라, 특정 트리거 단어가 있는 무해한 프롬프트를 안전하지 않다고 오판하는 좁고 뾰족한 실패다.
해법도 데이터 배합 비율을 손보는 대신 표적화된 개입이다. 저자들은 safety context distillation(안전 관련 preprompt를 붙여 생성한 응답으로 재학습)을 시도했는데, 이걸 helpful 프롬프트에도 적용하면 오히려 성능이 나빠지고 false refusal이 늘었다. 그래서 적대적 프롬프트에만 distillation을 적용하도록 범위를 좁혔다. 그런데도 일부 사례에서는 이미 좋은 응답이 오히려 장황하고 방어적으로 변질됐다. 최종 해법은 safety RM 자체를 게이트로 쓰는 것이다 — context distillation을 적용한 결과가 실제로 RM 점수를 올릴 때만 그 결과를 채택하고, 점수가 오르지 않으면 원래 응답을 그대로 둔다. Safety RM을 reward 신호일 뿐 아니라 개입의 부작용을 걸러내는 필터로도 재사용한 것이다.
같은 절에서 저자들은 여러 턴에 걸쳐 지시를 잊어버리는 문제도 다룬다. 이건 안전이 아니라 일관성 문제인데, 해법으로 제시하는 것이 Ghost Attention(GAtt)이다. 시스템 지시문을 학습 데이터의 모든 사용자 턴에 합성으로 이어붙이고, 이전 턴의 토큰(이전 assistant 응답 포함)에는 loss를 0으로 둬서 학습시킨다. 결과적으로 모델은 시스템 지시문을 매 턴 반복하지 않아도 대화 내내 그 지시를 계속 따르게 된다. 이 글의 주제인 reward 설계와는 결이 다른 기법이라 여기서는 이 정도만 짚는다.
Experiments
지금까지 다룬 설계 결정들이 실제로 어떤 최종 모델을 만들었는지, 데이터·학습·평가 숫자로 정리한다.
데이터 규모. Meta가 14주간 수집한 preference comparison은 1,418,091건이고, 여기에 Anthropic HH·OpenAI Summarize·OpenAI WebGPT·StackExchange·Stanford SHP 등 오픈소스 preference 데이터셋을 더하면 총 2,919,326건이다.
| 데이터 소스 | 비교 수 |
|---|---|
| Meta (Safety+Helpfulness, 14주 자체 수집) | 1,418,091 |
| 오픈소스 preference 데이터셋 합계 | 1,501,235 |
| 총합 | 2,919,326 |
PPO 하이퍼파라미터. 최종 결합 reward는 KL 페널티와 함께 다음 형태로 최적화된다.
\[R(g \mid p) = \tilde R_c(g \mid p) - \beta D_{KL}(\pi_\theta(g \mid p) \Vert \pi_0(g \mid p))\]\(\pi_\theta\)는 현재 정책, \(\pi_0\)는 학습 시작 시점의 정책(distribution이 너무 멀어지는 것을 막는 앵커)이다. 흥미롭게도 이 \(\beta\)는 #3 HH-RLHF의 \(\lambda_{KL}=0.001\)보다 5~10배 크다 — 연구용 세팅보다 실제 배포 모델 쪽이 정책이 초기값에서 멀어지는 것을 훨씬 강하게 억제한다는 뜻이다.
| 하이퍼파라미터 | 값 |
|---|---|
| Optimizer | AdamW (\(\beta_1=0.9, \beta_2=0.95, \text{eps}=10^{-5}\)) |
| Weight decay / Gradient clip | 0.1 / 1.0 |
| Learning rate | \(10^{-6}\) (constant) |
| Batch size / Mini-batch size | 512 / 64 |
| PPO clip threshold | 0.2 |
| KL 계수 \(\beta\) | 0.01 (7B·13B) / 0.005 (34B·70B) |
| 학습 iteration 수 | 200~400 |
| 70B 기준 1 iteration 소요 시간 | 약 330초 (FSDP 사용) |
RM 정확도의 세부 패턴. Table 8의 세분화된 정확도는 margin loss 절에서 다룬 “격차가 클수록 정확도가 높다”는 패턴이 RM 전체에 걸쳐 일관됨을 보여준다.
| 평가 RM | 테스트셋 | Significantly Better | Better | Slightly Better | Negligibly Better/Unsure | Avg |
|---|---|---|---|---|---|---|
| Safety RM | Meta Safety | 94.3 | 76.3 | 65.7 | 55.3 | 64.5 |
| Helpfulness RM | Meta Safety | 89.9 | 73.2 | 63.8 | 54.5 | 62.8 |
| Safety RM | Meta Helpful | 64.6 | 57.5 | 53.8 | 52.2 | 56.2 |
| Helpfulness RM | Meta Helpful | 80.7 | 67.5 | 60.9 | 54.7 | 63.2 |
각 RM은 자기 도메인 테스트셋에서 항상 최고 정확도를 낸다(Safety RM은 Meta Safety에서 64.5, Helpfulness RM은 Meta Helpful에서 63.2) — 두 RM을 분리한 결정이 숫자로도 뒷받침된다.
최종 win rate. 사람 평가(약 4,000개 helpfulness 프롬프트, 프롬프트당 3인 평가)에서 나온 결과다.
| 비교 | 결과 |
|---|---|
| Llama 2-Chat 70B vs ChatGPT | Win 36% / Tie 31.5% |
| Llama 2-Chat 34B vs Vicuna-33B·Falcon-40B | 전체 승률 75% 이상 |
| Llama 2-Chat 7B vs MPT-7B-chat | 60% 프롬프트에서 승리 |
| Llama 2-Chat 70B vs PaLM-Bison chat | 큰 격차로 우위 |
70B 모델이 ChatGPT를 이긴 비율(36%)만 보면 아직 못 미치는 것 같지만, tie까지 합치면 67.5%가 “ChatGPT에 뒤지지 않는” 응답이라는 뜻이다. 오픈소스 모델 대비로는 압도적이다.
Conclusion
Llama 2의 메시지를 한 줄로 요약하면 이렇다. 정교한 단일 모델보다, 목적이 다른 두 개의 RM과 그 사이를 잇는 거친 규칙이 “지금 당장 배포할 수 있는” 프로덕션 레시피였다.
정리하면,
- RM 분리: helpfulness와 safety를 하나의 RM에 섞으면 두 능력이 서로를 혼란시킨다는 #3 HH-RLHF의 관찰에 대해, Llama 2는 파라미터 자체를 분리하고 RL 단계에서 임계값 0.15 규칙으로 스위칭하는 답을 낸다. #7 ArmoRM의 한 모델 내 다목적 분해보다 거칠지만, 그만큼 구현·검증 비용이 낮다.
- Margin loss: 4단계 선호 강도 라벨을 손실의 margin 항으로 반영해, #5 Secrets of RLHF II가 지적하는 모호한 선호 쌍 문제에 데이터 필터링이 아닌 손실 함수 설계로 대응한다. 다만 이 설계가 reward 분포를 양극화시킨다는 부채를 남긴다.
- Iterative RLHF: #1 Christiano의 비동기 3-프로세스를 주 단위 라운드로 이산화해 distribution shift에 대응했다. Rejection sampling으로 손쉬운 이득을 먼저 확보하고, RM이 성숙한 뒤에야 PPO로 깊이 방향 개선을 추가했다.
- Safety RM의 함정: 안전 데이터를 늘리면 트리거 단어가 있는 무해한 프롬프트에서 false refusal이 15%→27%까지 뛴다. 데이터 비율 조정이 아니라, safety RM 자체를 context distillation의 필터로 재사용하는 표적화된 개입으로 다스렸다.
한계도 분명하다. RM 결합 규칙(0.15 임계값, is_safety 태그)은 사람이 정한 휴리스틱이라 새로운 프롬프트 분포에 얼마나 일반화될지 보장이 없다. Margin loss가 만든 reward 분포의 양극화는 저자들 스스로도 “향후 calibration 연구가 필요하다”고 인정한 미해결 문제다. 이 부채는 이 시리즈 3부(Reward Hacking)에서 다시 마주치게 된다 — reward 분포가 뒤틀리면 정책이 그 뒤틀림을 정확히 파고들기 때문이다. 다음 글(#9 RewardBench 2)은 질문을 한 단계 옮긴다 — 이렇게 만들어진 RM들을 애초에 어떻게 평가하고 비교할 것인가.
RLHF Reward 설계 시리즈
이 글은 RLHF Reward 설계 시리즈의 여덟 번째 글이다.
1부. 지형도
- Deep RL from Human Preferences (Christiano 2017) — 선호로 보상을 배우는 원형
- InstructGPT (Ouyang 2022) — RLHF 3단계 표준 레시피
- HH-RLHF (Bai 2022) — helpful·harmless preference model
2부. 스칼라 RM 해부
- Rethinking Bradley-Terry (2024) — reward 변환의 수학적 기반
- Secrets of RLHF II (2024) — 선호 데이터 노이즈와 RM 일반화
- Skywork-Reward (2024) — 데이터 큐레이션이 아키텍처를 이긴다
- ArmoRM (2024) — 다목적 분해와 MoE 게이팅
- (현재 글) Llama 2 (2023) — helpfulness·safety RM 분리 프로덕션 레시피
- RewardBench 2 (2025) — RM을 어떻게 평가할 것인가
3부. Reward Hacking
- Overoptimization Scaling Laws (2022) — Goodhart의 법칙 정량화
- Length Correlations in RLHF (2023) — 성능 향상의 얼마가 길이인가
- ODIN (2024) — 길이를 reward에서 분리
- WARM (2024) — weight averaging으로 hacking 방어
4부. reward를 정책으로
- PPO (2017) — clipped surrogate objective
- Secrets of RLHF I (2023) — PPO 학습 안정화 트릭
- GRPO / DeepSeekMath (2024) — value network를 버리다
- RLOO (2024) — REINFORCE로 충분한가
- DPO (2023) — reward를 없애면 어떻게 되는가
5부. Process & Verifiable Reward
- Let’s Verify Step by Step (2023) — 과정 감독이 결과 감독을 이긴다
- Math-Shepherd (2023) — 사람 라벨 없는 PRM
- DeepSeek-R1 (2025) — RLVR, 규칙이 reward가 될 때
6부. Generative Reward Model
- Generative Verifiers (2024) — reward를 next-token prediction으로
- Generative Reward Models (2024) — GenRM과 선호 학습의 결합
- DeepSeek-GRM / SPCT (2025) — inference-time scaling
- Rubrics as Rewards (2025) — 비검증 도메인으로
- One Token to Fool LLM-as-a-Judge (2025) — GenRM도 뚫린다
참고 문헌
- Touvron et al., 2023. Llama 2: Open Foundation and Fine-Tuned Chat Models. Meta AI (GenAI, Meta), arXiv 2023.
- ar5iv: Llama 2 (HTML rendering) — 본문 수식·표·그림 원본 확인.
- 장원범, 2026. Deep RL from Human Preferences: 보상 함수를 사람의 선호로 배우다. (온라인 3-프로세스 원형, iterative RLHF 비교 대상)
- 장원범, 2026. HH-RLHF: helpfulness와 harmlessness는 왜 충돌하는가. (단일 PM의 helpful·harmless 트레이드오프, RM 분리 동기)
- Ouyang et al., 2022. Training language models to follow instructions with human feedback. (기본 ranking loss 형태의 출처)
- Bai et al., 2022. Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback. (rejection sampling 방법론 비교 대상)
Enjoy Reading This Article?
Here are some more articles you might like to read next: