Phase 09: Reinforcement Learning

بهینه سازی سیاست های نزدیک (PPO)

A2C هر انتشار را پس از یک بروزرسانی از بین می برد. PPO گرادینت سیاست را در یک نسبت اهمیت کاهش داده است تا بتوانید 10 دوره بیشتر را در داده های مشابه بدون انفجار سیاست انجام دهید. Schulman et al. (2017). هنوز الگوریتم پیش فرض سیاست-گرادینت در سال 2026 است.

Type: Build

Languages: Python

Prerequisites: Phase 9 · 06 (REINFORCE), Phase 9 · 07 (Actor-Critic)

Time: ~75 minutes

مشکل

A2C (درسی 07) در سیاست است: گرادینت E_{π_θ}[A · ∇ log π_θ]نیاز به داده های نمونه گیری از در حال حاضرπ_θيه بار تازه کار باش وπ_θتغییراتی که شما استفاده کرده اید، غیر از سیاست است. دوباره از آن استفاده کنید و گرادینت شما منحرف است.

پخش کردن هزینه های زیادی دارد. در آتاری، یک پخش در طول 8 envs × 128 مرحله = 1024 انتقال و یک دوجین ثانیه زمان محیط. پس از یک گام گرادینت، از بین بردن آن، ضایع کننده است.

بهینه سازی سیاست های منطقه اعتماد (TRPO، Schulman 2015) اولین راه حل بود: هر بروزرسانی را محدود کنید تا تفاوت KL بین سیاست های قدیمی و جدید پایین تر بماند δنظري طور پاک، ولي به حل هر تازه ايجادي ميخواد

PPO (Schulman et al. 2017) محدودیت منطقه اعتماد سخت را با یک هدف ساده حذف می کند. یک خط اضافی کد. ده دوره در هر انتشار. هیچ گرادیانت همبستگی. تضمین های نظری کافی خوب. نه سال بعد هنوز هم الگوریتم گاردیانت سیاست پیش فرض برای همه چیز از MuJoCo تا RLHF است.

مفهوم

!PPO clipped surrogate objective: ratio clipping at 1 ± ε

The importance ratio.

r_t(θ) = π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)

این نسبت احتمال سیاست جدید نسبت به سیاست که داده ها را جمع آوری کرده است. r_t = 1به معنی هیچ تغییری نیستr_t = 2یعنی که سیاست جدید دو برابر بیشتر از این امکان دارهa_tمثل اون پير

The clipped surrogate.

L^{CLIP}(θ) = E_t [ min( r_t(θ) A_t, clip(r_t(θ), 1-ε, 1+ε) A_t ) ]

دو تا شرط:

  • اگر مزیتA_t > 0و نسبت تلاش می کند تا از گذشته بربیاید1 + ε، کلپ تراز را صاف می کند یک عمل خوب را بیشتر از فشار ندهید+εاز احتمالات قدیمی بالاتر
  • اگر مزیتA_t < 0و نسبت تلاش می کند تا از گذشته بربیاید1 - ε(به این معنی که ما یک عمل بد را در مقایسه با کاهش آن بیشتر می کنیم) ، کلیپ گریند را می پوشاند یک عمل بد را زیر فشار نمی دهد -ε. .

.minدر جهت دیگر کار می کند: اگر نسبت به جهت مفید حرکت کرده باشد، هنوز هم گرادینت را دریافت می کنید (هیچ برش روی طرف که به شما آسیب برساند).

نماديهε = 0.2. هدف را به عنوان تابع ازr_t: یک عملکرد قطعه ای خطی با یک سقف صاف در "جانب خوب" و یک طبقه صاف در "جانب بد".

The full PPO loss.

L(θ, φ) = L^{CLIP}(θ) - c_v · (V_φ(s_t) - V_t^{target})² + c_e · H(π_θ(·|s_t))

ساختار مشابهي از A2C. سه معادل، معمولاc_v = 0.5،c_e = 0.01،ε = 0.2. .

The training loop.

  1. جمع آوری کنیدN × Tانتقال ها در سراسرNمحیط های موازی برای Tهر قدم
  2. مزایای محاسبه (GAE) را به عنوان ثابت منجمد کنید.
  3. یخ زدهπ_{θ_old}به عنوان یک عکس از جریانπ_θ. .
  4. برایKدوره ها، برای هر دسته کوچک از(s, a, A, V_target, log π_old(a|s)):

