TinyZero 따라하기 (4) - PPO

 PPO 란?

TinyZero에서 핵심인 **PPO (Proximal Policy Optimization)**는 강화학습(RL)에서 아주 자주 쓰이는 정책 최적화 알고리즘. 쉽게 말하면, “AI가 보상을 최대화하는 방향으로 조금씩 행동을 업데이트하는 방법” 중 하나.


📌 PPO (Proximal Policy Optimization) 요약

🤖 무엇을 하는가?

  • 모델(정책)을 학습시키면서, **보상(reward)**이 높은 행동을 하도록 만듦

  • 기존 정책과 너무 다르게 바뀌지 않도록 안정적으로 업데이트


✅ 왜 쓰는가?

기존 문제점:

  • 강화학습에서 policy gradient 방식은 보상이 좋다고 파라미터를 크게 바꾸면 불안정해져.

PPO는?

"너무 많이 바꾸지 말고, 적당히 근처에서(policy 주변에서) 최적화하자"

  • 이를 위해 **클리핑(clipping)**을 도입해서 업데이트 폭 제한

  • 안정성 + 성능 사이 밸런스를 잘 맞춰줌


🔁 PPO 학습 흐름 (간단 설명)

  1. 질문을 던짐

  2. 모델이 응답을 생성

  3. 응답에 대해 reward model이 점수를 줌 (좋은 답 = 높은 보상)

  4. PPO로 정책(policy)를 업데이트

    • 좋은 응답은 더 자주 생성되도록

    • 나쁜 응답은 덜 생성되도록

  5. 다시 반복


🤝 TinyZero에서의 PPO

TinyZero는 다음 과정을 따름:


Prompt (질문) →

  LLM이 답변 생성 →

    Reward Model이 평가 →

      PPO로 정책 업데이트 →

        → 더 나은 답변 생성하도록 개선





📚 비유로 설명

👉 넷플릭스가 너의 시청 패턴을 바탕으로 "이런 거 좋아하겠네!" 하며 추천을 조정하는데, 갑자기 전혀 다른 장르로 바꾸면 너도 당황하잖아?
**PPO는 "천천히, 네가 좋아할 만한 비슷한 장르 안에서 추천을 개선"**하는 방식.


✅ TinyZero에서 PPO가 적용되는 위치

PPO 관련 핵심 로직은 ppo_trainer.py 파일에 집중돼 있음음.


🔍 PPO 흐름 구조 요약


# train_ppo.py 기준

prompt → 응답 생성 → reward 계산 → PPOTrainer.update() 호출



🧠 핵심 코드 분석: PPOTrainer.update() 내부


def update(self, prompts, responses, rewards):

    # 1. Forward pass: 정책 모델 평가 (현재 모델로 응답을 다시 평가)

    old_logprobs, values, entropies = self.policy.evaluate_actions(prompts, responses)


    # 2. Advantage 계산 (어떤 행동이 기대보다 얼마나 좋았는가?)

    advantages = rewards - values.detach()


    # 3. 정책 손실 계산 (클리핑 적용)

    ratio = exp(new_logprob - old_logprob)  # 정책 변화 비율

    policy_loss = -min(ratio * advantages, clipped_ratio * advantages)


    # 4. value function 손실

    value_loss = (rewards - values)²


    # 5. 총 손실 계산 후 역전파

    loss = policy_loss + c1 * value_loss - c2 * entropy

    loss.backward()

    optimizer.step()




🧩 구성 요소 설명

요소

설명

prompts, responses

LLM에게 입력-출력 쌍

rewards

보상 모델이 계산한 점수 (답변의 질 평가)

advantages

행동이 얼마나 기대 이상인지 계산

logprobs

응답을 생성할 확률 (log space)

ratio

현재 정책과 예전 정책의 차이 비율

policy_loss

클리핑 적용된 손실로 안정적인 학습 유도

value_loss

보상 예측과 실제 reward의 차이

entropy

정책의 다양성 (너무 확신 있는 행동을 방지)


🧠 전체 흐름 그림 (시각화 느낌)


[Prompt] → [Model generates Response]

     ↓

[Reward Model] → 점수 부여

     ↓

[PPOTrainer.update()] → 정책 안정적으로 업데이트

     ↓

[다음 학습 스텝에서 더 나은 응답 생성]



✅ Colab Pro용 TinyZero PPO 실행 노트북 예제


# [1] 저장소 복제 및 이동

!git clone https://github.com/Jiayi-Pan/TinyZero.git

%cd TinyZero


# [2] 필요 패키지 설치

!pip install -r requirements.txt


# [3] accelerate 설정 (Colab에서는 자동, 그래도 명시)

!accelerate config default


# [4] 사전학습 (Pretraining) 실행 - 선택적

!accelerate launch train.py \

  --config_file configs/pretrain_config.yaml


# [5] PPO 기반 강화학습(RLHF) 실행

!accelerate launch train_ppo.py \

  --config_file configs/ppo_config.yaml



💡 설정 설명

  • configs/pretrain_config.yaml: 사전학습 설정 파일

  • configs/ppo_config.yaml: PPO 설정 (보상 모델, 배치 크기, 학습률 등 포함)


📁 실행 순서 요약

  1. GPT 언어모델을 사전학습 (train.py)

  2. 사용자 질문에 대해 답변 생성

  3. 보상 모델이 평가 (좋은 답 = 높은 점수)

  4. PPO로 정책 업데이트 (train_ppo.py)

  5. 반복 → 스스로 더 나은 답변 생성



Comments

Popular posts from this blog

TinyZero 따라하기 (1)

TinyZero 따라하기 (3)

TinyZero 따라하기 (2)