第4章 蒙特卡洛方法:无模型强化学习的起点
说实话,我第一次接触蒙特卡洛方法时,心里是有点抵触的。你想啊,一个靠随机采样来估计价值的方法,能靠谱吗?但后来在实际项目中,我发现它恰恰是解决很多复杂问题的钥匙。今天我们就来聊聊这个无模型强化学习的起点。
4.1 为什么需要蒙特卡洛方法?
先说说背景。在动态规划那章,我们假设环境模型是已知的——也就是状态转移概率 P 和奖励函数 R 都摆在眼前。但现实世界哪有这么理想?
我在做机器人导航项目时,环境中的障碍物分布、地面摩擦系数,这些参数根本没法精确建模。这时候,无模型方法就派上用场了。蒙特卡洛方法的核心思想很简单:通过完整的轨迹采样来估计价值。
核心观点:蒙特卡洛方法不需要环境模型,它直接从经验中学习。你让智能体与环境交互,记录下完整的轨迹,然后根据实际获得的回报来更新价值估计。
4.2 蒙特卡洛预测:从完整轨迹中学习
预测问题,说白了就是估计状态价值函数 V(s) 或动作价值函数 Q(s,a)。蒙特卡洛的做法很直观:
- 让智能体从初始状态开始,按照当前策略执行,直到终止状态
- 记录下整条轨迹:S1, A1, R2, S2, A2, R3, ..., ST
- 对于轨迹中的每个状态,计算从该状态开始的累积折扣回报 Gt
- 用这些 Gt 的平均值来估计 V(s) 或 Q(s,a)
嗯,这里要注意一个细节:首次访问 vs 每次访问。我个人习惯用首次访问蒙特卡洛,因为它在理论上更简洁,方差也更小。
小技巧:如果你在同一个 episode 中多次访问同一个状态,首次访问法只使用第一次出现的回报,而每次访问法会使用所有出现的回报。我建议初学者先掌握首次访问法。
4.2.1 蒙特卡洛预测的伪代码
Initialize:
V(s) = 0 for all s
Returns(s) = empty list for all s
Loop for each episode:
Generate an episode following policy π:
S0, A0, R1, S1, A1, R2, ..., ST-1, AT-1, RT
G = 0
Loop for t = T-1 down to 0:
G = γ * G + Rt+1
If St is not in S0, S1, ..., St-1: # 首次访问检查
Append G to Returns(St)
V(St) = average(Returns(St))
你看,代码其实很简单。但我在项目中踩过一个坑:episode 必须足够长。有一次做游戏 AI,episode 太短导致采样不足,价值估计偏差很大。后来我加了个最小 episode 长度的限制,问题就解决了。
4.3 蒙特卡洛控制:策略迭代的无模型版本
控制问题,就是找到最优策略。蒙特卡洛控制遵循一个经典的框架:广义策略迭代。
具体来说,我们交替进行两个步骤:
- 策略评估:用蒙特卡洛方法估计当前策略的 Q 函数
- 策略改进:基于 Q 函数,贪心地选择动作
我曾经在自动驾驶决策模块中用过这个框架。车辆在十字路口需要决定是左转、右转还是直行。我们用蒙特卡洛方法评估每个动作的长期回报,然后选择最优的。效果还不错,就是训练时间有点长。
4.3.1 探索性初始化
这里有个关键问题:如果策略是贪心的,那智能体只会选择当前认为最优的动作,很多状态-动作对可能永远没机会探索。怎么办?
一个简单的办法是探索性初始化——让每个 episode 的起始状态-动作对都不同,确保所有 (s,a) 对都有机会被访问到。
避坑指南:我曾经在围棋 AI 项目中使用探索性初始化,结果发现状态空间太大,根本覆盖不完。后来我意识到,探索性初始化只适用于状态空间有限且可枚举的情况。对于大规模问题,需要更高级的探索策略。
4.4 探索与利用的平衡
这是强化学习中最经典的问题之一。你想想看,如果智能体总是利用已知的最优动作,那它可能永远发现不了更好的策略。但如果它总是探索,那又无法积累足够的经验来做出好的决策。
蒙特卡洛方法中,常用的平衡策略是 ε-贪心策略:
- 以概率 1-ε 选择当前最优动作(利用)
- 以概率 ε 随机选择动作(探索)
我个人的经验是,ε 的取值很关键。一开始可以设大一点(比如 0.3),让智能体充分探索。随着训练进行,逐渐减小 ε 到 0.01 左右。这个衰减过程,我习惯用指数衰减:
epsilon = max(0.01, 0.3 * (0.99 ** episode_count))
为什么这样设计?因为早期探索能发现更多可能性,后期则要收敛到最优策略。我在机器人抓取任务中试过,这个策略比固定 ε 的效果好很多。
4.5 蒙特卡洛方法的优缺点
| 优点 | 缺点 |
|---|---|
| 不需要环境模型,直接从经验学习 | 只能用于 episodic 任务,不能处理连续任务 |
| 概念简单,容易实现 | 方差较大,需要大量采样 |
| 对每个状态独立估计,没有偏差 | 学习速度慢,尤其是状态空间大时 |
| 可以处理非马尔可夫环境 | 无法进行增量式学习(需要完整轨迹) |
说白了,蒙特卡洛方法就像是一个经验丰富的老师傅,他见过足够多的案例,所以能给出靠谱的判断。但前提是,你得给他足够多的案例。
4.6 知识体系图
下面这张图展示了蒙特卡洛方法在强化学习中的位置,以及它与其他方法的关系:
4.7 实践中的注意事项
最后,分享几个我在实际项目中的经验:
- 采样效率:蒙特卡洛方法需要大量采样。我建议至少跑几千个 episode 才能看到稳定的结果。如果计算资源有限,可以考虑用重要性采样来复用旧数据。
- 折扣因子 γ:这个参数很敏感。γ 接近 1 时,智能体会考虑长远回报,但方差也大。我一般从 0.9 开始调。
- 终止状态设计:确保每个 episode 都能在合理步数内终止。否则,无限长的轨迹会让蒙特卡洛方法失效。
个人建议:刚开始学蒙特卡洛时,先在一个简单环境(比如 4x4 网格世界)上跑通代码。这样你能直观地看到价值函数的收敛过程,对理解算法本质很有帮助。
好了,蒙特卡洛方法就聊到这里。它是无模型强化学习的基石,虽然简单,但思想深刻。掌握了它,后面学习时序差分方法就会轻松很多。