2025-4-4-训练数据的收集、与策略梯度操作
训练数据收集
初版:
一开始Agent是完全随机、乱给的$\{s,a\}$,记录下来;然后做很多的episodes,得到相当多的数据。
评价每个Action是好还是不好
以评价的结果训练Agent: $\{r_1,r_2,\dots,r_N\}$from$\{s_1,a_1\},\{s_2,a_2\},\dots,\{s_N,a_N\}$
缺点:
- 短视:你只奖励了当下表现,而忽略了某些“短期亏损但长期获利”的动作
- 断裂式因果链:$r_1$仅来自于$\{s_1,a_1\}$,$r_2$仅来自于$\{s_2,a_2\}$。在环境是有“状态转移”的情况下,动作 $a_t$ 会影响 $s_{t+1}$,从而影响后续的一系列 $r_{t+1}, r_{t+2}, \dots$,但初版完全忽略了这个“连锁反应”.
进化版:
- $a_1$不仅得到$r_1$,也会影响下次$r_2$(以及后续的rewards)
- 延迟奖励:牺牲短期利益、考虑长期利益
对于当前动作不仅影响当下的reward、也会影响后续的reward。因此提出了Cumulative Reward:
Cumulative Reward:$G_t=\sum^N_{n=t}r_n$
但这存在问题:这个“影响”会存续多久?$r_N$的功劳究竟有多少与$a_1$有关?
Discounted Cumulative Reward:在Cumulative Reward基础上添加了decay:
缺点:
- 好坏不分“相对”:$r = 10$ 看起来不错,但如果平均大家都拿 20,那你其实表现很差。
这就说明:只看 $G_t’$ 绝对值,不足以说明动作是否好。
- 高方差问题:有时 $G_t’$ 波动非常大(比如因为环境随机性),训练不稳定。
举个例子:两次相同状态 $s_t$,采取相同动作 $a_t$,但由于环境差异得到的 $G_t’$ 不一样。那我们到底该信谁?怎么训练才稳?
再次进化版:好坏是相对的。
提出优势函数,建立baseline:
Q: baseline如何确定?
value function的确定,见下集。
Policy Gradient操作
- 随机初始化Agent,得到$\pi_{\theta}^0$
- 进入训练迭代epoch: (i=1:T)
- 用$\pi_{\theta}^{i-1}$(Agent)与环境互动
- 得到序列数据$\{s_1,a_1\},\{s_2,a_2\},\dots,\{s_N,a_N\}$
- 计算$A_1,A_2,\dots,A_N$
- 计算loss $\mathcal{L}$
- 梯度下降:$\pi_{\theta}^{t}\leftarrow \pi_{\theta}^{t-1}-\eta\mathcal{L}$
注意:数据采集和训练是绑定的
与传统监督学习不同,强化学习中:
- 每一轮 epoch 都必须重新从环境中采集新数据(步骤 2.1–2.3 是无法跳过的)
- 没有现成的 “训练集”,Agent 必须自己探索环境、生成样本
- 因此训练开销很大,尤其在复杂环境中(如游戏、机器人等)
其中2.1、2.2、2.3步骤,每步的计算无法省略:在ML中此步骤在epoch外进行、RL在epoch内进行。也就是说每个epoch都要充头来过,重新收集训练数据。因此非常耗费时间。
Policy分类
- On-policy:训练的Agent与环境互动的Agent是同一个。训练使用的数据是由当前策略 $\pi_\theta$ 自己生成的。
- 优点:数据和策略高度匹配
- 缺点:每次训练都必须重新采样,样本浪费大
- Off-Policy:两者Agent分开,这样不用每步重新收集训练数据$\{s,a\}$,允许用其他策略生成的数据来训练当前策略。
- PPO(Proximal Policy Optimization): 训练的Agent知道自己与环境交互的Agent不同$\rightarrow$”有些经验可以采纳、而有些不行”
- 优点:可以重复利用旧数据,效率高
- 缺点:训练会偏差,需要校正(如使用重要性采样)
PPO (Proximal Policy Optimization)
介于 on-policy 和 off-policy 之间的“近端优化”方法:
- PPO 训练时,使用的是过去某个策略 $\pi_{\text{old}}$ 与环境交互的经验
- 当前策略 $\pi_\theta$ 在更新时必须满足:“与旧策略不要差太多”
- 用一个 信任区域或裁剪机制 控制每次更新步长,防止策略剧烈跳动
这样就能部分复用旧经验,又保持训练的可靠性。
如何处理只有结尾有 reward 的场景?
像围棋、象棋这类任务中:
- 只有最终胜负才给出一个明确的 reward(如 +1 / -1)
- 中间过程 $r_t = 0$,训练信号极度稀疏,极难学习
✅ 答案是:可以处理,但训练难度高。方法包括:
- 自定义中间 reward:
- 自己构造评估函数(例如局势估值)
- 提前给予“启发式奖励”
- 使用 Value Network(Critic)来辅助:
- 借助值函数 $V(s)$ 估计未来期望回报
- 使得中间状态也能“感知”后续可能发生的奖励
- 强化学习特化方法(如 AlphaGo):
- 使用 Monte Carlo Tree Search 进行 rollout
- 引入策略网络 + 值网络,进行监督学习 + 自我博弈训练