BigData

RLHF(Reinforcement Learning from Human Feedback, 인간 피드백을 통한 강화 학습) 모델 구현 절차

IT오이시이 2025. 8. 2. 13:45
728x90

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 등으로 정책 미세조정)
   ↓
최종 모델

 

 

 

chatGPT의 RLHF

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 사이로 예측하도록 학습됩니다.

 

  1. transformers 라이브러리의 주요 자동 토크나이저(tokenizer), 시퀀스 분류 모델(Reward Model로 사용됨), Trainer(훈련 담당), TrainingArguments(훈련 하이퍼파라미터 설정)를 불러옵니다.
  2.  사전학습 모델 로드 : AutoModelForSequenceClassification.from_pretrained
    - AutoTokenizer - "sft-checkpoint"는 SFT(Supervised Fine-Tuning)가 끝난 LLM의 체크포인트 경로입니다.
    - 토크나이저(tokenizer): 입력 텍스트를 토큰(숫자 ID 시퀀스)로 변환합니다.
    - 모델: 시퀀스 분류를 위한 모델이며, 출력 뉴런 수 num_labels=1로 회귀(스칼라 점수 예측)을 하도록 설정되어 보상(Reward) 점수를 낼 수 있습니다.
  3. 예시 데이터 구조:

    - example["prompt"]: 질문/프롬프트
    - example["chosen"]: 인간이 선호한 답변(정답)
    - example["rejected"]: 인간이 비선호한 답변(오답)

    역할:
    - chosen(좋은 답변)은 label=1.0, rejected(나쁜 답변)은 label=0.0으로 레이블링해서 토크나이즈합니다.
    - 이 데이터를 reward 모델에 넣으면, 좋은 답변에 더 높은 점수를 주고 나쁜 답변엔 낮은 점수를 학습하게 됩니다.
  4. training_args = TrainingArguments
    - 모델 학습 결과 저장 위치(output_dir),
    - 1-GPU/장치 기준 배치사이즈(per_device_train_batch_size),
    - 전체 에포크(num_train_epochs) 등을 정의합니다.

  5. 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.
  1.  AutoModelForCausalLM 과 AutoTokenizer 로 SFT된 LLM 불러오기
    - "sft-checkpoint"는 슈퍼바이즈드 파인튜닝(SFT)을 거쳐 기본적인 작업능력을 갖춘 대형 언어모델 체크포인트 경로입니다.
    - AutoModelForCausalLM: causal language modeling (순차적 텍스트 생성) 구조를 갖춘 모델을 불러옵니다.
    - AutoTokenizer: 텍스트를 토큰 시퀀스로 변환하는 도구로, 학습된 모델과 동일한 토크나이저를 사용해야 합니다.

  2. reward_model 불러오기
    - AutoModelForSequenceClassification를 사용해 보상모델을 로드합니다.
    - 보상모델은 주어진 (프롬프트+응답) 쌍에 대해 “얼마나 인간이 선호하는가”를 점수화(스칼라 리워드)하는 역할을 합니다.
    - 이 보상모델은 앞서 학습한, 선호/비선호 답변 쌍 데이터를 기반으로 학습된 상태여야 합니다.

  3.  PPO 설정 (PPOConfig)
    - PPOConfig를 통해 PPO 학습에 필요한 하이퍼파라미터와 모델 정보 등을 설정합니다.
    - 간단히 model_name만 지정했지만, 배치 크기, 학습률 등 세부 옵션 설정도 가능합니다.

  4.  프롬프트 데이터(dataset)
    - PPO Trainer가 텍스트 생성 후 보상모델에게 평가받기 위한 입력(질문/프롬프트) 리스트입니다.
    - 실제 서비스·학습에선 더 큰 데이터셋(수천~수만개 이상)을 씁니다.

  5.  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를 구현하려면
    1. SFT 데이터셋으로 사전학습/지도미세조정
    2. 피드백(쌍) 데이터로 reward model 학습
    3. prompt들과 reward model로 PPO RL 학습
      위 과정에서 보여준 데이터 포맷과 코드 구조를 바탕으로 실무 RLHF 환경을 구축할 수 있습니다.
728x90
반응형