强化学习速查表深度解析:从 Bellman 方程到蒙特卡洛与时序差分算法
示例工程【免费下载链接】deep-reinforcement-learningRepo for the Deep Reinforcement Learning Nanodegree program项目地址https://gitcode.com/gh_mirrors/dee/deep-reinforcement-learning点击查看免费下载这份速查表Cheatsheet是 deep-reinforcement-learning 仓库中面向 Udacity 深度强化学习纳米学位课程的核心复习资料它将强化学习中最重要的数学符号、Bellman 方程、动态规划Dynamic Programming、蒙特卡洛Monte Carlo与时序差分Temporal-Difference方法的全部关键算法浓缩为一份可快速查阅的公式与伪代码集合。读完本文你将能够对照速查表梳理完整的学习路线理解每个算法的输入、输出与更新规则并在仓库的 dynamic-programming、monte-carlo、temporal-difference 三个练习模块中找到与速查表算法一一对应的可运行实现与自动化测试。速查表的原始入口是 cheatsheet/README.md其中明确鼓励学习者直接使用仓库中的 cheatsheet.pdf 来指导 RL 学习该 PDF 由 cheatsheet.tex 这一 LaTeX 源文件编译生成。本文即围绕该速查表的全部内容逐节展开并辅以仓库源码进行印证。速查表的结构与学习方法速查表整体按问题定义 → 解决方案 → Bellman 方程 → 动态规划 → 蒙特卡洛 → 时序差分的经典顺序组织恰好对应强化学习课程中从建模到求解的递进逻辑章节核心内容对应仓库练习The ProblemMDP 的符号体系状态、动作、奖励、折扣率、回报—The Solution策略与价值函数的定义—Bellman Equations期望方程、最优性方程与推导过程dynamic-programmingDynamic Programming策略评估、策略改进、策略迭代、价值迭代等 7 个算法dynamic-programmingMonte Carlo Methods首访 MC 预测、GLIE MC 控制、常数 α MC 控制等 4 个算法monte-carloTemporal-Difference MethodsTD(0)、Sarsa、Q-Learning、Expected Sarsa 等 4 个算法temporal-difference建议的学习方式是先通读速查表建立全局框架再进入对应的练习 Notebook如 Dynamic_Programming.ipynb、Monte_Carlo.ipynb、Temporal_Difference.ipynb亲自动手实现最后用check_test.py中的自动化测试验证实现是否正确。The Problem马尔可夫决策过程的符号体系速查表第一部分定义了强化学习问题即 MDP中的全部核心符号这是阅读后续所有公式的前提符号含义$S_t$时刻 $t$ 的状态state$A_t$时刻 $t$ 的动作action$R_t$时刻 $t$ 的奖励reward$\gamma$折扣率discount rate满足 $0 \leq \gamma \leq 1$$G_t$时刻 $t$ 的折扣回报discounted return$G_t \sum_{k0}^{\infty} \gamma^k R_{tk1}$$\mathcal{S}$所有非终止状态的集合$\mathcal{S}^$所有状态的集合含终止状态$\mathcal{A}$所有动作的集合$\mathcal{A}(s)$状态 $s$ 下可用的全部动作的集合$\mathcal{R}$所有奖励的集合$p(s,r|s,a)$给定当前状态 $s$ 与动作 $a$转移到下一状态 $s$ 并获得奖励 $r$ 的概率即 $p(s,r|s,a) \mathbb{P}(S_{t1}s, R_{t1}r \mid S_t s, A_t a)$其中折扣回报 $G_t$ 是理解长期收益的关键$\gamma$ 越接近 1智能体越看重远期奖励$\gamma$ 越小越短视。而 $p(s,r|s,a)$ 完整刻画了环境的动力学dynamics是动态规划算法可以白盒使用的前提——正因为 DP 方法需要显式遍历 $p(s,r|s,a)$它才要求已知完整的环境模型。The Solution策略与价值函数速查表第二部分定义了解——策略policy与价值函数value function策略 $\pi$若为确定性策略$\pi(s) \in \mathcal{A}(s)$对所有 $s \in \mathcal{S}$ 成立若为随机性策略$\pi(a|s) \mathbb{P}(A_ta|S_ts)$对所有 $s \in \mathcal{S}$ 和 $a \in \mathcal{A}(s)$ 成立。状态价值函数 $v_\pi$在策略 $\pi$ 下从状态 $s$ 出发的期望回报$v_\pi(s) \doteq \mathbb{E}[G_t \mid S_ts]$对所有 $s \in \mathcal{S}$ 成立。动作价值函数 $q_\pi$在策略 $\pi$ 下从状态 $s$ 出发执行动作 $a$ 的期望回报$q_\pi(s,a) \doteq \mathbb{E}[G_t \mid S_ts, A_ta]$对所有 $s \in \mathcal{S}$ 和 $a \in \mathcal{A}(s)$ 成立。最优状态价值函数 $v_*$$v_*(s) \doteq \max_\pi v_\pi(s)$对所有 $s \in \mathcal{S}$ 成立。最优动作价值函数 $q_*$$q_*(s,a) \doteq \max_\pi q_\pi(s,a)$对所有 $s \in \mathcal{S}$ 和 $a \in \mathcal{A}(s)$ 成立。从仓库实践看动作价值函数 $q_\pi(s,a)$ 是后续 TD 方法Sarsa、Q-Learning、Expected Sarsa直接学习的对象而状态价值函数 $v_\pi$ 则是动态规划中策略评估的核心产出。Bellman 方程Bellman 方程是价值函数满足的自洽递归关系速查表将其分为期望方程与最优性方程两组并附上了完整的推导过程。Bellman 期望方程状态价值的期望方程$$v_\pi(s) \sum_{a \in \mathcal{A}(s)} \pi(a|s) \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)(r \gamma v_\pi(s))$$动作价值的期望方程$$q_\pi(s,a) \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)\left(r \gamma \sum_{a \in \mathcal{A}(s)} \pi(a|s) q_\pi(s,a)\right)$$直观理解当前状态的价值 按策略 $\pi$ 加权所有可能动作后对立即奖励 折扣后的后继状态价值求期望。它把 $v_\pi$ 与 $v_\pi$ 自身、$q_\pi$ 与 $q_\pi$ 自身联系起来形成了可迭代求解的递归结构。Bellman 最优性方程最优状态价值方程$$v_(s) \max_{a \in \mathcal{A}(s)} \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)(r \gamma v_(s))$$最优动作价值方程$$q_(s,a) \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)\left(r \gamma \max_{a\in\mathcal{A}(s)} q_(s,a)\right)$$与期望方程的唯一区别是策略加权求和 $\sum_a \pi(a|s)$ 变成了取最大值 $\max_a$。这意味着最优策略 $\pi_*$ 在每个状态下只会选择价值最高的动作。推导 Bellman 方程的有用公式速查表还列出四组桥梁公式用于在 $v_\pi$、$q_\pi$、$v_$、$q_$ 之间互相转换$$v_\pi(s) \sum_{a \in \mathcal{A}(s)} \pi(a|s) q_\pi(s,a)$$$$v_(s) \max_{a \in \mathcal{A}(s)} q_(s,a)$$$$q_\pi(s,a) \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)(r \gamma v_\pi(s))$$$$q_(s,a) \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)(r \gamma v_(s))$$第一条公式尤其重要状态价值可以被视为按策略加权的动作价值而第三条公式说明动作价值可以拆解为立即奖励加折扣后的后继状态价值。这四组公式组合起来正是推导两个期望方程与两个最优性方程的完整工具箱。动作价值期望方程的 7 步推导速查表用 7 步完成 $q_\pi(s,a) \doteq \mathbb{E}_\pi[G_t \mid S_t s, A_t a]$ 到期望方程的推导$$\begin{aligned} q_\pi(s,a) \doteq \mathbb{E}{\pi}[ G_t \mid S_t s, A_t a ] (1) \ \sum{s , r} p(s,r|s,a) \mathbb{E}{\pi}[ G_{t} \mid S_t s, A_t a, S_{t1}s, R_{t1}r] (2) \ \sum{s , r} p(s,r|s,a) \mathbb{E}{\pi}[ G_{t} \mid S_{t1}s, R_{t1}r] (3) \ \sum{s , r} p(s,r|s,a) \mathbb{E}{\pi}[ R_{t1} \gamma G_{t1} \mid S_{t1}s, R_{t1}r] (4) \ \sum{s , r} p(s,r|s,a) (r \gamma \mathbb{E}\pi[G_{t1} \mid S_{t1}s]) (5) \ \sum{s , r} p(s,r|s,a) (r \gamma v_\pi(s)) (6) \end{aligned}$$每一步的依据分别为(1)由定义 $q_\pi(s,a) \doteq \mathbb{E}_{\pi}[G_t \mid S_t s, A_t a]$(2)全期望定律Law of Total Expectation把条件拆到下一状态 $s$ 与奖励 $r$ 上(3)由定义 $p(s,r|s,a) \doteq \mathbb{P}(S_{t1}s, R_{t1}r|S_ts, A_ta)$且给定 $S_{t1}, R_{t1}$ 后 $G_t$ 的期望与 $S_t, A_t$ 无关(4)回报的递推定义 $G_t R_{t1} \gamma G_{t1}$(5)期望的线性性质Linearity of Expectation将 $R_{t1}$ 的取值 $r$ 提出(6)由 $v_\pi(s) \mathbb{E}_\pi[G_{t1} \mid S_{t1}s]$ 收尾得到期望方程。这 7 步推导是理解价值函数为什么满足 Bellman 方程的数学根基也是动态规划算法中用 $r \gamma V(s)$ 更新 $V(s)$这一核心操作的来源。Dynamic Programming动态规划算法家族当环境模型 $p(s,r|s,a)$ 已知时可以用动态规划求解。速查表共给出 7 个 DP 算法仓库中对应的练习与自动化测试在 dynamic-programming 目录下练习环境是 frozenlake.py 中的FrozenLakeEnv参考实现与测试封装在 check_test.py。从 frozenlake.py 可以看到FrozenLakeEnv的__init__会构建转移字典PP[s][a]存储了所有可能的(prob, next_state, reward, done)元组其中is_slipperyTrue时每个动作会以1/3的概率滑向(a-1)%4、a、(a1)%4三个方向。这正是速查表中 $p(s,r|s,a)$ 的具体实例化——有了它DP 算法即可逐状态、逐动作地枚举转移概率。1. 策略评估Policy Evaluation输入MDP、策略 $\pi$、小正数 $\theta$输出$V \approx v_\pi$初始化 $V$例如对所有 $s \in \mathcal{S}^$ 令 $V(s)0$然后反复执行$\Delta \leftarrow 0$对每个状态 $s \in \mathcal{S}$记录 $v \leftarrow V(s)$更新 $V(s) \leftarrow \sum_{a\in\mathcal{A}(s)} \pi(a|s) \sum_{s , r} p(s,r|s,a)(r \gamma V(s))$$\Delta \leftarrow \max(\Delta, |v - V(s)|)$当 $\Delta \theta$ 时停止返回 $V$。该算法在 check_test.py 中有对应参考实现policy_evaluation_soln它以np.zeros(env.nS)初始化价值表双层遍历env.P[s][a]中的转移元组累加action_prob * prob * (reward gamma * V[next_state])并用delta theta作为收敛判据——与速查表伪代码逐行对应。测试policy_evaluation_check会对比你的实现与参考解在随机策略下的输出是否一致。2. 动作价值的估计Estimation of Action Values输入MDP、状态价值函数 $V$输出动作价值函数 $Q$对每个状态 $s \in \mathcal{S}$、每个动作 $a \in \mathcal{A}(s)$$$Q(s,a) \leftarrow \sum_{s \in \mathcal{S}, r\in\mathcal{R}} p(s,r|s,a)(r \gamma V(s))$$即用立即奖励 折扣后的后继状态价值一次性还原出所有动作价值。对应参考实现为 check_test.py 的q_from_v_soln它遍历env.P[s][a]累加prob * (reward gamma * V[next_state])。3. 策略改进Policy Improvement输入MDP、价值函数 $V$输出改进后的策略 $\pi$对每个状态 $s \in \mathcal{S}$先按上一算法计算每个动作的 $Q(s,a)$取最优动作$\pi(s) \leftarrow \arg\max_{a\in\mathcal{A}(s)} Q(s,a)$。策略改进定理保证只要存在一个动作严格优于当前策略下的加权平均改进后的 $\pi$ 就严格不差于 $\pi$。参考实现 policy_improvement_soln 用np.argwhere(qnp.max(q))找出最优动作允许并列并以 one-hot 归一化构造新策略测试policy_improvement_check验证new_V V单调不降。4. 策略迭代Policy Iteration输入MDP、小正数 $\theta$输出策略 $\pi \approx \pi_*$任意初始化 $\pi$例如对所有 $s, a$ 取均匀策略 $\pi(a|s)\frac{1}{|\mathcal{A}(s)|}$置policy-stable false反复执行直到policy-stable true$V \leftarrow \text{Policy_Evaluation}(\text{MDP}, \pi, \theta)$$\pi \leftarrow \text{Policy_Improvement}(\text{MDP}, V)$若 $\pi \pi$则policy-stable true否则 $\pi \leftarrow \pi$。策略迭代 完整策略评估 贪心策略改进的交替循环直至策略不再变化即达到最优策略。参考实现 policy_iteration_soln 同样以(new_policy policy).all()判断策略稳定测试policy_iteration_check会对比最终策略的价值是否与参考解一致。5. 截断策略评估Truncated Policy Evaluation输入MDP、策略 $\pi$、价值函数 $V$、正整数max_iterations输出$V \approx v_\pi$当max_iterations足够大时与完整策略评估的区别在于只迭代固定max_iterations轮就停止而不是等到 $\Delta \theta$ 收敛counter ← 0当counter max_iterations时对每个状态 $s$$V(s) \leftarrow \sum_{a} \pi(a|s) \sum_{s,r} p(s,r|s,a)(r \gamma V(s))$counter ← counter 1返回 $V$。它允许从已有的 $V$ 出发继续推进不必每次都从头评估是下一算法截断策略迭代的基石。6. 截断策略迭代Truncated Policy Iteration输入MDP、正整数max_iterations、小正数 $\theta$输出策略 $\pi \approx \pi_*$任意初始化 $V$如全 0与 $\pi$如均匀策略反复执行直到 $\max_{s\in\mathcal{S}}|V(s) - V_{old}(s)| \theta$$\pi \leftarrow \text{Policy_Improvement}(\text{MDP}, V)$$V_{old} \leftarrow V$$V \leftarrow \text{Truncated_Policy_Evaluation}(\text{MDP}, \pi, V, max_iterations)$返回 $\pi$。它用有限轮策略评估替代完整策略评估从而在评估与改进之间取得计算效率的折中。测试 check_test.py 的truncated_policy_iteration_check直接复用policy_iteration_check校验其最终价值与标准策略迭代一致。7. 价值迭代Value Iteration输入MDP、小正数 $\theta$输出策略 $\pi \approx \pi_*$任意初始化 $V$如对所有 $s \in \mathcal{S}^$ 令 $V(s)0$反复执行直到 $\Delta \theta$$\Delta \leftarrow 0$对每个状态 $s$记录 $v \leftarrow V(s)$更新 $V(s) \leftarrow \max_{a\in\mathcal{A}(s)} \sum_{s,r} p(s,r|s,a)(r \gamma V(s))$$\Delta \leftarrow \max(\Delta, |v - V(s)|)$收敛后执行一次 $\pi \leftarrow \text{Policy_Improvement}(\text{MDP}, V)$返回 $\pi$。价值迭代把策略评估 策略改进融合为一个更新每次直接用 $\max_a$最优性方程更新价值收敛后只需一次策略改进即可读出最优策略。测试 check_test.py 的value_iteration_check同样以价值一致性作为判据。Monte Carlo Methods蒙特卡洛方法当环境模型未知时只能从真实交互的回合episode中学习。速查表给出 4 个蒙特卡洛算法对应练习在 monte-carlo 目录使用的经典环境是 21 点Blackjack通过 Monte_Carlo.ipynb 的引导实现预测与控制算法并用 plot_utils.py 中的plot_blackjack_values将学到的状态价值绘制为三维曲面、plot_policy将策略可视化。蒙特卡洛方法的共同特点是完整地走完一个回合后用该回合的真实回报 $G_t$ 来更新价值估计即从回合末尾回头统计。8. 首访 MC 预测状态价值——First-Visit MC Prediction输入策略 $\pi$、正整数num_episodes输出价值函数 $V$当num_episodes足够大时 $V \approx v_\pi$初始化计数 $N(s) 0$、回报累加器returns_sum(s) 0所有 $s$对第 $i 1$ 到num_episodes个回合用 $\pi$ 生成一个完整回合 $S_0, A_0, R_1, \ldots, S_T$对 $t 0$ 到 $T-1$若 $S_t$ 是该回合中首次访问带回报 $G_t$则 $N(S_t) \leftarrow N(S_t) 1$returns_sum(S_t) G_t对所有 $s$$V(s) \leftarrow returns_sum(s)/N(s)$返回 $V$。首访意味着每个回合中同一状态只统计第一次出现的回报这是估计期望回报的无偏方式。9. 首访 MC 预测动作价值——First-Visit MC Prediction (Action Values)输入策略 $\pi$、正整数num_episodes输出动作价值函数 $Q$$Q \approx q_\pi$与上一算法几乎相同只是把统计对象从状态 $s$ 换成状态-动作对 $(s,a)$初始化 $N(s,a)0$、returns_sum(s,a)0在回合中当 $(S_t, A_t)$ 首次出现时累加 $N$ 与returns_sum最后 $Q(s,a) \leftarrow returns_sum(s,a)/N(s,a)$。10. 首访 GLIE MC 控制First-Visit GLIE MC Control输入正整数num_episodes、GLIE 序列 ${\epsilon_i}$输出策略 $\pi$当num_episodes足够大时 $\pi \approx \pi_*$GLIEGreedy in the Limit with Infinite Exploration是指 $\epsilon$ 随回合数递减且最终趋于 0从而在探索与利用之间平衡。算法流程初始化 $Q(s,a)0$、$N(s,a)0$对第 $i$ 个回合$\epsilon \leftarrow \epsilon_i$$\pi \leftarrow \epsilon\text{-greedy}(Q)$以 $\epsilon$ 概率随机探索否则取 $\arg\max_a Q(s,a)$用 $\pi$ 生成回合对每个首次访问的 $(S_t, A_t)$ $N(S_t,A_t) \leftarrow N(S_t,A_t) 1$ $Q(S_t, A_t) \leftarrow Q(S_t, A_t) \frac{1}{N(S_t,A_t)}(G_t - Q(S_t, A_t))$返回 $\pi$。这里的学习率 $\frac{1}{N(S_t,A_t)}$ 随访问次数递减是增量平均的蒙特卡洛形式等价于对所有历史回报求平均。11. 常数 αGLIEMC 控制Constant-α MC Control输入正整数num_episodes、小正分数 $\alpha$、GLIE 序列 ${\epsilon_i}$输出策略 $\pi$与上一算法的区别仅在于更新式中的学习率$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) \alpha(G_t - Q(S_t, A_t))$$使用固定步长 $\alpha$如 0.01的好处是最近回合的回报权重更大能够持续跟踪非平稳环境的变化代价是估计值会存在方差。两者均为回合结束后批量更新的蒙特卡洛风格这与下一节的时序差分方法形成鲜明对比。Temporal-Difference Methods时序差分方法时序差分TD方法结合了蒙特卡洛从经验学习与动态规划利用后继状态价值自举bootstrapping的双重优势每走一步就更新一次无需等待回合结束。对应练习在 temporal-difference 目录核心环境是悬崖行走Cliff Walking通过 Temporal_Difference.ipynb 引导实现check_test.py 提供了 TD 预测td_prediction_check与 TD 控制td_control_check两组测试前者比对关键路径上的状态价值V_true后者比对最优策略pol_opt。所有 TD 算法共享同一形式的更新模板$$V(S_t) \leftarrow V(S_t) \alpha \left( \text{TD目标} - V(S_t) \right)$$其中括号内称为 TD 误差。四个算法的区别只在TD 目标如何构造。12. TD(0)TD Prediction输入策略 $\pi$、正整数num_episodes输出价值函数 $V$$V \approx v_\pi$初始化 $V$如 $V(s)0$所有 $s \in \mathcal{S}^$对每个回合观察 $S_0$置 $t0$反复执行直到 $S_t$ 终止按 $\pi$ 选择 $A_t$执行并观察 $R_{t1}, S_{t1}$$V(S_t) \leftarrow V(S_t) \alpha \left( R_{t1} \gamma V(S_{t1}) - V(S_t) \right)$$t \leftarrow t1$返回 $V$。TD(0) 的 TD 目标为 $R_{t1} \gamma V(S_{t1})$——只前看一步属于单步自举。13. SarsaOn-Policy TD Control输入策略 $\pi$、正整数num_episodes、小正分数 $\alpha$、GLIE 序列 ${\epsilon_i}$输出动作价值函数 $Q$$Q \approx q_\pi$初始化 $Q$如 $Q(s,a)0$且 $Q(\text{终止状态}, \cdot)0$对每个回合$\epsilon \leftarrow \epsilon_i$观察 $S_0$用 $\epsilon$-greedy 策略选择 $A_0$置 $t0$反复执行直到 $S_t$ 终止执行 $A_t$观察 $R_{t1}, S_{t1}$用 $\epsilon$-greedy 选择 $A_{t1}$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) \alpha \left( R_{t1} \gamma Q(S_{t1}, A_{t1}) - Q(S_t, A_t) \right)$$t \leftarrow t1$返回 $Q$。Sarsa 名字来自状态-动作-奖励-状态-动作State-Action-Reward-State-Action五元组 $(S_t, A_t, R_{t1}, S_{t1}, A_{t1})$。它的 TD 目标 $R_{t1} \gamma Q(S_{t1}, A_{t1})$ 使用的是实际执行的下一动作属于 on-policy同策略算法——学到的策略就是正在被评估的策略。14. SarsamaxQ-Learning输入策略 $\pi$、正整数num_episodes、小正分数 $\alpha$、GLIE 序列 ${\epsilon_i}$输出动作价值函数 $Q$$Q \approx q_*$与 Sarsa 的唯一区别在 TD 目标$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) \alpha \left( R_{t1} \gamma \max_{a} Q(S_{t1}, a) - Q(S_t, A_t) \right)$$Q-Learning速查表中命名为 Sarsamax的 TD 目标取 $\max_a Q(S_{t1}, a)$与行为策略无关因此是 off-policy异策略算法——它可以边探索边学习最优策略。这一思想也是仓库中 dqn 章节 DQNDeep Q-Network的算法基石DQN 使用 Q-Learning 目标配合经验回放训练深度网络。15. Expected Sarsa输入策略 $\pi$、正整数num_episodes、小正分数 $\alpha$、GLIE 序列 ${\epsilon_i}$输出动作价值函数 $Q$$Q \approx q_\pi$TD 目标把 $\max_a$ 换成了按策略的期望$$Q(S_t, A_t) \leftarrow Q(S_t, A_t) \alpha \left( R_{t1} \gamma \sum_{a} \pi(a|S_{t1}) Q(S_{t1}, a) - Q(S_t, A_t) \right)$$Expected Sarsa 对下一状态的所有动作按 $\pi$ 求期望而不是采样单个 $A_{t1}$因此方差比 Sarsa 更小当 $\pi$ 为 $\epsilon$-greedy 时它也是 Q-Learning 的平滑化版本通常在相同步数下表现更稳定。三种 TD 控制的对比算法TD 目标on/off-policy特点Sarsa$R_{t1} \gamma Q(S_{t1}, A_{t1})$on-policy采样下一动作方差较大Q-LearningSarsamax$R_{t1} \gamma \max_a Q(S_{t1}, a)$off-policy学习最优策略DQN 的基础Expected Sarsa$R_{t1} \gamma \sum_a \pi(a|S_{t1}) Q(S_{t1}, a)$on-policy期望替代采样方差更小在 Temporal_Difference.ipynb 的悬崖行走环境中可以直观体会到三者的差异Sarsa 会学出绕远但安全的保守路径Q-Learning 倾向于学习贴着悬崖的贪心最优路径而 check_test.py 中的td_control_check会验证你实现的控制算法是否收敛到最优策略pol_opt。如何在仓库中使用这份速查表直接查看 PDF打开 cheatsheet.pdf 即可获得排版精美的完整速查表适合打印或在复习时快速查阅。阅读 LaTeX 源码想了解公式排版细节或自行修改内容可查看 cheatsheet.tex它使用amsart文档类与algorithm2e宏包排版算法伪代码。配套动手练习速查表每一章都能在仓库中找到对应实现任务——动态规划含 check_test.py 自动判题、蒙特卡洛、时序差分学完基础方法后可进一步挑战 dqn、cross-entropy、hill-climbing、reinforce 等更深层项目。小结这份速查表以不到三页的篇幅完整覆盖了强化学习入门的核心数学与算法从 MDP 符号体系出发经由 Bellman 期望/最优性方程及其推导串联起动态规划的 7 个算法策略评估、动作值估计、策略改进、策略迭代、截断策略迭代、价值迭代、蒙特卡洛的 4 个算法首访预测、GLIE/常数 α 控制与时序差分的 4 个算法TD(0)、Sarsa、Q-Learning、Expected Sarsa。掌握这份速查表就等于掌握了从已知环境模型的精确求解到未知环境下的经验学习的完整方法谱系是后续理解 DQN、DDPG、PPO 等深度强化学习算法的必要前置知识。赞分享示例工程【免费下载链接】deep-reinforcement-learningRepo for the Deep Reinforcement Learning Nanodegree program项目地址https://gitcode.com/gh_mirrors/dee/deep-reinforcement-learning点击查看免费下载相关推荐深度强化学习中的蒙特卡洛方法详解深度强化学习中的蒙特卡洛方法详解 蒙特卡洛方法概述 蒙特卡洛 Monte Carlo 方法是强化学习中的一类重要算法它通过从完整经验片段中采样来学习价值函数和示例工程如何快速理解蒙特卡洛方法算法学习的终极指南如何快速理解蒙特卡洛方法算法学习的终极指南 蒙特卡洛方法是一种通过随机采样来解决复杂问题的计算算法广泛应用于数学、物理、金融等多个领域。在GitHub加速计示例工程SOLAR-10.7b-ko-Y24_v0.1-openmind与PyTorch生态集成开发者必备手册SOLAR 10.7b ko Y24_v0.1 openmind与PyTorch生态集成开发者必备手册 SOLAR 10.7b ko Y24_v0.1 ope创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

