RLHF(Reinforcement Learning from Human Feedback) 모델 구현 절차
RLHF( “인간 피드백을 통한 강화 학습” ) 이란?
RLHF는 “인간 피드백을 통한 강화 학습”으로, 인간 선호를 반영하여 AI(특히 대형 언어모델, LLM)가 사람이 선호하는 방향으로 동작하도록 만드는 대표적인 머신러닝 파이프라인입니다.
정확한 보상함수를 정의하기 어려운 복잡·주관적 목표(예: 진실성, 안전성, 유용성 등)에 매우 적합합니다
* RLHF는 인간 직관이 중요한 복잡/주관적인 과제를 다룰 때, “사람이 뽑은 기준”을 깊이 녹이는 기법
* 인간의 직관/가치관/측정이 어렵지만 평가(판단)는 쉬운 복잡한 과제(예: 유해성 최소화, 안전성/진실성 극대화 등)에서 “정확한 loss를 공식화”하는 것이 아닌, 인간 선호에서 직접 보상함수를 만드는 방식이 효과적임
RLHF 주요 특징과 효과
* 장점
- 직접 loss를 설계하기 어려운 문제(창의성, 안전성, 재미 등)에서 강력함.
- 실질적 서비스 수준, 인간-친화성(align human value)에서 높은 성능.
- ChatGPT, Claude 등 최신 LLM 상용서비스의 핵심 학습법.
* 단점·주의점
- 고품질 인간 평가 데이터 구축 비용이 매우 높음.
- “인간”의 주관과 편향이 모델에 투영될 수 있음.
- 보상모델이 완벽하지 않아, 때로는 “보상 해킹” 등 문제 발생 가능.
* RLHF를 이해하기 위해 데이터와 예시 소스를 정리해 봅니다.
사전학습 LLM
↓
SFT (지도학습)
↓
인간 선호 수집 → 보상모델 학습
↓
RL(PPO 등으로 정책 미세조정)
↓
최종 모델

