Reinforcement Learning · Interactive Visualization

强化学习基础可视化实验室

通过 8 个交互式 SVG 可视化模块,从 Q-Learning 到 AlphaGo,系统理解强化学习的核心算法。每个模块包含动态可视化、参数调节与实时统计,将抽象的数学公式转化为直观的视觉语言。

8 Modules SVG + Vanilla JS Zero Dependencies Single File
01Q-Learning · Tabular TD Control

Q-Learning 基础

智能体在网格世界中通过试错学习最优策略。Q 值表记录每个状态-动作对的期望回报,使用 Bellman 方程迭代更新。点击播放观察智能体从随机探索到收敛最优路径的全过程。

GridWorld 网格世界与 Q 值表
Q-Learning 更新规则
Python# Q-Learning: off-policy TD control def q_learning_update(s, a, r, s_next, done): # 最优下一状态的 Q 值(off-policy) max_q_next = max(Q[s_next].values()) if not done else 0 # TD target 与 TD error td_target = r + gamma * max_q_next td_error = td_target - Q[s][a] # 增量更新 Q 值 Q[s][a] += alpha * td_error # epsilon-greedy 行为策略 def select_action(s, epsilon=0.1): if random() < epsilon: return random_action() return argmax(Q[s]) # 贪心
02DQN · Deep Q-Network

DQN 深度 Q 网络

将 Q-Learning 与深度神经网络结合,用网络近似 Q(s,a) 函数。经验回放池打破数据相关性,目标网络稳定训练。点击播放观察经验采集、批量采样与梯度更新的完整流程。

神经网络结构与经验回放池
DQN 损失函数与经验回放
Python# DQN: 用神经网络近似 Q(s, a) def dqn_loss(batch, policy_net, target_net): s, a, r, s_next, done = unpack(batch) # 当前 Q 值估计 q_pred = policy_net(s).gather(1, a) # 目标 Q 值(target network) q_next = target_net(s_next).max(1)[0] q_target = r + gamma * q_next * (1 - done) return F.mse_loss(q_pred, q_target.detach()) # 经验回放池 buffer = ReplayBuffer(capacity=10000) batch = buffer.sample(batch_size=32)
03Policy Gradient · REINFORCE

策略梯度 (Policy Gradient)

直接参数化策略 π(a|s;θ),通过最大化期望回报来优化。REINFORCE 算法采集完整轨迹后,用回报作为权重更新策略。观察概率分布如何随训练逐步集中于高回报动作。

策略网络与动作概率分布
REINFORCE 策略梯度
Python# REINFORCE: 蒙特卡洛策略梯度 def reinforce_loss(log_probs, returns): # 策略梯度: ∇J = E[∇log π(a|s) · G] loss = -sum(log_probs * returns) / len(returns) return loss # 采集一条完整轨迹 def collect_episode(env, policy): log_probs, rewards = [], [] s = env.reset() while not done: a, log_p = policy.act(s) s, r, done = env.step(a) log_probs.append(log_p) rewards.append(r) # 折扣回报 G_t = Σ γ^(k) r_{t+k} returns = compute_returns(rewards, gamma) return log_probs, returns
04Actor-Critic · A2C / A3C

Actor-Critic

Actor 负责选动作(策略网络),Critic 负责评估状态价值(价值网络)。TD 误差同时驱动两者更新,将策略梯度的方差从蒙特卡洛回报降低到单步时序差分。观察 TD 误差如何流向两个网络。

Actor-Critic 双网络结构与 TD 误差
A2C Actor-Critic 更新
Python# Actor-Critic: 同步更新策略与价值 def a2c_update(state, action, reward, next_state, done): # Critic: 计算 TD 误差 v = critic(state) v_next = critic(next_state).detach() td_target = reward + gamma * v_next * (1 - done) td_error = td_target - v # Critic loss (价值回归) critic_loss = F.mse_loss(v, td_target.detach()) # Actor loss (用 td_error 作权重) log_pi = actor.log_prob(state, action) actor_loss = -(log_pi * td_error.detach()) step(critic_loss + actor_loss)
05PPO · Proximal Policy Optimization