黑胶唱片旋转效果:用requestAnimationFrame实现高精度匀速转动

黑胶唱片旋转效果:用requestAnimationFrame实现高精度匀速转动

1. 项目概述:用代码“转”出一张会呼吸的黑胶唱片你有没有盯着老式唱机上那张缓缓旋转的黑胶唱片发过呆?不是为了听歌,而是被那种沉稳、连续、带着轻微震颤的物理转动本身吸引——指针划过沟槽的微响、唱片边缘泛起的柔光、转盘轴承里藏着的精…

2026/10/13 15:32:14 阅读更多 →
C++迭代器模式详解:从设计原理到自定义实现与避坑指南

C++迭代器模式详解:从设计原理到自定义实现与避坑指南

1. 迭代器模式到底解决了什么问题1.1 算法与容器解耦&#xff1a;一份代码&#xff0c;处处能跑先抛个问题&#xff1a;你写的std::sort既能排std::vector<int>&#xff0c;又能排std::deque<double>&#xff0c;还能排原生数组&#xff0c;凭什么&#xff1f;要是…

2026/10/13 15:32:14 阅读更多 →
工业互联网数字化工厂方案:从车间痛点讲到投资回报

工业互联网数字化工厂方案:从车间痛点讲到投资回报

今年年中&#xff0c;有家做精密机加工的企业找到我&#xff0c;让我帮忙整理一套工业互联网智能制造数字化工厂解决方案&#xff0c;说是要拿去跟集团管理层做年度汇报。我们第一版PPT做得挺“全”&#xff0c;云平台、数据中台、AI质检、数字孪生&#xff0c;能想到的概念全放…