https://openai.com/ko-KR/index/instruction-following/?form=MG0AV3
예: ChatGPT의 RLHF
OpenAI의 ChatGPT는 다음과 같은 방식으로 PPO를 활용했습니다:
| 1. Supervised Fine-Tuning | 인간이 작성한 응답으로 초기 학습 |
| 2. Reward Model 학습 | 응답 쌍에 대해 인간이 선호하는 응답을 선택 |
| 3. PPO로 정책 미세조정 | 보상 모델을 기반으로 응답 품질 향상 |
RLHF 주요 프로세스
1. SFT (Supervised Fine-Tuning)
프롬프트-정답(응답) 쌍 데이터로 기본 LLM을 1차 파인튜닝합니다.
2. 인간 피드백 수집
- 여러 답변 후보 생성 → 인간이 더 좋은 답변, 나쁜 답변을 직접 선택 또는 랭킹하여 쌍 데이터를 구축합니다.
3. 보상모델(Reward Model) 학습
- 인간 선호 데이터를 이용해, 각 응답의 선호도를 스칼라 점수로 예측하는 모델을 만듭니다.
4. RL(주로 PPO; Proximal Policy Optimization) 미세조정
- 파인튜닝된 LLM 정책을 Reward Model 점수가 높은 답변을 더 잘하게끔 강화학습(PPO 등)으로 최적화합니다
LLM 미세조정에서 보상 모델(Reward Model):
- 언어 모델이 생성한 응답의 "질"을 평가해주는 역할을 하며, PPO가 그 보상을 기반으로 정책을 업데이트할 수 있게 해줍니다.
- 입력(prompt)과 응답(response)을 받아서, 해당 응답이 얼마나 "좋은지"를 스칼라 점수로 예측하는 모델을 학습합니다.
- 이 점수는 PPO에서 보상 함수로 사용됩니다.
보상 모델을 학습하려면 인간 선호 데이터(human preference data)가 필요합니다.
일반적인 구성은 다음과 같이 쌍(pairwise comparison) 데이터를 통해 모델은 어떤 응답이 더 선호되는지를 학습합니다.
| Prompt | Response A | Response B | Preferred |
| "How do I bake a cake?" | "Use flour and sugar." | "Preheat oven, mix ingredients, bake for 30 mins." | B |
* PPO(Proximal Policy Optimization)는 강화 학습에서 널리 사용되는 알고리즘
PPO는 정책 기반 강화 학습 알고리즘으로, 기존 정책에서 크게 벗어나지 않도록 제한하면서 안정적으로 학습합니다. 핵심 아이디어는 정책 업데이트 시 KL divergence를 제한하거나 클리핑(clipping)을 통해 급격한 변화 방지하는 것
전통적인 supervised fine-tuning은 정답이 있는 데이터에만 의존하지만, PPO는 보상 함수(reward model)를 통해 모델이 생성한 응답의 질을 평가하고, 이를 기반으로 모델을 개선할 수 있습니다. 특히 다음과 같은 상황에서 유용합니다:
- RLHF (Reinforcement Learning from Human Feedback): 인간 피드백을 보상으로 사용
- 출력 품질 향상: 유창성, 사실성, 유용성 등을 보상으로 정의 가능
- 안전성 강화: 유해하거나 편향된 응답을 줄이도록 학습 가능
1. RLHF 데이터 예시
A. SFT(지도학습)용 데이터 포맷
[
{"prompt": "기후변화란?", "response": "기후변화는 온실가스 증가 등으로 인해 지구 기후가 변하는 현상입니다."},
{"prompt": "파이썬 리스트 만드는 법", "response": "my_list = [1, 2, 3]"}
]
B. 보상모델/피드백용 데이터 포맷
한 prompt에 좋은(선호) 응답, 나쁜(비선호) 응답 쌍으로 묶어 표시:
[
{
"prompt": "환경오염의 주원인은?",
"chosen": "주로 공장 배출가스, 자동차 배기가스 등이 주요 원인입니다.",
"rejected": "잘 모르겠습니다."
}
]
2. 보상모델 학습 코드
아래는 huggingface transformers 라이브러리를 활용해 보상모델을 만드는 코드입니다. (예시를 위해 간단히 작성됨)
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
# SFT로 파인튜닝된 체크포인트 로드
tokenizer = AutoTokenizer.from_pretrained("sft-checkpoint")
model = AutoModelForSequenceClassification.from_pretrained("sft-checkpoint", num_labels=1)
def preprocess(example):
chosen = tokenizer(example["prompt"] + example["chosen"], truncation=True, padding="max_length", max_length=256)
rejected = tokenizer(example["prompt"] + example["rejected"], truncation=True, padding="max_length", max_length=256)
# 각각 positive, negative 레이블로 가공
return {
"input_ids": chosen["input_ids"],
"label": 1.0
}, {
"input_ids": rejected["input_ids"],
"label": 0.0
}
# 데이터셋 전처리 등은 생략(실제는 huggingface datasets로 인스턴스화 필요)
# Trainer 구성
training_args = TrainingArguments(output_dir='./reward_model', per_device_train_batch_size=2, num_train_epochs=2)
trainer = Trainer(model=model, args=training_args, train_dataset=reward_train_dataset)
trainer.train()
- reward 모델은 각 응답에 대해 “선호될 점수(scalar)”를 1~0 사이로 예측하도록 학습됩니다.
- transformers 라이브러리의 주요 자동 토크나이저(tokenizer), 시퀀스 분류 모델(Reward Model로 사용됨), Trainer(훈련 담당), TrainingArguments(훈련 하이퍼파라미터 설정)를 불러옵니다.
- 사전학습 모델 로드 : AutoModelForSequenceClassification.from_pretrained
- AutoTokenizer - "sft-checkpoint"는 SFT(Supervised Fine-Tuning)가 끝난 LLM의 체크포인트 경로입니다.
- 토크나이저(tokenizer): 입력 텍스트를 토큰(숫자 ID 시퀀스)로 변환합니다.
- 모델: 시퀀스 분류를 위한 모델이며, 출력 뉴런 수 num_labels=1로 회귀(스칼라 점수 예측)을 하도록 설정되어 보상(Reward) 점수를 낼 수 있습니다. - 예시 데이터 구조:
- example["prompt"]: 질문/프롬프트
- example["chosen"]: 인간이 선호한 답변(정답)
- example["rejected"]: 인간이 비선호한 답변(오답)
역할:
- chosen(좋은 답변)은 label=1.0, rejected(나쁜 답변)은 label=0.0으로 레이블링해서 토크나이즈합니다.
- 이 데이터를 reward 모델에 넣으면, 좋은 답변에 더 높은 점수를 주고 나쁜 답변엔 낮은 점수를 학습하게 됩니다. - training_args = TrainingArguments
- 모델 학습 결과 저장 위치(output_dir),
- 1-GPU/장치 기준 배치사이즈(per_device_train_batch_size),
- 전체 에포크(num_train_epochs) 등을 정의합니다. - Trainer 객체화 및 학습
- reward_train_dataset: 전처리된 데이터셋(위의 preprocess 함수로 가공)
- Trainer: Hugging Face에서 제공하는 고수준 학습 클래스로, 데이터 로드, forward/backward, 검증 등을 자동화
- 마지막 trainer.train()을 실행하면 모델이 실제로 파인튜닝되어, 어떤 응답이 더 인간에게 선호되는지 예측할 수 있는 "보상모델"이 만들어집니다.
3. PPO로 LLM 미세조정 (Proximal Policy Optimization)
huggingface trl의 PPOTrainer 사용 예시입니다.
- LLM 미세조정은 파이프라인에서 최종 단계인 PPO(Proximal Policy Optimization)를 이용해 LLM(대형 언어모델)을 인간 피드백 기반 보상모델에 맞춰 추가로 미세조정하는 과정입니다
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import PPOTrainer, PPOConfig
# SFT로 미세조정된 LLM 불러오기
model = AutoModelForCausalLM.from_pretrained("sft-checkpoint")
tokenizer = AutoTokenizer.from_pretrained("sft-checkpoint")
# reward_model 불러오기
reward_model = AutoModelForSequenceClassification.from_pretrained("./reward_model")
# PPOTrainer 환경설정
ppo_config = PPOConfig(model_name="sft-checkpoint")
# 프롬프트 데이터셋 불러와야 함(예시)
prompts = ["기후변화의 원인은?", "파이썬 리스트 만드는 법"]
# PPOTrainer 준비 및 학습
ppo_trainer = PPOTrainer(
config=ppo_config,
model=model,
ref_model=None, # PPO KL penalty용 기준모델 없이 진행가능
reward_model=reward_model,
tokenizer=tokenizer,
dataset=prompts,
)
ppo_trainer.train()
- 각 배치마다 prompt를 넣으면 LLM이 응답 생성 → reward_model이 점수 측정 → PPO 알고리즘이 KL 등과 더불어 backpropagation.
- AutoModelForCausalLM 과 AutoTokenizer 로 SFT된 LLM 불러오기
- "sft-checkpoint"는 슈퍼바이즈드 파인튜닝(SFT)을 거쳐 기본적인 작업능력을 갖춘 대형 언어모델 체크포인트 경로입니다.
- AutoModelForCausalLM: causal language modeling (순차적 텍스트 생성) 구조를 갖춘 모델을 불러옵니다.
- AutoTokenizer: 텍스트를 토큰 시퀀스로 변환하는 도구로, 학습된 모델과 동일한 토크나이저를 사용해야 합니다. - reward_model 불러오기
- AutoModelForSequenceClassification를 사용해 보상모델을 로드합니다.
- 보상모델은 주어진 (프롬프트+응답) 쌍에 대해 “얼마나 인간이 선호하는가”를 점수화(스칼라 리워드)하는 역할을 합니다.
- 이 보상모델은 앞서 학습한, 선호/비선호 답변 쌍 데이터를 기반으로 학습된 상태여야 합니다. - PPO 설정 (PPOConfig)
- PPOConfig를 통해 PPO 학습에 필요한 하이퍼파라미터와 모델 정보 등을 설정합니다.
- 간단히 model_name만 지정했지만, 배치 크기, 학습률 등 세부 옵션 설정도 가능합니다. - 프롬프트 데이터(dataset)
- PPO Trainer가 텍스트 생성 후 보상모델에게 평가받기 위한 입력(질문/프롬프트) 리스트입니다.
- 실제 서비스·학습에선 더 큰 데이터셋(수천~수만개 이상)을 씁니다. - PPOTrainer 초기화 및 학습
- ppo_trainer 객체 생성 시 다음 주요 파라미터를 넘깁니다.
* model: 파인튜닝할 언어모델(정책, policy)
* ref_model: KL-divergence 보정용 기준모델. None이면 KL penalty 없이 진행
* reward_model: PPO 학습 시 생성 결과에 대해 평가 점수를 주는 보상모델
* tokenizer: 텍스트 토큰화 도구
* dataset: 프롬프트 집합
- ppo_trainer.train() 수행 시:
* 각 프롬프트마다 현재 정책 모델이 답변 샘플을 생성
* 보상모델이 생성된 답변에 대해 보상 점수를 부여
* PPO 알고리즘이 보상과 KL 페널티를 고려해 모델 파라미터 업데이트 (정책 개선)
* 반복하여 모델이 점점 더 보상모델이 선호하는 답변을 생성하도록 학습됨
4. 참고
- 실제로는 모든 데이터셋은 huggingface
datasets로 래핑 및 batch preprocess 해야 하며, reward loss·PPO loss 등 세부 구현은 공식 라이브러리 및 예제를 참고해야 합니다. - 실전 코드 예제 및 공식 문서는 Hugging Face TRL GitHub(trl/examples/rlhf)에서 확인 가능합니다.
정리:
- RLHF를 구현하려면
- SFT 데이터셋으로 사전학습/지도미세조정
- 피드백(쌍) 데이터로 reward model 학습
- prompt들과 reward model로 PPO RL 학습
위 과정에서 보여준 데이터 포맷과 코드 구조를 바탕으로 실무 RLHF 환경을 구축할 수 있습니다.
'BigData' 카테고리의 다른 글
| LLM을 활용 하기 위해 고려할 AI와 Data 활용 사이클의 실제 (0) | 2025.08.15 |
|---|---|
| AI 거버넌스, 리스크 및 컴플라이언스 프레임워크 종류 : ISO 42001/EU AI Act NIST RMF (0) | 2025.08.11 |
| AI관리 시스템 표준 ISO 42001 핵심 요구사항 정리 (0) | 2025.08.11 |
| Supervised Fine-Tuning(SFT)과 Direct Preference Optimization(DPO), RLHF(Reinforcement Learning from Human Feedback) 비교 (1) | 2025.08.02 |
| Supervised Fine-Tuning(SFT)과 Direct Preference Optimization(DPO) (0) | 2025.08.02 |
| 생성형 AI 데이터 활용 정책과 이용자 보호에 관한 주요 정책 동향 (1) | 2025.07.27 |
| 인공지능 보안 위협 4가지 - 3. Model Inversion Attack (1) | 2025.06.29 |