Reward Model 이란?
“AI가 만든 답변이 얼마나 좋은지 자동으로 점수를 매기는 모델”
RLHF에서 AI가 스스로 학습하려면 “이 답변은 괜찮은가?”라는 기준점이 필요.
그 역할을 하는 게 바로 Reward Model.
📦 Reward Model의 학습 과정
🔁 입력
📊 인간 피드백
📈 목표
→ 이 점수가 바로 PPO의 reward 값으로 들어가!
🧠 Reward Model이 하는 일
LLM이 답변 A, 답변 B 생성
Reward Model이 A: 0.6점, B: 0.1점 평가
A를 더 선호하는 것으로 판단 → 그 방향으로 PPO 업데이트
🧪 예시
Prompt: “What is the capital of France?”
Response A: “Paris is the capital of France.” Response B: “I think it’s London but I’m not sure.”
→ Reward Model Output: A: 0.9 B: 0.2 |
→ PPO는 A처럼 답변하도록 학습
✅ TinyZero에서의 Reward Model
TinyZero에는 reward_model.py 파일이 있고,
그 안에서 GPT 모델을 기반으로 Score Predictor를 학습하거나 로드해 사용함.
class RewardModel(nn.Module): def forward(self, input_ids): # GPT 계열 모델을 통해 hidden state 추출 # 마지막 토큰 기준으로 score 계산 return score |
TinyZero는 오픈도어처럼 **"스스로 생성한 응답을 가지고 reward를 추정"**하는 방식으로 사용.
(즉, Human Feedback 없이 시작 가능하도록 가볍게 구현된 RLHF)
🎯 정리 요약
항목 | 설명 |
목적 | LLM이 만든 답변의 품질을 수치로 평가 |
입력 | Prompt + 답변 (Response) |
출력 | 점수 (예: 0.83) |
쓰임 | PPO에서 reward 값으로 사용됨 |
학습 방식 | 사람 피드백을 이용해 랭킹 학습 또는 비교 학습 |
✨ 쉽게 말하면?
🤖 “AI야, 너가 한 말이 사람 입장에서 얼마나 괜찮은지 점수 줄게 → 그 점수 기준으로 스스로 고쳐나가 봐!”
TinyZero의 실제 코드 파일인 reward_model.py를 줄단위로 깔끔하게 분석.
이 파일은 **LLM 기반의 보상 모델(Reward Model)**을 정의한 곳.
📁 위치: reward_model.py
🔍 전체 흐름 요약
🔍 핵심 코드 분석
class RewardModel(nn.Module): def __init__(self, model_name): super().__init__() self.model = AutoModel.from_pretrained(model_name) self.v_head = nn.Linear(self.model.config.hidden_size, 1) |
🧠 분석:
def forward(self, input_ids, attention_mask): outputs = self.model(input_ids=input_ids, attention_mask=attention_mask) last_hidden_state = outputs.last_hidden_state last_token_tensor = last_hidden_state[:, -1, :] reward = self.v_head(last_token_tensor) return reward.squeeze(-1) |
🧠 분석:
outputs.last_hidden_state: 각 토큰의 임베딩 (hidden vector)
[:, -1, :]: 마지막 토큰의 벡터만 추출
v_head: 이 벡터를 스칼라 점수로 변환 → 이것이 reward score
💡 이 모델이 하는 일?
“문장 전체를 보고 마지막 토큰 기준으로 얼마나 ‘좋은’ 응답인지 점수로 나타냄”
✨ 정리 요약
구성 요소 | 설명 |
AutoModel | 사전학습된 언어 모델 (예: GPT2, GPT-Neo 등) |
v_head | 마지막 hidden vector → 스칼라 보상값 |
forward() | 주어진 문장에 대해 reward 점수 출력 |
🧪 예시
prompt = "What's the capital of France?" response = "Paris is the capital of France."
→ GPT가 이 문장을 처리 → → 마지막 토큰 벡터 추출 → → `v_head` 통과 → → 보상 점수: 0.93 |
✅ 1. 예제 코드: Reward Model 실행 예시
아래는 TinyZero의 RewardModel을 직접 로딩해서
prompt + response에 대해 보상 점수를 예측하는 코드.
import torch from transformers import AutoTokenizer from reward_model import RewardModel
# 1. 모델 및 토크나이저 불러오기 model_name = "gpt2" # 또는 TinyZero에서 사용하는 모델명 tokenizer = AutoTokenizer.from_pretrained(model_name) model = RewardModel(model_name) model.eval()
# 2. 입력 정의 prompt = "What is the capital of France?" response = "Paris is the capital of France."
# 3. Tokenization input_text = prompt + " " + response inputs = tokenizer(input_text, return_tensors="pt")
# 4. 보상 점수 예측 with torch.no_grad(): reward_score = model(**inputs)
print(f"Predicted reward: {reward_score.item():.4f}") |
🎯 결과는 0.1 ~ 1.0 사이 점수로 나오며,
LLM 응답이 얼마나 ‘좋은’지 평가하는 척도 역할을 함
✅ 2. TinyZero에서 PPO와 Reward 연결 흐름
TinyZero의 train_ppo.py를 보면 RewardModel이 어떻게 사용되는지 잘 나타나 있음.
💡 흐름:
# [1] 질문/프롬프트 생성 prompt = sample_prompt()
# [2] LLM이 응답 생성 response = model.generate(prompt)
# [3] 보상 점수 계산 reward = reward_model(prompt + response)
# [4] PPOTrainer에 넘겨줌 ppo_trainer.update(prompt, response, reward) |
📁 실제 코드 위치 정리
파일 | 설명 |
reward_model.py | GPT 기반 보상 예측기 정의 |
train_ppo.py | RewardModel 불러와서 매 스텝마다 score 평가 |
ppo_trainer.py | reward를 받아 Advantage 계산 및 PPO 업데이트 수행 |
📌 시각화: TinyZero PPO + Reward 흐름도
[PROMPT] ↓ [LLM Response Generation] ↓ [Reward Model] ← prompt + response → 점수 ↓ [PPOTrainer.update()] ← reward 입력 ↓ [정책 파라미터 업데이트] |
🎯 요약
항목 | 역할 |
RewardModel | 응답의 질을 수치로 평가 (점수 출력) |
PPOTrainer | 이 점수를 기준으로 정책 파라미터를 업데이트 |
TinyZero | RewardModel을 통해 “스스로 평가하며 학습”하는 구조 구현 |
Comments
Post a Comment