2026/10/13 15:32:14 阅读更多 →

最新新闻

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

简介&#xff1a;《MySQL 4.0.pdf》是一份聚焦MySQL 4.0版本的开源关系型数据库参考资料&#xff0c;适合数据库管理员、后端开发人员及系统学习数据库原理的读者&#xff0c;用于理解经典版本的功能体系与运维思路。资源为单个PDF文件&#xff0c;压缩包仅334KB&#xff0c;内…

2026/10/13 16:17:31 阅读更多 →
C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

最近又刷了一轮力扣字符串题&#xff0c;把 344、541 和一道很经典的“替换数字”放到一起过了三遍。这三题单独看都不难&#xff0c;C 解法也都不超过 30 行&#xff0c;但把它们串在一起刷&#xff0c;你会发现它们正好覆盖了字符串操作中最容易被忽略的三类基本功&#xff1…

2026/10/13 16:17:31 阅读更多 →
Linux VFS核心架构深度拆解:从root device报错到数据落盘

Linux VFS核心架构深度拆解:从root device报错到数据落盘

前阵子帮朋友调一块嵌入式板子&#xff0c;内核起来后卡在了一行红字上&#xff1a;VFS: Cannot open root device "ram" or unknown-block(1,0): error -6折腾了一下午&#xff0c;最后发现只是内核配置没开 ramdisk 驱动&#xff0c;外加启动参数里 root 写得太想当…

2026/10/13 16:17:31 阅读更多 →
Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

简介&#xff1a;一套基于CocosCreator引擎开发的房卡麻将棋牌游戏完整源码&#xff0c;面向Cocos Creator游戏开发者与棋牌类项目学习者。该项目围绕房卡模式展开&#xff0c;覆盖玩家创建私密房间、邀请好友开局、房卡购买与发放等核心链路&#xff0c;可作为从零搭建棋牌游戏…

2026/10/13 16:17:30 阅读更多 →
Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

1. VFS到底是什么&#xff1a;从一次启动报错说起如果你玩过Linux内核开发或者自己折腾过嵌入式系统&#xff0c;大概率遇到过这么一行让人血压升高的日志&#xff1a;VFS: Cannot open root device "ram" or unknown-block(1,0): error -6 Please append a correct …

2026/10/13 16:17:30 阅读更多 →
基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

每年到这个时间点&#xff0c;总有不少同学私信问我同一个问题&#xff1a;毕设选题到底选什么&#xff0c;既能赶紧把东西做出来&#xff0c;又不至于在答辩的时候被问得哑口无言。如果你正在发愁这件事&#xff0c;那这套基于SpringBootVue的西安旅游系统管理平台&#xff0c…

2026/10/13 16:16:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →