机器学习笔记(17): REINFORCE 算法
可能更好的阅读体验 Jeefy's Blog: REINFORCE 算法
核心思想和蒙特卡洛强相关,很幸运的在 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

浙公网安备 33010602011771号