- حساب کردنr_t(θ) = exp(log π_θ(a|s) - log π_old(a|s)). .

- درخواست کنیدL^{CLIP}+ از دست دادن ارزش + انتروپ

- مرحله ي درجه ي بالا

  1. از راه اندازی بازتاب کن برگرد به مرحله اول

K = 10و تعداد 64 عدد کمی از آن ها مجموعه ای از پارامترهای استاندارد است.

KL-penalty variant.مقاله اصلی پیشنهاد کرد که با استفاده از مجازات KL سازگار جایگزین شود: L = L^{PG} - β · KL(π_θ || π_old)باβنسخه برش تبدیل به غالب شد؛ ویرانت KL در RLHF زنده ماند (که KL به سیاست مرجع یک محدودیت جداگانه است که همیشه می خواهید).

آن را بسازید

مرحله اول: گرفتنlog π_old(a | s)در زمان پخش

pythonfor step in range(T):
    probs = softmax(logits(theta, state_features(s)))
    a = sample(probs, rng)
    s_next, r, done = env.step(s, a)
    buffer.append({
        "s": s, "a": a, "r": r, "done": done,
        "v_old": value(w, state_features(s)),
        "log_pi_old": log(probs[a] + 1e-12),
    })
    s = s_next

عکس یک بار در زمان انتشار گرفته می شود. در دوران بروزرسانی تغییر نمی کند.

مرحله دوم: مزایای GAE را محاسبه کنید (درسی 07)

همونطور که A2C هست، در تمام دسته عادی بشه

مرحله 3: بروز رسانی جایگزین حذف شده

pythonfor _ in range(K_EPOCHS):
    for mb in minibatches(buffer, size=64):
        for rec in mb:
            x = state_features(rec["s"])
            probs = softmax(logits(theta, x))
            logp = log(probs[rec["a"]] + 1e-12)
            ratio = exp(logp - rec["log_pi_old"])
            adv = rec["advantage"]
            surrogate = min(
                ratio * adv,
                clamp(ratio, 1 - EPS, 1 + EPS) * adv,
            )
            # backprop -surrogate, add value loss, subtract entropy
            grad_logpi = onehot(rec["a"]) - probs
            if (adv > 0 and ratio >= 1 + EPS) or (adv < 0 and ratio <= 1 - EPS):
                pg_grad = 0.0  # clipped
            else:
                pg_grad = ratio * adv
            for i in range(N_ACTIONS):
                for j in range(N_FEAT):
                    theta[i][j] += LR * pg_grad * grad_logpi[i] * x[j]

الگوی "کوتاه شدن → صفر" قلب PPO است. اگر سیاست جدید در جهت سودمند بیش از حد حرکت کرده باشد، به روزرسانی متوقف می شود.

مرحله 4: ارزش و انترپی

به هدف منتقد MSE استاندارد و یک پاداش انتروپی در بازیگر اضافه کنید، همان طور که A2C.

مرحله 5: تشخیص

سه تا چيز براي نگاه کردن به هر تازه ترين:

  • Mean KL E[log π_old - log π_θ]باید توی خونه بمون[0, 0.02]اگه اون از قبل پرواز کنه0.1، کاهشK_EPOCHSیاLR. .
  • Clip fraction بخش نمونه هایی که نسبت آن خارج از آن قرار دارد [1-ε, 1+ε]باید باشه~0.1-0.3اگه~0، کلپ هرگز باعث افزایش نمیشهLRیاK_EPOCHSاگه~0.5+، شما بیش از حد نصب کردن رولوت → پایین آوردن آنها.
  • Explained variance 1 - Var(V_target - V_pred) / Var(V_target). معیار کیفیت انتقادی . باید به سمت 1 بالا برود

