核心思想和蒙特卡洛强相关,很幸运的在 THUWC 2024 遇到了 MCTS 的工程题。
这个算法是 RL Policy Based 类的始祖,需要对大量的 Trajectory 进行采样,而每个Trajectory之间的差异可能是巨大的,结果就引入了高方差(High Variance)和较大的梯度噪声(noisy gradients) ,导致训练的不稳定和策略收敛困难。
所以之后的优化和变体就是基于上述两个问题进行的。
- $\pi_\theta$ 基于参数 $\theta$ 的策略函数
- $\tau$ 轨迹。
- $G_{\tau, t} = \sum_{k=0}^{\infty} \gamma^{k} r_{t+k}$ 带衰减的累计收益
- $a, r$ 动作和收益。
期望最大收益:
$$J(\theta) = {\mathbb E}_{s \sim \tau^{\pi_\theta}, a \sim \pi_\theta} [G_{\tau, 1}] $$
利用马尔可夫和蒙特卡洛无偏估计,以及 $\nabla_\theta p(\theta) = p(\theta) \nabla_\theta \log p(\theta)$ 的小 trick,可以有:
$$\nabla J(\theta) = {\mathbb E}_{\tau \sim \pi_\theta} \left[ \sum_{t = 0}^T \nabla \log \pi_\theta(a_t|s_t) G_{\tau, t} \right] $$
$$\nabla J(\theta) = {\mathbb E}_{\tau \sim \pi_\theta} \left[ \sum_{t = 0}^T G_{\tau, t} \nabla \log \pi_\theta(a_t|s_t) \right] $$
$\nabla \log \pi_\theta(a_t|s_t)$ 其实就是预测概率分布和真实 one-hot 动作之间的交叉熵,可以通过数学推导而来。
于是 REINFORCE 算法就有了:
$T$ 轮
每轮采样 $N$ 条轨迹,计算 $\nabla$
更新 $\pi_\theta \leftarrow \pi_\theta + \alpha \nabla$
https://github.com/louisnino/RLcode/blob/master/tutorial_PG.py