TinyZero 따라하기 (6) - Reward Model

 Reward Model 이란?

“AI가 만든 답변이 얼마나 좋은지 자동으로 점수를 매기는 모델”

RLHF에서 AI가 스스로 학습하려면 “이 답변은 괜찮은가?”라는 기준점이 필요.
그 역할을 하는 게 바로 Reward Model.


📦 Reward Model의 학습 과정

🔁 입력

  • Prompt (질문)

  • 여러 개의 답변 (response_1, response_2, ...)

📊 인간 피드백

  • 사람이 response_2 > response_1 > response_3 이런 식으로 랭킹을 매김

📈 목표

  • 모델이 각 답변에 대해 “얼마나 좋은지”를 점수화하도록 학습

→ 이 점수가 바로 PPO의 reward 값으로 들어가!


🧠 Reward Model이 하는 일

  1. LLM이 답변 A, 답변 B 생성

  2. Reward Model이 A: 0.6점, B: 0.1점 평가

  3. 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

🔍 전체 흐름 요약

  • GPT-like 모델을 불러온 후,

  • 마지막 토큰의 hidden state를 이용해 보상 점수를 예측하는 구조


🔍 핵심 코드 분석


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)

🧠 분석:

  • self.model: GPT 등 Transformer 기반 모델 로딩

  • v_head: 마지막 hidden state → 보상 점수로 변환하는 1D 회귀 헤드


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


💡 이 모델이 하는 일?

“문장 전체를 보고 마지막 토큰 기준으로 얼마나 ‘좋은’ 응답인지 점수로 나타냄”

  • GPT 모델의 문맥 이해력을 이용해서,

  • 마지막 토큰 위치의 정보로 “이 답변은 좋다 / 나쁘다”를 정량화함


✨ 정리 요약

구성 요소

설명

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

Popular posts from this blog

TinyZero 따라하기 (1)

TinyZero 따라하기 (3)

TinyZero 따라하기 (2)