دام ها

  • Clip coefficient mistuned. ε = 0.2این استاندارد واقعی است.0.1تازه ها رو خیلی ترسناک می کنه0.3+به عدم ثبات دعوت می کند.
  • Too many epochs. K > 20به طور معمول از ثبات بی ثباتی می کند چون سیاست ها از راه دور حرکت می کنند.π_old. دوره های محدود، به خصوص برای شبکه های بزرگ
  • No reward normalization.مقیاس های بزرگ پاداش به محدوده کلیپ می خوردند. پاداش ها را قبل از مزایای محاسباتی عادی سازی کنید.
  • Forgetting advantage normalization.نرمال سازی صفر متوسط/وحده std در هر دسته استاندارد است.
  • Learning rate not decayed.PPO از انحلال LR خطی به صفر بهره مند می شود. LR ثابت اغلب بدتر است.
  • Importance ratio math errors.همیشهexp(log_new - log_old)برای ثبات عددی، نه new / old. .
  • Wrong gradient sign.بخاطر زایمان جایگزین-L^{CLIP}. علامت برگشتي رایج ترين خطاي PPO است

ازش استفاده کن

PPO الگورتھم RL پیش فرض 2026 در تعداد شگفت انگیزی از دامنه ها است:

Use casePPO variant
MuJoCo / robotics controlPPO with Gaussian policy, GAE(0.95)
Atari / discrete gamesPPO with categorical policy, rolling 128-step rollouts
RLHF for LLMsPPO with KL penalty to reference model, reward from RM at end of response
Large-scale game agentsIMPALA + PPO (AlphaStar, OpenAI Five)
Reasoning LLMsGRPO (Lesson 12) — PPO variant without critic
Preference-only dataDPO — closed-form collapsing of PPO+KL, no online sampling

شکل PPO خسارت جایگزین برش شده + ارزش + انتروپی است که برای DPO، GRPO و تقریبا هر لوله RLHF است.

-باده

پس ازoutputs/skill-ppo-trainer.md:

markdown---
name: ppo-trainer
description: Produce a PPO training config and a diagnostic plan for a given environment.
version: 1.0.0
phase: 9
lesson: 8
tags: [rl, ppo, policy-gradient]
---

Given an environment and training budget, output:

1. Rollout size. `N` envs × `T` steps.
2. Update schedule. `K` epochs, minibatch size, LR schedule.
3. Surrogate params. `ε` (clip), `c_v`, `c_e`, advantage normalization on.
4. Advantage. GAE(`λ`) with explicit `γ` and `λ`.
5. Diagnostics plan. KL, clip fraction, explained variance thresholds with alerts.

Refuse `K > 30` or `ε > 0.3` (unsafe trust region). Refuse any PPO run without advantage normalization or KL/clip monitoring. Flag clip fraction sustained above 0.4 as drift.

تمرینات

  1. Easy.از پي پي او در 4×4 گريد ورلد استفاده کنε=0.2, K=4.با عملکرد نمونه ها در مراحل سازگار با A2C (یک دوره در هر رول) مقایسه کنید.
  2. Medium.پاک کردنK ∈ {1, 4, 10, 30}. نقشه برگشت به مقابل مرحله های محیط و ردیابی متوسط KL در هر بروزرسانیKکلوپین در این کار منفجر میشه؟
  3. Hard.جایگزین جایگزین برش شده را با مجازات KL سازگار (βدو برابر شده اگرKL > 2·target، نصف شده اگرKL < target/2) بازده نهایی، ثبات و بدون کلپ را مقایسه کنید.

اصطلاحات کلیدی

TermWhat people sayWhat it actually means
Importance ratio"r_t(θ)"π_θ(a|s) / π_old(a|s); deviation from the policy that collected the data.
Clipped surrogate"PPO's main trick"min(r·A, clip(r, 1-ε, 1+ε)·A); flat gradient past the clip on beneficial side.
Trust region"TRPO / PPO intent"Limit each update's KL to guarantee monotone improvement.
KL penalty"Soft trust region"Alternative PPO: L - β · KL(π_θ || π_old). Adaptive β.
Clip fraction"How often clipping triggers"Diagnostic — should be 0.1-0.3; outside means mistuned.
Multi-epoch training"Data reuse"K epochs on each rollout; variance cost traded for sample efficiency.
On-policy-ish"Mostly on-policy"PPO is nominally on-policy but K>1 epochs uses slightly-off-policy data safely.
PPO-KL"The other PPO"KL-penalty variant; used in RLHF where KL-to-reference is already a constraint.

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.