PPO 近端策略优化

通过裁剪策略比率 r=π_new/π_old,将策略更新限制在信任区域内,避免一步更新过大导致崩溃。调节裁剪参数 ε,观察目标函数如何在大比率处被截断,实现稳定训练。

PPO 裁剪函数与信任区域
PPO Clipped Surrogate Objective
Python# PPO 裁剪代理目标 def ppo_loss(old_logp, new_logp, adv, epsilon=0.2): # 策略比率 r = π_new / π_old ratio = (new_logp - old_logp).exp() # 未裁剪目标 surr1 = ratio * adv # 裁剪目标: 把比率限制在 [1-ε, 1+ε] surr2 = torch.clamp(ratio, 1-epsilon, 1+epsilon) * adv # 取较小者(保守更新) loss = -torch.min(surr1, surr2).mean() return loss
06AlphaGo · Monte Carlo Tree Search

AlphaGo / MCTS 蒙特卡洛树搜索

AlphaGo 结合神经网络与蒙特卡洛树搜索(MCTS)。每次搜索分四步:选择(UCB)、扩展、模拟(快速走子)、回溯更新。点击单步执行观察搜索树如何逐步展开并找到更优走法。

搜索树展开与 UCB 选择
UCB 选择公式与 MCTS 四步
Python# UCB1: 选择子节点的置信上界 def ucb(child, parent_visits, c=1.4): exploit = child.win_rate # W / N explore = c * sqrt(log(parent_visits) / child.visits) return exploit + explore # MCTS 四步循环 def mcts_iteration(root): # 1. Selection: 沿 UCB 最大路径向下 leaf = select(root) # 2. Expansion: 给叶子添加子节点 new_node = expand(leaf) # 3. Simulation: 快速走子到终局 result = rollout(new_node) # 4. Backprop: 更新路径上所有节点 backprop(new_node, result)
07Reward Shaping · Dense vs Sparse

奖励设计 (Reward Shaping)

稀疏奖励让智能体难以获得学习信号。通过奖励塑形将稀疏奖励稠密化,或用课程学习逐步增加难度,能显著加速收敛。切换不同奖励设计,对比学习曲线的差异。

稀疏 vs 稠密奖励学习曲线对比
奖励塑形与潜在函数
Python# 稠密奖励: 加入距离引导 def dense_reward(s, s_next, goal): # 原始稀疏奖励 sparse = 1.0 if s_next == goal else 0 # 塑形项: 缩小距离给正奖励 shaping = dist(s_next, goal) - dist(s, goal) return sparse + gamma * shaping # 课程学习: 由易到难 def curriculum(agent, level): if agent.success_rate > 0.8: level += 1 # 升级难度 env = make_env(difficulty=level) # 逆强化学习: 从专家演示学奖励 reward = irl_infer(expert_demos)
08Exploration vs Exploitation · Multi-Armed Bandit

探索-利用困境

多臂老虎机是探索-利用问题的经典模型。Epsilon-Greedy 固定探索率,UCB 基于置信上界自适应探索,Thompson Sampling 用贝叶斯后验采样。切换策略,对比累积奖励与遗憾(Regret)。

多臂老虎机与累积奖励
三种探索策略对比
Python# Epsilon-Greedy def eps_greedy(Q, epsilon=0.1): if random() < epsilon: return random_arm() return argmax(Q) # UCB: 置信上界 def ucb_select(Q, N, t, c=2.0): return argmax(Q[a] + c*sqrt(log(t)/N[a])) # Thompson Sampling: 贝叶斯采样 def thompson(alpha, beta): return argmax(beta_sample(alpha[a], beta[a])) # Regret = 最优臂期望 - 实际获得 regret = t * Q_best - sum(rewards)