强化学习速记:公式、直觉与最小实现
用公式和代码把 RL 的核心环节串起来:价值函数、策略梯度与优势估计。
强化学习的核心目标是最大化长期回报。下面用一篇“公式 + 最小代码”把关键概念串起来。
1. 基本定义
折扣回报:
$$ G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k} $$
状态价值函数:
$$ V^{\pi}(s) = \mathbb{E}_{\pi}[G_t \mid s_t=s] $$
动作价值函数:
$$ Q^{\pi}(s,a) = \mathbb{E}_{\pi}[G_t \mid s_t=s, a_t=a] $$
2. Bellman 方程
Bellman 期望方程:
$$ V^{\pi}(s) = \sum_a \pi(a\mid s) \sum_{s'} P(s'\mid s,a) [r + \gamma V^{\pi}(s')] $$
最优 Bellman 方程:
$$ V^*(s) = \max_a \sum_{s'} P(s'\mid s,a) [r + \gamma V^*(s')] $$
3. TD 误差与更新
TD 误差:
$$ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) $$
一阶更新:
$$ V(s_t) \leftarrow V(s_t) + \alpha \delta_t $$
4. 策略梯度与优势函数
策略梯度目标:
$$ J(\theta) = \mathbb{E}_{\pi_\theta}[G_t] $$
梯度形式:
$$ \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}[\nabla_\theta \log \pi_\theta(a_t\mid s_t) A_t] $$
优势估计:
$$ A_t = Q(s_t,a_t) - V(s_t) $$
用 GAE 表达:
$$ \hat{A}_t = \sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} $$
5. 最小实现(PyTorch 伪代码)
Python1import torch2 3def compute_returns(rewards, gamma=0.99):4 returns = []5 g = 0.06 for r in reversed(rewards):7 g = r + gamma * g8 returns.append(g)9 return list(reversed(returns))10 11def policy_gradient_step(log_probs, advantages, optimizer):12 # maximize E[log pi * A] -> minimize negative13 loss = -(torch.stack(log_probs) * torch.tensor(advantages)).mean()14 optimizer.zero_grad()15 loss.backward()16 optimizer.step()
6. 一份实践清单
- 奖励缩放与标准化
- 优势归一化避免训练发散
- 先验证小环境(CartPole)再上复杂任务
提示建议先把 reward、advantage 的统计日志打出来,再开始调参。
注意如果策略熵快速塌缩,通常意味着探索不足或学习率偏高。
| 指标 | 目标区间 | 说明 |
|---|---|---|
| Policy Loss | 稳定下降 | 波动过大时先减小学习率 |
| Value Loss | 不爆炸 | 长时间偏高说明值函数拟合不足 |
| Entropy | 缓慢下降 | 下降太快会导致探索不足 |
强化学习不是靠堆模型,而是靠稳定的训练流程与正确的信号设计。
参考资料 博客园