深入浅出强化学习:从贝尔曼公式到蒙特卡洛方法的数学之旅

张开发
2026/4/12 15:32:24 15 分钟阅读

分享文章

深入浅出强化学习:从贝尔曼公式到蒙特卡洛方法的数学之旅
1. 强化学习入门从贝尔曼公式说起第一次接触强化学习时我被那些数学符号绕得头晕眼花。直到有一天导师在黑板上写下贝尔曼方程的那一刻整个强化学习的逻辑突然清晰了——原来所有复杂的算法都是在解决这个方程的不同变体。贝尔曼公式就像强化学习的DNA它揭示了智能体如何通过当前奖励和未来收益的权衡来做决策。想象你在玩迷宫游戏每走一步都会消耗体力负奖励找到出口获得大奖。贝尔曼公式告诉你站在某个位置时不仅要看下一步能得多少分还要考虑从这个位置出发后续能获得的总收益。让我们用Python代码实现最简单的贝尔曼方程计算def bellman_equation(V, s, gamma, rewards, transitions): V: 当前状态价值估计 s: 当前状态 gamma: 折扣因子 rewards: 奖励函数 transitions: 状态转移概率 max_value -float(inf) for a in possible_actions(s): # 遍历所有可能的动作 expected_value 0 for s_next in possible_states(s, a): # 遍历所有可能的下一个状态 prob transitions(s, a, s_next) reward rewards(s, a, s_next) expected_value prob * (reward gamma * V[s_next]) if expected_value max_value: max_value expected_value return max_value这个函数的核心思想是当前状态的价值等于即时奖励加上未来状态的折现价值。gamma参数控制着目光长远程度当gamma接近1时智能体会更重视远期收益gamma接近0则变成今朝有酒今朝醉的短视策略。2. 贝尔曼最优方程寻找终极策略当理解了基础贝尔曼方程后很自然会产生一个疑问什么样的策略才是最好的这就引出了贝尔曼最优方程——它给出了判断策略是否最优的黄金标准。贝尔曼最优方程的精妙之处在于它采用了不动点理论。就像解方程xf(x)一样最优价值函数V满足VT(V*)其中T是贝尔曼最优算子。这个性质直接带来了值迭代算法初始化所有状态价值为0对所有状态s用贝尔曼最优算子更新V(s)重复步骤2直到V收敛根据收敛的V*提取最优策略def value_iteration(states, gamma, threshold1e-6): V {s: 0 for s in states} # 初始化价值函数 while True: delta 0 new_V {} for s in states: new_V[s] bellman_optimal_update(V, s, gamma) delta max(delta, abs(new_V[s] - V[s])) V new_V if delta threshold: # 收敛判断 break return V在实际项目中我发现值迭代有几个实用技巧设置合理的折扣因子gamma通常在0.9-0.99之间使用异步更新可以加速收敛不用等所有状态更新完再迭代结合优先扫描(prioritized sweeping)技术优先更新变化大的状态3. 蒙特卡洛方法从模型依赖中解放前两章的方法都需要知道环境的完整模型状态转移概率和奖励函数。但现实中很多场景无法获得完整模型——比如训练游戏AI时我们可能连游戏规则都不完全清楚。这时候就需要蒙特卡洛方法它只需要与环境交互的经验数据。蒙特卡洛的核心思想简单得令人惊讶用样本均值估计期望值。就像估算硬币正面概率不需要知道理论概率只要多抛几次计算频率就行。在强化学习中运行完整回合如玩完整局游戏记录状态、动作、奖励序列从后往前计算每个状态的回报G用观测到的G更新状态价值估计def mc_prediction(policy, env, num_episodes, gamma): V defaultdict(float) returns defaultdict(list) for _ in range(num_episodes): episode [] state env.reset() while True: action policy(state) next_state, reward, done, _ env.step(action) episode.append((state, reward)) if done: break state next_state G 0 for t in reversed(range(len(episode))): state, reward episode[t] G gamma * G reward if state not in [x[0] for x in episode[:t]]: # 首次访问型 returns[state].append(G) V[state] np.mean(returns[state]) return V我在实现蒙特卡洛时踩过两个坑探索不足如果策略总是选择最优动作可能错过更有潜力的状态。解决方案是采用ε-greedy策略以ε概率随机探索。高方差单次episode的回报可能波动很大。可以使用加权平均给近期样本更高权重来平滑学习过程。4. 时序差分学习融合蒙特卡洛和动态规划蒙特卡洛方法需要等到回合结束才能更新这在长回合任务中效率太低。时序差分(TD)学习则结合了蒙特卡洛的采样思想和动态规划的自举(bootstrapping)思想实现了单步更新。最经典的TD算法是Q-learningdef q_learning(env, num_episodes, alpha, gamma, epsilon): Q defaultdict(lambda: np.zeros(env.action_space.n)) for episode in range(num_episodes): state env.reset() while True: if np.random.random() epsilon: action env.action_space.sample() # 探索 else: action np.argmax(Q[state]) # 利用 next_state, reward, done, _ env.step(action) # Q-learning更新公式 best_next_action np.argmax(Q[next_state]) td_target reward gamma * Q[next_state][best_next_action] Q[state][action] alpha * (td_target - Q[state][action]) state next_state if done: break return Q这个算法有几个关键点值得注意Off-policy特性学习最优策略的同时可以使用任意探索策略步长参数α控制学习速度通常需要随时间衰减ε-greedy策略平衡探索与利用的经典方法在实际应用中我发现结合经验回放(experience replay)可以显著提升Q-learning的稳定性。具体做法是将转移样本(state, action, reward, next_state)存入缓冲区然后随机采样进行训练这样能打破样本间的相关性。5. 从理论到实践构建完整RL系统理解了这些数学原理后如何将它们组合成实用的强化学习系统这里分享我在智能游戏AI项目中的架构设计环境封装层将原始环境如游戏引擎封装成标准的gym.Env接口经验收集器并行运行多个环境实例高效收集训练数据模型核心实现DQN、PPO等算法包含神经网络近似器用于价值函数或策略目标网络稳定训练经验回放缓冲区训练流水线env make_env() model DQN(env.observation_space, env.action_space) buffer ReplayBuffer(capacity100000) for episode in range(10000): state env.reset() episode_reward 0 while True: action model.select_action(state) next_state, reward, done, _ env.step(action) buffer.push(state, action, reward, next_state, done) if len(buffer) batch_size: batch buffer.sample(batch_size) model.update(batch) state next_state episode_reward reward if done: break if episode % 100 0: test_performance()这个架构中有几个提升性能的关键技巧双网络结构使用独立的目标网络计算TD目标减少波动优先级采样根据TD误差大小给样本赋权重要样本更频繁训练n-step回报平衡MC和TD的优点使用多步回报作为目标6. 数学直觉培养如何理解RL中的抽象概念很多同学在学习强化学习时容易被各种公式吓到。根据我的教学经验建立数学直觉比死记硬背更重要。下面用几个生活类比来解释关键概念价值函数就像房地产评估状态价值≈地段潜力动作价值≈装修投资回报率贝尔曼方程≈综合当前租金和未来升值潜力的估价公式策略梯度好比学做菜策略≈做菜方法奖励≈菜品评分梯度上升≈根据评分调整做法多放盐或少煮会儿探索与利用的权衡类似找工作利用≈接受现有offer探索≈继续面试ε-greedy≈先面10家公司再决定通过这些类比复杂的数学概念突然变得亲切起来。我建议大家在理解新公式时先抛开数学符号思考它对应的现实意义是什么。7. 前沿扩展深度强化学习的数学基础当传统RL遇到深度学习产生了令人惊艳的深度强化学习(DRL)。其数学本质是用神经网络近似价值函数或策略函数核心公式其实并不复杂价值函数近似class ValueNetwork(nn.Module): def __init__(self, state_dim): super().__init__() self.fc1 nn.Linear(state_dim, 64) self.fc2 nn.Linear(64, 1) # 输出状态价值 def forward(self, state): x torch.relu(self.fc1(state)) return self.fc2(x)策略梯度更新def policy_gradient_update(policy_net, states, actions, advantages): log_probs policy_net.get_log_prob(states, actions) loss -(log_probs * advantages).mean() # 目标函数 optimizer.zero_grad() loss.backward() optimizer.step()在实际训练DRL时有几点特别重要输入归一化不同维度的状态特征需要标准化梯度裁剪防止梯度爆炸熵正则化保持策略的探索性并行采样加速数据收集我最近在机器人控制项目中发现结合模仿学习(imitation learning)可以显著提升DRL的样本效率——先用专家演示数据预训练策略网络再用强化学习微调。

更多文章