Original source
---
id: reinforcement-learning
title: Reinforcement Learning
code: RL
subtitle: MDPs, value methods, policy gradients, PPO, RLHF and GRPO. Formulas, update lines and diagnostics from Phase 9.
hue: 75
sources: phases/09-reinforcement-learning/01-mdps-states-actions-rewards, phases/09-reinforcement-learning/02-dynamic-programming, phases/09-reinforcement-learning/03-monte-carlo-methods, phases/09-reinforcement-learning/04-q-learning-sarsa, phases/09-reinforcement-learning/05-dqn, phases/09-reinforcement-learning/06-policy-gradients-reinforce, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c, phases/09-reinforcement-learning/08-ppo, phases/09-reinforcement-learning/09-reward-modeling-rlhf, phases/09-reinforcement-learning/12-rl-for-games
source_hash: a115ea75e61f42aa
---
## PPO training loop
type: architecture
from: phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/08-ppo/code/main.py, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md
```arch
node | envs | 1,1 | N parallel envs | T steps each
node | actor | 2,1 | Actor | softmax policy
node | buf | 1,2 | Rollout buffer | s, a, r, log_pi_old
node | critic | 2,2 | Critic | v_old per state
node | gae | 1,3 | GAE | advantages, returns
node | clip | 2,3 | Clipped surrogate | K epochs, minibatches
node | diag | 1,4 | Diagnostics | mean KL, clip fraction
edge | actor | envs | action
edge | envs | buf | transition
edge | critic | buf | value
edge | buf | gae |
edge | gae | clip | advantage
edge | clip | actor | update
edge | clip | diag |
```
## RLHF in three stages
type: flow
from: phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md
1. **SFT**: fine tune the base model on human demonstrations.
2. **Preference data**: collect rows of prompt, chosen and rejected.
3. **Reward model**: train a scalar head on the SFT model with the Bradley-Terry loss.
4. **Policy and reference**: start the policy from SFT. Freeze a copy as the reference.
5. **Reward**: RM score minus $\beta$ times the KL to the reference.
6. **PPO**: update the token level policy against that reward.
7. **Monitor**: watch mean KL. Past about 5 to 10, drift or reward hacking starts.
## Value formulas
type: concepts
from: phases/09-reinforcement-learning/01-mdps-states-actions-rewards/docs/en.md, phases/09-reinforcement-learning/02-dynamic-programming/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md
- **MDP**: the tuple $(S, A, P, R, \gamma)$ with the Markov property.
- **Return**: $G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \ldots$
- **Bellman V**: $V^\pi(s) = \sum_a \pi(a \mid s) \sum_{s', r} P(s', r \mid s, a) [r + \gamma V^\pi(s')]$
- **Value iteration**: $V(s) \leftarrow \max_a \sum_{s',r} P(s',r \mid s,a) [r + \gamma V(s')]$
- **TD(0)**: $V(s) \leftarrow V(s) + \alpha [r + \gamma V(s') - V(s)]$
- **Q-learning**: $Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma \max_{a'} Q(s', a') - Q(s, a)]$
- **SARSA**: $Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma Q(s', a') - Q(s, a)]$
- **DQN loss**: $(r + \gamma \max_{a'} Q(s', a'; \theta^-) - Q(s, a; \theta))^2$ over replay samples.
## Policy formulas
type: concepts
from: phases/09-reinforcement-learning/06-policy-gradients-reinforce/docs/en.md, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
- **Policy gradient**: $\nabla J(\theta) = \mathbb{E}[ \sum_t G_t \cdot \nabla_\theta \log \pi_\theta(a_t \mid s_t) ]$
- **TD advantage**: $\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t)$
- **GAE**: $A_t^{\text{GAE}} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}$
- **PPO ratio**: $r_t(\theta) = \pi_\theta(a_t \mid s_t) / \pi_{\theta_{\text{old}}}(a_t \mid s_t)$
- **PPO clip**: $\mathbb{E}_t [ \min( r_t A_t, \mathop{\mathrm{clip}}(r_t, 1-\epsilon, 1+\epsilon) A_t ) ]$
- **Bradley-Terry**: $L(\phi) = -\mathbb{E}[ \log \sigma(R_\phi(x, y_+) - R_\phi(x, y_-)) ]$
- **RLHF reward**: $R_\phi(x, y) - \beta \cdot \mathrm{KL}(\pi_\theta \Vert \pi_{\text{ref}})$
- **GRPO advantage**: $A_i = (r_i - \text{mean}_r) / \text{std}_r$ over $G$ samples of one prompt.
## Choose a method
type: command-table
from: phases/09-reinforcement-learning/02-dynamic-programming/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
| Situation | Method |
|---|---|
| Small tabular MDP, known model | value iteration or policy iteration |
| Small tabular MDP, samples only | Q-learning |
| On-policy, safety critical | SARSA or Expected SARSA |
| High dimensional state, discrete actions | DQN, with Double DQN in production |
| Continuous control | PPO with Gaussian policy, or SAC and TD3 |
| LLM alignment from preferences | DPO first, RLHF-PPO with KL penalty |
| LLM math and code reasoning | GRPO with a verifier reward |
| Two player board games | AlphaZero or MuZero |
## Update lines
type: task-table
from: phases/09-reinforcement-learning/03-monte-carlo-methods/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
| Task | Code |
|---|---|
| Return, reverse sweep | `G = r + gamma * G` |
| Explore with epsilon greedy | `if random() < epsilon: return choice(ACTIONS)` |
| Q-learning target | `target = r + (gamma * max(Q[s_next].values()) if not done else 0.0)` |
| SARSA target | `target = r + (gamma * Q[s_next][a_next] if not done else 0.0)` |
| TD step | `Q[s][a] += alpha * (target - Q[s][a])` |
| Sync DQN target net | `if steps % sync_every == 0: target = copy(online)` |
| RLHF reward with KL | `reward = dot(w, bag([token])) - beta * kl(probs, probs_ref)` |
| GRPO group advantage | `advs = [(r - mean_r) / std_r for r in rewards]` |
## PPO clipped update
type: annotated-code
lang: python
from: phases/09-reinforcement-learning/08-ppo/code/main.py
```python
for rec, adv in zip(mb, adv_norm): # advantages normalized per minibatch
x = rec["x"]
probs = softmax(logits(theta, x)) # current policy
logp = math.log(max(probs[rec["a"]], 1e-12))
ratio = math.exp(logp - rec["log_pi_old"]) # new over old probability
clipped = (adv > 0 and ratio > 1 + eps) or (adv < 0 and ratio < 1 - eps)
pg_scale = 0.0 if clipped else ratio * adv # clipped means zero gradient
for action in range(N_ACTIONS):
grad_logpi = (1.0 if action == rec["a"] else 0.0) - probs[action]
for j in range(N_FEAT):
theta[action][j] += lr_a * pg_scale * grad_logpi * x[j]
err = rec["ret"] - value(w, x) # critic error
for j in range(N_FEAT):
w[j] += lr_v * err * x[j] # critic step
```
## Defaults and numbers
type: defaults
from: phases/09-reinforcement-learning/01-mdps-states-actions-rewards/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
| Setting | Default | Note |
|---|---|---|
| Discount $\gamma$ | 0.99 | horizon about $1 / (1 - \gamma)$, so 100 steps |
| Tabular $\alpha$ and $\epsilon$ | 0.1 | Q-learning and SARSA on the 4x4 GridWorld |
| PPO clip $\epsilon$ | 0.2 | 0.1 is too timid, 0.3 and more is unstable |
| Value coefficient $c_v$ | 0.5 | PPO and A2C |
| Entropy coefficient $c_e$ | 0.01 | PPO and A2C |
| GAE $\lambda$ | 0.95 | 0 is TD, 1 is MC |
| RLHF KL $\beta$ | 0.01-0.05 | keeps the policy near SFT |
| GRPO group size $G$ | 8 | 8 to 64 is standard, below 4 is noisy |
## Troubleshooting
type: troubleshooting
from: phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md, phases/09-reinforcement-learning/06-policy-gradients-reinforce/docs/en.md, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md
| Symptom | Cause | Fix |
|---|---|---|
| Mean KL past 0.1 | policy drifts far from the old policy | reduce `K_EPOCHS` or `LR` |
| Clip fraction near 0 | clip never triggers | raise `LR` or `K_EPOCHS` |
| Clip fraction 0.5 or more | overfit to the rollout | lower `LR` or `K_EPOCHS` |
| Reward climbs, human eval drops | reward hacking of the RM | stop early, raise $\beta$, broaden RM data |
| Responses get longer | RM rewards length | length normalized reward |
| Q values too high | max bias on noisy Q | Double DQN |
| DQN diverges | deadly triad | keep the target net and the replay buffer |
| Policy stops exploring | entropy collapse | entropy bonus with $c_e > 0$ |
## Abbreviations
type: glossary
from: phases/09-reinforcement-learning/01-mdps-states-actions-rewards/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
- **MDP**: Markov Decision Process. States, actions, transitions, rewards, discount.
- **TD**: Temporal Difference. Update from a one step bootstrapped target.
- **DQN**: Deep Q-Network. Q-learning with replay, target net and reward clipping.
- **A2C**: Advantage Actor-Critic. Synchronous batched parallel envs.
- **GAE**: Generalized Advantage Estimation. Weighted sum of TD residuals.
- **PPO**: Proximal Policy Optimization. Clipped importance ratio, many epochs.
- **RLHF**: Reinforcement Learning from Human Feedback. SFT, then RM, then PPO.
- **GRPO**: Group Relative Policy Optimization. PPO variant without a critic.
## Questions
type: qa
from: phases/09-reinforcement-learning/03-monte-carlo-methods/docs/en.md, phases/09-reinforcement-learning/04-q-learning-sarsa/docs/en.md, phases/09-reinforcement-learning/06-policy-gradients-reinforce/docs/en.md, phases/09-reinforcement-learning/09-reward-modeling-rlhf/docs/en.md, phases/09-reinforcement-learning/12-rl-for-games/docs/en.md
- **On-policy or off-policy?** On-policy learns from its own data. Off-policy learns from another policy's data.
- **Q-learning or SARSA?** Q-learning bootstraps on the max. SARSA uses the next action it takes and is more cautious.
- **Why subtract a baseline?** It keeps the gradient unbiased and cuts the variance.
- **Why the KL in RLHF?** It keeps the policy near the data where the RM was trained.
- **Why GRPO for reasoning?** No value network, so half the memory. Per prompt normalization fits sparse rewards.
## Tips
type: tips
from: phases/09-reinforcement-learning/01-mdps-states-actions-rewards/docs/en.md, phases/09-reinforcement-learning/02-dynamic-programming/docs/en.md, phases/09-reinforcement-learning/05-dqn/docs/en.md, phases/09-reinforcement-learning/07-actor-critic-a2c-a3c/docs/en.md, phases/09-reinforcement-learning/08-ppo/docs/en.md
- Write the five MDP tuples before you write a training loop.
- Check a tabular agent against the DP value $V^{\ast}$.
- Decay $\epsilon$ from 1.0 to 0.01 over the first 10% of training.
- Normalize advantages per batch to zero mean and unit std.
- Compute the ratio as exp(log_new minus log_old) for numerical stability.
- Start PPO with $K = 10$ epochs and minibatches of 64.