<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>cloudinwind&apos;s blog</title><description>记录个人经历</description><link>https://vercel.cloudinwind4132.top</link><item><title>2026-04-06</title><link>https://vercel.cloudinwind4132.top/blog/week-note-1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/week-note-1</guid><description>0330-0405 这一周的总结</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;本周总结&lt;/h2&gt;
&lt;p&gt;2026年3月30日到4月4日，正常上班，协调车辆，推进Bug，看CSAPP，4月4日加班，晚上拿到一辆新车。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4月5日&lt;/strong&gt;
下午看了 《挽救计划》，科幻片，简要概括：噬星体从太阳到金星，遮盖住了太阳，从而会导致地球温度降低**15℃。男主被迫搭乘飞船千万 天马星系，探究太马星系的恒星未受到噬星体影响到原因，从而拯救地球，在途中遇到 外星生物，在天马星系找到 t 灭虫菌，发射到地球挽救地球。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4月6日&lt;/strong&gt; 早上11 点多起床，下午练车，重点练习了侧边停车和倒车入库。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/><enclosure url="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/></item><item><title>RL笔记（29）：推理模型的崛起 (GRPO &amp; PRM)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-29</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-29</guid><description>大模型训练的新范式：详解 DeepSeek 提出的 GRPO 如何彻底省去 Critic 网络，以及 PRM 如何通过过程监督让模型学会正确推理。</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在上一篇笔记中，我们介绍了经典的 &lt;strong&gt;PPO + RLHF&lt;/strong&gt; 流程。虽然 PPO 非常有效，但在训练超大规模语言模型时，它面临两个挑战：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;资源消耗巨大&lt;/strong&gt;：PPO 需要维护 Actor、Ref、Reward、Critic 四个模型，显存开销极高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果导向的局限&lt;/strong&gt;：传统的奖励模型只对最终答案评分（ORM），而不关心推理过程。如果模型凑巧猜对了答案，也会得到高分，这会导致“走捷径”和幻觉。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本章将介绍 &lt;strong&gt;GRPO&lt;/strong&gt; ——一种更轻量、更高效的策略优化算法，以及 &lt;strong&gt;PRM&lt;/strong&gt; ——一种对思维过程进行细粒度监督的奖励机制。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;GRPO (Group Relative Policy Optimization)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2402.03300&quot;&gt;DeepSeekMath: Pushing the Limits of Mathematical Reasoning in LLMs&lt;/a&gt;
&lt;strong&gt;应用&lt;/strong&gt;：DeepSeek-V3 / DeepSeek-R1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;GRPO 的核心创新在于：&lt;strong&gt;彻底丢弃了 Critic 模型，利用组内相对排名来估计优势函数（Advantage）。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;核心思想：组内相对评价&lt;/h3&gt;
&lt;p&gt;在 PPO 中，我们需要 Critic 网络来预测状态价值 $V(s)$，从而计算优势 $A = Q - V$。
而在 GRPO 中，对于每一个提示词（Prompt）$q$：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;让模型生成&lt;strong&gt;一组&lt;/strong&gt;不同的回复 ${o_1, o_2, o_3, ..., o_G}$（组大小为 $G$）。&lt;/li&gt;
&lt;li&gt;利用奖励模型（或规则奖励）计算出这一组回复的分数 ${r_1, r_2, r_3, ..., r_G}$。&lt;/li&gt;
&lt;li&gt;通过这组分数的&lt;strong&gt;相对强弱&lt;/strong&gt;来直接得出每个回复的优势。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;优势函数计算&lt;/h3&gt;
&lt;p&gt;第 $i$ 个回复的优势函数 $A_i$ 计算公式为：
$$
A_i = \frac{r_i - \text{mean}(r_1, r_2, ..., r_G)}{\text{std}(r_1, r_2, ..., r_G)}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：
这就像是在班级里考试。我们不需要一个绝对的“满分标准”（Critic），只需要看你在班级里的排名。如果你比班级平均分高，我们就增加你这种行为的概率；反之则降低。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;GRPO 损失函数&lt;/h3&gt;
&lt;p&gt;$$
L_{GRPO}(\theta) = \frac{1}{G} \sum_{i=1}^G \left[ \min\left( \frac{\pi_\theta(o_i|q)}{\pi_{\text{old}}(o_i|q)} A_i, \text{clip}\left(\frac{\pi_\theta(o_i|q)}{\pi_{\text{old}}(o_i|q)}, 1-\epsilon, 1+\epsilon\right) A_i \right) - \beta D_{KL}(\pi_\theta || \pi_{\text{ref}}) \right]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：由于省去了 Critic 网络，在大模型训练中可以节省约 &lt;strong&gt;50%&lt;/strong&gt; 的梯度计算相关显存，从而允许更长的上下文或更大的 Batch Size。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;PRM (Process Reward Models)&lt;/h2&gt;
&lt;p&gt;传统的奖励模型被称为 &lt;strong&gt;ORM (Outcome Reward Models)&lt;/strong&gt;：只看结果。
&lt;strong&gt;PRM (Process Reward Models)&lt;/strong&gt; 则是对推理链条中的&lt;strong&gt;每一个步骤&lt;/strong&gt;进行打分。&lt;/p&gt;
&lt;h3&gt;核心动机&lt;/h3&gt;
&lt;p&gt;在复杂的数学推导或编程任务中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中间错一步，步步错&lt;/strong&gt;：即使最终答案对，中间逻辑也可能有毒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奖励稀疏&lt;/strong&gt;：只有到最后才给分，模型很难学会长链条的逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;训练与运作机制&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;步骤拆解&lt;/strong&gt;：将模型生成的思维链（CoT）利用换行符或特殊 token 拆分为 $S_1, S_2, ..., S_n$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;细粒度标注&lt;/strong&gt;：通过人类专家或更强模型（如 GPT-4）对每一个 $S_i$ 标注“正确”、“错误”或“中性”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型预测&lt;/strong&gt;：PRM 模型学习预测每一步的正确概率。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;强化学习中的应用&lt;/h3&gt;
&lt;p&gt;在 RL 过程中，奖励函数不再是标量，而是一个序列：
$$ \mathcal{R} = {r(S_1), r(S_2), ..., r(S_n)} $$
这允许 PPO 或 GRPO 进行&lt;strong&gt;更密集的奖励信号反馈&lt;/strong&gt;，显著提升模型处理复杂推理问题的逻辑严密性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;案例分析：DeepSeek-R1 的强化学习范式&lt;/h2&gt;
&lt;p&gt;DeepSeek-R1 展示了 GRPO 结合“规则奖励”的惊人效果：&lt;/p&gt;
&lt;h3&gt;规则导向的 PRM&lt;/h3&gt;
&lt;p&gt;在推理任务中，我们有时不需要神经网络做奖励模型，而是使用&lt;strong&gt;硬规则&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;准确性奖励 (Accuracy)&lt;/strong&gt;：答案必须对（例如数学题，提取最后的结果比对）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式奖励 (Format)&lt;/strong&gt;：思维链必须放在 &lt;code&gt;&amp;#x3C;think&gt;&lt;/code&gt; 和 &lt;code&gt;&amp;#x3C;/think&gt;&lt;/code&gt; 标签之间。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;涌现能力&lt;/h3&gt;
&lt;p&gt;DeepSeek 发现，通过这种简单的 GRPO + 规则奖励，模型在训练过程中会出现&lt;strong&gt;自我反思（Self-reflection）&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当模型发现之前的推导有问题时，它会自发地写下“Wait, that&apos;s not right...”（等一下，这不对……），然后重新推导。&lt;/li&gt;
&lt;li&gt;这种能力并不是通过 SFT（监督微调）刻意教出来的，而是通过 RL 最大化奖励的过程中&lt;strong&gt;自发进化&lt;/strong&gt;出来的。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结与对比：PPO vs. GRPO&lt;/h2&gt;
&lt;p&gt;| 维度 | PPO (标准版) | GRPO (组相对版) |
| :--- | :--- | :--- |
| &lt;strong&gt;显存消耗&lt;/strong&gt; | 高 (需要 Critic 网络) | &lt;strong&gt;低 (丢弃 Critic 网络)&lt;/strong&gt; |
| &lt;strong&gt;优势估计&lt;/strong&gt; | 依赖学出来的 $V(s)$ | &lt;strong&gt;依赖组内样本的统计分布&lt;/strong&gt; |
| &lt;strong&gt;训练稳定性&lt;/strong&gt; | 容易受 Critic 网络波动影响 | 更稳定，因为对比是相对的 |
| &lt;strong&gt;主要应用&lt;/strong&gt; | 早期 ChatGPT, Llama 3 对齐 | &lt;strong&gt;DeepSeek-R1/V3 推理训练&lt;/strong&gt; |&lt;/p&gt;
&lt;h3&gt;启示&lt;/h3&gt;
&lt;p&gt;强化学习在大模型时代的进化方向非常明确：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;算力优化&lt;/strong&gt;：通过像 GRPO 这样的算法减少训练开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑监督&lt;/strong&gt;：通过 PRM 或 规则奖励 强化模型的推理过程，而不仅仅是最终答案。&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/><enclosure url="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/></item><item><title>RL笔记（28）：大语言模型与强化学习 (LLM + RLHF)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-28</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-28</guid><description>大模型的最后一块拼图：详解基于人类反馈的强化学习 (RLHF)。涵盖从 SFT 到奖励模型，以及利用 PPO 算法进行策略对齐的完整流程。</description><pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，我们一直在研究如何让智能体在物理环境或博弈环境（如 Atari, MuJoCo, SMAC）中拿高分。而现在，我们要处理的对象是 &lt;strong&gt;大语言模型 (LLM)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大模型的训练通常分为三个阶段：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预训练 (Pre-training)&lt;/strong&gt;：在海量文本上通过自监督学习“知识”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令微调 (SFT, Supervised Fine-Tuning)&lt;/strong&gt;：在高质量问答对上学习“对话格式”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人类对齐 (Alignment)&lt;/strong&gt;：通过强化学习，让模型生成符合人类价值观（有用、诚实、无害）的内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;为什么要用 RL 而不是 SFT？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;难以写出标准答案&lt;/strong&gt;：对于“写一首诗”这种开放性问题，不存在唯一的正解（Label）。人类可以很容易判断谁写得更好，但很难写出完美的示范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分布偏移问题&lt;/strong&gt;：SFT 属于行为克隆（BC），如果模型在生成时产生了一个没见过的词，误差会迅速累积。RL 则让模型在“试错”中学会从各种回复中找到最优路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;核心映射：将 LLM 建模为 RL 问题&lt;/h2&gt;
&lt;p&gt;要用强化学习训练 LLM，我们首先需要将文本生成过程对应到 MDP 五元组中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;状态 (State, $s$)&lt;/strong&gt;：当前输入的提示词（Prompt）以及模型已经生成的 Token 序列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动作 (Action, $a$)&lt;/strong&gt;：模型预测的下一个 Token。动作空间就是词表（Vocab Size，通常为 3w ~ 10w）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;策略 (Policy, $\pi$)&lt;/strong&gt;：大语言模型本身，输入提示词，输出下一个词的概率分布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奖励 (Reward, $R$)&lt;/strong&gt;：反映生成的一整段话好不好。这个奖励不是环境给的，而是由 &lt;strong&gt;奖励模型 (Reward Model)&lt;/strong&gt; 评分。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;RLHF 的三大步骤&lt;/h2&gt;
&lt;p&gt;RLHF (Reinforcement Learning from Human Feedback) 通常包含以下经典流程：&lt;/p&gt;
&lt;h3&gt;阶段一：监督微调 (SFT)&lt;/h3&gt;
&lt;p&gt;在预训练模型的基础上，使用人类编写的高质量 (Prompt, Answer) 数据集进行微调。此时模型学会了基本的指令遵循能力。&lt;/p&gt;
&lt;h3&gt;阶段二：奖励模型训练 (Reward Modeling)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;给同一个 Prompt，让 SFT 后的模型生成多个不同的回复 ${y^1, y^2, y^3, y^4}$。&lt;/li&gt;
&lt;li&gt;让人类对这些回复进行排序（例如 $y^2 &gt; y^1 &gt; y^4 &gt; y^3$）。&lt;/li&gt;
&lt;li&gt;训练一个标量奖励模型 $r_\theta(x, y)$，使其输出的分数符合人类的排序规律。损失函数通常采用 &lt;strong&gt;Pairwise Ranking Loss&lt;/strong&gt;：
$$ L(\theta) = - \mathbb{E}&lt;em&gt;{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma \left( r&lt;/em&gt;\theta(x, y_w) - r_\theta(x, y_l) \right) \right] $$
其中 $y_w$ 是胜出的回复，$y_l$ 是失败的回复。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;阶段三：强化学习对齐 (PPO)&lt;/h3&gt;
&lt;p&gt;利用奖励模型给出的分数，通过 PPO 算法调整 LLM 的参数。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;RLHF 中的 PPO 目标函数&lt;/h2&gt;
&lt;p&gt;在对齐阶段，我们的目标是最大化奖励模型的分数。但如果只考虑奖励，模型可能会学会“钻空子”（Reward Hacking），生成一些人类看不懂但奖励模型给高分的乱码。&lt;/p&gt;
&lt;p&gt;因此，我们需要约束模型，使其不要偏离原始模型太远。目标函数定义为：&lt;/p&gt;
&lt;p&gt;$$
J(\phi) = \mathbb{E}&lt;em&gt;{x \sim \mathcal{D}, y \sim \pi&lt;/em&gt;\phi(y|x)} \left[ r_\theta(x, y) - \beta \log \left( \frac{\pi_\phi(y|x)}{\pi_{\text{ref}}(y|x)} \right) \right]
$$&lt;/p&gt;
&lt;h3&gt;公式拆解：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$r_\theta(x, y)$&lt;/strong&gt;：奖励模型对生成的完整句子 $y$ 给出的预测分数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\log \left( \frac{\pi_\phi(y|x)}{\pi_{\text{ref}}(y|x)} \right)$&lt;/strong&gt;：这是新策略 $\pi_\phi$ 与参考模型（通常是 SFT 后的模型）$\pi_{\text{ref}}$ 之间的 &lt;strong&gt;KL 散度&lt;/strong&gt;（准确说是 KL 惩罚项）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\beta$&lt;/strong&gt;：KL 惩罚系数。$\beta$ 越大，模型越保守，越像原始模型。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：
这一项的作用是：&lt;strong&gt;“你可以尽量讨好人类，但不能忘了怎么说话。”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;LLM-PPO 的训练架构&lt;/h2&gt;
&lt;p&gt;在这一阶段，显存中通常需要同时加载四个模型（通常采用参数共享或层冻结来优化）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Actor (Policy Network)&lt;/strong&gt;：当前正在训练的 LLM，参数为 $\phi$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reference Model&lt;/strong&gt;：冻结的 SFT 模型，用于计算 KL 惩罚。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critic (Value Network)&lt;/strong&gt;：一个额外的头部，输入 Token 序列，预测从当前位置开始能获得的未来总奖励（即 $V(s)$）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reward Model&lt;/strong&gt;：冻结的评分模型。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;训练循环：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;采样 (Rollout)&lt;/strong&gt;：输入 Prompt $x$，Actor 生成回复 $y$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评分 (Evaluation)&lt;/strong&gt;：Reward Model 对 $(x, y)$ 打分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算优势 (Advantage)&lt;/strong&gt;：
利用序列中的每一个 Token 的 TD Error 来计算优势 $\hat{A}$。
注意：在 LLM 中，奖励通常是在&lt;strong&gt;最后一个 Token&lt;/strong&gt; 给出的，而前面的 Token 奖励为 0（除了 KL 惩罚）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新 (Update)&lt;/strong&gt;：
利用 PPO 的 Clip 损失函数更新 Actor，利用 MSE 损失更新 Critic。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;进阶：DPO (Direct Preference Optimization)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2305.18290&quot;&gt;Direct Preference Optimization: Your Language Model is Secretly a Reward Model&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PPO 虽然经典，但非常复杂（需要 4 个模型，显存开销巨大，训练极不稳定）。
2023 年提出的 &lt;strong&gt;DPO&lt;/strong&gt; 彻底简化了这个过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DPO 的核心发现&lt;/strong&gt;：
我们可以通过数学变换，直接将奖励函数 $r$ 表达为最优策略 $\pi^*$ 的函数。这意味着我们&lt;strong&gt;不需要训练奖励模型&lt;/strong&gt;，也不需要强化学习，直接在偏好数据 $(y_w, y_l)$ 上进行&lt;strong&gt;监督式学习&lt;/strong&gt;即可。&lt;/p&gt;
&lt;p&gt;DPO 损失函数：
$$
L_{DPO}(\pi_\phi; \pi_{\text{ref}}) = - \mathbb{E}&lt;em&gt;{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi&lt;/em&gt;\phi(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\phi(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：如果模型在好回复 $y_w$ 上的概率提升比在坏回复 $y_l$ 上快，Loss 就变小。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;LLM + RL 的结合标志着强化学习从“解决玩具问题”走向了“赋能通用人工智能”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RLHF&lt;/strong&gt; 建立了模型行为与人类偏好的桥梁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PPO&lt;/strong&gt; 提供了稳定的优化框架，通过 KL 惩罚保证了语言的自然性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DPO&lt;/strong&gt; 等后续算法进一步降低了对齐的门槛，使得中小型团队也能进行模型对齐。&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/><enclosure url="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/></item><item><title>Paper Reading: Embodied AI 2</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-eba2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-eba2</guid><description>从零开始的Embodied AI研究生活。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;import { ManualTOC } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;ManualTOC
title=&apos;&apos;
categories={[
{
title: &apos;Embodied AI Paper Reading&apos;,
items: [
{
title: &apos;Batch 1&apos;,
href: &apos;/blog/paper-reading-eba1&apos;,
order: &apos;1&apos;
},
{
title: &apos;Batch 2&apos;,
href: &apos;/blog/paper-reading-eba2&apos;,
order: &apos;2&apos;
},
{
title: &apos;Batch 3&apos;,
href: &apos;/blog/paper-reading-eba3&apos;,
order: &apos;3&apos;
},
{
title: &apos;Batch 4&apos;,
href: &apos;/blog/paper-reading-eba4&apos;,
order: &apos;4&apos;
}
]
}
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;RL菜鸡开始进军Embodied AI，慢慢积累，提升自己。&lt;/p&gt;
&lt;h2&gt;LLARVA&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/LLARVA.8z70f5s0j6.webp&quot; alt=&quot;&quot;&gt;
LLARVA 是一种 OpenVLA-like 的 VLA，使用 Instruction Tuning 进行微调，并通过输出 2D Visual Trace 去引导 Action 生成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/LLARVA-prompt.7axnhz1uu9.webp&quot; alt=&quot;&quot;&gt;
LLARVA 的输入指令被规范化为 Prompt，详细见图。
LLM 的主干为 LLaMA2 7B，并使用 LoRA 进行微调。
先预测 2D Visual Trace 再生成 Action Chunk，本质上是基于 CoT 的思想。&lt;/p&gt;
&lt;h2&gt;ATM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/ATM.83aizqrop9.webp&quot; alt=&quot;&quot;&gt;
ATM 的亮点在于仅可以使用 Action-free 的数据去训练机器人操作策略。
ATM 是一种 Pipeline 方法，分为任意点轨迹建模与轨迹引导策略学习两个部分。
在任意点轨迹建模部分，ATM 利用了大量 Label-free 的视频训练了一个 Points-Tracker，输入是当前观察 Obs、任务 Instruction 以及初始 Points，输出是未来的 Points-Trajectory。
在轨迹引导策略学习部分，策略网络以上个步骤预测的 Points-Trajectory 以及当前 Obs 为输入，输出机器人的 Action。&lt;/p&gt;
&lt;p&gt;任意点轨迹建模：
在数据处理部分，ATM 使用了离线的 Points-Tracker 模型去得出的 Label。
同时，过滤掉了大部分静止的 Points，只保留了 32 个高频活动的 Points。
对于当前 Obs，使用 ViT 将图像切分为 Patches，并随机 Mask 掉 50% 的 Patches，得出 Image Token。
对于任务 Instruction，使用 BERT 进行信息提取 Language Token。
对于初始 Points，在文中是有32个，编码为 Track Token。
以 Obs 以及 Instruction 为 Base 的 Points-Tracker 被定义为一个 Transformer，输入为 Image Token、Language Token 以及 Track Token，输出为未来的 Points-Trajectory。
按照题主的理解，输出的 Points-Trajectory 其实就是任务导向的 Vision-Language Fusion。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/ATM-policy.9kgo1hvysf.webp&quot; alt=&quot;&quot;&gt;
轨迹引导策略学习：
首先，使用了 BERT-like 的 Transformer 对 Image Token 以及 Track Token 进行 Fusion，得出特征 [CLS]。
然后，策略网络设定为 MLP，以 [CLS] 以及 Track Token 为输入，输出机器人的 Action。
在策略学习的过程中，并没有引入 Instruction 的信息，因为在轨迹建模阶段已经引入了。
同时，对 Track Token 进行了两次 Fusion，这样会有更好的效果，详细见原文。&lt;/p&gt;
&lt;h2&gt;Track2Act&lt;/h2&gt;
&lt;p&gt;Track2Act 本质上和 ATM 是一样的，都是以 Points-Trajectory 去引导动作的生成。
Track2Act 主要分为三个阶段：Points-Trajectory 预测、Open-loop 动作求解以及 Residual Policy 闭环修正。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/Track2Act-pt.13m9i5xvjf.webp&quot; alt=&quot;&quot;&gt;
在 Points-Trajectory 预测阶段，Track2Act 使用了 DiT 生成模型。
DiT 的 Condition 被设置为初始图像 $I_0$ 以及目标图像 $\mathcal{G}$ 的表征，给定随机采样的查询点集 $P_0$，生成 Points-Trajectory。&lt;/p&gt;
&lt;p&gt;在 Open-loop 动作求解阶段，Track2Act 使用了一个确定性的算法进行刚性动作的求解，不涉及神经网络训练。
这个算法的输入是 Points-Trajectory，输出一系列的刚性变换 $[\textbf{T}&lt;em&gt;t]&lt;/em&gt;{t=1}^H$。
具体求解算法见原文，这里不详细展开。
最后，基于刚性变换，可以求解出机器人的 Open-loop 动作序列 $[\bar{a}&lt;em&gt;t]&lt;/em&gt;{t=1}^H$。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/Track2Act-rp.4n877z0ttz.webp&quot; alt=&quot;&quot;&gt;
在 Residual Policy 闭环修正阶段，Track2Act 使用一个 Residual Policy 去修正 Open-loop 动作。其实就是使用一个 Transformer-Encoder 去预测误差，最后加在一起。&lt;/p&gt;
&lt;p&gt;最后简单瑞萍一下，其实博主觉得后面两个阶段完成可以使用神经网络进行表征，有点多余，虽然残差修正动作这个思想是好的。&lt;/p&gt;
&lt;h2&gt;ECoT&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/ECoT.73ufntxfff.webp&quot; alt=&quot;&quot;&gt;
ECoT 这篇工作指出 LLM 那边的 CoT 是无法直接迁移到 Embodied 任务环境中的。
若只是简单的语义推理，那么就会出现大量不符合实际物理环境的幻觉。
因此，ECoT 在 CoT 的基础上添加了智能体对环境的感知，从而使得 CoT 具有 Embodied 性质。
ECoT 的具体设置见上图，和 CoT 类似，只是加入了 Embodied 的感知。
ECoT 使用的模型基座是 OpenVLA，使用 ECoT 后效果得到了很好的改善。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/ECoT-data.1vz50u4k0o.webp&quot; alt=&quot;&quot;&gt;
ECoT 还提出了一套使用机器人数据产生 CoT 训练数据的 Pipeline。
具体就不多说了，图里面说的很清楚。&lt;/p&gt;
&lt;p&gt;这种推理过程是显式的，具有一定的解释性，缺点就是这样会降低推理的速度，文中也给了一些解决方案。&lt;/p&gt;
&lt;h2&gt;VoxPoser&lt;/h2&gt;
&lt;p&gt;VoxPoser 是一种 Code for Robotic 的方法。
简单的来说，VoxPoser 使用 LLM 去生成 Python 代码，这里的代码会调用 VLM 的 API 生成 3D Value Map，然后进行 MPC。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/VoxPoser.1vz50wovrd.webp&quot; alt=&quot;&quot;&gt;
首先，VoxPoser 会告诉 LLM 任务的文本描述以及一些 VLM 具有的 API函数，让它去产生能够基于 RGB-D 图像计算 3D Value Map 的 Python 代码。
然后，使用 Python 执行器去执行代码，过程中会调用 VLM 的 API，其实就是 OWL-ViT 获取边框还有 SAM 获取 Mask，然后重建 3D Points Cloud，计算得出 3D Value Map。
最后，有了 3D Value Map 作为价值引导，就可以使用 MPC 的方法合成轨迹，进行规划。
在文中，提供了在线训练 MPC 以及 启发式 MPC 两种方式，前者需要环境交互，后者则无需训练。&lt;/p&gt;
&lt;h2&gt;PIVOT&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/PIVOT-example.2rvmgdu2g2.webp&quot; alt=&quot;&quot;&gt;
PIVOT 的思想很简单，就是把机器人的低级 Action 投影到图像中，并采用 VQA 的形式让 VLM 去选择 Action 集合。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/PIVOT.szfq1osvp.webp&quot; alt=&quot;&quot;&gt;
PIVOT 维护一个 Action 的分布，初始化为均匀分布，有点像 MPC 中的交叉熵方法。
PIVOT 使用的是 Zero-Shot 的迭代算法，不断去优化 Action 的分布，直到收敛。
首先，PIVOT 从分布中采样一系列的 Action，然后将 Action 投影到 2D 图像上，详细见图，每个 Action 都对应了序号。
然后，给定任务描述文本以及 2D 图像，编写合适的 Prompt 让 VLM 去选择最优 Action 集合。
接着，根据选取的 Action 集合去维护 Action 分布，类似于 MPC 中的交叉熵方法。
经过不断迭代，可以得出较好的 Action 候选集合。&lt;/p&gt;
&lt;p&gt;PIVOT 的思路很有启发性，但缺陷也是明显的。比如，3D 歧义理解、细粒度控制以及 VLM 的幻觉问题。&lt;/p&gt;
&lt;h2&gt;Code As Policies&lt;/h2&gt;
&lt;p&gt;CaP 核心思想不是训练策略网络，而是通过 Prompt 让 LLM 去调用机器人 API，从而完成任务。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/CaP.77e1n0y43g.webp&quot; alt=&quot;&quot;&gt;
首先，CaP 进行了 LMP 形式化，其实就是让策略利用 Python 语言的一些特性。
然后，为了处理复杂任务代码过长或者逻辑复杂的问题，CaP 使用了层次化代码生成的方法，其实就是自下而上分而治之的思想。
最后，CaP 进行了感知与动作的对齐。
LLM 会基于 Prompt 得出一些预定义的感知 API 以及 控制 API。
LLM 可以通过感知 API 去获取视觉信息的变量。
LLM 会计算控制 API 的参数，并执行。&lt;/p&gt;
&lt;p&gt;CaP 的工作虽然简单，但它将高层规划和底层执行联系在了一起。&lt;/p&gt;
&lt;h2&gt;RoboPoint&lt;/h2&gt;
&lt;p&gt;RoboPoint 通过构建一套程序化合成数据生成流水线，将通用视觉语言模型（VLM）微调为能根据自然语言指令预测精确 2D 空间操作点（Spatial Affordance）的模型，从而实现了无需真实世界数据训练的机器人零样本（Zero-shot）操控与导航。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/RoboPoint.lw7w2yur8.webp&quot; alt=&quot;&quot;&gt;
在数据生成阶段，RoboPoint 利用程序化生成技术构建多样化的 3D 仿真场景，通过利用模拟器中的精确几何信息自动计算物体间的空间关系，并创造性地采用“移除目标物体再采样”的策略来自动标注自由空间（Free Space），从而低成本地生成了海量包含“图像-指令-像素坐标点”的高质量合成训练数据。&lt;/p&gt;
&lt;p&gt;在指令微调阶段，RoboPoint 套用 LLaVA 的架构，冻住视觉层只练语言模型，把“找坐标”直接转化成“文本生成”任务，让模型直接输出坐标数字
同时，为了防止了 VLM 的遗忘，加入了 VQA 数据进行 Co-Training。&lt;/p&gt;
&lt;p&gt;在真实执行阶段，先使用 RoboPoint 计算出 RGB 图像上的 2D 坐标，然后结合深度图转换为 3D 坐标，最后直接套用一个预设好的抓取姿态，把目标传给传统的运动规划算法去解算路径，机械臂照做就行了。&lt;/p&gt;
&lt;p&gt;RoboPoint 其实也是一种高层决策的规划，也是一种 System 2 的方法。&lt;/p&gt;
&lt;h2&gt;GR-1&lt;/h2&gt;
&lt;p&gt;GR-1 证明了视频生成是策略学习的高效代理任务，它通过大规模视频生成式预训练迫使 GPT 模型内化环境动态与物理先验，从而在下游机器人任务中实现了卓越的小样本学习与零样本泛化能力。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/GR-1-all.1sfj4q0vsm.webp&quot; alt=&quot;&quot;&gt;
GR-1 采用 GPT-style Causal Transformer 架构处理多模态交织序列，先通过大规模视频生成预训练学习环境动态，再经由动作与未来帧联合预测任务进行微调，实现端到端的自回归策略学习。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/GR-1-input.2vf8flx9ka.webp&quot; alt=&quot;&quot;&gt;
在预训练阶段，GR-1 利用大规模人类第一视角视频数据集（Ego4D）执行语言条件下的视频预测任务，旨在无需动作标注即可习得通用物理动态。
模型架构上冻结了 CLIP 文本编码器与 MAE-ViT 视觉编码器（辅以 Perceiver Resampler 压缩特征），将语言指令、历史图像帧与可学习的 [OBS] Token 交织输入至 GPT 主干网络。
训练过程中，模型屏蔽 [ACT] Token，仅通过因果掩码注意力机制利用 [OBS] Token 驱动视觉解码器（Vision Decoder）重建未来帧像素，从而迫使模型内化视觉演变规律与视语对齐关系，为下游机器人操作任务提供具备强泛化能力的 World Model 初始化权重。&lt;/p&gt;
&lt;p&gt;在微调阶段，GR-1 加载预训练权重并扩展输入序列，将机器人本体状态（Proprioceptive State）与语言、图像交织输入，引入 [ACT] Token 用于回归 7-DoF 机械臂动作与夹爪状态。
训练采用多任务联合优化策略，在执行行为克隆（Behavior Cloning）学习策略分布的同时，保留未来帧预测（Video Prediction）作为辅助任务，通过联合最小化动作回归损失与图像重建损失，迫使策略在决策时显式利用预训练阶段习得的物理世界动态（World Model），从而实现感知到动作的高效迁移与对齐。&lt;/p&gt;
&lt;p&gt;GR-1 的 Limitation 也是明显的。
因为要处理高维图像，所以导致推理延迟较高。
同时预训练的人类视频与机械臂控制之间存在形态鸿沟（Embodiment Gap），目前仅依靠微调隐式对齐而缺乏显式的动作重定向机制。&lt;/p&gt;
&lt;h2&gt;HPT&lt;/h2&gt;
&lt;p&gt;HPT 使用一种模块化 Token 对齐机制将异构机器人的 Proprioception 与 Vision 映射到共享潜空间到通用策略架构，并在大规模 Cross-Embodied 数据上验证了机器人策略学习的 Scaling Laws 以及迁移能力。&lt;/p&gt;
&lt;p&gt;HPT 采用了一种高度模块化的 Stem-Trunk-Head 设计范式来解决 Cross-Embodied 难题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/HPT-Stem.8z70jpnbae.webp&quot; alt=&quot;&quot;&gt;
在 Stem 模块中，利用 Cross-Attention 将异构的 Proprioception 与 Vision 对齐到统一的 Embodied 潜在表征。首先，机器人的 Vision 信息被编码成 Cross-Attention 中的 K 与 V，并与一组可学习的 Q 进行聚合得出 Vision Token。同样，机器人的 Proprioception 也经过相同的操作，得出 Proprio. Token。不同的 Embodied 对应了不同 Stem，是分别进行学习的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.hana0721.top/HPT.2yyuezdjdc.webp&quot; alt=&quot;&quot;&gt;
在 Trunk 模块中，所有 Embodied 任务共享一个 Transformer，负责将 Stem 对齐后的多模态 Token 进行深度融合和推理。最终，经过池化后得出最终 Latent。&lt;/p&gt;
&lt;p&gt;在 Head 模块中，负责将 Trunk 得出 Latent 进行解码，这里的解码器可以是 MLP、DP 以及 ACT，得出机器人的 Action。请注意，异构的机器人分别对应了不同的 Head。&lt;/p&gt;
&lt;p&gt;在训练数据上，HPT 使用 OXE、Simulation 以及 Human Videos 等。
HPT 使用了最暴力的 BC 方法，证明了其 Scaling Law 的存在。&lt;/p&gt;
&lt;h2&gt;RoboDual&lt;/h2&gt;
&lt;h2&gt;GR-2&lt;/h2&gt;
&lt;h2&gt;Humanoid Manipulation&lt;/h2&gt;
&lt;h2&gt;Surfer&lt;/h2&gt;
&lt;h2&gt;SceneVerse&lt;/h2&gt;
&lt;h2&gt;Robot See Robot Do&lt;/h2&gt;
&lt;h2&gt;ReKep&lt;/h2&gt;
&lt;h2&gt;OmniManip&lt;/h2&gt;
&lt;h2&gt;SOFAR&lt;/h2&gt;
&lt;h2&gt;PIVOT-R&lt;/h2&gt;
&lt;h2&gt;ManipGen&lt;/h2&gt;
&lt;h2&gt;DemoGen&lt;/h2&gt;
&lt;h2&gt;ArticuBot&lt;/h2&gt;
&lt;h2&gt;LAPA&lt;/h2&gt;
&lt;h2&gt;GR00T&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（27）：MARL 最后的波纹 (MAT &amp; HASAC)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-27</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-27</guid><description>多智能体领域的 SOTA 之作：详解 Multi-Agent Transformer (MAT) 如何将博弈转化为序列建模，以及 HASAC 如何结合异构理论与 SAC 的样本效率。</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，我们看到了 MARL 的发展脉络：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MAPPO&lt;/strong&gt;：On-Policy，稳定但样本效率低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HAPPO&lt;/strong&gt;：引入序列更新，解决了异构和单调性问题，但仍是 On-Policy。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decision Transformer&lt;/strong&gt;：将单智能体 RL 变成了序列预测。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章将介绍两个集大成者：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MAT (Multi-Agent Transformer)&lt;/strong&gt;：将 &quot;Transformer&quot; 和 &quot;序列决策&quot; 引入 MARL，把多智能体博弈变成了一个自回归（Auto-Regressive）的序列生成问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HASAC (Heterogeneous-Agent SAC)&lt;/strong&gt;：将 HAPPO 的 &quot;序列更新理论&quot; 应用于 SAC，打造出兼具理论保证和极高样本效率的 Off-Policy 算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Multi-Agent Transformer (MAT)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2205.14953&quot;&gt;Multi-Agent Reinforcement Learning is a Sequence Modeling Problem&lt;/a&gt; (NeurIPS 2022)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;核心思想：把“并发”变成“串行”&lt;/h3&gt;
&lt;p&gt;传统 MARL（如 QMIX, MAPPO）假设所有智能体在同一时刻&lt;strong&gt;同时&lt;/strong&gt;采取行动，联合动作分布为 $\pi(\mathbf{a}|s) = \prod \pi(a^i|s)$（假设独立）。&lt;/p&gt;
&lt;p&gt;MAT 提出了一种颠覆性的视角：&lt;strong&gt;联合策略可以分解为序列预测&lt;/strong&gt;。
利用概率链式法则，联合动作的概率可以写成：
$$
\pi(\mathbf{a}|s) = \prod_{i=1}^n \pi(a^i | s, a^1, a^2, ..., a^{i-1})
$$&lt;/p&gt;
&lt;p&gt;这意味着：Agent 1 先动；Agent 2 看到 Agent 1 的动作后再动；Agent 3 看到 1 和 2 的动作后再动……
这与 &lt;strong&gt;Transformer&lt;/strong&gt; 的自回归生成（预测下一个单词）完全一致！&lt;/p&gt;
&lt;h3&gt;架构设计：Encoder-Decoder&lt;/h3&gt;
&lt;p&gt;MAT 使用了标准的 Transformer 架构：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encoder（处理观测）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：所有智能体的局部观测序列 $(o^1, o^2, ..., o^n)$。&lt;/li&gt;
&lt;li&gt;作用：利用 Self-Attention 提取智能体之间的交互特征，生成联合状态表征。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Decoder（生成动作）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：Encoder 的输出 + 之前的智能体动作序列 $(a^1, ..., a^{i-1})$。&lt;/li&gt;
&lt;li&gt;输出：当前智能体 $i$ 的动作概率分布 $\pi(a^i | \dots)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：类似于 GPT，通过 Masked Attention 确保智能体 $i$ 只能看到它之前的队友动作，看不到未来的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;训练目标&lt;/h3&gt;
&lt;p&gt;MAT 使用 PPO 的目标函数进行端到端训练。
$$
L(\theta) = \min(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：这种序列化建模天然地解决了&lt;strong&gt;非平稳性&lt;/strong&gt;问题。对于 Agent $i$ 来说，它做决策时，队友 $1 \sim i-1$ 的动作已经是&lt;strong&gt;已知&lt;/strong&gt;的（Fixed），环境不再是“薛定谔”的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;：MAT 在 SMAC 等基准测试中展现了惊人的性能，尤其是在需要复杂协调的任务中，且具有极强的 Zero-Shot 泛化能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Heterogeneous-Agent SAC (HASAC)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2109.11251&quot;&gt;Trust Region Policy Optimization in Multi-Agent Reinforcement Learning&lt;/a&gt; (ICLR 2022)
&lt;em&gt;注：HASAC 是该论文提出的 HARL (Heterogeneous-Agent RL) 框架下的 Off-Policy 变体。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;核心动机：效率至上&lt;/h3&gt;
&lt;p&gt;HAPPO 虽然理论完美（保证单调提升），但它是 On-Policy 的，数据利用率低，训练慢。
SAC 是单智能体中样本效率最高的 Off-Policy 算法。
&lt;strong&gt;HASAC = HAPPO 的序列更新理论 + SAC 的最大熵 Off-Policy 机制。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;算法原理&lt;/h3&gt;
&lt;p&gt;HASAC 继承了 HAPPO 的 &lt;strong&gt;多智能体优势分解引理&lt;/strong&gt;：
$$
A_{\boldsymbol{\pi}}^{\text{joint}}(s, \mathbf{a}) = \sum_{i=1}^n A_{\pi}^{i}(s, a^i, a^1, ..., a^{i-1})
$$&lt;/p&gt;
&lt;h3&gt;训练流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;随机排列&lt;/strong&gt;：每一轮训练，随机打乱智能体更新顺序（例如 $1 \to 2 \to \dots \to n$）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列更新&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;对于智能体 $i$，它的 Critic $Q_i$ 需要评估的是：在队友 $1 \sim i-1$ 已经更新了新策略，而队友 $i+1 \sim n$ 还在用旧策略的情况下的价值。&lt;/li&gt;
&lt;li&gt;目标函数结合了 SAC 的熵正则化：
$$
J(\pi^i) = \mathbb{E}&lt;em&gt;{\mathcal{D}} \left[ Q^{\pi&lt;/em&gt;{\text{old}}}(s, a^1, ..., a^i, ..., a^n) - \alpha \log \pi^i(a^i|s) \right]
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键点&lt;/strong&gt;：在计算 $Q$ 值时，输入的动作向量 $\mathbf{a}$ 是混合的：
&lt;ul&gt;
&lt;li&gt;$a^{1:i-1}$ 来自&lt;strong&gt;当前最新&lt;/strong&gt;的策略。&lt;/li&gt;
&lt;li&gt;$a^{i}$ 是当前正在优化的。&lt;/li&gt;
&lt;li&gt;$a^{i+1:n}$ 来自&lt;strong&gt;旧&lt;/strong&gt;策略（Replay Buffer 中的动作或旧策略采样）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极高的样本效率&lt;/strong&gt;：Off-Policy 机制让它可以利用历史数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异构友好&lt;/strong&gt;：不需要参数共享，适合不同类型的智能体协作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收敛保证&lt;/strong&gt;：继承了 HARL 的单调性证明。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：计算复杂度较高，因为需要串行更新每个智能体，且 Critic 需要处理混合动作输入。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;深度对比：四大天王&lt;/h2&gt;
&lt;p&gt;至此，我们已经集齐了 MARL 领域的四大顶级算法。&lt;/p&gt;
&lt;p&gt;| 维度 | MAPPO | HAPPO | MAT | HASAC |
| :--- | :--- | :--- | :--- | :--- |
| &lt;strong&gt;核心机制&lt;/strong&gt; | PPO + CTDE | 序列更新 + PPO | &lt;strong&gt;Transformer + 自回归&lt;/strong&gt; | &lt;strong&gt;序列更新 + SAC&lt;/strong&gt; |
| &lt;strong&gt;策略类型&lt;/strong&gt; | On-Policy | On-Policy | On-Policy | &lt;strong&gt;Off-Policy&lt;/strong&gt; |
| &lt;strong&gt;决策方式&lt;/strong&gt; | 独立 (同步) | 独立 (执行时) | &lt;strong&gt;序列 (串行执行)&lt;/strong&gt; | 独立 (执行时) |
| &lt;strong&gt;同构/异构&lt;/strong&gt; | 强依赖同构 (参数共享) | &lt;strong&gt;异构友好&lt;/strong&gt; | 同构/异构皆可 | &lt;strong&gt;异构友好&lt;/strong&gt; |
| &lt;strong&gt;样本效率&lt;/strong&gt; | 低 | 低 | 中 | &lt;strong&gt;高&lt;/strong&gt; |
| &lt;strong&gt;适用场景&lt;/strong&gt; | 大规模同质集群 | 复杂异构协作 | 极复杂序列决策 | 需要快速收敛的任务 |&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果你追求&lt;strong&gt;极致的性能&lt;/strong&gt;和对复杂策略的建模能力，&lt;strong&gt;MAT&lt;/strong&gt; 是首选，它代表了 RL 与 LLM 结合的趋势。&lt;/li&gt;
&lt;li&gt;如果你追求&lt;strong&gt;训练速度&lt;/strong&gt;和&lt;strong&gt;样本利用率&lt;/strong&gt;，或者你的智能体是&lt;strong&gt;异构&lt;/strong&gt;的（比如一个无人机配合一个机械臂），&lt;strong&gt;HASAC&lt;/strong&gt; 是目前的最强选择。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>RL笔记（26）：异构智能体信任区域优化 (HAPPO &amp; HATRPO)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-26</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-26</guid><description>从经验主义回归理论严谨性：详解 HAPPO 如何解决 MARL 中的单调提升难题。涵盖多智能体优势分解引理、序列更新机制以及与 MAPPO 的本质区别。</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，我们介绍了 &lt;strong&gt;MAPPO&lt;/strong&gt;，它简单地让每个智能体运行 PPO，并共用一个中心化 Critic。虽然在工程上很成功，但它在理论上存在一个巨大的漏洞：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多智能体更新冲突&lt;/strong&gt;。
在单智能体中，PPO/TRPO 保证了每一步更新，策略性能 $J(\pi)$ 都是&lt;strong&gt;单调不减&lt;/strong&gt;的。
但在多智能体中，如果所有智能体&lt;strong&gt;同时&lt;/strong&gt;更新策略，这就好比两个人抬桌子，A 想往左，B 想往右，虽然两人各自觉得自己的方向是对的，但合起来的结果可能导致桌子翻倒（联合策略性能下降）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HAPPO (Heterogeneous-Agent PPO)&lt;/strong&gt; 和 &lt;strong&gt;HATRPO&lt;/strong&gt; 的核心贡献在于：提出了&lt;strong&gt;多智能体优势分解引理&lt;/strong&gt;，并据此设计了&lt;strong&gt;序列更新&lt;/strong&gt;方案，在理论上证明了联合策略的单调提升，特别适用于&lt;strong&gt;异构（Heterogeneous）&lt;/strong&gt; 智能体场景。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;理论基石：多智能体优势分解引理&lt;/h2&gt;
&lt;p&gt;我们希望优化联合策略 $\boldsymbol{\pi} = (\pi^1, \pi^2, ..., \pi^n)$ 以最大化联合回报 $J(\boldsymbol{\pi})$。
类似于 TRPO，我们关注新旧策略的回报差 $J(\boldsymbol{\pi}&lt;em&gt;{\text{new}}) - J(\boldsymbol{\pi}&lt;/em&gt;{\text{old}})$。&lt;/p&gt;
&lt;h3&gt;优势分解引理 (Multi-Agent Advantage Decomposition Lemma)&lt;/h3&gt;
&lt;p&gt;HAPPO 证明了，联合策略的优势函数（Joint Advantage）可以精确分解为每个智能体局部优势函数的&lt;strong&gt;累加&lt;/strong&gt;，前提是这些优势是&lt;strong&gt;按顺序&lt;/strong&gt;计算的。&lt;/p&gt;
&lt;p&gt;$$
A_{\boldsymbol{\pi}}^{\text{joint}}(s, \mathbf{a}) = \sum_{i=1}^n A_{\pi}^{i}(s, a^i, a^1, a^2, ..., a^{i-1})
$$&lt;/p&gt;
&lt;p&gt;这里的 $A_{\pi}^{i}$ 是第 $i$ 个智能体的优势函数，但有一个关键细节：
它不仅依赖于当前状态 $s$ 和动作 $a^i$，还依赖于&lt;strong&gt;排在他前面的智能体 $(a^1, a^2, ..., a^{i-1})$ 的动作&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这意味着：如果我们按照某种顺序 $1, 2, ..., n$ 依次更新智能体，那么整体性能的提升等于每个人贡献的提升之和。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;核心机制：序列更新 (Sequential Update)&lt;/h2&gt;
&lt;p&gt;为了利用上述引理，HAPPO 抛弃了 MAPPO 的“同步更新”模式，采用了 &lt;strong&gt;序列更新&lt;/strong&gt; 模式。&lt;/p&gt;
&lt;h3&gt;流程&lt;/h3&gt;
&lt;p&gt;在每一次训练迭代中：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;随机排列&lt;/strong&gt;：随机生成一个智能体的更新顺序（例如：Agent 3 -&gt; Agent 1 -&gt; Agent 2）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依次更新&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent 3&lt;/strong&gt;：基于旧策略 $\boldsymbol{\pi}&lt;em&gt;{\text{old}}$ 计算自己的优势，更新策略，变为 $\pi^3&lt;/em&gt;{\text{new}}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 1&lt;/strong&gt;：看到 Agent 3 已经更新了（环境变了），基于 $(\pi^3_{\text{new}}, \pi^1_{\text{old}}, \pi^2_{\text{old}})$ 计算自己的优势，更新为 $\pi^1_{\text{new}}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 2&lt;/strong&gt;：看到 3 和 1 都变了，基于 $(\pi^3_{\text{new}}, \pi^1_{\text{new}}, \pi^2_{\text{old}})$ 更新自己。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环结束&lt;/strong&gt;：所有智能体更新完毕，进入下一轮采样。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;为什么这样就稳了？&lt;/h3&gt;
&lt;p&gt;通过这种方式，对于每一个智能体 $i$ 来说，它在更新时，排在它前面的队友已经是“新策略”了，排在后面的还是“旧策略”。它只需要在当前这个&lt;strong&gt;固定&lt;/strong&gt;的上下文中找到最优提升方向，就能保证整个团队的总分是增加的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉&lt;/strong&gt;：
就像多人过独木桥。大家一起跑容易挤掉下去（同步更新）。HAPPO 的做法是：第一个人先走稳，第二个人看准第一个人的位置再走，依次类推。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;HATRPO 与 HAPPO&lt;/h2&gt;
&lt;p&gt;基于这个理论框架，衍生出了两个算法。它们都共享同一个&lt;strong&gt;中心化 Critic&lt;/strong&gt; $V(s)$。&lt;/p&gt;
&lt;h3&gt;HATRPO (Trust Region)&lt;/h3&gt;
&lt;p&gt;这是 TRPO 的多智能体版本。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：最大化局部优势期望。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;约束&lt;/strong&gt;：严格限制每个智能体更新前后的 KL 散度：
$$ \mathbb{E}[D_{KL}(\pi^i_{\text{old}} || \pi^i_{\text{new}})] \le \delta $$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求解&lt;/strong&gt;：同样需要使用共轭梯度法（CG），计算量较大，但理论性质最强。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HAPPO (Proximal Policy)&lt;/h3&gt;
&lt;p&gt;这是 PPO 的多智能体版本，更实用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：使用 Clip 技巧来替代 KL 约束。
定义比率 $r_t^i(\theta) = \frac{\pi^i(a^i|s)}{\pi^i_{\text{old}}(a^i|s)}$，损失函数为：
$$
L^{HAPPO}(\theta^i) = \mathbb{E} \left[ \min \left( r_t^i(\theta) \hat{M}^i, \text{clip}\left(r_t^i(\theta), 1-\epsilon, 1+\epsilon\right) \hat{M}^i \right) \right]
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键点 $\hat{M}^i$&lt;/strong&gt;：这是&lt;strong&gt;修正后的优势函数&lt;/strong&gt;。
在计算 Agent $i$ 的优势时，必须扣除排在它前面的队友 $1, ..., i-1$ 已经拿走的优势，确保不重复计算功劳。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;深度对比：HAPPO vs. MAPPO&lt;/h2&gt;
&lt;p&gt;这两个算法非常相似，都是 PPO + CTDE，很容易混淆。&lt;/p&gt;
&lt;p&gt;| 维度 | MAPPO (Multi-Agent PPO) | HAPPO (Heterogeneous-Agent PPO) |
| :--- | :--- | :--- |
| &lt;strong&gt;更新方式&lt;/strong&gt; | &lt;strong&gt;同步更新 (Simultaneous)&lt;/strong&gt; | &lt;strong&gt;序列更新 (Sequential)&lt;/strong&gt; |
| &lt;strong&gt;理论保证&lt;/strong&gt; | 无单调提升保证 (可能震荡) | &lt;strong&gt;有单调提升保证&lt;/strong&gt; |
| &lt;strong&gt;参数共享&lt;/strong&gt; | 强烈依赖 (Parameter Sharing) | &lt;strong&gt;不需要&lt;/strong&gt; (天生支持异构) |
| &lt;strong&gt;优势计算&lt;/strong&gt; | $A(s, a^i)$ (假设队友不变) | $A(s, a^i, a^1, ..., a^{i-1})$ (考虑队友更新) |
| &lt;strong&gt;适用场景&lt;/strong&gt; | 同质智能体 (如星际争霸小狗海) | &lt;strong&gt;异构智能体&lt;/strong&gt; (如牧羊犬与羊、不同类型的机器人) |
| &lt;strong&gt;计算量&lt;/strong&gt; | 较小 | 稍大 (因为要串行计算) |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;HAPPO 系列算法在 MARL 领域具有重要的理论地位：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;解决了 Heterogeneous (异构) 问题&lt;/strong&gt;：以前的算法（如 QMIX, MAPPO）通常假设智能体共享参数以加速收敛。HAPPO 证明了即使每个智能体结构完全不同（异构），只要按顺序更新，也能高效协作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决了 Trust Region 问题&lt;/strong&gt;：它将单智能体的“信任区域”概念成功推广到了多智能体，解决了多智能体同时更新导致的&lt;strong&gt;环境非平稳&lt;/strong&gt;和&lt;strong&gt;信度分配&lt;/strong&gt;难题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你面对的任务中，智能体各不相同（例如一个无人机配合一个地面车），且协作极其复杂，HAPPO 往往比 MAPPO 表现更稳健。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>claude 中使用 GLM</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-eba1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-eba1</guid><description>claude 中使用 GLM</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;重点参考官方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.ai/docs/code&quot;&gt;claude code 官方文档&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.bigmodel.cn/cn/guide/develop/claude&quot;&gt;GLM 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;第三方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/1957370685748938170&quot;&gt;claude code + GLM，保姆级配置教程&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lutaonan.com/blog/glm-with-claude-code/&quot;&gt;在Claude Code中使用GLM 4.6的体验&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用 Homebrew 安装 claude code&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（25）：多智能体策略梯度 (MADDPG &amp; MAPPO)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-25</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-25</guid><description>从连续控制到离散博弈：详解 CTDE 架构在 Actor-Critic 中的应用。涵盖 MADDPG 的多面手 Critic 设计与 MAPPO 的工程化胜利。</description><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言：Actor-Critic 的群体进化&lt;/h2&gt;
&lt;p&gt;我们在之前的笔记中学习了 &lt;strong&gt;CTDE (中心化训练，分布式执行)&lt;/strong&gt; 的思想。在 Value-Based 方法（如 QMIX）中，CTDE 体现在将 $Q_{tot}$ 分解为 $Q_i$。&lt;/p&gt;
&lt;p&gt;而在 &lt;strong&gt;Actor-Critic&lt;/strong&gt; 架构中，CTDE 的实现更加直观且灵活：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Actor (策略)&lt;/strong&gt;：必须是&lt;strong&gt;局部&lt;/strong&gt;的 ($\pi(a_i|o_i)$)，因为执行时只能靠自己。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critic (价值)&lt;/strong&gt;：必须是&lt;strong&gt;全局&lt;/strong&gt;的 ($Q(s, \mathbf{a})$ 或 $V(s)$)，因为训练时我们可以利用上帝视角来更准地评估局势，从而指导 Actor。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章将介绍这一范式下的两个里程碑算法：针对连续动作的 &lt;strong&gt;MADDPG&lt;/strong&gt; 和目前最强的 Baseline &lt;strong&gt;MAPPO&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MADDPG (Multi-Agent DDPG)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/1706.02275&quot;&gt;Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MADDPG 是 DDPG 算法在多智能体环境下的自然延伸，由 OpenAI 在 2017 年提出。它主要解决了&lt;strong&gt;非平稳性&lt;/strong&gt;问题。&lt;/p&gt;
&lt;h3&gt;核心思想：Critic 知道一切&lt;/h3&gt;
&lt;p&gt;在独立学习（Independent DDPG）中，Critic 只输入 $(o_i, a_i)$。当队友 $j$ 的策略 $\pi_j$ 改变时，环境对 $i$ 来说就变了，导致 Critic 震荡。&lt;/p&gt;
&lt;p&gt;MADDPG 提出：&lt;strong&gt;Critic 应该输入所有人的动作&lt;/strong&gt;。
$$ Q_i^{\boldsymbol{\pi}}(s, a_1, \dots, a_N) $$
只要输入了联合动作 $\mathbf{a} = (a_1, \dots, a_N)$，环境的状态转移 $P(s&apos;|s, \mathbf{a})$ 就是由物理规律决定的，是&lt;strong&gt;平稳 (Stationary)&lt;/strong&gt; 的。&lt;/p&gt;
&lt;h3&gt;架构设计&lt;/h3&gt;
&lt;p&gt;对于 $N$ 个智能体，每个智能体 $i$ 维护两个网络：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Actor $\mu_{\theta_i}(o_i)$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：仅局部观测 $o_i$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：确定性动作 $a_i$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：执行时完全独立。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critic $Q_{\phi_i}(s, a_1, \dots, a_N)$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：全局状态 $s$（或所有人的观测） + &lt;strong&gt;所有人的动作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：标量 Q 值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：仅在训练时使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;训练流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Critic 更新&lt;/strong&gt;：最小化贝尔曼误差。
$$ y = r_i + \gamma Q_i&apos;(s&apos;, a&apos;_1, \dots, a&apos;&lt;em&gt;N)|&lt;/em&gt;{a&apos;_j = \mu&apos;_j(o&apos;_j)} $$
注意：计算目标值时，需要用到&lt;strong&gt;每个智能体的 Target Actor&lt;/strong&gt; 来预测下一步动作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actor 更新&lt;/strong&gt;：确定性策略梯度。
$$ \nabla_{\theta_i} J = \mathbb{E} [\nabla_{a_i} Q_i(s, a_1, \dots, a_N)|&lt;em&gt;{a_i=\mu_i(o_i)} \cdot \nabla&lt;/em&gt;{\theta_i} \mu_i(o_i)] $$
注意：Critic 对 $a_i$ 求导，告诉 Actor $i$ 如何调整动作能提高集体（或个人）收益。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：可以处理连续动作；适用于合作、竞争或混合任务（每个 Critic 可以最大化不同的奖励 $r_i$）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：Critic 的输入维度随人数线性增长，难以扩展到大规模集群。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;MAPPO (Multi-Agent PPO)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2103.01955&quot;&gt;The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;长期以来，人们认为 Off-Policy（如 MADDPG/QMIX）在 MARL 中更高效。但 MAPPO (2021) 证明：&lt;strong&gt;只要调参得当，简单的 On-Policy PPO 也能吊打复杂的 Off-Policy 算法。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;核心思想：Centralized Value Function&lt;/h3&gt;
&lt;p&gt;MAPPO 的结构极其简单，就是 PPO + CTDE。
它与 IPPO（独立 PPO）唯一的区别在于 &lt;strong&gt;Critic&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPPO Critic&lt;/strong&gt;: $V(o_i)$ —— 只看自己，不仅视野窄，而且受队友策略变化干扰严重。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MAPPO Critic&lt;/strong&gt;: $V(s)$ —— &lt;strong&gt;看全局&lt;/strong&gt;。Critic 学习的是全局状态价值函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;为什么 $V(s)$ 比 $Q(s, \mathbf{a})$ 好？&lt;/h3&gt;
&lt;p&gt;MADDPG 使用 $Q(s, \mathbf{a})$，这需要输入巨大的联合动作空间。
MAPPO 使用 $V(s)$ 来计算优势函数：
$$ \hat{A}&lt;em&gt;i(t) = \sum (\gamma \lambda)^l (r&lt;/em&gt;{i, t+l} + \gamma V(s_{t+1+l}) - V(s_{t+l})) $$。
$V(s)$ 不需要输入动作，维度低，训练更容易收敛。&lt;/p&gt;
&lt;h3&gt;成功的关键：工程技巧 (Implementation Matters)&lt;/h3&gt;
&lt;p&gt;MAPPO 的成功不仅仅在于算法，更在于 5 个关键的工程实践：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输入特征处理&lt;/strong&gt;：将 Agent ID 作为 One-hot 向量拼接到状态中（在参数共享时区分不同个体）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数共享 (Parameter Sharing)&lt;/strong&gt;：所有智能体共用一个 Actor 和一个 Critic 网络（适用于同质智能体），极大加速收敛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PopArt&lt;/strong&gt;：对 Critic 的目标值（Value Target）进行&lt;strong&gt;归一化&lt;/strong&gt;，处理奖励尺度差异大的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据并行&lt;/strong&gt;：使用多个并行环境收集数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;裁剪 (Clipping)&lt;/strong&gt;：PPO 本身的 Clip 机制有效防止了非平稳环境下的策略崩塌。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;深度对比：MADDPG vs. MAPPO&lt;/h2&gt;
&lt;p&gt;| 维度 | MADDPG | MAPPO |
| :--- | :--- | :--- |
| &lt;strong&gt;基础算法&lt;/strong&gt; | DDPG (Off-Policy) | PPO (On-Policy) |
| &lt;strong&gt;策略类型&lt;/strong&gt; | 确定性 ($\mu(o)$) | 随机性 ($\pi(a|o)$) |
| &lt;strong&gt;动作空间&lt;/strong&gt; | &lt;strong&gt;连续&lt;/strong&gt; (擅长) | 连续 &amp;#x26; 离散 (都擅长) |
| &lt;strong&gt;Critic 形式&lt;/strong&gt; | $Q(s, a_1, \dots, a_N)$ | $V(s)$ |
| &lt;strong&gt;通信需求&lt;/strong&gt; | 训练时需知晓他人动作 | 训练时需知晓全局状态 |
| &lt;strong&gt;样本效率&lt;/strong&gt; | 较高 (Replay Buffer) | 较低 (需大量采样) |
| &lt;strong&gt;稳定性&lt;/strong&gt; | 较差 (超参数敏感) | &lt;strong&gt;极高&lt;/strong&gt; (鲁棒性强) |
| &lt;strong&gt;SOTA 表现&lt;/strong&gt; | 早期基准 | 目前 SMAC 等环境的主流强基准 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;多智能体策略方法的发展经历了从“各自为战”到“全局协同”的过程。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MADDPG&lt;/strong&gt; 解决了连续动作下的多智能体博弈问题，通过将“队友的动作”显式输入 Critic，在数学上恢复了平稳性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MAPPO&lt;/strong&gt; 则展示了“大道至简”的力量，证明了通过引入全局价值函数 $V(s)$ 并配合优秀的工程实现，On-Policy 算法也能在复杂的协作任务中达到 SOTA 水平。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，我们已经涵盖了 MARL 的两大主流流派：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Value-Based&lt;/strong&gt;: QMIX, QPLEX (适合离散动作，强显式协作)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy-Based&lt;/strong&gt;: MADDPG, MAPPO (适合连续动作，通用性强)。&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>RL笔记（24）：超越单调性 (QTRAN, WQMIX, QPLEX)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-24</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-24</guid><description>打破 QMIX 的枷锁：详解 QTRAN、Weighted QMIX 和 QPLEX 如何突破单调性约束。涵盖软约束松弛、非对称加权投影及对偶对决架构的完全表达能力证明。</description><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在上一章中，我们介绍了 &lt;strong&gt;QMIX&lt;/strong&gt;，它通过强制混合网络的权重非负，实现了对 IGM 原则的单调性近似。
然而，单调性是一个&lt;strong&gt;充分非必要条件&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;局限性&lt;/strong&gt;：QMIX 无法表示非单调的协作任务（例如：智能体 A 和 B 必须同时做动作 X 才能得分，单独做反而扣分。这种“异或”逻辑违反了单调性）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;挑战&lt;/strong&gt;：我们需要一种方法，既能满足 IGM 原则（保证分布式执行），又能覆盖&lt;strong&gt;所有&lt;/strong&gt;可能的联合价值函数空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章将介绍三种试图突破 QMIX 天花板的进阶算法：&lt;strong&gt;QTRAN&lt;/strong&gt;（基于变换）、&lt;strong&gt;WQMIX&lt;/strong&gt;（基于加权）和 &lt;strong&gt;QPLEX&lt;/strong&gt;（基于优势函数）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;QTRAN: Learning to Factorize with Transformation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/1905.05408&quot;&gt;QTRAN: Learning to Factorize with Transformation for Cooperative MARL&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;核心思想：变换与松弛&lt;/h3&gt;
&lt;p&gt;QTRAN 认为，直接学习一个满足 IGM 的 $Q_{tot}$ 太难了。
不如我们将 $Q_{tot}$ 拆解为两部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$Q&apos;_{tot}$&lt;/strong&gt;：一个易于分解的部分（如 VDN 的求和形式），用于指导动作选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$V_{tot}$&lt;/strong&gt;：一个状态价值修正项，用于补足残差，确保逼近真实的 $Q^*$。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;数学构造&lt;/h3&gt;
&lt;p&gt;我们定义变换后的目标函数：
$$
Q_{tot}(s, \mathbf{u}) \approx Q&apos;&lt;em&gt;{tot}(s, \mathbf{u}) + V&lt;/em&gt;{tot}(s, \mathbf{u})
$$
其中 $Q&apos;&lt;em&gt;{tot}(s, \mathbf{u}) = \sum&lt;/em&gt;{i=1}^n Q_i(u_i)$ 是我们实际用来选动作的函数。&lt;/p&gt;
&lt;p&gt;为了保证 $\arg\max Q&apos;&lt;em&gt;{tot} = \arg\max Q&lt;/em&gt;{tot}$（IGM 原则），QTRAN 推导出了一组充分条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最优动作一致性&lt;/strong&gt;：在最优动作 $\bar{\mathbf{u}}$ 处，两者相等。
$$ Q&apos;&lt;em&gt;{tot}(\bar{\mathbf{u}}) - Q&lt;/em&gt;{tot}(\bar{\mathbf{u}}) + V_{tot}(\bar{\mathbf{u}}) = 0 $$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非最优动作界限&lt;/strong&gt;：在非最优动作 $\mathbf{u}$ 处，$Q&apos;&lt;em&gt;{tot}$ 不会“篡位”。
$$ Q&apos;&lt;/em&gt;{tot}(\mathbf{u}) - Q_{tot}(\mathbf{u}) + V_{tot}(\mathbf{u}) \ge 0 $$&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;损失函数设计&lt;/h3&gt;
&lt;p&gt;QTRAN 将上述硬约束转化为软损耗（Soft Constraints）加入训练：
$$
L_{opt} = (Q&apos;&lt;em&gt;{tot}(\bar{\mathbf{u}}) - y&lt;/em&gt;{target})^2 + \lambda \sum_{\mathbf{u} \in \mathcal{U}, \mathbf{u} \ne \bar{\mathbf{u}}} (Q&apos;&lt;em&gt;{tot}(\mathbf{u}) - Q&lt;/em&gt;{tot}(\mathbf{u}) + V_{tot}(\mathbf{u}))^2
$$&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：理论上具有完全的表达能力 (Full Expressiveness)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：实际训练中，软约束很难被完美满足，且计算量巨大（涉及所有动作空间的求和）。在复杂任务上表现往往不如 QMIX。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Weighted QMIX (WQMIX)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2006.10800&quot;&gt;Weighted QMIX: Expanding Monotonic Value Function Factorisation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;核心思想：非对称加权&lt;/h3&gt;
&lt;p&gt;WQMIX 指出 QMIX 的核心问题是 &lt;strong&gt;相对过泛化 (Relative Overgeneralization)&lt;/strong&gt;：为了拟合某些非最优的低分动作，模型被迫拉低了最优动作的 Q 值。&lt;/p&gt;
&lt;p&gt;WQMIX 提出：&lt;strong&gt;我们其实不在乎非最优动作的 Q 值准不准，我们只在乎最优动作的 Q 值准不准。&lt;/strong&gt;
因此，我们可以给最优样本赋予极高的权重。&lt;/p&gt;
&lt;h3&gt;算法架构&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无限制网络 $\hat{Q}^*$&lt;/strong&gt;：使用一个普通的前馈网络（不加绝对值约束）来估计真实的联合 Q 值。这保证了表达能力，但不满足 IGM。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单调网络 $Q_{tot}$&lt;/strong&gt;：使用标准的 QMIX 结构（满足 IGM），用来做策略执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权投影&lt;/strong&gt;：通过加权 Loss 强行让 $Q_{tot}$ 去逼近 $\hat{Q}^*$。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;损失函数&lt;/h3&gt;
&lt;p&gt;$$
\mathcal{L} = \sum_{i=1}^b w(s, \mathbf{u}) \left( \hat{Q}^*(s, \mathbf{u}) - Q_{tot}(s, \mathbf{u}) \right)^2
$$
权重函数 $w$ 的设计体现了&lt;strong&gt;乐观主义&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 $\hat{Q}^*$ 认为当前动作很好的（可能是潜在的最优解），给大权重 $w=1$。&lt;/li&gt;
&lt;li&gt;如果 $\hat{Q}^*$ 认为当前动作很差，给小权重 $w=\alpha \ll 1$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这使得 $Q_{tot}$ 即使受限于单调性，也会优先保证在最优动作附近的形状是正确的，从而突破了结构瓶颈。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;QPLEX: Duplex Dueling Multi-Agent Q-Learning&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2008.01062&quot;&gt;QPLEX: Duplex Dueling Multi-Agent Q-Learning&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;核心思想：基于优势的 IGM&lt;/h3&gt;
&lt;p&gt;QPLEX 是目前的 SOTA 方法之一。它借鉴了 Dueling DQN 的思想，指出 IGM 原则其实只关乎 &lt;strong&gt;优势函数 (Advantage)&lt;/strong&gt;，与状态价值 $V(s)$ 无关。&lt;/p&gt;
&lt;p&gt;$$ Q_{tot}(s, \mathbf{u}) = V_{tot}(s) + A_{tot}(s, \mathbf{u}) $$&lt;/p&gt;
&lt;p&gt;只要保证 $A_{tot}$ 和局部 $A_i$ 在“正负号”上的一致性，就能满足 IGM，而不需要限制权重的正负。&lt;/p&gt;
&lt;h3&gt;数学构造&lt;/h3&gt;
&lt;p&gt;QPLEX 构造了如下形式的联合优势函数：
$$
A_{tot}(s, \mathbf{u}) = \sum_{i=1}^n \lambda_i(s, \mathbf{u}) A_i(s, u_i)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关键点：只要系数 $\lambda_i(s, \mathbf{u}) &gt; 0$，那么 $A_{tot}$ 的符号就由 $A_i$ 决定。
&lt;ul&gt;
&lt;li&gt;如果所有 $u_i$ 都是局部最优（$A_i=0$），那么 $A_{tot}=0$（全局最优）。&lt;/li&gt;
&lt;li&gt;如果有任何一个 $u_i$ 不是最优（$A_i &amp;#x3C; 0$），那么 $A_{tot} &amp;#x3C; 0$（全局非最优）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;网络架构&lt;/h3&gt;
&lt;p&gt;QPLEX 使用 &lt;strong&gt;多头注意力机制 (Multi-Head Attention)&lt;/strong&gt; 来动态生成权重 $\lambda_i$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这不仅保证了 $\lambda_i &gt; 0$，还赋予了模型根据当前状态动态调整每个智能体权重的能力。&lt;/li&gt;
&lt;li&gt;通过这种严格的数学构造，QPLEX 在理论上实现了&lt;strong&gt;完全表达能力&lt;/strong&gt;，同时保留了 VDN 般高效的计算效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结与对比&lt;/h2&gt;
&lt;p&gt;| 算法 | 核心机制 | 表达能力 | IGM 保证 | 计算复杂度 |
| :--- | :--- | :--- | :--- | :--- |
| &lt;strong&gt;QMIX&lt;/strong&gt; | 单调性约束 (权重 $&gt;0$) | 受限 (单调类) | 严格 | 低 |
| &lt;strong&gt;QTRAN&lt;/strong&gt; | 软约束松弛 + 罚项 | 完全 | 近似 (软约束) | 极高 |
| &lt;strong&gt;WQMIX&lt;/strong&gt; | 双网络 + 非对称加权 | 近似完全 | 严格 (投影后) | 中 |
| &lt;strong&gt;QPLEX&lt;/strong&gt; | 优势分解 + 注意力权重 | &lt;strong&gt;完全&lt;/strong&gt; | &lt;strong&gt;严格 (数学构造)&lt;/strong&gt; | 中 |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演进脉络&lt;/strong&gt;：
从 QMIX 的“削足适履”（为了 IGM 牺牲表达能力），到 QPLEX 的“量体裁衣”（通过精巧的数学构造同时实现 IGM 和完全表达能力），值分解算法在 MARL 领域已经发展得相当成熟。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>RL笔记（23）：多智能体值分解 (VDN &amp; QMIX)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-23</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-23</guid><description>如何在不牺牲独立决策能力的前提下，实现复杂的协作？详解多智能体强化学习中的值分解流派。涵盖 IGM 原则、VDN 的线性分解与 QMIX 的单调性约束设计。</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在上一篇笔记中，我们讨论了 MARL 的两种极端：&lt;strong&gt;JAL（完全中心化）&lt;/strong&gt; 理论完美但不可计算，&lt;strong&gt;IPPO（完全独立）&lt;/strong&gt; 计算简单但理论有毒。&lt;/p&gt;
&lt;p&gt;我们需要一种折中方案：&lt;strong&gt;CTDE（中心化训练，分布式执行）&lt;/strong&gt;。
对于 Value-Based 方法来说，CTDE 的核心挑战在于：&lt;strong&gt;如何利用全局 $Q_{tot}$ 来指导局部 $Q_i$ 的更新，同时确保局部贪婪决策能导致全局最优？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就是 &lt;strong&gt;值分解 (Value Decomposition)&lt;/strong&gt; 算法的核心使命。本章将介绍这一流派的开山之作 &lt;strong&gt;VDN&lt;/strong&gt; 和经典之作 &lt;strong&gt;QMIX&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;理论基石：Dec-POMDP 与 IGM&lt;/h2&gt;
&lt;h3&gt;问题形式化：Dec-POMDP&lt;/h3&gt;
&lt;p&gt;我们将多智能体协作任务建模为 &lt;strong&gt;去中心化部分可观测马尔可夫决策过程 (Dec-POMDP)&lt;/strong&gt;。
元组定义为 $G = \langle \mathcal{S}, N, U, P, R, Z, O, \gamma \rangle$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$s \in \mathcal{S}$：全局状态。&lt;/li&gt;
&lt;li&gt;$u_i \in U$：智能体 $i$ 的动作，联合动作 $\mathbf{u} \in U^n$。&lt;/li&gt;
&lt;li&gt;$z_i \in Z$：智能体 $i$ 的局部观测。&lt;/li&gt;
&lt;li&gt;$\tau_i$：动作-观测历史（因为是部分可观测，智能体需要记住历史）。&lt;/li&gt;
&lt;li&gt;$Q_{tot}(s, \mathbf{u})$：全局联合价值函数，代表集体的利益。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;核心原则：IGM (Individual-Global-Max)&lt;/h3&gt;
&lt;p&gt;为了保证“分布式执行”的有效性，我们必须确保：&lt;strong&gt;当每个智能体都最大化自己的局部利益 $Q_i$ 时，集体的利益 $Q_{tot}$ 也同时被最大化。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这被称为 &lt;strong&gt;IGM 原则&lt;/strong&gt;，数学表达为：
$$
\arg\max_{\mathbf{u}} Q_{tot}(\boldsymbol{\tau}, \mathbf{u}) =
\begin{pmatrix}
\arg\max_{u_1} Q_1(\tau_1, u_1) \
\vdots \
\arg\max_{u_n} Q_n(\tau_n, u_n)
\end{pmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：就像一支理想的足球队，如果前锋拼命进球（局部最优），后卫拼命防守（局部最优），那么整支球队的胜率（全局最优）也应该是最高的。如果满足 IGM，我们就不需要复杂的协调通信，各自为战即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;VDN (Value-Decomposition Networks)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/1706.05296&quot;&gt;Value-Decomposition Networks For Cooperative Multi-Agent Learning&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;VDN&lt;/strong&gt; 是值分解领域的奠基之作。它的思路非常简单粗暴：假设全局价值就是局部价值的&lt;strong&gt;直接加和&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;核心假设&lt;/h3&gt;
&lt;p&gt;$$
Q_{tot}(\boldsymbol{\tau}, \mathbf{u}) = \sum_{i=1}^n Q_i(\tau_i, u_i; \theta_i)
$$&lt;/p&gt;
&lt;h3&gt;训练与执行&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;训练时&lt;/strong&gt;：我们最小化 $Q_{tot}$ 与真实回报的 TD 误差：
$$ \mathcal{L}(\theta) = \left( r + \gamma \max_{\mathbf{u}&apos;} Q_{tot}(\boldsymbol{\tau}&apos;, \mathbf{u}&apos;; \theta^-) - Q_{tot}(\boldsymbol{\tau}, \mathbf{u}; \theta) \right)^2 $$
注意：这里的 $\max_{\mathbf{u}&apos;} Q_{tot}$ 可以很容易计算，因为 $\max \sum Q_i = \sum \max Q_i$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行时&lt;/strong&gt;：每个智能体只需选择 $u_i^* = \arg\max_{u_i} Q_i$，即可保证选择了全局最优动作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;局限性&lt;/h3&gt;
&lt;p&gt;VDN 满足 IGM 原则，但&lt;strong&gt;求和&lt;/strong&gt;的假设太强了。它限制了 $Q_{tot}$ 只能表示局部价值的线性组合，无法处理复杂的非线性协作（例如：只有当 A 和 B 同时做某事时，奖励才会暴增）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;QMIX&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/1803.11485&quot;&gt;QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;QMIX&lt;/strong&gt; 放宽了 VDN 的限制。它指出，要满足 IGM 原则，并不需要严格的线性求和，只需要满足 &lt;strong&gt;单调性约束 (Monotonicity Constraint)&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;h3&gt;核心假设&lt;/h3&gt;
&lt;p&gt;$$
\frac{\partial Q_{tot}}{\partial Q_i} \ge 0, \quad \forall i \in {1, \dots, n}
$$
即：&lt;strong&gt;局部价值 $Q_i$ 越高，全局价值 $Q_{tot}$ 也就越高。&lt;/strong&gt;
只要满足这个条件，$\arg\max Q_{tot}$ 就一定等价于 $\arg\max Q_i$ 的组合。&lt;/p&gt;
&lt;h3&gt;网络架构&lt;/h3&gt;
&lt;p&gt;QMIX 使用一个 &lt;strong&gt;混合网络 (Mixing Network)&lt;/strong&gt; 来拟合 $Q_{tot}$，它以所有 $Q_i$ 为输入，以 $Q_{tot}$ 为输出。
为了保证单调性（权重非负），QMIX 引入了一个 &lt;strong&gt;超网络 (Hypernetwork)&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Agent Network&lt;/strong&gt;: 输入局部观测 $\tau_i$，输出 $Q_i$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mixing Network&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;这是一个前馈神经网络，输入是 ${Q_1, \dots, Q_n}$，输出是 $Q_{tot}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键点&lt;/strong&gt;：这个网络的&lt;strong&gt;权重 (Weights)&lt;/strong&gt; 是由 Hypernetwork 生成的，且被强制取绝对值（保证非负）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypernetwork&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;输入是全局状态 $s$。&lt;/li&gt;
&lt;li&gt;输出是 Mixing Network 的权重 $W$ 和偏置 $b$。&lt;/li&gt;
&lt;li&gt;公式：$W_{mix} = | \text{Hyper}(s) |$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过这种设计，QMIX 实现了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非线性能力&lt;/strong&gt;：Mixing Network 可以是复杂的非线性函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态依赖&lt;/strong&gt;：全局状态 $s$ 决定了混合的方式（例如在某些状态下，$Q_1$ 更重要；在另一些状态下，$Q_2$ 更重要）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单调性保证&lt;/strong&gt;：由于权重恒为正，混合网络对输入 $Q_i$ 保持单调递增。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;损失函数&lt;/h3&gt;
&lt;p&gt;QMIX 的训练也是标准的 DQN 风格：
$$
\mathcal{L}(\theta) = \left( r + \gamma Q_{tot}(\boldsymbol{\tau}&apos;, s&apos;, \mathbf{u}&lt;em&gt;{max}&apos;; \theta^-) - Q&lt;/em&gt;{tot}(\boldsymbol{\tau}, s, \mathbf{u}; \theta) \right)^2
$$
其中 $\mathbf{u}_{max}&apos;$ 是通过各个 $Q_i$ 贪婪选出的动作组合。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结与对比&lt;/h2&gt;
&lt;p&gt;| 维度 | VDN | QMIX |
| :--- | :--- | :--- |
| &lt;strong&gt;分解方式&lt;/strong&gt; | 线性求和 | 非线性混合 |
| &lt;strong&gt;IGM 保证&lt;/strong&gt; | 是 (Sum) | 是 (Monotonicity) |
| &lt;strong&gt;全局信息利用&lt;/strong&gt; | 无 (仅通过反向传播隐式利用) | &lt;strong&gt;有 (Hypernetwork 输入 $s$)&lt;/strong&gt; |
| &lt;strong&gt;表达能力&lt;/strong&gt; | 弱 (仅限线性关系) | &lt;strong&gt;强 (单调非线性关系)&lt;/strong&gt; |
| &lt;strong&gt;适用场景&lt;/strong&gt; | 简单协作 | 复杂非线性协作 (如集火攻击) |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QMIX 的地位&lt;/strong&gt;：
它是 MARL 领域最经典的算法之一。虽然它只能处理满足单调性假设的任务（有些任务可能局部最优不等于全局最优），但在《星际争霸》(SMAC) 等主流测试平台上，QMIX 及其变体长期占据统治地位。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>RL笔记（22）：初入多智能体强化学习 (MARL)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-22</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-22</guid><description>MARL 的两个极端：详解联合动作学习 (JAL) 与独立学习 (Independent RL)。深度分析“维度灾难”与“环境非平稳性”这对核心矛盾。</description><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的 19 篇笔记中，我们研究的都是 &lt;strong&gt;单智能体强化学习 (Single-Agent RL)&lt;/strong&gt;。
但在现实世界中，任务往往涉及多个个体。&lt;strong&gt;多智能体强化学习 (MARL)&lt;/strong&gt; 将问题扩展到了随机博弈（Stochastic Games）的领域。&lt;/p&gt;
&lt;p&gt;在进入复杂的 SOTA 算法之前，我们必须先理解解决 MARL 问题的两种&lt;strong&gt;最朴素、最极端&lt;/strong&gt;的思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;完全中心化 (JAL)&lt;/strong&gt;：把所有人看作一个人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完全去中心化 (IPPO)&lt;/strong&gt;：把队友看作空气（或环境噪声）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这两种思路分别对应了 MARL 的两大核心难题：&lt;strong&gt;维度灾难&lt;/strong&gt; 与 &lt;strong&gt;非平稳性&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;理论模型：随机博弈&lt;/h2&gt;
&lt;p&gt;定义为一个元组 $(N, \mathcal{S}, \mathcal{A}, \mathcal{P}, \mathcal{R}, \gamma)$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$N$：智能体数量。&lt;/li&gt;
&lt;li&gt;$\mathcal{S}$：全局状态空间。&lt;/li&gt;
&lt;li&gt;$\mathcal{A} = \mathcal{A}_1 \times \dots \times \mathcal{A}_N$：&lt;strong&gt;联合动作空间 (Joint Action Space)&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;状态转移取决于所有人的动作组合 $\mathbf{a} = (a_1, \dots, a_N)$。&lt;/li&gt;
&lt;li&gt;即 $s&apos; \sim \mathcal{P}(\cdot | s, \mathbf{a})$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;极端一：联合动作学习 (JAL)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Joint Action Learning (JAL)&lt;/strong&gt; 代表了 &lt;strong&gt;完全中心化 (Fully Centralized)&lt;/strong&gt; 的思路。&lt;/p&gt;
&lt;h3&gt;核心思想&lt;/h3&gt;
&lt;p&gt;既然环境受所有人的动作 $\mathbf{a}$ 影响，那我们就构建一个拥有上帝视角的 &lt;strong&gt;“超级智能体” (Super Agent)&lt;/strong&gt;，它接收全局状态 $s$，直接输出联合动作 $\mathbf{a}$ 来控制所有单位。&lt;/p&gt;
&lt;h3&gt;方法&lt;/h3&gt;
&lt;p&gt;直接套用标准的 PPO 算法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：$s$&lt;/li&gt;
&lt;li&gt;输出：$\mathbf{a} = (a_1, a_2, \dots, a_N)$&lt;/li&gt;
&lt;li&gt;策略：$\Pi_\theta(\mathbf{a} | s)$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;理论分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势：环境平稳&lt;/strong&gt;。
对于这个超级智能体来说，外界环境是静止的（Stationary），因为没有“其他人”在干扰它。因此，马尔可夫性质成立，RL 的收敛性理论依然有效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;致命缺陷：维度灾难 (Curse of Dimensionality)&lt;/strong&gt;。
假设每个智能体有 $|A|$ 个动作，共有 $N$ 个智能体。联合动作空间的大小为 $|A|^N$。
&lt;ul&gt;
&lt;li&gt;$|A|=5, N=10 \Rightarrow 5^{10} \approx 9,765,625$。&lt;/li&gt;
&lt;li&gt;输出层需要预测近一千万个概率值，这在计算上是不可行的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;极端二：独立学习 (Independent RL / IPPO)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Independent PPO (IPPO)&lt;/strong&gt; 代表了 &lt;strong&gt;完全去中心化 (Fully Decentralized)&lt;/strong&gt; 的思路。&lt;/p&gt;
&lt;h3&gt;核心思想&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;“把队友当空气”&lt;/strong&gt;。
每个智能体 $i$ 都是一个独立的个体，它只关心自己的观测 $o_i$ 和奖励 $r_i$。它把所有“其他智能体”都视为&lt;strong&gt;环境的一部分&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;方法&lt;/h3&gt;
&lt;p&gt;同时运行 $N$ 个独立的 PPO 算法（参数可以共享，也可以不共享）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于智能体 $i$：
&lt;ul&gt;
&lt;li&gt;输入：局部观测 $o_i$&lt;/li&gt;
&lt;li&gt;输出：独立动作 $a_i$&lt;/li&gt;
&lt;li&gt;策略：$\pi_{\theta_i}(a_i | o_i)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;理论分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势：线性扩展&lt;/strong&gt;。
计算复杂度随人数 $N$ 线性增长。无论有多少人，每个网络只输出 $|A|$ 个概率。这完美解决了维度灾难。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;致命缺陷：非平稳性 (Non-Stationarity)&lt;/strong&gt;。
从智能体 $i$ 的视角看，状态转移概率变成了：
$$ P(s&apos;|s, a_i) = \sum_{\mathbf{a}&lt;em&gt;{-i}} P(s&apos;|s, a_i, \mathbf{a}&lt;/em&gt;{-i}) \pi_{-i}(\mathbf{a}&lt;em&gt;{-i}|s) $$
注意公式里的 $\pi&lt;/em&gt;{-i}$（队友的策略）。在训练过程中，&lt;strong&gt;队友也在学习，$\pi_{-i}$ 一直在变&lt;/strong&gt;。
这意味着：&lt;strong&gt;对于智能体 $i$ 来说，昨天有用的策略，今天可能就没用了，因为环境（队友）变了。&lt;/strong&gt;
这破坏了马尔可夫假设，理论上算法无法收敛。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结与对比&lt;/h2&gt;
&lt;p&gt;| 维度 | 联合动作学习 (JAL) | 独立学习 (IPPO) |
| :--- | :--- | :--- |
| &lt;strong&gt;控制方式&lt;/strong&gt; | &lt;strong&gt;完全中心化&lt;/strong&gt; (Super Agent) | &lt;strong&gt;完全去中心化&lt;/strong&gt; (Independent Agents) |
| &lt;strong&gt;动作空间&lt;/strong&gt; | 联合动作 $\mathbf{a}$ | 独立动作 $a_i$ |
| &lt;strong&gt;空间复杂度&lt;/strong&gt; | &lt;strong&gt;指数级爆炸&lt;/strong&gt; $|A|^N$ | &lt;strong&gt;线性增长&lt;/strong&gt; $N \times |A|$ |
| &lt;strong&gt;环境性质&lt;/strong&gt; | &lt;strong&gt;平稳 (Stationary)&lt;/strong&gt; | &lt;strong&gt;非平稳 (Non-Stationary)&lt;/strong&gt; |
| &lt;strong&gt;理论保证&lt;/strong&gt; | 有收敛保证 | 无收敛保证 |
| &lt;strong&gt;实际表现&lt;/strong&gt; | 规模稍大即无法运行 | 尽管没理论保证，但在实践中往往是 Strong Baseline |&lt;/p&gt;
&lt;h3&gt;这一章的启示&lt;/h3&gt;
&lt;p&gt;我们陷入了两难境地：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选 JAL，理论稳但算不动。&lt;/li&gt;
&lt;li&gt;选 IPPO，算得快但理论虚。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就引出了 MARL 研究的圣杯——&lt;strong&gt;CTDE (集中式训练，分布式执行)&lt;/strong&gt;。
我们需要一种折中的方法：&lt;strong&gt;在训练时利用 JAL 的上帝视角来缓解非平稳性，在执行时利用 IPPO 的独立结构来避免维度灾难。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这正是后续 &lt;strong&gt;MAPPO&lt;/strong&gt; 和 &lt;strong&gt;QMIX&lt;/strong&gt; 等算法的核心动机。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/><enclosure url="https://pic.hana0721.top/rl-note-4.1ziqble6oe.webp"/></item><item><title>RL笔记（21）：目标导向的强化学习 (Goal-Conditioned RL)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-21</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-21</guid><description>从解决单一任务到解决一类任务：详解目标导向 RL 的数学形式化。涵盖通用价值函数近似 (UVFA) 理论，以及解决稀疏奖励难题的核心技术——事后经验回放 (HER)。</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在标准的强化学习设定中，我们通常训练一个智能体去完成&lt;strong&gt;一个特定的任务&lt;/strong&gt;（例如：打赢一局游戏，或者让机器人走到特定的坐标 $(x,y)$）。如果任务目标变了（例如：走到新的坐标 $(x&apos;, y&apos;)$），我们通常需要重新训练网络。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目标导向的强化学习 (Goal-Conditioned RL, GCRL)&lt;/strong&gt; 旨在打破这一限制。我们希望训练一个智能体，它不仅能根据状态 $s$ 做出决策，还能根据&lt;strong&gt;输入的目标 $g$&lt;/strong&gt; 动态调整策略。&lt;/p&gt;
&lt;p&gt;即策略函数变为 $\pi(a|s, g)$，价值函数变为 $Q(s, a, g)$。这使得智能体具备了&lt;strong&gt;多任务泛化&lt;/strong&gt;的能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;问题形式化 (Problem Formulation)&lt;/h2&gt;
&lt;p&gt;我们将标准的马尔可夫决策过程 (MDP) 扩展为 &lt;strong&gt;目标增强的 MDP (Augmented MDP)&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;扩展元组&lt;/h3&gt;
&lt;p&gt;新的元组定义为 $\mathcal{M} = (\mathcal{S}, \mathcal{A}, \mathcal{P}, \mathcal{G}, r, \gamma)$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mathcal{G}$：目标空间（通常是状态空间 $\mathcal{S}$ 的子集）。&lt;/li&gt;
&lt;li&gt;$r(s, a, g)$：目标导向的奖励函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;奖励函数的设计&lt;/h3&gt;
&lt;p&gt;在 GCRL 中，最常见的奖励函数有两种形式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稀疏奖励 (Sparse Reward)&lt;/strong&gt;：
只有当智能体真正达成目标时才给奖励（通常用于机械臂抓取等精确任务）。
$$
r(s, a, g) = \mathbb{I}(\phi(s) = g) = \begin{cases} 0 &amp;#x26; \text{if } ||\phi(s) - g|| &amp;#x3C; \epsilon \ -1 &amp;#x26; \text{otherwise} \end{cases}
$$
&lt;em&gt;(注：这里用 0/-1 奖励结构比 1/0 更常见，因为这样价值函数代表了“到达目标的期望步数”的负值)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稠密奖励 (Dense Reward)&lt;/strong&gt;：
基于当前状态与目标的距离。
$$
r(s, a, g) = -||\phi(s) - g||_2
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;目标：UVFA&lt;/h3&gt;
&lt;p&gt;我们的优化目标是找到一个最优策略 $\pi^*$，最大化所有可能的起始状态和目标的期望回报：
$$
J(\pi) = \mathbb{E}&lt;em&gt;{g \sim p(g), s_0 \sim p(s_0), \tau \sim \pi} \left[ \sum&lt;/em&gt;{t=0}^\infty \gamma^t r(s_t, a_t, g) \right]
$$&lt;/p&gt;
&lt;p&gt;这种能够同时泛化状态 $s$ 和目标 $g$ 的价值函数近似器，被称为 &lt;strong&gt;通用价值函数近似 (Universal Value Function Approximators, UVFA)&lt;/strong&gt;。
$$ V(s, g; \theta) \approx \mathbb{E} [R | s, g] $$
神经网络结构通常是将状态特征 $\phi(s)$ 和目标特征 $\psi(g)$ 拼接后输入。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;稀疏奖励难题&lt;/h2&gt;
&lt;p&gt;尽管 UVFA 提供了理论框架，但在实际训练中，如果使用&lt;strong&gt;稀疏奖励&lt;/strong&gt;，学习会极其困难。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：在一个高维环境中（例如机械臂控制），随机探索碰到目标 $g$ 的概率几乎为 0。
这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;经验回放池 $\mathcal{D}$ 中几乎所有的样本，其奖励 $r$ 都是 -1（或 0）。&lt;/li&gt;
&lt;li&gt;智能体收不到任何正反馈，梯度无法指引优化的方向。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这被称为 &lt;strong&gt;稀疏奖励问题 (Sparse Reward Problem)&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;事后经验回放 (Hindsight Experience Replay, HER)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HER&lt;/strong&gt; 是 GCRL 领域最核心的算法创新。它的灵感来源于人类的“精神胜利法”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉&lt;/strong&gt;：
假设你的目标是射中靶心，但你射偏了，射到了旁边的树上。
虽然作为“射靶心”的任务你失败了，但如果我们事后回顾（Hindsight），假设原本的目标就是“射中那棵树”，那你通过刚才的动作序列，完美地完成了任务！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;理论推导&lt;/h3&gt;
&lt;p&gt;HER 的核心在于&lt;strong&gt;重标记 (Relabeling)&lt;/strong&gt; 经验回放池中的目标。&lt;/p&gt;
&lt;p&gt;假设智能体在目标 $g$ 的指导下，产生了一条轨迹：
$$ \tau = {s_0, a_0, r_0, s_1, \dots, s_T} $$
其中，最后的状态 $s_T$ 并没有到达预设目标 $g$，所以所有的 $r_t = -1$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HER 的操作&lt;/strong&gt;：
我们构造一个新的虚假目标 $g&apos; = s_T$（即把最后实际达到的状态当作目标）。
对于轨迹中的每一个转换 $(s_t, a_t, s_{t+1})$，我们根据新目标 $g&apos;$ 重新计算奖励：
$$
r&apos;&lt;em&gt;t = r(s_t, a_t, g&apos;) = \begin{cases} 0 &amp;#x26; \text{if } s&lt;/em&gt;{t+1} = g&apos; \ -1 &amp;#x26; \text{otherwise} \end{cases}
$$
由于 $g&apos;$ 就是 $s_T$，那么在轨迹结束时，智能体&lt;strong&gt;必然&lt;/strong&gt;获得了正奖励。&lt;/p&gt;
&lt;p&gt;我们将原始数据 $(s_t, a_t, r_t, s_{t+1}, g)$ 和修改后的数据 $(s_t, a_t, r&apos;&lt;em&gt;t, s&lt;/em&gt;{t+1}, g&apos;)$ 都存入 Replay Buffer。&lt;/p&gt;
&lt;h3&gt;为什么数学上是成立的？(Off-Policy 的重要性)&lt;/h3&gt;
&lt;p&gt;HER 只能用于 &lt;strong&gt;离线策略 (Off-Policy)&lt;/strong&gt; 算法（如 DQN, DDPG, SAC）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：
我们原本产生的轨迹 $\tau$ 是由策略 $\pi(\cdot | s, g)$ 生成的。
但在训练时，我们将其强行解释为是由策略 $\pi(\cdot | s, g&apos;)$ 生成的。
这本质上是一种极端的 Off-Policy 学习：&lt;strong&gt;行为策略的目标与更新时的目标完全不同。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只要算法支持 Off-Policy（即不仅可以利用自己产生的旧数据，还可以利用“别人”产生的数据），HER 就是数学上合法的。因为对于 $(s_t, a_t, s_{t+1})$ 这个物理转换来说，它只遵循环境动力学 $P(s&apos;|s,a)$，与目标 $g$ 无关。环境的物理规律是不随心中的目标而改变的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;HER 的变种与理论解释&lt;/h2&gt;
&lt;h3&gt;不同的重标记策略 (Replay Strategy)&lt;/h3&gt;
&lt;p&gt;在将数据存入 Buffer 时，我们可以选择不同的重标记方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Future&lt;/strong&gt;: 从当前时间步 $t$ 之后的轨迹中随机选取一个状态作为新目标 $g&apos;$。（这是标准做法，效果最好）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final&lt;/strong&gt;: 仅使用轨迹的最后一个状态 $s_T$ 作为 $g&apos;$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Episode&lt;/strong&gt;: 从整个轨迹中随机选取一个状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Random&lt;/strong&gt;: 随机生成一个全新的目标（效果通常不好）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;隐式课程学习 (Implicit Curriculum Learning)&lt;/h3&gt;
&lt;p&gt;从理论上讲，HER 实现了一种自动的课程学习。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初期&lt;/strong&gt;：智能体很笨，只能碰到离起始点很近的状态。HER 把这些近的状态设为目标，智能体学会了如何“走一小步”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中期&lt;/strong&gt;：学会走一小步后，智能体能探索到稍远一点的状态。HER 再次把稍远的状态设为目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后期&lt;/strong&gt;：随着能力扩展，智能体最终能学会到达真正的远距离目标 $g$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种奖励信号从容易到困难的自动传播，是 HER 解决稀疏奖励问题的本质原因。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;目标导向 RL 将强化学习从“解决一个问题”提升到了“解决一类问题”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UVFA&lt;/strong&gt; 提供了网络结构的理论基础，让 $V(s,g)$ 成为可能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HER&lt;/strong&gt; 解决了最为棘手的稀疏奖励问题，通过&lt;strong&gt;事后重标记&lt;/strong&gt;，将每一次失败的尝试都转化为另一次成功的训练数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，我们已经掌握了让智能体学会“指哪打哪”的关键技术。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>Paper Reading: LLM 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-llm1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-llm1</guid><description>读一些大型语言模型相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;GPT 1.0&lt;/h2&gt;
&lt;h2&gt;BERT&lt;/h2&gt;
&lt;h2&gt;GPT 2.0&lt;/h2&gt;
&lt;h2&gt;Megatron-LM&lt;/h2&gt;
&lt;h2&gt;T5&lt;/h2&gt;
&lt;h2&gt;ZeRO&lt;/h2&gt;
&lt;h2&gt;Scaling Law&lt;/h2&gt;
&lt;h2&gt;GPT 3.0&lt;/h2&gt;
&lt;h2&gt;Switch Transformers&lt;/h2&gt;
&lt;h2&gt;Codex&lt;/h2&gt;
&lt;h2&gt;COT&lt;/h2&gt;
&lt;h2&gt;InstructGPT&lt;/h2&gt;
&lt;h2&gt;PaLM&lt;/h2&gt;
&lt;h2&gt;LLaMA&lt;/h2&gt;
&lt;h2&gt;GPT 4&lt;/h2&gt;
&lt;h2&gt;DPO&lt;/h2&gt;
&lt;h2&gt;ToT&lt;/h2&gt;
&lt;h2&gt;LLaMA2&lt;/h2&gt;
&lt;h2&gt;Mistral 7B&lt;/h2&gt;
&lt;h2&gt;Mamba&lt;/h2&gt;
&lt;h2&gt;Mamba2&lt;/h2&gt;
&lt;h2&gt;Qwen2.5&lt;/h2&gt;
&lt;h2&gt;DeepSeek-V3&lt;/h2&gt;
&lt;h2&gt;DeepSeek-R1&lt;/h2&gt;
&lt;h2&gt;Kimi K2&lt;/h2&gt;
&lt;h2&gt;DFT&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/><enclosure url="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/></item><item><title>Paper Reading: LLM 2</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-llm2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-llm2</guid><description>读一些大型语言模型相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;MMaDA&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/><enclosure url="https://pic.hana0721.top/rl-note-5.32ifmhjene.webp"/></item><item><title>Paper Reading: MLLM 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-mllm1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-mllm1</guid><description>读一些多模态相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;CLIP&lt;/h2&gt;
&lt;h2&gt;SigLip&lt;/h2&gt;
&lt;h2&gt;SigLipV2&lt;/h2&gt;
&lt;h2&gt;Dino V1&lt;/h2&gt;
&lt;h2&gt;Dino V2&lt;/h2&gt;
&lt;h2&gt;Dino V3&lt;/h2&gt;
&lt;h2&gt;ViLT&lt;/h2&gt;
&lt;h2&gt;ALBEF&lt;/h2&gt;
&lt;h2&gt;VLMo&lt;/h2&gt;
&lt;h2&gt;BLIP&lt;/h2&gt;
&lt;h2&gt;CoCa&lt;/h2&gt;
&lt;h2&gt;BEiT V3&lt;/h2&gt;
&lt;h2&gt;BLIP2&lt;/h2&gt;
&lt;h2&gt;LLava&lt;/h2&gt;
&lt;h2&gt;Flamingo&lt;/h2&gt;
&lt;h2&gt;Visual Instruction Tuning&lt;/h2&gt;
&lt;h2&gt;Qwen-VL&lt;/h2&gt;
&lt;h2&gt;Gemini&lt;/h2&gt;
&lt;h2&gt;GPT-4V&lt;/h2&gt;
&lt;h2&gt;LISA&lt;/h2&gt;
&lt;h2&gt;Cambrian-1&lt;/h2&gt;
&lt;h2&gt;Qwen2-VL&lt;/h2&gt;
&lt;h2&gt;Qwen2.5-VL&lt;/h2&gt;
&lt;h2&gt;InstructBLIP&lt;/h2&gt;
&lt;h2&gt;LLaMA-Adapter&lt;/h2&gt;
&lt;h2&gt;VisionLLM&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>Paper Reading: MLLM 2</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-mllm2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-mllm2</guid><description>读一些多模态相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;LLaVA-OneVision&lt;/h2&gt;
&lt;h2&gt;GPT 5&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>Paper Reading: Unify MLLM 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-umllm1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-umllm1</guid><description>读一些统一多模态大模型相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;速览一些统一多模态大模型的论文。&lt;/p&gt;
&lt;h2&gt;SEED&lt;/h2&gt;
&lt;h2&gt;LaVIT&lt;/h2&gt;
&lt;h2&gt;SEED-X&lt;/h2&gt;
&lt;h2&gt;Emu&lt;/h2&gt;
&lt;h2&gt;Emu2&lt;/h2&gt;
&lt;h2&gt;Chameleon&lt;/h2&gt;
&lt;h2&gt;Transfusion&lt;/h2&gt;
&lt;h2&gt;Emu3&lt;/h2&gt;
&lt;h2&gt;MMAR&lt;/h2&gt;
&lt;h2&gt;Janus&lt;/h2&gt;
&lt;h2&gt;PUMA&lt;/h2&gt;
&lt;h2&gt;Show-o&lt;/h2&gt;
&lt;h2&gt;VILA-U&lt;/h2&gt;
&lt;h2&gt;MIO&lt;/h2&gt;
&lt;h2&gt;JanusFlow&lt;/h2&gt;
&lt;h2&gt;Orthus&lt;/h2&gt;
&lt;h2&gt;TokenFlow&lt;/h2&gt;
&lt;h2&gt;Liquid&lt;/h2&gt;
&lt;h2&gt;MUSE-VL&lt;/h2&gt;
&lt;h2&gt;SILMM&lt;/h2&gt;
&lt;h2&gt;ILLUME&lt;/h2&gt;
&lt;h2&gt;Visual Lexicon&lt;/h2&gt;
&lt;h2&gt;LatentLM&lt;/h2&gt;
&lt;h2&gt;SynerGen-VL&lt;/h2&gt;
&lt;h2&gt;MetaMorph&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top/rl-note.3yex1wenfg.webp"/></item><item><title>Paper Reading: Unify MLLM 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-umllm2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-umllm2</guid><description>读一些统一多模态大模型相关的论文</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;速览一些统一多模态大模型的论文。&lt;/p&gt;
&lt;h2&gt;LMFusion&lt;/h2&gt;
&lt;h2&gt;UniToken&lt;/h2&gt;
&lt;h2&gt;VARGPT&lt;/h2&gt;
&lt;h2&gt;Janus-Pro&lt;/h2&gt;
&lt;h2&gt;BLIP3-o&lt;/h2&gt;
&lt;h2&gt;Show-o2&lt;/h2&gt;
&lt;h2&gt;Qwen-Image&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top/rl-note.3yex1wenfg.webp"/></item><item><title>RL笔记（20）：Decision Transformer</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-20</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-20</guid><description>范式转移：当强化学习遇上 Transformer。详解 Decision Transformer 如何抛弃贝尔曼方程，利用 Return-to-Go 将 RL 重构为条件序列建模问题。</description><pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，无论是有模型还是无模型，在线还是离线，我们解决 RL 问题的核心思路都是基于 &lt;strong&gt;动态规划 (Dynamic Programming)&lt;/strong&gt; 的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们要估计价值函数 $V(s)$ 或 $Q(s,a)$。&lt;/li&gt;
&lt;li&gt;利用贝尔曼方程进行迭代更新（自举）。&lt;/li&gt;
&lt;li&gt;通过最大化价值来获得策略。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Decision Transformer (DT)&lt;/strong&gt; 提出了一种完全不同的视角：
如果我们拥有大量的离线轨迹数据，为什么不把它看作是一个 &lt;strong&gt;序列建模 (Sequence Modeling)&lt;/strong&gt; 问题呢？
就像 GPT 预测下一个单词一样，能不能根据&lt;strong&gt;过去的轨迹&lt;/strong&gt;和&lt;strong&gt;期望的回报&lt;/strong&gt;，直接预测&lt;strong&gt;下一个动作&lt;/strong&gt;？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：
强化学习 $\approx$ 在给定&lt;strong&gt;期望回报 (Target Return)&lt;/strong&gt; 条件下的&lt;strong&gt;行为克隆 (Conditional Behavior Cloning)&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;轨迹表示与 Return-to-Go&lt;/h2&gt;
&lt;p&gt;为了将 RL 问题转化为 Transformer 可以处理的序列问题，我们需要重新定义模型的输入。&lt;/p&gt;
&lt;h3&gt;轨迹 (Trajectory)&lt;/h3&gt;
&lt;p&gt;一条标准的 RL 轨迹由状态、动作和奖励组成：
$$ \tau = (s_1, a_1, r_1, s_2, a_2, r_2, \dots, s_T, a_T, r_T) $$&lt;/p&gt;
&lt;h3&gt;剩余回报 (Return-to-Go, RTG)&lt;/h3&gt;
&lt;p&gt;传统的 RL 使用即时奖励 $r_t$。但在做序列预测时，我们更关心“&lt;strong&gt;未来还能拿多少分&lt;/strong&gt;”。
定义 $t$ 时刻的 &lt;strong&gt;Return-to-Go (RTG)&lt;/strong&gt; $\hat{R}_t$ 为从当前时刻到回合结束的累积回报：
$$
\hat{R}&lt;em&gt;t = \sum&lt;/em&gt;{k=t}^T r_k
$$&lt;/p&gt;
&lt;h3&gt;模型的输入序列&lt;/h3&gt;
&lt;p&gt;DT 的核心创新在于将 RTG 作为一种&lt;strong&gt;条件 (Condition)&lt;/strong&gt; 输入给模型。
输入序列被组织为三元组的序列（K-V-Q 模式）：
$$
\tau_{input} = (\hat{R}_1, s_1, a_1, \hat{R}_2, s_2, a_2, \dots, \hat{R}_T, s_T, a_T)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：这就像是在告诉模型：“我现在状态是 $s_1$，我想在未来总共获得 $\hat{R}_1$ 分，请告诉我该做什么动作 $a_1$？”&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;网络架构&lt;/h2&gt;
&lt;p&gt;DT 直接使用了 &lt;strong&gt;GPT (Generative Pre-trained Transformer)&lt;/strong&gt; 的架构，即因果掩码 Transformer (Causal Transformer)。&lt;/p&gt;
&lt;h3&gt;嵌入层 (Embeddings)&lt;/h3&gt;
&lt;p&gt;由于 $R, s, a$ 的模态不同（标量、图像/向量、离散/连续），我们需要先将它们映射到同一个维度 $d$：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;状态嵌入&lt;/strong&gt;：CNN 或 MLP 处理 $s_t$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动作嵌入&lt;/strong&gt;：Embedding 层或 MLP 处理 $a_t$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回报嵌入&lt;/strong&gt;：MLP 处理 $\hat{R}_t$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间步嵌入 (Timestep Embedding)&lt;/strong&gt;：为了让模型知道当前处于轨迹的哪个阶段，额外加入一个可学习的时间位置编码。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;上下文窗口 (Context Window)&lt;/h3&gt;
&lt;p&gt;由于轨迹可能很长，Transformer 无法处理整个 Episode。DT 使用一个固定的上下文窗口 $K$（context length），只把最近的 $K$ 步输入模型：
$$
\text{Input}&lt;em&gt;t = [\hat{R}&lt;/em&gt;{t-K}, s_{t-K}, a_{t-K}, \dots, \hat{R}_t, s_t]
$$&lt;/p&gt;
&lt;h3&gt;预测目标&lt;/h3&gt;
&lt;p&gt;模型的目标是预测下一个 token。在 DT 中，我们主要关注预测&lt;strong&gt;动作&lt;/strong&gt; $a_t$。
$$
a_t = \text{DecisionTransformer}(\hat{R}&lt;em&gt;{t-K}, s&lt;/em&gt;{t-K}, a_{t-K}, \dots, \hat{R}_t, s_t)
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;训练与推断&lt;/h2&gt;
&lt;h3&gt;训练 (Training)&lt;/h3&gt;
&lt;p&gt;DT 的训练过程完全是&lt;strong&gt;监督学习 (Supervised Learning)&lt;/strong&gt;，不需要计算梯度，不需要贝尔曼误差，不需要目标网络。&lt;/p&gt;
&lt;p&gt;从离线数据集 $\mathcal{D}$ 中采样轨迹片段，最小化预测动作与真实动作的误差：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离散动作&lt;/strong&gt;：交叉熵损失 (Cross-Entropy Loss)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续动作&lt;/strong&gt;：均方误差 (MSE Loss)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\mathcal{L}(\theta) = \mathbb{E}&lt;em&gt;{\tau \sim \mathcal{D}} \left[ \sum&lt;/em&gt;{t=1}^T (a_t - \hat{a}_t)^2 \right]
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 注意&lt;/strong&gt;：虽然数据集中可能包含低分的轨迹（“臭棋”），但模型学习的是条件概率 $P(a_t | \hat{R}_t, s_t, \dots)$。也就是说，模型学会了“如果想要低分该怎么做”以及“如果想要高分该怎么做”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;推断 (Inference)&lt;/h3&gt;
&lt;p&gt;这是 DT 最神奇的地方。训练完成后，我们可以通过&lt;strong&gt;提示 (Prompting)&lt;/strong&gt; 来控制智能体。&lt;/p&gt;
&lt;p&gt;我们给智能体设定一个&lt;strong&gt;目标回报 (Target Return)&lt;/strong&gt; $\hat{R}_{target}$（通常设为数据集中最高分的那个回报，或者更高）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自回归生成过程&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;初始时刻 $t=1$&lt;/strong&gt;：输入 $(\hat{R}_{target}, s_1)$，模型输出动作 $a_1$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境交互&lt;/strong&gt;：执行 $a_1$，环境返回即时奖励 $r_1$ 和新状态 $s_2$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新目标&lt;/strong&gt;：既然已经拿到了 $r_1$，剩下的目标就要减去它：
$$ \hat{R}_2 = \hat{R}_1 - r_1 $$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下一时刻&lt;/strong&gt;：输入 $(\dots, \hat{R}_1, s_1, a_1, \hat{R}_2, s_2)$，预测 $a_2$。&lt;/li&gt;
&lt;li&gt;重复直至结束。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;理论对比：DT vs. CQL&lt;/h2&gt;
&lt;p&gt;为了理解 DT 的位置，我们将它与上一篇笔记中的 CQL 进行对比：&lt;/p&gt;
&lt;p&gt;| 维度 | Conservative Q-Learning (CQL) | Decision Transformer (DT) |
| :--- | :--- | :--- |
| &lt;strong&gt;核心范式&lt;/strong&gt; | &lt;strong&gt;动态规划 (DP)&lt;/strong&gt; | &lt;strong&gt;序列建模 (SL)&lt;/strong&gt; |
| &lt;strong&gt;学习目标&lt;/strong&gt; | 逼近最优价值函数 $Q^*(s,a)$ | 拟合条件分布 $P(a|\hat{R}, s)$ |
| &lt;strong&gt;训练方式&lt;/strong&gt; | 最小化贝尔曼误差 (TD Error) | 最大化动作似然 (Supervised) |
| &lt;strong&gt;OOD 处理&lt;/strong&gt; | 显式惩罚未知动作的 Q 值 (悲观主义) | 依靠 Transformer 的泛化能力 (无显式约束) |
| &lt;strong&gt;长时序信用分配&lt;/strong&gt; | 依靠 $Q$ 值的自举传播 (Bootstrapping) | 依靠 Attention 机制直接关联过去与未来 |
| &lt;strong&gt;优点&lt;/strong&gt; | 理论下界保证，擅长拼接轨迹 (Stitching) | 训练极其稳定，易于扩展，能够处理稀疏奖励 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Decision Transformer 的提出证明了：&lt;strong&gt;只要模型足够强（Transformer），强化学习可以被简化为监督学习。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它不需要复杂的 Actor-Critic 架构。&lt;/li&gt;
&lt;li&gt;它不需要处理“过高估计”等死板的数值问题。&lt;/li&gt;
&lt;li&gt;它通过 &lt;strong&gt;Return-to-Go&lt;/strong&gt; 实现了类似于“事后诸葛亮”的条件控制：利用这一局最终的得分作为条件，来学习这一局中的动作。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（19）：离线强化学习 (Offline RL)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-19</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-19</guid><description>数据驱动的强化学习：当不能与环境交互时，如何从静态数据集中学习？深度解析分布偏移 (Distribution Shift) 问题，以及 BCQ 和 CQL 算法的理论推导。</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的章节（DQN, SAC, DDPG）中，我们讨论的都是 &lt;strong&gt;在线 (Online)&lt;/strong&gt; 或 &lt;strong&gt;离线策略 (Off-Policy)&lt;/strong&gt; 算法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Online&lt;/strong&gt;: 边玩边学。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Off-Policy&lt;/strong&gt;: 可以利用之前的经验回放池（Replay Buffer），但仍然需要不断与环境交互来补充新数据，纠正价值估计。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;离线强化学习 (Offline RL)&lt;/strong&gt;，又称 Batch RL，面临的是一个更严苛的场景：
&lt;strong&gt;智能体完全不能与环境交互，只能从一个固定的、历史的数据集 $\mathcal{D}$ 中学习策略。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就像是“仅仅通过看别人下棋的棋谱（而且可能含有臭棋），就要学会成为棋圣”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;核心挑战：分布偏移 (Distribution Shift)&lt;/h2&gt;
&lt;p&gt;既然 Off-Policy 算法（如 SAC）可以使用 Replay Buffer，为什么不能直接把静态数据集 $\mathcal{D}$ 当作 Buffer 跑 SAC 呢？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;外推误差 (Extrapolation Error)&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;贝尔曼更新的陷阱&lt;/h3&gt;
&lt;p&gt;回顾 Q-Learning 的贝尔曼更新目标：
$$
\mathcal{T}Q(s, a) = r + \gamma \max_{a&apos;} Q(s&apos;, a&apos;)
$$
或者 Actor-Critic 中的：
$$
y = r + \gamma Q(s&apos;, \pi(s&apos;))
$$&lt;/p&gt;
&lt;p&gt;这里存在一个致命的 &lt;strong&gt;反事实查询 (Counterfactual Query)&lt;/strong&gt; 问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据集 $\mathcal{D}$ 是由行为策略 $\pi_\beta$ 产生的。&lt;/li&gt;
&lt;li&gt;我们学习的新策略 $\pi$ 通常会与 $\pi_\beta$ 不同（为了变得更好）。&lt;/li&gt;
&lt;li&gt;在计算目标值时，我们需要查询 $Q(s&apos;, \pi(s&apos;))$。&lt;/li&gt;
&lt;li&gt;如果 $\pi(s&apos;)$ 选出的动作 $a&apos;$ &lt;strong&gt;从未在数据集 $\mathcal{D}$ 中出现过&lt;/strong&gt;（OOD, Out-of-Distribution），Q 网络对这个从未见过的 $(s&apos;, a&apos;)$ 会输出什么？
&lt;ul&gt;
&lt;li&gt;根据神经网络的特性，它会输出一个随机的、无意义的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大化的诅咒&lt;/strong&gt;：由于 $\max$ 操作的存在，优化器会倾向于选择那些被&lt;strong&gt;错误高估&lt;/strong&gt;的 OOD 动作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误差传播&lt;/strong&gt;：这个高估的误差会通过贝尔曼方程回传，导致整个 Q 函数崩溃。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就是 &lt;strong&gt;分布偏移&lt;/strong&gt;：训练数据的分布 $(s, a) \sim \pi_\beta$ 与学习策略的分布 $(s, a) \sim \pi$ 不一致，导致 Q 值在未知区域严重高估。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;解决方案一：基于约束的方法 (BCQ)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BCQ (Batch-Constrained deep Q-learning)&lt;/strong&gt; 的思路非常直观：
既然 OOD 动作会导致 Q 值高估，那我就&lt;strong&gt;禁止智能体选择那些在数据集中没出现过的动作&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;理论推导&lt;/h3&gt;
&lt;p&gt;我们希望优化策略 $\pi$，使其在最大化 $Q$ 值的动作，同时满足它生成的动作分布接近行为策略 $\pi_\beta$：
$$
\pi(s) = \arg\max_{a} Q(s,a) \quad \text{s.t.} \quad P(a|s, \mathcal{D}) &gt; \tau
$$&lt;/p&gt;
&lt;h3&gt;算法实现逻辑&lt;/h3&gt;
&lt;p&gt;由于 $\pi_\beta$ 未知，BCQ 训练一个 &lt;strong&gt;生成模型 (VAE)&lt;/strong&gt; 来拟合数据集中的状态-动作分布。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生成 (Generation)&lt;/strong&gt;：使用 CVAE 根据状态 $s$ 生成一组“在该状态下可能出现过的”候选动作 ${a_1, \dots, a_n}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扰动 (Perturbation)&lt;/strong&gt;：训练一个扰动网络 $\xi_\phi(s,a)$，对生成的动作进行微调（在小范围内寻找更优解），得到 ${a_1+\xi_1, \dots, a_n+\xi_n}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择 (Selection)&lt;/strong&gt;：在这些动作中，选择 Q 值最大的那个作为最终输出。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 评价&lt;/strong&gt;：BCQ 是一种保守策略，它消除了外推误差，但也限制了策略的泛化能力（只能在见过的数据附近微调）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;解决方案二：基于价值的保守方法 (CQL)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CQL (Conservative Q-Learning)&lt;/strong&gt; 是目前理论最完备的 Offline RL 算法之一。
它的思路是：&lt;strong&gt;修改贝尔曼更新的目标函数，显式地惩罚 OOD 动作的 Q 值。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;目标函数设计&lt;/h3&gt;
&lt;p&gt;标准的贝尔曼误差是最小化 $\mathbb{E}_{(s,a)\sim\mathcal{D}} [(Q - \mathcal{T}Q)^2]$。
CQL 增加了一个正则项，用于&lt;strong&gt;最小化&lt;/strong&gt;策略 $\mu$（新策略）产生的动作的 Q 值，同时&lt;strong&gt;最大化&lt;/strong&gt;数据集 $\mathcal{D}$ 中动作的 Q 值：&lt;/p&gt;
&lt;p&gt;$$
\min_Q \alpha \left( \underbrace{\mathbb{E}&lt;em&gt;{s\sim\mathcal{D}, a\sim\mu(a|s)} [Q(s,a)]}&lt;/em&gt;{\text{压低 OOD 动作的 Q 值}} - \underbrace{\mathbb{E}&lt;em&gt;{s\sim\mathcal{D}, a\sim\pi&lt;/em&gt;\beta(a|s)} [Q(s,a)]}&lt;em&gt;{\text{拉高数据中动作的 Q 值}} \right) + \frac{1}{2} \mathbb{E}&lt;/em&gt;{\mathcal{D}} [(Q - \mathcal{B}^{\pi}Q)^2]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mu(a|s)$：可以是当前学习的策略，也可以是随机分布。&lt;/li&gt;
&lt;li&gt;通过这种“压低未知，拉高已知”，CQL 迫使 Q 函数在 OOD 区域产生低估。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;理论推导：Q 值下界 (Lower Bound)&lt;/h3&gt;
&lt;p&gt;CQL 的核心理论贡献在于证明了上述目标函数学习到的 Q 值 $\hat{Q}$ 是真实 Q 值 $Q^\pi$ 的&lt;strong&gt;下界&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;令 $\mathcal{B}^\pi$ 为贝尔曼算子。CQL 的不动点迭代可以近似写作：
$$
\hat{Q}_{k+1} \leftarrow \mathcal{B}^\pi \hat{Q}&lt;em&gt;k - \alpha (\mu - \pi&lt;/em&gt;\beta)
$$
(这里省略了复杂的采样误差项，仅关注期望行为)&lt;/p&gt;
&lt;p&gt;当 $\alpha$ 足够大时，可以证明：
$$
\mathbb{E}&lt;em&gt;{\pi(a|s)} [\hat{Q}(s,a)] \le \mathbb{E}&lt;/em&gt;{\pi(a|s)} [Q^\pi(s,a)]
$$&lt;/p&gt;
&lt;p&gt;这意味着 CQL 学习到的 Q 值是&lt;strong&gt;保守的 (Conservative)&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果策略想去一个未知区域，CQL 会告诉它：“那个地方 Q 值很低（哪怕实际上可能很高）”。&lt;/li&gt;
&lt;li&gt;因此，策略会倾向于留在数据覆盖的“安全区域”内。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;广义 CQL (Generalization)&lt;/h3&gt;
&lt;p&gt;对于连续动作空间，CQL 将第一项正则化改为 $\log\sum\exp$ 形式（Soft-max），以覆盖所有可能的动作：&lt;/p&gt;
&lt;p&gt;$$
\min_Q \alpha \mathbb{E}&lt;em&gt;{s \sim \mathcal{D}} \left[ \log \sum_a \exp(Q(s,a)) - \mathbb{E}&lt;/em&gt;{a \sim \pi_\beta}[Q(s,a)] \right] + \text{Bellman Error}
$$&lt;/p&gt;
&lt;p&gt;这等价于压低整个 Q 值函数的配分函数，确保没有任何一个 OOD 动作能由于外推误差而获得异常高的 Q 值。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结：从乐观到悲观&lt;/h2&gt;
&lt;p&gt;| 维度 | 在线/离线策略 RL (DQN/SAC) | 离线 RL (Offline RL) |
| :--- | :--- | :--- |
| &lt;strong&gt;心态&lt;/strong&gt; | &lt;strong&gt;乐观 (Optimistic)&lt;/strong&gt; | &lt;strong&gt;悲观 (Pessimistic) / 保守&lt;/strong&gt; |
| &lt;strong&gt;对待未知&lt;/strong&gt; | 未知动作 = 潜在的高回报 (探索红利) | 未知动作 = 潜在的风险 (外推误差) |
| &lt;strong&gt;核心算法&lt;/strong&gt; | $\max Q$ | $\max Q$ s.t. $a \in \mathcal{D}$ (BCQ)  $\min Q_{OOD}$ (CQL) |
| &lt;strong&gt;适用场景&lt;/strong&gt; | 模拟器、低成本试错环境 | 医疗、工业控制、自动驾驶 (试错成本极高) |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;离线强化学习的本质&lt;/strong&gt;：
在无法验证真伪的情况下，&lt;strong&gt;宁可错过（低估），不可做错（高估）。&lt;/strong&gt; 只有当数据充分证明某个策略好时，我们才敢信任它。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（18）：基于模型的策略优化 (MBPO)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-18</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-18</guid><description>Model-Based RL 的集大成者：深度解析 MBPO 的理论边界。从单调性保证到分支推演 (Branched Rollout)，论证如何通过控制推演步长来解决模型偏差带来的二次误差累积问题。</description><pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在强化学习的谱系中，存在一对矛盾：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model-Free (如 SAC)&lt;/strong&gt;：渐进性能好（能收敛到很高的分数），但样本效率极低（需要几百万次交互）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model-Based (如 Dyna)&lt;/strong&gt;：样本效率高（利用模型生成数据），但往往受限于&lt;strong&gt;模型偏差 (Model Bias)&lt;/strong&gt;，导致渐进性能较差。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;模型偏差的诅咒&lt;/strong&gt;在于：模型也是从数据中拟合出来的，它必然存在误差。当智能体在模型中进行长距离推演时，微小的误差会像滚雪球一样迅速放大（Compound Error），导致智能体在“虚构的完美世界”里表现很好，但在“残酷的现实世界”里一塌糊涂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MBPO (Model-Based Policy Optimization)&lt;/strong&gt; 的核心贡献在于它通过严格的理论推导，定量地分析了模型误差与策略性能的关系，并提出了一种&lt;strong&gt;分支推演 (Branched Rollout)&lt;/strong&gt; 机制，在保证单调提升的前提下，最大化地利用模型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;理论推导：回报差的上界&lt;/h2&gt;
&lt;p&gt;我们希望找到一个策略 $\pi$，最大化真实环境中的期望回报 $\eta[\pi]$。
但我们只能优化模型环境中的期望回报 $\hat{\eta}[\pi]$。
我们需要推导两者之间的误差上界，从而找到一个安全优化的 &lt;strong&gt;下界 (Lower Bound)&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;定义与假设&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;真实环境的状态转移分布：$p(s&apos;|s,a)$&lt;/li&gt;
&lt;li&gt;学习模型的状态转移分布：$\hat{p}(s&apos;|s,a)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型误差 $\epsilon_m$&lt;/strong&gt;：假设模型在分布上的最大误差是有界的（TV 散度）：
$$ \max_{s,a} D_{TV}(p(\cdot|s,a) || \hat{p}(\cdot|s,a)) \le \epsilon_m $$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;状态分布的差异&lt;/h3&gt;
&lt;p&gt;策略 $\pi$ 在真实动力学下的状态访问分布为 $\rho_\pi$，在模型动力学下的状态访问分布为 $\hat{\rho}&lt;em&gt;\pi$。
根据 &lt;em&gt;Simulation Lemma&lt;/em&gt;，两者之间的差异上界为：
$$
D&lt;/em&gt;{TV}(\rho_\pi || \hat{\rho}_\pi) \le \frac{\gamma \epsilon_m}{(1-\gamma)^2}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 警示&lt;/strong&gt;：注意这里的 $(1-\gamma)^2$。这意味着状态分布的误差是随着时间视界（Horizon）&lt;strong&gt;二次方&lt;/strong&gt;增长的。这就是为什么在传统 Model-Based RL 中，长距离推演会导致极其严重的偏差。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;真实回报与模型回报的差异&lt;/h3&gt;
&lt;p&gt;基于上述状态分布差异，我们可以推导出真实回报 $\eta[\pi]$ 与模型回报 $\hat{\eta}[\pi]$ 的差值上界：
$$
\left| \eta[\pi] - \hat{\eta}[\pi] \right| \le 2 r_{\max} \frac{\gamma \epsilon_m}{(1-\gamma)^2}
$$&lt;/p&gt;
&lt;p&gt;这个上界告诉我们：如果我们只是简单地训练一个模型，然后在模型里从头跑到尾（Full Rollout）来训练策略，那么真实性能和模型性能的差距可能会非常大，优化 $\hat{\eta}$ 并不代表能提升 $\eta$。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;核心突破：分支推演 (Branched Rollout)&lt;/h2&gt;
&lt;p&gt;为了打破上述的“二次方误差诅咒”，MBPO 提出改变推演的方式。&lt;/p&gt;
&lt;h3&gt;什么是分支推演？&lt;/h3&gt;
&lt;p&gt;传统的 Dyna 风格是从初始状态 $s_0$ 开始，一直推演到 $s_T$。
MBPO 的 &lt;strong&gt;$k$-步分支推演&lt;/strong&gt; 是：
从策略在&lt;strong&gt;真实环境&lt;/strong&gt;中访问过的状态分布 $\mathcal{D}_{\text{env}}$ 中采样一个状态 $s$，作为推演的起点，然后仅在模型中推演 $k$ 步。&lt;/p&gt;
&lt;h3&gt;修正后的误差边界&lt;/h3&gt;
&lt;p&gt;在 $k$-步分支推演下，回报差的上界被显著收紧了：
$$
\left| \eta[\pi] - \hat{\eta}&lt;em&gt;k[\pi] \right| \le 2 r&lt;/em&gt;{\max} \left[ \frac{\gamma^{k+1} \epsilon_\pi}{(1-\gamma)^2} + \frac{\gamma^k \epsilon_m}{1-\gamma} + \frac{k}{1-\gamma}\epsilon_m \right]
$$
&lt;em&gt;(注：公式略作简化以直观展示核心项)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;关键在于最后一项 $\frac{k}{1-\gamma}\epsilon_m$。
这表明：&lt;strong&gt;在分支推演下，模型误差 $\epsilon_m$ 对总回报误差的贡献是随 $k$ 线性增长的，而不是二次方增长。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;$k$ 的权衡 (Trade-off)&lt;/h3&gt;
&lt;p&gt;这个理论边界揭示了超参数 $k$ 的物理意义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当 $k$ 很小时&lt;/strong&gt;：误差界很紧（线性），我们可以放心地信任模型数据。但是模型能提供的“远见”有限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当 $k$ 很大时&lt;/strong&gt;：误差界变松（趋向二次方），模型偏差开始主导，导致策略性能下降。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，MBPO 动态调整 $k$：在训练初期模型不准时，$k=1$；随着模型精度提高，逐渐增加 $k$（通常从 1 增加到 15 左右），在保证偏差可控的前提下最大化利用模型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;算法架构设计&lt;/h2&gt;
&lt;p&gt;MBPO 的实现是围绕上述理论构建的，由三个核心模块组成。&lt;/p&gt;
&lt;h3&gt;概率模型集成 (Ensemble of Probabilistic Models)&lt;/h3&gt;
&lt;p&gt;为了准确估计模型误差并防止过拟合，MBPO 训练一组（如 7 个）高斯概率网络。
$$ \hat{p}&lt;em&gt;\theta(s&apos;|s,a) = \mathcal{N}(\mu&lt;/em&gt;\theta(s,a), \Sigma_\theta(s,a)) $$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不确定性感知&lt;/strong&gt;：预测时随机从集成模型中选择一个成员，这模拟了贝叶斯后验采样，能够捕捉&lt;strong&gt;认知不确定性 (Epistemic Uncertainty)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;混合策略优化 (Model-Based Policy Optimization)&lt;/h3&gt;
&lt;p&gt;MBPO 使用 &lt;strong&gt;SAC (Soft Actor-Critic)&lt;/strong&gt; 作为底层的策略优化器。
为了克服模型偏差，SAC 的训练数据由两部分组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;真实数据 $\mathcal{D}_{\text{env}}$&lt;/strong&gt;：占比很小（如 5%）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型数据 $\mathcal{D}_{\text{model}}$&lt;/strong&gt;：由分支推演产生的海量数据，占比很大（如 95%）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;算法流程 (伪代码)&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize policy } \pi_\phi, \text{ ensemble models } {p_{\theta_1}, \dots, p_{\theta_B}} \
&amp;#x26; \bullet ; \text{Initialize empty buffers } \mathcal{D}&lt;em&gt;{\text{env}}, \mathcal{D}&lt;/em&gt;{\text{model}} \
&amp;#x26; \bullet ; \textbf{For } N \text{ epochs} \textbf{ do}: \
&amp;#x26; \bullet \qquad \textbf{1. Collect Real Data (Exploration)} \
&amp;#x26; \bullet \qquad \text{Rollout policy in real environment, add transitions to } \mathcal{D}&lt;em&gt;{\text{env}} \
&amp;#x26; \bullet \qquad \textbf{2. Train Models (Supervised Learning)} \
&amp;#x26; \bullet \qquad \text{Train ensemble } {p&lt;/em&gt;\theta} \text{ on } \mathcal{D}&lt;em&gt;{\text{env}} \text{ via Max Likelihood} \
&amp;#x26; \bullet \qquad \textbf{3. Branched Rollout (Data Augmentation)} \
&amp;#x26; \bullet \qquad \text{Sample states } s \sim \mathcal{D}&lt;/em&gt;{\text{env}} \
&amp;#x26; \bullet \qquad \text{Rollout } k \text{ steps using models, add to } \mathcal{D}&lt;em&gt;{\text{model}} \
&amp;#x26; \bullet \qquad \textbf{4. Policy Optimization (SAC)} \
&amp;#x26; \bullet \qquad \textbf{For } G \text{ gradient steps} \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Sample batch } B \text{ from } \mathcal{D}&lt;/em&gt;{\text{env}} \cup \mathcal{D}&lt;em&gt;{\text{model}} \text{ (e.g., 95% model data)} \
&amp;#x26; \bullet \qquad \qquad \text{Update } \pi&lt;/em&gt;\phi, Q_\psi \text{ using SAC loss} \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结：MBPO 的启示&lt;/h2&gt;
&lt;p&gt;MBPO 是 Model-Based RL 的一个转折点，它通过理论证明回答了**“我们该多大程度信任模型？”**这个问题。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单调性保证&lt;/strong&gt;：通过限制推演步长 $k$，MBPO 将模型误差控制在线性增长范围内，从而保证了策略改进的单调性（类似 TRPO 的 Trust Region 思想，但应用在 Rollout Length 上）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据增强&lt;/strong&gt;：MBPO 本质上是把学到的模型当作一个&lt;strong&gt;超级数据增强器&lt;/strong&gt;。它从有限的真实数据出发，通过短步推演，扩散出海量的虚拟数据供 SAC 训练。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果&lt;/strong&gt;：MBPO 在 MuJoCo 等基准测试中，以 1/10 甚至更少的样本量，达到了与 SAC 相当的渐进性能，打破了“Model-Based 也就是学得快但分不高”的刻板印象。&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>Paper Reading: VLM 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-vlm1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-vlm1</guid><description>从零开始的VLM研究生活。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;浅浅学习一下VLM相关的知识。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/dst-1.86u4d7doms.webp"/><enclosure url="https://pic.hana0721.top/dst-1.86u4d7doms.webp"/></item><item><title>Paper Reading: VLM 2</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-vlm2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-vlm2</guid><description>从零开始的VLM研究生活。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;浅浅学习一下VLM相关的知识。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/dst-1.86u4d7doms.webp"/><enclosure url="https://pic.hana0721.top/dst-1.86u4d7doms.webp"/></item><item><title>Paper Reading: Basic Method 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-bm1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-bm1</guid><description>从基础开始吧！</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;这里主要是一些比较基础性的文章。&lt;/p&gt;
&lt;h2&gt;VAE&lt;/h2&gt;
&lt;h2&gt;Transformer&lt;/h2&gt;
&lt;h2&gt;Diffusion&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/ppp1.szf66edwc.webp"/><enclosure url="https://pic.hana0721.top/ppp1.szf66edwc.webp"/></item><item><title>Paper Reading: CV 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-cv1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-cv1</guid><description>浅度一些视觉相关的工作</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;这里主要是一些比较基础性的文章。&lt;/p&gt;
&lt;h2&gt;AlexNet&lt;/h2&gt;
&lt;h2&gt;VGG&lt;/h2&gt;
&lt;h2&gt;ResNet&lt;/h2&gt;
&lt;h2&gt;PointNet&lt;/h2&gt;
&lt;h2&gt;PointNet++&lt;/h2&gt;
&lt;h2&gt;VGGT&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/xiaozha-yuki.13m9ao1ccd.webp"/><enclosure url="https://pic.hana0721.top/xiaozha-yuki.13m9ao1ccd.webp"/></item><item><title>Paper Reading: Embodied AI 3</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-eba3</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-eba3</guid><description>从零开始的Embodied AI研究生活。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;import { ManualTOC } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;ManualTOC
title=&apos;&apos;
categories={[
{
title: &apos;Embodied AI Paper Reading&apos;,
items: [
{
title: &apos;Batch 1&apos;,
href: &apos;/blog/paper-reading-eba1&apos;,
order: &apos;1&apos;
},
{
title: &apos;Batch 2&apos;,
href: &apos;/blog/paper-reading-eba2&apos;,
order: &apos;2&apos;
},
{
title: &apos;Batch 3&apos;,
href: &apos;/blog/paper-reading-eba3&apos;,
order: &apos;3&apos;
},
{
title: &apos;Batch 4&apos;,
href: &apos;/blog/paper-reading-eba4&apos;,
order: &apos;4&apos;
}
]
}
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;RL菜鸡开始进军Embodied AI，慢慢积累，提升自己。&lt;/p&gt;
&lt;h2&gt;RoboVerse&lt;/h2&gt;
&lt;h2&gt;AgiBot World Colosseo&lt;/h2&gt;
&lt;h2&gt;UniVLA&lt;/h2&gt;
&lt;h2&gt;GraspVLA&lt;/h2&gt;
&lt;h2&gt;GRAPE&lt;/h2&gt;
&lt;h2&gt;A0&lt;/h2&gt;
&lt;h2&gt;OneTwoVLA&lt;/h2&gt;
&lt;h2&gt;RDT-1B&lt;/h2&gt;
&lt;h2&gt;Octo&lt;/h2&gt;
&lt;h2&gt;FAST&lt;/h2&gt;
&lt;h2&gt;Magma&lt;/h2&gt;
&lt;h2&gt;ChatVLA&lt;/h2&gt;
&lt;h2&gt;ChatVLA-2&lt;/h2&gt;
&lt;h2&gt;RoboBrain&lt;/h2&gt;
&lt;h2&gt;CoT-VLA&lt;/h2&gt;
&lt;h2&gt;Interleave-VLA&lt;/h2&gt;
&lt;h2&gt;Knowledge Insulating Vision-Language-Action Models&lt;/h2&gt;
&lt;h2&gt;Hi Robot&lt;/h2&gt;
&lt;h2&gt;Scenethesis&lt;/h2&gt;
&lt;h2&gt;LBM&lt;/h2&gt;
&lt;h2&gt;UniVLA&lt;/h2&gt;
&lt;h2&gt;SmolVLA&lt;/h2&gt;
&lt;h2&gt;ThinkAct&lt;/h2&gt;
&lt;h2&gt;VIDAR&lt;/h2&gt;
&lt;h2&gt;DreamVLA&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>Paper Reading: Embodied AI 4</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-eba4</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-eba4</guid><description>从零开始的Embodied AI研究生活。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;import { ManualTOC } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;ManualTOC
title=&apos;&apos;
categories={[
{
title: &apos;Embodied AI Paper Reading&apos;,
items: [
{
title: &apos;Batch 1&apos;,
href: &apos;/blog/paper-reading-eba1&apos;,
order: &apos;1&apos;
},
{
title: &apos;Batch 2&apos;,
href: &apos;/blog/paper-reading-eba2&apos;,
order: &apos;2&apos;
},
{
title: &apos;Batch 3&apos;,
href: &apos;/blog/paper-reading-eba3&apos;,
order: &apos;3&apos;
},
{
title: &apos;Batch 4&apos;,
href: &apos;/blog/paper-reading-eba4&apos;,
order: &apos;4&apos;
}
]
}
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;RL菜鸡开始进军Embodied AI，慢慢积累，提升自己。&lt;/p&gt;
&lt;h2&gt;4D-VLA&lt;/h2&gt;
&lt;h2&gt;D(R,O) Grasp&lt;/h2&gt;
&lt;h2&gt;Fast-in-Slow&lt;/h2&gt;
&lt;h2&gt;NavDP&lt;/h2&gt;
&lt;h2&gt;Nav $A^3$&lt;/h2&gt;
&lt;h2&gt;StreamVLN&lt;/h2&gt;
&lt;h2&gt;V-JEPA 2&lt;/h2&gt;
&lt;h2&gt;MolmoAct&lt;/h2&gt;
&lt;h2&gt;MimicGen&lt;/h2&gt;
&lt;h2&gt;SpatialVLA&lt;/h2&gt;
&lt;h2&gt;TraceVLA&lt;/h2&gt;
&lt;h2&gt;Hume&lt;/h2&gt;
&lt;h2&gt;RICL&lt;/h2&gt;
&lt;h2&gt;OmniVTLA&lt;/h2&gt;
&lt;h2&gt;Spatial Traces&lt;/h2&gt;
&lt;h2&gt;Embodied-R1&lt;/h2&gt;
&lt;h2&gt;RynnEC&lt;/h2&gt;
&lt;h2&gt;RoboRefer&lt;/h2&gt;
&lt;h2&gt;Discrete Diffusion VLA&lt;/h2&gt;
&lt;h2&gt;G0&lt;/h2&gt;
&lt;h2&gt;InternScenes&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>Paper Reading: MARL 1</title><link>https://vercel.cloudinwind4132.top/blog/paper-reading-marl1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/paper-reading-marl1</guid><description>回来吧MARL，我最骄傲的信仰。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;博主制作这篇博客时，已弃坑MARL，仅留作纪念，怀念最初的感觉。&lt;/p&gt;
&lt;h2&gt;VDN&lt;/h2&gt;
&lt;h2&gt;QMIX&lt;/h2&gt;
&lt;h2&gt;Qatten&lt;/h2&gt;
&lt;h2&gt;QTRAN&lt;/h2&gt;
&lt;h2&gt;QPLEX&lt;/h2&gt;
&lt;h2&gt;RQN&lt;/h2&gt;
&lt;h2&gt;GraphMix&lt;/h2&gt;
&lt;h2&gt;Weighted QMIX&lt;/h2&gt;
&lt;h2&gt;MAVEN&lt;/h2&gt;
&lt;h2&gt;HAPPO&lt;/h2&gt;
&lt;h2&gt;MAT&lt;/h2&gt;
&lt;h2&gt;RODE&lt;/h2&gt;
&lt;h2&gt;EMC&lt;/h2&gt;
&lt;h2&gt;EMU&lt;/h2&gt;
&lt;h2&gt;HPN&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top/basic-algorithm.lw77gyrtm.webp"/><enclosure url="https://pic.hana0721.top/basic-algorithm.lw77gyrtm.webp"/></item><item><title>RL笔记（17）：模型预测控制 (MPC)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-17</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-17</guid><description>在已知环境模型的情况下，如何高效规划？详解模型预测控制 (MPC) 的原理：预测未来、滚动优化与MPC-SAC。</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，我们探讨了&lt;strong&gt;无模型 (Model-Free)&lt;/strong&gt; 算法（如 Q-Learning, PPO, SAC）如何通过试错学习。我们也初步接触了&lt;strong&gt;基于模型 (Model-Based)&lt;/strong&gt; 的 Dyna-Q，它通过学习环境模型来生成模拟数据辅助学习。&lt;/p&gt;
&lt;p&gt;今天我们深入 Model-Based RL 的另一个重要分支：&lt;strong&gt;模型预测控制 (Model Predictive Control, MPC)&lt;/strong&gt;。
MPC 的核心优势在于，它&lt;strong&gt;直接利用环境模型进行前向规划&lt;/strong&gt;，像一个经验丰富的棋手一样“预判”未来，然后根据预测结果做出当前最优的决策。&lt;/p&gt;
&lt;p&gt;MPC 不仅仅是生成模拟数据（像 Dyna-Q），它是在每一个状态下，都&lt;strong&gt;重新规划&lt;/strong&gt;一次未来的动作序列。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MPC 的核心思想&lt;/h2&gt;
&lt;p&gt;MPC 是一种控制策略，它假设我们拥有一个精确的环境模型 $M(s,a) \to (r, s&apos;)$。&lt;/p&gt;
&lt;h3&gt;预测与规划 (Prediction &amp;#x26; Planning)&lt;/h3&gt;
&lt;p&gt;在当前状态 $s_t$，MPC 并不直接选择一个动作。而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预测未来&lt;/strong&gt;：假设从当前状态 $s_t$ 开始，执行一系列动作 $\pi = {a_t, a_{t+1}, \dots, a_{t+H}}$（称为&lt;strong&gt;预测时域 (Prediction Horizon)&lt;/strong&gt; $H$）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模拟轨迹&lt;/strong&gt;：利用模型 $M$，模拟出这一系列动作可能产生的轨迹及其累积奖励。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化规划&lt;/strong&gt;：找到能最大化累积奖励的动作序列 $\pi^*$。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;滚动优化 (Rolling Optimization)&lt;/h3&gt;
&lt;p&gt;MPC 的决策过程是&lt;strong&gt;滚动&lt;/strong&gt;的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在状态 $s_t$，MPC 找到最优动作序列 $\pi^* = {a_t^&lt;em&gt;, a_{t+1}^&lt;/em&gt;, \dots, a_{t+H}^*}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只执行第一个动作 $a_t^*$&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;智能体进入新状态 $s_{t+1}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新规划&lt;/strong&gt;：基于新的状态 $s_{t+1}$，重复步骤 1-3。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉&lt;/strong&gt;：
MPC 就像一个有预见性的决策者。它不会一次性把所有步骤都定死，而是每走一步，都根据当前情况重新规划下一步的最佳路径。这使得它能很好地应对环境变化。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;MPC 与强化学习的结合&lt;/h2&gt;
&lt;p&gt;MPC 本身是一种控制方法，如何与 RL 结合呢？&lt;/p&gt;
&lt;h3&gt;学习模型&lt;/h3&gt;
&lt;p&gt;在 Model-Based RL 中，我们首先需要学习一个环境模型 $M_\theta$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;监督学习&lt;/strong&gt;：用收集到的真实数据 $(s, a, r, s&apos;)$ 来训练模型。
&lt;ul&gt;
&lt;li&gt;预测奖励：$r \approx R_\phi(s,a)$&lt;/li&gt;
&lt;li&gt;预测状态：$s&apos; \approx M_\theta(s,a)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型类型&lt;/strong&gt;：可以是&lt;strong&gt;概率模型&lt;/strong&gt;（如 PETS 使用的概率 GP 回归）来估计模型的不确定性，也可以是确定性模型（如简单的神经网络）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MPC 规划&lt;/h3&gt;
&lt;p&gt;一旦有了模型 $M_\theta$，就可以进行规划：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在当前状态 $s_t$，MPC 在所有可能的 $H$ 步动作序列中搜索，找到能最大化模拟累积奖励的序列 $\pi^* = {a_t^&lt;em&gt;, a_{t+1}^&lt;/em&gt;, \dots, a_{t+H}^*}$。&lt;/li&gt;
&lt;li&gt;执行 $a_t^*$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优化策略&lt;/h3&gt;
&lt;p&gt;MPC 产生的动作序列 $\pi^&lt;em&gt;$ 本身就可以看作是当前状态下的一个“策略”。我们可以用标准的 RL 算法（如 PPO, SAC）来优化**生成这个 $\pi^&lt;/em&gt;$ 的参数**。&lt;/p&gt;
&lt;p&gt;例如，&lt;strong&gt;MPC-SAC&lt;/strong&gt; 的做法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;训练一个模型&lt;/strong&gt; $M_\theta$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练 Actor-Critic&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;Critic 学习 $Q$ 值。&lt;/li&gt;
&lt;li&gt;Actor 学习策略 $\pi_\phi$。&lt;/li&gt;
&lt;li&gt;在 Actor 的更新时，&lt;strong&gt;使用 MPC 规划 $H$ 步&lt;/strong&gt;，获得更准确的奖励信号来更新 Actor。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;PETS 算法示例 (Probabilistic Embeded Trajectory Sampling)&lt;/h2&gt;
&lt;p&gt;PETS 是一个经典的 Model-Based RL 算法，它使用了&lt;strong&gt;概率模型&lt;/strong&gt;来处理模型不确定性。&lt;/p&gt;
&lt;h3&gt;概率模型&lt;/h3&gt;
&lt;p&gt;PETS 使用&lt;strong&gt;高斯过程 (Gaussian Process, GP)&lt;/strong&gt; 或其他概率模型来学习奖励函数 $R_\phi$ 和状态转移函数 $M_\theta$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：GP 不仅能给出预测值，还能给出预测的&lt;strong&gt;不确定性&lt;/strong&gt;（方差）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;采样与规划&lt;/h3&gt;
&lt;p&gt;在 MPC 规划时，PETS 会从学到的概率模型中&lt;strong&gt;采样&lt;/strong&gt;多条可能的未来轨迹。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果模型预测某一步不确定性很高（方差大），意味着未来可能有很多种情况，MPC 会倾向于选择风险更小的路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;策略学习&lt;/h3&gt;
&lt;p&gt;PETS 也会用学习到的模型和规划结果来训练一个 Actor-Critic 策略。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MPC 的优势与劣势&lt;/h2&gt;
&lt;h3&gt;优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高样本效率&lt;/strong&gt;：通过模型可以“预演”大量场景，大大减少与真实环境的交互次数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可解释性&lt;/strong&gt;：模型可以被检查，知道智能体为什么这么规划。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;：在规划时可以预见潜在的危险状态，并加以避免。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;劣势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型偏差 (Model Bias)&lt;/strong&gt;：这是 Model-Based 方法的软肋。如果模型不准确，规划的结果可能完全错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算成本&lt;/strong&gt;：MPC 规划本身需要大量的计算，尤其是在动作空间连续、预测时域长的情况下。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;MPC 提供了一种强大的在&lt;strong&gt;已知模型&lt;/strong&gt;下进行序列决策的方法。它通过向前看（预测）和滚动优化，能够做出比直接 RL 更明智的决策。
将 MPC 与 RL 结合，是 Model-Based RL 的重要研究方向，其目标是学好模型，并用好模型，从而以最高的样本效率解决复杂任务。&lt;/p&gt;
&lt;p&gt;我们之前的笔记主要聚焦于 Model-Free 方法（Q-Learning, REINFORCE, PPO, SAC）。Model-Based 方法（Dyna-Q, MPC）提供了另一种思路，它们往往在样本效率上具有优势，但在模型精度要求上较高。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（16）：模仿学习 (Imitation Learning)</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-16</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-16</guid><description>没有奖励函数怎么办？详解模仿学习的三大流派：行为克隆 (BC) 的简单粗暴与局限、逆强化学习 (IRL) 的理论推导，以及生成式对抗模仿学习 (GAIL) 的对抗博弈思想。</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在传统的强化学习中，智能体通过最大化累积奖励来学习。然而，在很多复杂任务中，“定义奖励”比“解决任务”本身还要难。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：自动驾驶。你很难用数学公式精确定义什么叫“开得稳且安全”。但是，我们可以很容易地收集到人类老司机的驾驶数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;模仿学习 (Imitation Learning)&lt;/strong&gt; 的目标是：给定一组专家演示数据 $\tau_E = {(s_1, a_1), (s_2, a_2), \dots }$，训练一个策略 $\pi_\theta$，使其行为尽可能接近专家策略 $\pi_E$。&lt;/p&gt;
&lt;p&gt;我们不需要知道背后的奖励函数是什么，只需要“照猫画虎”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;行为克隆 (Behavioral Cloning, BC)&lt;/h2&gt;
&lt;p&gt;这是最简单、最直观的模仿学习方法。&lt;/p&gt;
&lt;h3&gt;核心思想&lt;/h3&gt;
&lt;p&gt;把模仿学习看作一个&lt;strong&gt;监督学习 (Supervised Learning)&lt;/strong&gt; 问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：状态 $s$（特征）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标签&lt;/strong&gt;：动作 $a$（专家在 $s$ 下做的动作）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们的目标是训练一个分类器（离散动作）或回归器（连续动作）$\pi_\theta(s)$，使其输出拟合专家的动作。&lt;/p&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;使用最大似然估计 (MLE)：
$$
\max_\theta \mathbb{E}&lt;em&gt;{(s,a) \sim \pi_E} [\log \pi&lt;/em&gt;\theta(a|s)]
$$
即最小化负对数似然损失：
$$
L(\theta) = - \sum_{i=1}^N \log \pi_\theta(a_i|s_i)
$$&lt;/p&gt;
&lt;h3&gt;局限性：协变量偏移 (Covariate Shift)&lt;/h3&gt;
&lt;p&gt;虽然 BC 简单有效，但它有一个致命弱点：&lt;strong&gt;误差累积&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;训练分布&lt;/strong&gt;：策略是在专家访问过的状态 $s \sim P(\pi_E)$ 上训练的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试分布&lt;/strong&gt;：在实际运行时，策略 $\pi_\theta$ 可能会犯一点小错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;恶性循环&lt;/strong&gt;：这一点小错会导致智能体进入一个&lt;strong&gt;专家从未去过&lt;/strong&gt;的状态（Out-of-Distribution）。在这种陌生状态下，BC 策略可能会胡乱行动，导致更大的错误，最终迅速偏离轨道（比如自动驾驶车偏离一点点后，不知道怎么修回去，直接冲出跑道）。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 总结&lt;/strong&gt;：BC 只是单纯地拟合动作，而不理解“为什么要这么做”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;逆强化学习 (Inverse RL, IRL)&lt;/h2&gt;
&lt;p&gt;为了解决 BC 的问题，IRL 提出了一个更深层的思路：&lt;strong&gt;专家之所以这么做，是因为他在最大化某个未知的奖励函数 $R$。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果我们能把这个 $R$ 反推（Inverse）出来，再用标准的 RL 算法（如 PPO/SAC）去最大化这个 $R$，不就能学会专家的策略了吗？&lt;/p&gt;
&lt;h3&gt;核心流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;假设&lt;/strong&gt;：存在一个参数化的奖励函数 $R_\phi(s,a)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：找到参数 $\phi$，使得在该奖励函数下，专家的轨迹获得的累积回报高于其他任何策略。
$$ \mathbb{E}&lt;em&gt;{\pi_E} [R&lt;/em&gt;\phi] \ge \mathbb{E}&lt;em&gt;{\pi} [R&lt;/em&gt;\phi] $$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内层循环&lt;/strong&gt;：给定当前的 $R_\phi$，通过 RL 训练一个最优策略 $\pi^*$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外层循环&lt;/strong&gt;：更新 $R_\phi$，使得专家轨迹和 $\pi^*$ 轨迹的差距变大（让专家得分更高）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;难点&lt;/h3&gt;
&lt;p&gt;IRL 是一个&lt;strong&gt;不适定 (Ill-posed)&lt;/strong&gt; 问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;很多奖励函数都能解释同一种行为（例如：如果 $R=0$，任何策略都是最优的）。&lt;/li&gt;
&lt;li&gt;因此，IRL 通常需要引入&lt;strong&gt;最大熵 (Maximum Entropy)&lt;/strong&gt; 假设：在所有能解释专家行为的奖励函数中，选择那个对策略分布约束最少（熵最大）的。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 总结&lt;/strong&gt;：IRL 试图理解专家的“动机”。但它计算极其昂贵，因为每更新一次奖励函数，就要重新跑一遍完整的 RL 训练。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;生成式对抗模仿学习 (GAIL)&lt;/h2&gt;
&lt;p&gt;Ho &amp;#x26; Ermon (2016) 证明了：&lt;strong&gt;我们其实不需要显式地把奖励函数 $R$ 恢复出来。&lt;/strong&gt;
如果我们直接训练一个策略，让它的状态-动作分布 $\rho_\pi(s,a)$ 和专家的分布 $\rho_E(s,a)$ 难以区分，不就达到目的了吗？&lt;/p&gt;
&lt;p&gt;这正是 &lt;strong&gt;GAN (生成对抗网络)&lt;/strong&gt; 的思想。&lt;/p&gt;
&lt;h3&gt;核心架构&lt;/h3&gt;
&lt;p&gt;GAIL 包含两个网络进行博弈：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;判别器 (Discriminator) $D_w(s,a)$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;任务是&lt;strong&gt;找茬&lt;/strong&gt;。它接收一个 $(s,a)$ 对，判断这是&lt;strong&gt;专家&lt;/strong&gt;产生的（输出 1），还是&lt;strong&gt;智能体&lt;/strong&gt;产生的（输出 0）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成器 (Generator) $\pi_\theta(a|s)$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;即我们的策略网络。任务是&lt;strong&gt;欺骗&lt;/strong&gt;判别器，让自己的行为看起来像专家。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;GAIL 的优化目标与 GAN 几乎一致：
$$
\min_\pi \max_D V(\pi, D) = \mathbb{E}&lt;em&gt;{\pi_E}[\log D(s,a)] + \mathbb{E}&lt;/em&gt;{\pi}[\log(1 - D(s,a))]
$$&lt;/p&gt;
&lt;h3&gt;训练流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;训练判别器 $D$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;采样专家数据 $(s_E, a_E)$ 和 智能体数据 $(s_\pi, a_\pi)$。&lt;/li&gt;
&lt;li&gt;让 $D(s_E, a_E) \to 1$，让 $D(s_\pi, a_\pi) \to 0$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练策略 $\pi$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;我们使用 $D$ 的输出作为一种&lt;strong&gt;替代奖励 (Surrogate Reward)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;定义奖励函数：$r(s,a) = - \log(1 - D(s,a))$ （或者其他变体，如 $\log D(s,a)$）。&lt;/li&gt;
&lt;li&gt;如果 $D$ 认为当前动作像专家（$D \approx 1$），奖励就高；不像专家，奖励就低。&lt;/li&gt;
&lt;li&gt;使用 PPO 或 TRPO 来最大化这个奖励。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决了 Covariate Shift&lt;/strong&gt;：因为 $\pi$ 是在环境中交互训练的（RL），遇到偏离的状态时，判别器会给低分，RL 算法会学会如何修正回到正轨。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率高&lt;/strong&gt;：不需要像 IRL 那样反复求解最优策略，策略和判别器是同步更新的。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结与对比&lt;/h2&gt;
&lt;p&gt;| 维度 | 行为克隆 (BC) | 逆强化学习 (IRL) | 生成对抗模仿 (GAIL) |
| :--- | :--- | :--- | :--- |
| &lt;strong&gt;核心思想&lt;/strong&gt; | &lt;strong&gt;监督学习&lt;/strong&gt;：拟合 $s \to a$ 映射 | &lt;strong&gt;逆向推理&lt;/strong&gt;：反推 $R(s,a)$ | &lt;strong&gt;对抗博弈&lt;/strong&gt;：让分布 $\rho_\pi \approx \rho_E$ |
| &lt;strong&gt;交互需求&lt;/strong&gt; | 不需要与环境交互 (Offline) | 需要 (Online) | 需要 (Online) |
| &lt;strong&gt;奖励函数&lt;/strong&gt; | 无 | 显式学出 $R$ | 隐式奖励 ($D$ 的输出) |
| &lt;strong&gt;优点&lt;/strong&gt; | 简单、训练快 | 可解释性强、鲁棒 | 效果好、无需解内层 RL 循环 |
| &lt;strong&gt;缺点&lt;/strong&gt; | 误差累积 (Covariate Shift) | 计算极其昂贵 | 训练不稳定 (GAN 通病) |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 思考&lt;/strong&gt;：
如果专家的数据也不是完美的（比如偶尔手滑），BC 会傻傻地把错误也学进去，而 IRL/GAIL 由于有奖励函数的平滑作用，通常能学出比专家更好的策略。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/><enclosure url="https://pic.hana0721.top/rl-note-3.3yex1xdpri.webp"/></item><item><title>RL笔记（15）：SAC</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-15</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-15</guid><description>深入解析 Soft Actor-Critic (SAC)：从最大熵原理出发，详细推导 Soft 策略迭代与收敛性证明，并解析重参数化技巧与自动熵调节等关键实现细节。</description><pubDate>Wed, 24 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Soft Actor-Critic (SAC)&lt;/strong&gt; 是一种基于最大熵强化学习的 &lt;strong&gt;Off-Policy（离线策略）&lt;/strong&gt; 算法，于 2018 年提出。
SAC 的前身是 Soft Q-learning (SQL)。相比于 SQL 需要复杂的采样过程，SAC 引入了 Actor-Critic 架构，使其训练更加稳定且高效。SAC 在各类 Benchmark 及真实机器人任务中表现出色，以其&lt;strong&gt;极强的抗干扰能力&lt;/strong&gt;和&lt;strong&gt;对超参数的鲁棒性&lt;/strong&gt;著称，是现代深度强化学习的基石算法之一。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;最大熵强化学习 (Maximum Entropy RL)&lt;/h2&gt;
&lt;h3&gt;熵的定义&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;熵 (Entropy)&lt;/strong&gt; 表示对一个随机变量的随机程度的度量。如果 $X$ 是一个随机变量，它的概率密度记为 $p$，那么它的熵 $H$ 定义为：
$$
\begin{align}
H(X)&amp;#x26;=\mathbb{E}&lt;em&gt;{x\sim p}[-\log p(x)]\notag \
&amp;#x26;=-\int&lt;/em&gt;{x}p(x)\log p(x) \mathrm{d}x \notag
\end{align}
$$
在强化学习中，可以使用 $H(\pi(\cdot|s))$ 来表示策略 $\pi$ 在状态 $s$ 下的随机程度。&lt;/p&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;最大熵强化学习（maximum entropy RL）的思想是除了最大化累计奖励，还要使得策略更加随机。如此，强化学习的目标中加入了一项熵的正则项，定义为：
$$
\begin{align}
\pi_{\textbf{MaxEnt}}^*=\arg\max_{\pi}\mathbb{E}&lt;em&gt;{\pi}\left[\sum&lt;/em&gt;{t=0}^\infty r(s_t,a_t)+\alpha H(\pi(\cdot|s_t))\right]\notag
\end{align}
$$
其中，$\alpha$ 是一项正则项系数，用来权衡熵的重要程度。
SAC 算法加入熵正则项，有利于增加强化学习算法的探索，$\alpha$ 越大，探索性越强，有助于加速策略的学习，降低策略陷入局部最优的可能性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;基于能量的模型 (Energy-Based Model, EBM)&lt;/h2&gt;
&lt;p&gt;基于能量的模型（Energy-Based Model，EBM）是一类基于统计物理学原理的概率模型，通过能量函数为每个可能的状态分配一个标量能量值，低能量区域对应高概率区域。在强化学习中，EBM 将状态-动作对 $(s,a)$ 映射到能量值 $\mathcal{E}$，从而表示策略分布，定义为：
$$
\begin{align}
\pi(a|s)=\frac{\exp(-\mathcal{E}(s,a))}{Z(s)}\notag
\end{align}
$$
其中，$Z(s)=\int_{A}\exp(-\mathcal{E}(s,a))\mathrm{d}a$ 是配分函数，负责归一化能量值以形成有效的概率分布。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Soft 策略迭代 (Soft Policy Iteration)&lt;/h2&gt;
&lt;h3&gt;Soft 贝尔曼方程&lt;/h3&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^\pi(s)&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s,a)-\alpha\log\pi(a|s)]\notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim \pi(a|s)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s,a)]+\alpha H(\pi(\cdot|s)) \notag
\end{align}
$$
$$
\begin{align}
Q^{\pi}&lt;em&gt;{\textbf{soft}}(s,a)=r(s,a)+\gamma \mathbb{E}&lt;/em&gt;{s^\prime\sim p(\cdot|s,a)}[V_{\textbf{soft}}^\pi(s^\prime)]\notag \
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;Soft 策略评估 (Soft Policy Evaluation)&lt;/h3&gt;
&lt;p&gt;在 SAC 算法中，Soft 价值函数定义为：
$$
\begin{align}
V_{\textbf{soft}}^\pi(s)\triangleq\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s,a)-\alpha\log\pi(a|s)]\notag
\end{align}
$$
Soft 动作价值函数定义为：
$$
\begin{align}
Q^{\pi}&lt;em&gt;{\textbf{soft}}(s,a)\triangleq r(s,a)+\gamma \mathbb{E}&lt;/em&gt;{s^\prime\sim p(\cdot|s,a)}[V_{\textbf{soft}}^\pi(s^\prime)]\notag \
\end{align}
$$
动作价值函数的 Soft 贝尔曼迭代算子定义为：
$$
\begin{align}
\mathcal{T}^\pi Q^{k}&lt;em&gt;{\textbf{soft}}(s,a)&amp;#x26;\triangleq r(s,a)+\gamma \mathbb{E}&lt;/em&gt;{s^\prime\sim p(\cdot|s,a)}[V_{\textbf{soft}}^{k}(s^\prime)]\notag \
&amp;#x26;\triangleq  r(s,a)+\gamma \mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a)}[\mathbb{E}&lt;/em&gt;{a^\prime\sim\pi(\cdot|s^\prime)}[Q^{k}_{\textbf{soft}}(s^\prime,a^\prime)-\alpha\log\pi(a^\prime|s^\prime)]]\notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soft 策略评估定理&lt;/strong&gt;：基于上述的算子 $\mathcal{T}^\pi$ 以及初始化的映射 $Q^0_{\textbf{soft}}:S\times A\rightarrow \mathbb{R}$，且 $|A|&amp;#x3C;\infty$，$Q^{k+1}&lt;em&gt;{\textbf{soft}}=\mathcal{T}^\pi Q^k&lt;/em&gt;{\textbf{soft}}$。那么当 $k\rightarrow\infty$ 时，序列 ${Q^k_{\textbf{soft}}}$ 会收敛至 $Q_{\textbf{soft}}^\pi$。&lt;/p&gt;
&lt;p&gt;接下来证明这是一个压缩映射。文章重新定义了奖励 $r_\pi(s,a)$：
$$
\begin{align}
r_{\pi}(s,a)\triangleq r(s,a)+\mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a)}[H(\pi(\cdot|s^\prime))]\notag \
\end{align}
$$
迭代式可以重写为：
$$
\begin{align}
\mathcal{T}^\pi Q^{k}&lt;/em&gt;{\textbf{soft}}(s,a)\triangleq r_\pi(s,a)+\gamma \mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a), a^\prime \sim \pi(\cdot|s^\prime)}[Q^{k}&lt;/em&gt;{\textbf{soft}}(s^\prime,a^\prime)]\notag \
\end{align}
$$
在算法中，我们假设 $|A|&amp;#x3C;\infty$，那么 $r_\pi(s,a)$ 就是有界的，那么只需要证明此不等式：
$$
\begin{align}
\big|\big|\mathcal{T}^\pi Q^N_{\textbf{soft}}(s,a)-\mathcal{T}^\pi Q^M_{\textbf{soft}}(s,a)\big|\big|&lt;em&gt;\infty \le k\big|\big| Q^N&lt;/em&gt;{\textbf{soft}}(s,a)-Q^M_{\textbf{soft}}(s,a)\big|\big|&lt;em&gt;\infty ,\quad\exists k\in(0,1)\notag
\end{align}
$$
左式化简为：
$$
\begin{align}
\big|\mathcal{T}^\pi Q^N&lt;/em&gt;{\textbf{soft}}(s,a)-\mathcal{T}^\pi Q^M_{\textbf{soft}}(s,a)\big|
&amp;#x26;=\gamma\big|\mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a), a^\prime\sim\pi(\cdot|s^\prime)}\left[Q^N&lt;/em&gt;{\textbf{soft}}(s^\prime,a^\prime)-Q^M_{\textbf{soft}}(s^\prime,a^\prime)\right]\big|\notag \
&amp;#x26;\le \gamma\mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a), a^\prime\sim\pi(\cdot|s^\prime)}\left[\big|Q^N&lt;/em&gt;{\textbf{soft}}(s^\prime,a^\prime)-Q^M_{\textbf{soft}}(s^\prime,a^\prime)\big|\right] \notag \
&amp;#x26;\le \gamma\mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a)}\left[\max&lt;/em&gt;{a^\prime\in A}\big|Q^N_{\textbf{soft}}(s^\prime,a^\prime)-Q^M_{\textbf{soft}}(s^\prime,a^\prime)\big|\right] \notag \
&amp;#x26;\le \gamma \max_{s^\prime\in S,a^\prime\in A} \big|Q^N_{\textbf{soft}}(s^\prime,a^\prime)-Q^M_{\textbf{soft}}(s^\prime,a^\prime)\big| \notag
\end{align}
$$
最终可以得出：
$$
\begin{align}
\max_{s\in S,a\in A}\big|\mathcal{T}^\pi Q^N_{\textbf{soft}}(s,a)-\mathcal{T}^\pi Q^M_{\textbf{soft}}(s,a)\big| \le \gamma \max_{s^\prime\in S,a^\prime\in A} \big|Q^N_{\textbf{soft}}(s^\prime,a^\prime)-Q^M_{\textbf{soft}}(s^\prime,a^\prime)\big| \notag \
\end{align}
$$
其中，折扣因子 $\gamma\in(0,1)$，可以证明 $\mathcal{T}^\pi$ 是压缩映射。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Soft 策略提升 (Soft Policy Improvement)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Soft 策略提升定理&lt;/strong&gt;：对于任意 $\pi_{\text{old}} \in \Pi$，并以下式优化 $\pi_{\text{new}}$。假设 $|A|&amp;#x3C;\infty$，那么对于 $\forall (s,a) \in S \times A$，有 $Q_{\textbf{soft}}^{\pi_{\text{new}}}(s,a)\ge Q_{\textbf{soft}}^{\pi_{\text{old}}}(s,a)$。
$$
\begin{align}
\pi_{\text{new}}(\cdot|s)=\arg \min_{\pi^\prime\in\Pi}D_{\textbf{KL}}\left(\pi^\prime(\cdot|s)\Big|\Big|\frac{\exp(\frac{1}{\alpha}Q^{\pi_{\text{old}}}&lt;em&gt;{\textbf{soft}}(s,\cdot))}{Z^{\pi&lt;/em&gt;{\text{old}}}(s)}\right)\notag \
\end{align}
$$
其中 $Z^{\pi_{\text{old}}}(s)$ 是配分函数，负责归一化分布。&lt;/p&gt;
&lt;p&gt;定义 $J(\pi(\cdot|s);\pi_{\text{old}})$ 为：
$$
\begin{align}
J(\pi(\cdot|s);\pi_{\text{old}})&amp;#x26;= D_{\textbf{KL}}\left(\pi(\cdot|s)\Big|\Big|\frac{\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,\cdot))}{Z^{\pi_\text{old}}(s)}\right)\notag \
&amp;#x26;=\int_a \pi(a|s)\log\frac{\pi(a|s)}{\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)-\log Z^{\pi_{\text{old}}}(s))}\text{d}a \notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}\left[\log\pi(a|s)-\frac{1}{\alpha}Q&lt;/em&gt;{\textbf{soft}}^{\pi_\text{old}}(s,a)+\log Z^{\pi_\text{old}}(s)\right] \notag
\end{align}
$$
那么对于 $\pi_\text{old}$ 和 $\pi_\text{new}$，满足 $J(\pi_\text{new}(\cdot|s);\pi_\text{old})\le J(\pi_\text{old}(\cdot|s);\pi_\text{old})$，即：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{new}(\cdot|s)}\left[\log\pi_\text{new}(a|s)-\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)+\log Z^{\pi_\text{old}}(s)\right] \le \mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{old}(\cdot|s)}\left[\log\pi_\text{old}(a|s)-\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)+\log Z^{\pi_\text{old}}(s)\right]  \notag \
\end{align}
$$
$Z^{\pi_\text{old}}(s)$ 与 $a$ 无关，相约后得：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{new}(\cdot|s)}\left[\log\pi_\text{new}(a|s)-\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)\right] \le \mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{old}(\cdot|s)}\left[\log\pi_\text{old}(a|s)-\frac{1}{\alpha}Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)\right]  \notag \
\end{align}
$$
化简为：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{new}(\cdot|s)}\left[Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)-\alpha\log\pi_\text{new}(a|s)\right] \ge \mathbb{E}&lt;em&gt;{a\sim\pi&lt;/em&gt;\text{old}(\cdot|s)}\left[Q_{\textbf{soft}}^{\pi_\text{old}}(s,a)-\alpha\log\pi_\text{old}(a|s)\right] = V_{\textbf{soft}}^{\pi_\text{old}}(s) \notag \
\end{align}
$$
接下来证明 $Q_{\textbf{soft}}^{\pi_{\text{new}}}(s,a)\ge Q_{\textbf{soft}}^{\pi_{\text{old}}}(s,a)$，我们利用上式进行迭代展开：
$$
\begin{align}
Q_{\textbf{soft}}^{\pi_{\text{old}}}(s,a) &amp;#x26;= r_0 + \gamma \mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[ V&lt;/em&gt;{\textbf{soft}}^{\pi_\text{old}}(s_1)\right]\notag \
&amp;#x26;\le r_0 + \gamma \mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[\mathbb{E}&lt;/em&gt;{a_1\sim \pi_\text{new}(\cdot|s_1)}\left[Q_{\textbf{soft}}^{\pi_\text{old}}(s_1,a_1) - \alpha \log \pi_\text{new}(a_1|s_1)\right]\right] \notag \
&amp;#x26;= r_0 + \gamma \mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[\mathbb{E}&lt;/em&gt;{a_1\sim \pi_\text{new}(\cdot|s_1)}\left[r(s_1, a_1) + \gamma \mathbb{E}&lt;em&gt;{s_2}[V&lt;/em&gt;{\textbf{soft}}^{\pi_\text{old}}(s_2)] + \alpha H(\pi_\text{new}(\cdot|s_1))\right]\right] \notag \
&amp;#x26;\cdots \notag \
&amp;#x26;\le \sum_{t=0}^\infty \gamma^t \mathbb{E}&lt;em&gt;{(s_t,a_t)\sim \rho^{\pi&lt;/em&gt;\text{new}}}\left[r(s_t,a_t)+\alpha H(\pi_\text{new}(\cdot|s_t))\right]\notag \
&amp;#x26;=Q_{\textbf{soft}}^{\pi_\text{new}}(s,a) \notag
\end{align}
$$
证明完毕。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Soft 策略迭代定理&lt;/h3&gt;
&lt;p&gt;假设 $|A|&amp;#x3C;\infty$，对于任意 $\pi \in \Pi$，重复应用 Soft 策略评估和 Soft 策略提升，会收敛到 $\pi^&lt;em&gt;$，使得对于任意 $\pi \in \Pi$ 以及 $(s,a)\in S\times A$，都有 $Q^{\pi^&lt;/em&gt;}&lt;em&gt;\textbf{soft}(s,a)\ge Q^{\pi}&lt;/em&gt;\textbf{soft}(s,a)$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;证明过程&lt;/strong&gt;：
令 $\pi_i$ 为第 $i$ 轮迭代的策略，根据 Soft 策略迭代定理，序列 ${Q^{\pi_i}&lt;em&gt;\textbf{soft}}$ 是单调递增的。对于任意 $\pi \in \Pi$， $Q^\pi&lt;/em&gt;\textbf{soft}$ 是有上界的（奖励与熵均是有界的），因此序列会收敛到某个 $\pi^&lt;em&gt;$，接下来需要证明 $\pi^&lt;/em&gt;$ 是最优的。
在收敛时，必然满足：对于任意 $\pi\in\Pi$ 且 $\pi\neq \pi^&lt;em&gt;$，都有 $J(\pi^&lt;/em&gt;(\cdot|s);\pi^&lt;em&gt;) &amp;#x3C; J(\pi(\cdot|s);\pi^&lt;/em&gt;)$，即：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a\sim\pi^&lt;em&gt;(\cdot|s)}\left[\log\pi^&lt;/em&gt;(a|s)-\frac{1}{\alpha}Q&lt;/em&gt;{\textbf{soft}}^{\pi^&lt;em&gt;}(s,a)\right] &amp;#x3C; \mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}\left[\log\pi(a|s)-\frac{1}{\alpha}Q&lt;/em&gt;{\textbf{soft}}^{\pi^&lt;/em&gt;}(s,a)\right]  \notag \
\end{align}
$$
化简为：
$$
\begin{align}
V_\textbf{soft}^{\pi^&lt;em&gt;}(s) &gt; \mathbb{E}&lt;em&gt;{a\sim \pi(\cdot|s)}\left[Q&lt;/em&gt;\textbf{soft}^{\pi^&lt;/em&gt;}(s,a)-\alpha \log \pi(a|s)\right]\notag \
\end{align}
$$
接下来证明 $\pi^&lt;em&gt;$ 是最优的，即证明 $Q_\textbf{soft}^{\pi^&lt;/em&gt; }(s,a) &gt; Q^\pi_\textbf{soft}(s,a)$：
$$
\begin{align}
Q_\textbf{soft}^{\pi^* }(s,a)&amp;#x26;=r_0+\gamma\mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[V&lt;/em&gt;\textbf{soft}^{\pi^&lt;em&gt;}(s_1)\right]\notag \
&amp;#x26;&gt;r_0+\gamma\mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[\mathbb{E}&lt;/em&gt;{a_1\sim \pi(\cdot|s_1)}\left[Q_\textbf{soft}^{\pi^&lt;/em&gt;}(s_1,a_1)-\alpha \log \pi(a_1|s_1)\right]\right] \notag \
&amp;#x26;= r_0+\gamma\mathbb{E}&lt;em&gt;{s_1\sim p(\cdot|s,a)}\left[\mathbb{E}&lt;/em&gt;{a_1\sim \pi(\cdot|s_1)}\left[r(s_1, a_1) + \gamma \mathbb{E}&lt;em&gt;{s_2}[V&lt;/em&gt;\textbf{soft}^{\pi^*}(s_2)] + \alpha H(\pi(\cdot|s_1))\right]\right] \notag \
&amp;#x26;&gt; \sum_{t=0}^\infty \gamma^t \mathbb{E}&lt;em&gt;{(s_t,a_t)\sim\rho^\pi}\left[r(s_t,a_t)+\alpha H(\pi(\cdot|s_t))\right] \notag \
&amp;#x26;=Q^\pi&lt;/em&gt;\textbf{soft}(s,a)\notag
\end{align}
$$
证明完毕。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;算法实现&lt;/h2&gt;
&lt;p&gt;在 SAC 算法中，我们为两个动作价值函数 $Q_\textbf{soft}$（参数分别 $\omega_1$ 为和 $\omega_2$）和一个策略函数 $\pi$（参数为 $\theta$）建模。基于 Double DQN 的思想，SAC 使用 $Q_\textbf{soft}$ 两个网络，但每次用 $Q_\textbf{soft}$ 网络时会挑选一个 $Q_\textbf{soft}$ 值小的网络，从而缓解 $Q_\textbf{soft}$ 值过高估计的问题。&lt;/p&gt;
&lt;h3&gt;动作价值函数 (Critic)&lt;/h3&gt;
&lt;p&gt;任意一个函数 $Q_\textbf{soft}$ 的损失函数为：
$$
\begin{align}
L_{Q_\textbf{soft}}(\omega)&amp;#x26;=\mathbb{E}&lt;em&gt;{(s_t,a_t,r_t,s&lt;/em&gt;{t+1})\sim R}\left[\frac{1}{2}\left(Q_\textbf{soft}^\omega(s_t,a_t)-\left(r_t+\gamma V_{\textbf{soft}}^{\omega^-}(s_{t+1})\right)\right)^2\right]\notag \
&amp;#x26;= \mathbb{E}&lt;em&gt;{(s_t,a_t,r_t,s&lt;/em&gt;{t+1})\sim R}\left[\frac{1}{2}\left(Q_\textbf{soft}^\omega(s_t,a_t)-\left(r_t+\gamma\mathbb{E}&lt;em&gt;{a&lt;/em&gt;{t+1}\sim \pi_\theta(\cdot|s_{t+1})}\left[\min_{j=1,2} Q_\textbf{soft}^{\omega_j^-}(s_{t+1},a_{t+1})-\alpha \log \pi_{\theta}(a_{t+1}|s_{t+1})\right]\right)\right)^2\right]\notag
\end{align}
$$
其中，$R$ 是策略过去收集的数据，因为 SAC 是一种离线策略算法。为了让训练更加稳定，这里使用了两个目标网络 $Q_\textbf{soft}^{\omega_j^-}$。目标网络的更新方式是 Soft 更新：
$$
\begin{align}
\omega_j^-\leftarrow \tau \omega_j + (1-\tau) \omega_j^-, \quad j=1,2\notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;策略函数 (Actor)&lt;/h3&gt;
&lt;p&gt;接下来根据 Soft 策略提升定理中的 KL 散度来推导策略 $\pi_\theta$ 的损失函数 $L_{\pi}(\theta)$：
$$
\begin{align}
\theta&amp;#x26;=\arg \min_{\theta} L_\pi(\theta) \notag \
&amp;#x26;=\arg \min_{\theta} \mathbb{E}&lt;em&gt;{s_t\sim R}\left[D&lt;/em&gt;\textbf{KL}\left(\pi_\theta(\cdot|s_t)\Big|\Big|\frac{\exp(\frac{1}{\alpha }Q_\textbf{soft}^\omega(s_t,\cdot))}{Z(s_t)}\right)\right]\notag \
&amp;#x26;= \arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R}\left[\mathbb{E}&lt;/em&gt;{a_t\sim \pi_\theta(\cdot|s_t)}\left[\log\left(\frac{\pi_\theta(a_t|s_t)Z(s_t)}{\exp(\frac{1}{\alpha}Q_\textbf{soft}^\omega(s_t,a_t))}\right)\right]\right] \notag \
&amp;#x26;=\arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R, a_t\sim \pi&lt;/em&gt;\theta(\cdot|s_t)}\left[\log \pi_\theta(a_t|s_t)-\frac{1}{\alpha}Q_\textbf{soft}^\omega(s_t,a_t)+\log Z(s_t)\right] \notag \
&amp;#x26;=\arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R, a_t\sim \pi&lt;/em&gt;\theta(\cdot|s_t)}\left[\log \pi_\theta(a_t|s_t)-\frac{1}{\alpha}Q_\textbf{soft}^\omega(s_t,a_t)\right] \notag \
&amp;#x26;=\arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R, a_t\sim \pi&lt;/em&gt;\theta(\cdot|s_t)}\left[\alpha\log \pi_\theta(a_t|s_t)-Q_\textbf{soft}^\omega(s_t,a_t)\right] \notag \
&amp;#x26;=\arg\max_\theta \mathbb{E}&lt;em&gt;{s_t\sim R}\left[V&lt;/em&gt;\textbf{soft}^\omega (s_t)\right]\notag
\end{align}
$$
考虑到两个 $Q_\textbf{soft}^\omega$ 网络，损失函数写为：
$$
\begin{align}
L_\pi(\theta)=\arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R, a_t\sim \pi&lt;/em&gt;\theta(\cdot|s_t)}\left[\alpha\log \pi_\theta(a_t|s_t)-\min_{j=1,2}Q_\textbf{soft}^{\omega_j}(s_t,a_t)\right] \notag \
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;重参数化技巧 (Reparameterization Trick)&lt;/h3&gt;
&lt;p&gt;对于连续动作空间的环境，策略输出 Gauss 分布的均值和标准差，但是 Gauss 分布采样动作的过程是不可导的。因此，我们使用了重参数化技巧。
重参数化的做法是先从标准的 Gauss 分布 $\mathcal{N}$ 进行采样，然后再将采样值乘以标准差后加上均值，如下：
$$
\begin{align}
a_t&amp;#x26;=f_\theta(\epsilon_t;s_t) \notag \
&amp;#x26;= \mu_\theta(s_t)+\epsilon_t\sigma_\theta(s_t), \quad \epsilon\sim\mathcal{N}(0,I)\notag
\end{align}
$$
这样就可以认为是从策略高斯分布采样，并且这样对于策略函数是可导的，损失函数写为：
$$
\begin{align}
L_\pi(\theta)=\arg\min_\theta \mathbb{E}&lt;em&gt;{s_t\sim R, \epsilon_t \sim \mathcal{N}}\left[\alpha\log \pi&lt;/em&gt;\theta(f_\theta(\epsilon_t;s_t)|s_t)-\min_{j=1,2}Q_\textbf{soft}^{\omega_j}(s_t,f_\theta(\epsilon_t;s_t))\right] \notag \
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;自动调整熵系数 (Automating Entropy Adjustment)&lt;/h3&gt;
&lt;p&gt;在 SAC 算法中，如何选择熵正则项的系数非常重要。在不同的状态下需要不同大小的熵：在最优动作不确定的某个状态下，熵的取值应该大一点；而在某个最优动作比较确定的状态下，熵的取值可以小一点。
为了自动调整熵正则项，SAC 将强化学习的目标改写为一个带约束的优化问题：
$$
\begin{align}
\arg\max_\theta\mathbb{E}&lt;em&gt;{(s_t,a_t)\sim \rho^{\pi&lt;/em&gt;\theta}}\left[\sum_{t=0}^\infty r(s_t,a_t)\right] \quad \text{s.t.} \quad \mathbb{E}&lt;em&gt;{(s_t,a_t)\sim\rho^{\pi&lt;/em&gt;\theta}}\left[-\log\pi_\theta(a_t|s_t)\right]\ge H_0\notag \
\end{align}
$$
将上述问题转化为 KKT（Karush-Kuhn-Tucker）条件下的约束问题：
$$
\begin{align}
\arg\min_\theta\mathbb{E}&lt;em&gt;{(s_t,a_t)\sim \rho^{\pi&lt;/em&gt;\theta}}\left[-\sum_{t=0}^\infty r(s_t,a_t)\right] \quad \text{s.t.} \quad H_0-\mathbb{E}&lt;em&gt;{(s_t,a_t)\sim\rho^{\pi&lt;/em&gt;\theta}}\left[-\log\pi_\theta(a_t|s_t)\right]\le 0\notag \
\end{align}
$$
通过拉格朗日乘数法，转化为无约束问题，拉格朗日函数为：
$$
\begin{align}
L(\theta,\alpha)=\mathbb{E}&lt;em&gt;{(s_t,a_t)\sim \rho^{\pi&lt;/em&gt;\theta}}\left[-\sum_{t=0}^\infty r(s_t,a_t)\right] + \alpha\left[H_0-\mathbb{E}&lt;em&gt;{(s_t,a_t)\sim\rho^{\pi&lt;/em&gt;\theta}}\left[-\log\pi_\theta(a_t|s_t)\right]\right] \notag
\end{align}
$$
其中 $\alpha\ge0$ 是拉格朗日乘数，将拉格朗日函数中与 $\alpha$ 相关的提取出来：
$$
\begin{align}
L(\alpha)=\mathbb{E}&lt;em&gt;{s_t\sim R,a_t\sim\pi&lt;/em&gt;\theta(\cdot|s_t)}\left[-\alpha\log\pi_\theta(a_t|s_t)-\alpha H_0\right] \notag
\end{align}
$$
即当策略的熵低于目标值 $H_0$ 时，训练目标 $L(\alpha)$ 会使 $\alpha$ 的值增大，进而在上述最小化损失函数 $L_\pi(\theta)$ 的过程中增加了策略熵对应项的重要性；而当策略的熵高于目标值 $H_0$ 时，训练目标 $L(\alpha)$ 会使 $\alpha$ 的值减小，进而使得策略训练时更专注于价值提升。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（14）：SQL</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-14</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-14</guid><description>深入解析 Soft Q-Learning (SQL)：从最大熵强化学习原理出发，详细推导 Soft Bellman 方程、策略提升定理及收敛性证明，并探讨基于能量模型的策略采样与实现细节。</description><pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;Soft Q-Learning (SQL) 是强化学习中结合 &lt;strong&gt;最大熵强化学习（Maximum Entropy Reinforcement Learning）&lt;/strong&gt; 思想的 Q-Learning 扩展算法。
它的核心目标不仅仅是找到&lt;strong&gt;那一条&lt;/strong&gt;获得最高分的路，而是要找到&lt;strong&gt;所有&lt;/strong&gt;能获得高分的路。它在最大化累积奖励的同时，强制策略保持随机性（即最大化策略的熵），从而提升策略的探索能力、鲁棒性和泛化性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;最大熵强化学习（Maximum Entropy RL）&lt;/h2&gt;
&lt;h3&gt;基本定义&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;熵（Entropy）&lt;/strong&gt; 是表示随机变量不确定性的度量。对于随机变量 $X$，如果其概率密度为 $p$，熵 $H$ 定义为：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
H(X)&amp;#x26;=\mathbb{E}&lt;em&gt;{x\sim p}[-\log p(x)]\notag \
&amp;#x26;=-\int&lt;/em&gt;{X}p(x)\log p(x) \mathrm{d}x \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;在强化学习中，我们关注的是策略 $\pi$ 在状态 $s$ 下的随机程度，记为 $H(\pi(\cdot|s))$。&lt;/p&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;最大熵强化学习的思想是：除了最大化累计奖励，还要使得策略更加随机。因此，目标函数中加入了一项&lt;strong&gt;熵正则项&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
\pi_{\textbf{MaxEnt}}^*=\arg\max_{\pi}\sum_{t=0}^\infty \mathbb{E}_{\pi}[ r(s_t,a_t)+\alpha H(\pi(\cdot|s_t))]\notag
\end{align}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\alpha$ (Temperature)：正则项系数，用来权衡熵的重要程度。
&lt;ul&gt;
&lt;li&gt;$\alpha \to 0$：退化为标准 RL（贪婪）。&lt;/li&gt;
&lt;li&gt;$\alpha$ 越大：越鼓励探索，策略分布越平坦。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：
这一项 $\alpha H$ 的加入，意味着智能体如果不去探索新的动作，或者太早确定一个动作（熵变低），就会受到“惩罚”。这能有效防止智能体陷入局部最优。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;基于能量的模型 (Energy-Based Model, EBM)&lt;/h2&gt;
&lt;p&gt;SQL 使用基于能量的模型来建模策略。这源于统计物理学：能量越低的状态，出现的概率越高。&lt;/p&gt;
&lt;p&gt;在强化学习中，我们将状态-动作对 $(s,a)$ 映射到能量值 $\mathcal{E}$。策略分布定义为：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
\pi(a|s)=\frac{\exp(-\mathcal{E}(s,a))}{Z(s)}\notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;其中，$Z(s)$ 是&lt;strong&gt;配分函数（Partition Function）&lt;/strong&gt;，用于归一化，确保概率之和为 1：
$$
Z(s)=\int_{\mathcal{A}}\exp(-\mathcal{E}(s,a))\mathrm{d}a
$$&lt;/p&gt;
&lt;p&gt;在 Soft Q-Learning 中，我们通常用 Soft Q 值来代替负能量 $-\mathcal{E}(s,a)$，即 $Q_{soft}(s,a)$ 越大，选择该动作的概率越大。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Soft 贝尔曼方程 (Soft Bellman Equation)&lt;/h2&gt;
&lt;p&gt;为了推导 SQL，我们需要重新定义价值函数 $V$ 和 $Q$，将熵包含进去。&lt;/p&gt;
&lt;h3&gt;回顾：普通贝尔曼方程&lt;/h3&gt;
&lt;p&gt;普通 $Q$ 值：
$$
\begin{align}
Q^\pi(s,a) &amp;#x26;= r(s,a)+\gamma\mathbb{E}&lt;em&gt;{s^\prime \sim p(\cdot|s,a)}[V^\pi(s^\prime)] \notag
\end{align}
$$
普通 $V$ 值：
$$
\begin{align}
V^\pi(s) &amp;#x26;=\mathbb{E}&lt;/em&gt;{a\sim \pi(\cdot|s)}[Q^\pi(s,a)] \notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;定义：Soft 贝尔曼方程&lt;/h3&gt;
&lt;p&gt;在最大熵框架下，价值函数的定义发生了变化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soft 状态价值函数 $V_\text{soft}$ 推导：&lt;/strong&gt;
$V_\text{soft}$ 不仅包含未来的奖励，还包含未来的熵。&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^\pi(s)
&amp;#x26;=\mathbb{E}&lt;em&gt;{\pi}[\sum&lt;/em&gt;{l=0}^\infty \gamma^l(R_{t+l}+\alpha H(\pi(\cdot|S_{t+l})))|S_t=s] \notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{\pi}[R_t+\alpha H(\pi(\cdot|S_t))|S_t=s]+\gamma \mathbb{E}&lt;/em&gt;{\pi}[\sum_{l=0}^\infty \gamma^l(R_{t+1+l}+\alpha H(\pi(\cdot|S_{t+1+l})))] \notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[r(s,a)]+\alpha H(\pi(\cdot|s))+\gamma \mathbb{E}&lt;/em&gt;{a\sim\pi(\cdot|s),s^\prime\sim p(\cdot|s,a)}[V^{\pi}_{\textbf{soft}}(s^\prime)] \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;将 $H(\pi)$ 展开为期望形式 $\mathbb{E}[-\log \pi]$，可以合并项：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^\pi(s)
&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[r(s,a)-\alpha\log\pi(a|s)+\gamma\mathbb{E}&lt;/em&gt;{s^\prime\sim p(\cdot|s,a)}[V^{\pi}&lt;em&gt;{\textbf{soft}}(s^\prime)]] \notag \
&amp;#x26;=\mathbb{E}&lt;/em&gt;{a\sim\pi(\cdot|s)}[r(s,a)+\gamma \mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a)}[V^{\pi}&lt;/em&gt;{\textbf{soft}}(s^\prime)]]+\alpha H(\pi(\cdot|s)) \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soft 动作价值函数 $Q_\text{soft}$ 推导：&lt;/strong&gt;
与 $V$ 类似，展开递归形式：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
Q_{\textbf{soft}}^\pi(s,a)
&amp;#x26;=r(s,a)+\gamma \mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a),a^\prime\sim\pi(\cdot|s^\prime)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s^\prime,a^\prime)-\alpha\log\pi(a^\prime|s^\prime)] \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两者关系总结：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;V 与 Q 的关系&lt;/strong&gt;：
$$
\begin{align}
V_{\textbf{soft}}^\pi(s)&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s,a)-\alpha\log\pi(a|s)]\notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim \pi(a|s)}[Q^{\pi}&lt;/em&gt;{\textbf{soft}}(s,a)]+\alpha H(\pi(\cdot|s)) \notag
\end{align}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 笔记&lt;/strong&gt;：这说明 $V$ 值等于 $Q$ 值的期望加上当前的熵红利。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q 与 V 的关系&lt;/strong&gt;（Soft Bellman）：
$$
\begin{align}
Q^{\pi}&lt;em&gt;{\textbf{soft}}(s,a)=r(s,a)+\gamma \mathbb{E}&lt;/em&gt;{s^\prime\sim p(\cdot|s,a)}[V_{\textbf{soft}}^\pi(s^\prime)]\notag \
\end{align}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Soft 策略提升定理 (Soft Policy Improvement)&lt;/h2&gt;
&lt;p&gt;我们如何保证更新策略后，效果一定会变好？这里给出了详细证明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;定理&lt;/strong&gt;：对于任意状态 $s$，如果我们按照以下规则更新策略：
$$
\begin{align}
\tilde{\pi}(\cdot|s) \propto \exp(\frac{1}{\alpha}Q^{\pi}_{\textbf{soft}}(s,\cdot)), \quad \forall s \in \mathcal{S} \notag \
\end{align}
$$
那么新策略 $\tilde{\pi}$ 的 Soft Q 值一定优于旧策略 $\pi$。&lt;/p&gt;
&lt;h3&gt;证明过程&lt;/h3&gt;
&lt;p&gt;首先，我们计算旧策略 $\pi$ 下的 $V$ 值，并尝试引入新策略 $\tilde{\pi}$ 的形式。&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^\pi(s)&amp;#x26;=\mathbb{E}&lt;em&gt;{a\sim \pi(\cdot|s)}[Q&lt;/em&gt;{\textbf{soft}}^\pi(s,a)]+\alpha H(\pi(\cdot|s)) \notag \
&amp;#x26;=\int_a\pi(a|s)Q_{\textbf{soft}}^\pi(s,a)\text{d}a-\alpha\int_a\pi(a|s)\log\pi(a|s)\text{d}a\notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;这里利用一个恒等变换。因为更新规则 $\tilde{\pi}(a|s) = \frac{\exp(\frac{1}{\alpha}Q(s,a))}{Z(s)}$，所以 $Q(s,a) = \alpha \log \tilde{\pi}(a|s) + \alpha \log Z(s)$。
代入积分中：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^\pi(s) &amp;#x26;= \alpha\int_a \pi(a|s) \left[ \log \tilde{\pi}(a|s) + \log \int_{a^\prime}\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^\pi(s,a^\prime))\text{d}a^\prime \right] \text{d}a - \alpha\int_a\pi(a|s)\log\pi(a|s)\text{d}a \notag \
&amp;#x26;= \alpha \log \left[ \int_{a^\prime}\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^\pi(s,a^\prime))\text{d}a^\prime \right] + \alpha \int_a \pi(a|s) \log \frac{\tilde{\pi}(a|s)}{\pi(a|s)} \text{d}a \notag \
&amp;#x26;= \alpha \log \int_a\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^\pi(s,a))\text{d}a - \alpha D_{\textbf{KL}}(\pi(\cdot|s)||\tilde{\pi}(\cdot|s)) \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;当 $\pi = \tilde{\pi}$ 时，KL 散度为 0，我们得到&lt;strong&gt;Soft Value Function 的解析解（LogSumExp 形式）&lt;/strong&gt;：
$$
V_{\textbf{soft}}^{\tilde{\pi}}(s) = \alpha \log \int_a \exp(\frac{1}{\alpha}Q_{\textbf{soft}}^\pi(s,a))\text{d}a
$$&lt;/p&gt;
&lt;p&gt;因为 KL 散度非负（$D_{KL} \ge 0$），且 $\alpha &gt; 0$，所以去掉 KL 项后，不等式成立：
$$
\begin{align}
\alpha \log \int_a \exp(\frac{1}{\alpha}Q)\text{d}a \ge V_{\textbf{soft}}^\pi(s) + \alpha D_{\textbf{KL}} \ge V_{\textbf{soft}}^\pi(s) \notag
\end{align}
$$
这导出了关键不等式：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a\sim\tilde{\pi}(\cdot|s)}[Q&lt;/em&gt;{\textbf{soft}}^\pi(s,a)]+ \alpha H(\tilde{\pi}(\cdot|s))\ge
\mathbb{E}&lt;em&gt;{a\sim\pi(\cdot|s)}[Q&lt;/em&gt;{\textbf{soft}}^\pi(s,a)]+ \alpha H(\pi(\cdot|s)) \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;接下来的迭代推导证明了 $Q$ 值的单调递增性（通过不断展开贝尔曼算子）：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
Q_{\textbf{soft}}^\pi(s,a) &amp;#x26;= r_0 + \gamma V_{soft}^\pi(s_1) \notag \
&amp;#x26;\le r_0 + \gamma (\mathbb{E}&lt;em&gt;{a_1 \sim \tilde{\pi}}[Q^\pi(s_1, a_1)] + \alpha H(\tilde{\pi})) \quad \text{(根据上述不等式)} \notag \
&amp;#x26;\le \dots \notag \
&amp;#x26;\le Q&lt;/em&gt;{\textbf{soft}}^{\tilde{\pi}}(s,a) \notag
\end{align}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 结论&lt;/strong&gt;：
只要我们将策略更新为正比于 $\exp(Q/\alpha)$，新的策略在 Soft Q 值的评估下一定比旧策略更好（或持平）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;Soft 策略评估定理与收敛性证明&lt;/h2&gt;
&lt;p&gt;我们定义&lt;strong&gt;Soft 贝尔曼算子 $\mathcal{T}$&lt;/strong&gt;，并证明反复应用它会收敛到最优值。&lt;/p&gt;
&lt;p&gt;定义算子操作：
$$
\begin{align}
\mathcal{T} Q_{\textbf{soft}}^\pi(s,a) \triangleq r(s,a)+\gamma \mathbb{E}&lt;em&gt;{s^\prime\sim p(\cdot|s,a)}\left[\alpha\log\int&lt;/em&gt;{a^\prime}\exp (\frac{1}{\alpha}Q_{\textbf{soft}}^\pi(s^\prime,a^\prime))\text{d}a^\prime\right]\notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;压缩映射证明 (Contraction Mapping)&lt;/h3&gt;
&lt;p&gt;我们要证明 $||\mathcal{T}Q_1 - \mathcal{T}Q_2|| \le k ||Q_1 - Q_2||$，其中 $k &amp;#x3C; 1$。&lt;/p&gt;
&lt;p&gt;定义度量距离 $\epsilon = \max_{s,a}|Q_1(s,a) - Q_2(s,a)|$。
这意味对于任意 $(s,a)$：
$$
Q_1(s,a) \le Q_2(s,a) + \epsilon
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键推导步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;利用指数单调性：
$$
\exp(\frac{1}{\alpha}Q_1) \le \exp(\frac{1}{\alpha}(Q_2 + \epsilon)) = \exp(\frac{Q_2}{\alpha}) \cdot \exp(\frac{\epsilon}{\alpha})
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;积分保序性：
$$
\int \exp(\frac{Q_1}{\alpha}) \text{d}a&apos; \le \exp(\frac{\epsilon}{\alpha}) \int \exp(\frac{Q_2}{\alpha}) \text{d}a&apos;
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取 $\alpha \log$（&lt;strong&gt;注意这里的常数提取&lt;/strong&gt;）：
$$
\begin{align}
\alpha \log \int \exp(\frac{Q_1}{\alpha}) \text{d}a&apos;
&amp;#x26;\le \alpha \log \left[ \exp(\frac{\epsilon}{\alpha}) \int \exp(\frac{Q_2}{\alpha}) \text{d}a&apos; \right] \notag \
&amp;#x26;= \alpha \left[ \log(\exp(\frac{\epsilon}{\alpha})) + \log \int \exp(\frac{Q_2}{\alpha}) \text{d}a&apos; \right] \notag \
&amp;#x26;= \alpha \left[ \frac{\epsilon}{\alpha} + \log \int \exp(\frac{Q_2}{\alpha}) \text{d}a&apos; \right] \notag \
&amp;#x26;= \epsilon + \alpha \log \int \exp(\frac{Q_2}{\alpha}) \text{d}a&apos; \notag
\end{align}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算算子差值：
$$
\begin{align}
|\mathcal{T}Q_1 - \mathcal{T}Q_2| &amp;#x26;= \gamma \left| \mathbb{E}&lt;em&gt;{s&apos;} \left[ \alpha \log \int&lt;/em&gt;{a^\prime} \exp(\frac{Q_1(s^\prime,a^\prime)}{\alpha}) \text{d}a^\prime - \alpha \log \int_{a^\prime} \exp(\frac{Q_2(s^\prime,a^\prime)}{\alpha}) \text{d}a^\prime \right] \right| \notag \
&amp;#x26;\le \gamma \mathbb{E}&lt;em&gt;{s&apos;} [\epsilon] \notag \
&amp;#x26;= \gamma \max&lt;/em&gt;{s,a} |Q_1(s,a)-Q_2(s,a)| \notag
\end{align}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：
$$
||\mathcal{T}Q_1 - \mathcal{T}Q_2||&lt;em&gt;\infty \le \gamma ||Q_1 - Q_2||&lt;/em&gt;\infty
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于折扣因子 $\gamma \in (0,1)$，算子 $\mathcal{T}$ 是一个&lt;strong&gt;压缩映射&lt;/strong&gt;，必然收敛到唯一的不动点 $Q^*_\text{soft}$。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;实现困难与解决方案&lt;/h2&gt;
&lt;p&gt;理论很完美，但实际用神经网络实现时（Deep RL），有两个主要困难。&lt;/p&gt;
&lt;h3&gt;困难 1：处理积分 (The Integral Problem)&lt;/h3&gt;
&lt;p&gt;在计算 $V_\text{soft}(s)$ 时，需要计算 $\log \int \exp(Q) \text{d}a$。
如果动作空间是连续的，这个积分通常无法解析计算。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：重要性采样 (Importance Sampling)&lt;/strong&gt;
我们把积分转化为期望，通过采样来近似。
引入一个采样分布 $q_a(a)$（通常可以是当前的策略网络）：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
V_{\textbf{soft}}^{\theta}(s)&amp;#x26;= \alpha \log \int_a \exp(\frac{1}{\alpha}Q_{\textbf{soft}}^{\theta}(s,a))\text{d}a\notag \
&amp;#x26;=\alpha\log\int_a q_a(a)\frac{\exp(\frac{1}{\alpha}Q_{\textbf{soft}}^{\theta}(s,a))}{q_a(a)} \text{d}a \notag \
&amp;#x26;\approx \alpha \log \mathbb{E}&lt;em&gt;{a\sim q_a(\cdot)}\left[\frac{\exp(\frac{1}{\alpha}Q&lt;/em&gt;{\textbf{soft}}^{\theta}(s,a))}{q_a(a)}\right] \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;于是，Soft Q-Learning 的目标函数（Bellman Error）变为：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
J_Q(\theta)&amp;#x26;=\mathbb{E}&lt;em&gt;{\mathcal{D}}\left[\frac{1}{2}\left(\hat{Q}&lt;/em&gt;{\textbf{soft}}(s_t,a_t)-Q_{\textbf{soft}}^\theta(s_t,a_t)\right)^2\right]\notag
\end{align}
$$
其中目标值 $\hat{Q}$ 使用上述的重要性采样估计来计算 $V$。&lt;/p&gt;
&lt;h3&gt;困难 2：策略采样 (Sampling from Energy-Based Policy)&lt;/h3&gt;
&lt;p&gt;理论上的最优策略是基于能量的：$\pi(a|s) \propto \exp(\frac{1}{\alpha}Q(s,a))$。
这是一种复杂的分布，我们无法直接从 Q 网络中高效采样动作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：Amortized Inference (近似推断)&lt;/strong&gt;
我们训练一个显式的策略网络（Actor）$\pi_\phi(a|s)$（通常是高斯分布或由神经网络生成的分布），让它去逼近那个能量分布。&lt;/p&gt;
&lt;p&gt;目标是最小化两者之间的 KL 散度：
$$
\begin{align}
J_\pi(\phi;s_t)=D_{\textbf{KL}}\left(\pi_\phi(\cdot|s_t)\Big|\Big|\exp\left(\frac{1}{\alpha}(Q_{\textbf{soft}}^\theta(s_t,\cdot)-V_{\textbf{soft}}^\theta(s_t))\right)\right)\notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;将 KL 散度展开并忽略常数项，等价于最大化：
$$
\mathbb{E}&lt;em&gt;{a \sim \pi&lt;/em&gt;\phi}[Q^\theta(s,a) - \alpha \log \pi_\phi(a|s)]
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 实现细节&lt;/strong&gt;：
在 SQL 原文中，作者使用了 &lt;strong&gt;SVGD (Stein Variational Gradient Descent)&lt;/strong&gt; 方法来更新这个策略网络，这允许策略生成非常复杂的多模态分布。后续的 SAC 算法则使用了重参数化技巧（Reparameterization Trick）来简化这一步。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（13）：DDPG</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-13</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-13</guid><description>深度确定性策略梯度：将 DQN 扩展到连续动作空间。详解 DDPG 的软更新与噪声探索，以及 TD3 如何通过双 Q 网络和延迟更新解决过估计问题。</description><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;我们之前学过 &lt;strong&gt;DQN&lt;/strong&gt;（处理离散动作的价值方法）和 &lt;strong&gt;REINFORCE/PPO&lt;/strong&gt;（处理连续/离散动作的随机策略方法）。
如果我们将 DQN 的思想（Off-policy, Replay Buffer）应用到连续控制任务中，会遇到什么问题？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DQN 需要对动作取最大值 $\max_a Q(s,a)$。在连续空间中，这个最大化操作本身就是一个复杂的优化问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DDPG (Deep Deterministic Policy Gradient)&lt;/strong&gt; 的出现解决了这个问题。你可以简单地把它理解为 &lt;strong&gt;“DQN + Actor-Critic”&lt;/strong&gt;。它使用一个 Actor 网络来直接输出那个“让 Q 值最大的动作”，从而避免了复杂的积分或最大化计算。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;策略类型的本质区别&lt;/h2&gt;
&lt;p&gt;在深入 DDPG 之前，我们需要明确两种策略的数学形式差异。&lt;/p&gt;
&lt;h3&gt;随机策略 (Stochastic Policy)&lt;/h3&gt;
&lt;p&gt;输出动作的&lt;strong&gt;概率分布&lt;/strong&gt;（如高斯分布的均值和方差）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离散动作&lt;/strong&gt;：$\pi(a|s;\theta)=\frac{\exp(Q_\theta(s,a))}{\sum_{a^\prime}\exp(Q_\theta(s,a^\prime))}$ (Softmax)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续动作&lt;/strong&gt;：$\pi(a|s;\theta) \sim \mathcal{N}(\mu_\theta(s), \sigma_\theta(s))$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;确定性策略 (Deterministic Policy)&lt;/h3&gt;
&lt;p&gt;对于同一个状态，永远输出&lt;strong&gt;同一个动作&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离散动作&lt;/strong&gt;：$\pi(s;\theta)=\operatorname{argmax}&lt;em&gt;{a} Q&lt;/em&gt;\theta(s,a)$ (不可微，无法用梯度下降直接优化)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续动作&lt;/strong&gt;：$a=\mu_\theta(s)$ (可微，这正是 DDPG 的基础)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 核心区别&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;随机策略&lt;/strong&gt;通过&lt;strong&gt;对数似然 (Log-Likelihood)&lt;/strong&gt; 来更新参数：$\nabla \log \pi \cdot Q$。它试探性地增加高分动作的概率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确定性策略&lt;/strong&gt;通过&lt;strong&gt;链式法则 (Chain Rule)&lt;/strong&gt; 来更新参数：$\nabla_a Q \cdot \nabla_\theta \mu$。它直接告诉动作“往哪个方向挪一点，Q 值会变大”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;确定性策略梯度定理 (DPG)&lt;/h2&gt;
&lt;p&gt;这是 DDPG 的理论基石。我们希望找到策略参数 $\theta$，最大化目标函数 $J(\theta) = \mathbb{E}[Q(s, \mu_\theta(s))]$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;定理推导&lt;/strong&gt;：
假设我们有一个 Critic 网络 $Q^w(s,a)$ 估得足够准。我们想调整 Actor $\mu_\theta(s)$，使得输出的动作 $a$ 能获得更大的 $Q$ 值。
根据链式法则：
$$
\begin{align}
\nabla_\theta J(\mu_\theta) &amp;#x26;= \mathbb{E}&lt;em&gt;{s \sim \rho^\pi} [\nabla&lt;/em&gt;\theta Q^w(s, \mu_\theta(s))] \notag \
&amp;#x26;= \mathbb{E}&lt;em&gt;{s \sim \rho^\pi} [\underbrace{\nabla_a Q^w(s,a)|&lt;/em&gt;{a=\mu_\theta(s)}}&lt;em&gt;{\text{Critic 指出的方向}} \cdot \underbrace{\nabla&lt;/em&gt;\theta \mu_\theta(s)}_{\text{Actor 的梯度}}] \notag
\end{align}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：Critic 告诉 Actor：“动作 $a$ 往大变一点，Q 值能增加”。Actor 就计算如何调整 $\theta$ 才能让 $a$ 变大。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;深度确定性策略梯度 (DDPG)&lt;/h2&gt;
&lt;p&gt;DDPG 是 Deep Q-Network (DQN) 在连续动作空间的自然延伸。&lt;/p&gt;
&lt;h3&gt;核心组件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Actor-Critic 架构&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Actor $\mu(s; \theta)$：输出确定性动作。&lt;/li&gt;
&lt;li&gt;Critic $Q(s, a; w)$：评估 (状态, 动作) 的价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;经验回放 (Replay Buffer)&lt;/strong&gt;：与 DQN 一样，存储 $(s, a, r, s&apos;)$，打破数据相关性，实现 Off-Policy 训练。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标网络 (Target Networks)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了稳定训练，建立了 Target Actor $\mu&apos;$ 和 Target Critic $Q&apos;$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键改进：软更新 (Soft Update)&lt;/strong&gt;。
DQN 是每隔 $C$ 步硬拷贝参数。DDPG 使用滑动平均：
$$ \theta&apos; \leftarrow \tau \theta + (1-\tau)\theta&apos; $$
其中 $\tau \ll 1$ (如 0.001)。这使得目标值变化非常平滑。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;探索策略 (Exploration)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确定性策略本身不会探索。DDPG 必须在动作上&lt;strong&gt;加噪声&lt;/strong&gt;来进行探索：
$$ a_t = \mu_\theta(s_t) + \mathcal{N}_t $$&lt;/li&gt;
&lt;li&gt;原论文使用了 &lt;strong&gt;Ornstein-Uhlenbeck (OU)&lt;/strong&gt; 噪声（具有时间相关性，适合惯性系统）。现在的实践通常直接使用简单的&lt;strong&gt;高斯噪声&lt;/strong&gt; $\mathcal{N}(0, \sigma)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;DDPG 算法流程&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize Actor } \mu_\theta, \text{Critic } Q_w, \text{Target nets } \mu&apos;, Q&apos; \
&amp;#x26; \bullet ; \textbf{For } \text{episode } = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Receive initial state } s \
&amp;#x26; \bullet \qquad \textbf{For } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Select action } a = \mu_\theta(s) + \text{Noise} \
&amp;#x26; \bullet \qquad \qquad \text{Execute } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad \text{Store } (s, a, r, s&apos;) \text{ in Buffer } \mathcal{R} \
&amp;#x26; \bullet \qquad \qquad \text{Sample batch } N \text{ from } \mathcal{R} \
&amp;#x26; \bullet \qquad \qquad \textbf{// Update Critic (minimize MSBE)} \
&amp;#x26; \bullet \qquad \qquad y = r + \gamma Q&apos;(s&apos;, \mu&apos;(s&apos;)) \
&amp;#x26; \bullet \qquad \qquad L_w = \frac{1}{N}\sum (y - Q_w(s,a))^2 \
&amp;#x26; \bullet \qquad \qquad \textbf{// Update Actor (maximize Q)} \
&amp;#x26; \bullet \qquad \qquad \nabla_\theta J = \frac{1}{N} \sum \nabla_a Q_w(s,a) \nabla_\theta \mu_\theta(s) \
&amp;#x26; \bullet \qquad \qquad \textbf{// Soft Update Targets} \
&amp;#x26; \bullet \qquad \qquad \theta&apos; \leftarrow \tau \theta + (1-\tau)\theta&apos; \
&amp;#x26; \bullet \qquad \qquad w&apos; \leftarrow \tau w + (1-\tau)w&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;双价值函数策略延时更新 (TD3)&lt;/h2&gt;
&lt;p&gt;DDPG 很强，但非常&lt;strong&gt;脆弱&lt;/strong&gt;，对超参数敏感。它继承了 DQN 的&lt;strong&gt;过高估计 (Overestimation)&lt;/strong&gt; 问题，甚至更严重。TD3 提出了三个技巧来修正它。&lt;/p&gt;
&lt;h3&gt;技巧 1：截断双 Q 学习 (Clipped Double Q-Learning)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：DQN 中 $y = r + \gamma \max Q$ 会导致价值高估。DDPG 中虽然没有 max，但 Actor 也是朝着 Q 值最大的方向更新的，效果一样。
&lt;strong&gt;解决&lt;/strong&gt;：学习两个 Critic ($Q_1, Q_2$)，计算目标值时&lt;strong&gt;取最小值&lt;/strong&gt;。
$$ y = r + \gamma \min_{i=1,2} Q_{\phi_i&apos;}(s&apos;, \tilde{a}) $$
这体现了“悲观主义”原则，宁可低估也不要高估。&lt;/p&gt;
&lt;h3&gt;技巧 2：策略参数延迟更新 (Delayed Policy Updates)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Critic 还在学习中，波动很大。如果 Actor 频繁根据错误的 Critic 调整方向，会导致策略震荡发散。
&lt;strong&gt;解决&lt;/strong&gt;：让 Critic 多练几次，Actor 再动。
通常 Critic 更新 2 次（或更多），Actor 和 目标网络才更新 1 次。&lt;/p&gt;
&lt;h3&gt;目标策略平滑 (Target Policy Smoothing)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Critic 可能会对某些尖峰值（错误的 Q 值峰值）过拟合。
&lt;strong&gt;解决&lt;/strong&gt;：在计算目标值时，给动作加一点&lt;strong&gt;被截断的噪声&lt;/strong&gt;，让 Q 函数在动作周围更平滑。
$$
\tilde{a} = \mu_{\theta&apos;}(s&apos;) + \epsilon, \quad \epsilon \sim \text{clip}(\mathcal{N}(0, \sigma), -c, c)
$$
$$ y = r + \gamma \min Q&apos;(s&apos;, \tilde{a}) $$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉&lt;/strong&gt;：相似的动作应该有相似的价值。如果动作稍微变一点点，价值就剧烈变化，说明这个 Critic 是有问题的（过拟合）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;深度解析：DDPG/TD3 的定位&lt;/h2&gt;
&lt;p&gt;我们可以将 DDPG/TD3 放在整个 RL 家族谱系中进行对比：&lt;/p&gt;
&lt;p&gt;| 维度 | DDPG / TD3 | PPO / A2C | DQN |
| :--- | :--- | :--- | :--- |
| &lt;strong&gt;动作空间&lt;/strong&gt; | &lt;strong&gt;连续&lt;/strong&gt; (Continuous) | 离散 或 连续 | 离散 (Discrete) |
| &lt;strong&gt;策略类型&lt;/strong&gt; | &lt;strong&gt;确定性策略&lt;/strong&gt; ($\mu(s)$) | 随机策略 ($\pi(a|s)$) | 确定性 (argmax Q) |
| &lt;strong&gt;样本效率&lt;/strong&gt; | &lt;strong&gt;高 (Off-Policy)&lt;/strong&gt; | 低 (On-Policy) | 高 (Off-Policy) |
| &lt;strong&gt;更新方式&lt;/strong&gt; | &lt;strong&gt;链式法则&lt;/strong&gt; ($\nabla_a Q \nabla_\theta \mu$) | 对数似然 ($\nabla \log \pi \cdot A$) | 最小化 TD Error |
| &lt;strong&gt;稳定性&lt;/strong&gt; | 较低 (需精细调参) | &lt;strong&gt;高&lt;/strong&gt; (鲁棒性强) | 中 |
| &lt;strong&gt;核心痛点&lt;/strong&gt; | Q 值高估、超参数敏感 | 采样慢、无法利用旧数据 | 无法处理连续动作 |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DDPG&lt;/strong&gt; 是 DQN 在连续控制领域的继承者，引入了 Actor-Critic 架构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TD3&lt;/strong&gt; 是 DDPG 的“补丁版”，通过双 Q 网络和延迟更新，大大提升了算法的稳定性。&lt;/li&gt;
&lt;li&gt;它们都是 &lt;strong&gt;Off-Policy&lt;/strong&gt; 算法，适合需要极高样本效率的场景（如机器人控制）。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（12）：PPO</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-12</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-12</guid><description>OpenAI 的默认算法：详解 PPO 如何通过 Clip 技巧简化 TRPO。涵盖 PPO-Clip 与 PPO-Penalty 两种变体、GAE 优势估计及完整的损失函数设计。圣PPO伟大无需多言！</description><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;上一章提到的 &lt;strong&gt;TRPO&lt;/strong&gt; 虽然理论优美（保证单调不减），但计算太复杂了（需要共轭梯度法求解 Hessian-Vector Product）。
OpenAI 提出的 &lt;strong&gt;PPO (Proximal Policy Optimization)&lt;/strong&gt; 是 TRPO 的一阶近似版本。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：TRPO 使用 KL 散度作为&lt;strong&gt;硬约束 (Constraint)&lt;/strong&gt;，而 PPO 将约束转化为&lt;strong&gt;惩罚项 (Penalty)&lt;/strong&gt; 或者直接通过&lt;strong&gt;截断 (Clipping)&lt;/strong&gt; 来限制策略更新幅度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地位&lt;/strong&gt;：PPO 是目前 Deep RL 的基准算法，平衡了实现复杂度、样本效率和性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;变体 1：PPO-Clip (主流)&lt;/h2&gt;
&lt;p&gt;这是目前最常用的 PPO 版本，它不需要计算 KL 散度，直接在目标函数里动手脚。&lt;/p&gt;
&lt;h3&gt;重要性采样比率&lt;/h3&gt;
&lt;p&gt;定义新旧策略的比率为 $r_t(\theta)$：
$$
r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当 $\theta = \theta_{\text{old}}$ 时，$r_t = 1$。&lt;/li&gt;
&lt;li&gt;我们希望 $r_t$ 不要偏离 1 太多，这意味着新策略没有发生剧烈变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;截断目标函数&lt;/h3&gt;
&lt;p&gt;PPO-Clip 的核心目标函数如下：
$$
L^{CLIP}(\theta)=\hat{\mathbb{E}}_t \left[ \min \left( r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t \right) \right]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\epsilon$ 是一个超参数（通常为 0.2），表示允许策略变化的幅度（Trust Region）。&lt;/li&gt;
&lt;li&gt;$\text{clip}(r, 1-\epsilon, 1+\epsilon)$：把比率 $r$ 强制限制在 $[0.8, 1.2]$ 之间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;直观理解：为什么要 Min？&lt;/h3&gt;
&lt;p&gt;我们需要分两种情况来看优势函数 $\hat{A}_t$ 的正负：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;情况 A：动作是好的 ($\hat{A}_t &gt; 0$)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;我们希望增加这个动作的概率，即 $r_t(\theta)$ 增大。&lt;/li&gt;
&lt;li&gt;但不能无限增大。如果 $r_t &gt; 1+\epsilon$，&lt;code&gt;clip&lt;/code&gt; 函数会将其锁死在 $1+\epsilon$。&lt;/li&gt;
&lt;li&gt;此时 $\min$ 操作生效，目标函数不再随 $r_t$ 增加而增加。这防止了策略更新步子太大。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情况 B：动作是坏的 ($\hat{A}_t &amp;#x3C; 0$)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;我们希望减小这个动作的概率，即 $r_t(\theta)$ 减小。&lt;/li&gt;
&lt;li&gt;但不能无限减小。如果 $r_t &amp;#x3C; 1-\epsilon$，&lt;code&gt;clip&lt;/code&gt; 函数会将其锁死在 $1-\epsilon$。&lt;/li&gt;
&lt;li&gt;此时 $\min$ 操作生效，防止策略过度修正（以此避免策略坍塌）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 总结&lt;/strong&gt;：
只有当策略变化在“安全区域”内时，我们才进行奖励优化；一旦超出安全区域，就不再给予额外的梯度奖励。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;变体 2：PPO-Penalty (自适应 KL)&lt;/h2&gt;
&lt;p&gt;这是另一种接近 TRPO 原义的方法，将 KL 散度作为正则项加入 Loss，并动态调整系数 $\beta$。&lt;/p&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;$$
L^{KLPEN}(\theta)=\hat{\mathbb{E}}&lt;em&gt;t \left[ r_t(\theta)\hat{A}&lt;em&gt;t - \beta D&lt;/em&gt;{KL}(\pi&lt;/em&gt;{\theta_{\text{old}}}(\cdot|s_t) || \pi_\theta(\cdot|s_t)) \right]
$$&lt;/p&gt;
&lt;h3&gt;自适应 $\beta$ 更新规则&lt;/h3&gt;
&lt;p&gt;我们在每次更新后计算平均 KL 散度 $d = \hat{\mathbb{E}}&lt;em&gt;t [D&lt;/em&gt;{KL}]$，并与目标值 $d_{\text{targ}}$ 比较：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果 $d &amp;#x3C; d_{\text{targ}} / 1.5$&lt;/strong&gt;：说明策略变动太小，步子太保守。&lt;strong&gt;减小惩罚&lt;/strong&gt; $\beta \leftarrow \beta / 2$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果 $d &gt; d_{\text{targ}} \times 1.5$&lt;/strong&gt;：说明策略变动太大，步子太危险。&lt;strong&gt;增大惩罚&lt;/strong&gt; $\beta \leftarrow \beta \times 2$。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;广义优势估计 (GAE)&lt;/h2&gt;
&lt;p&gt;在计算优势函数 $\hat{A}_t$ 时，简单的多步 TD 或蒙特卡洛都有局限。PPO 通常使用 &lt;strong&gt;GAE (Generalized Advantage Estimation)&lt;/strong&gt; 来平衡偏差和方差。&lt;/p&gt;
&lt;p&gt;我们定义 TD Error $\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)$。
GAE 是 $\delta$ 的加权几何平均：&lt;/p&gt;
&lt;p&gt;$$
\hat{A}&lt;em&gt;t^{GAE} = \sum&lt;/em&gt;{k=0}^{\infty} (\gamma \lambda)^k \delta_{t+k}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\lambda = 0$：即单步 TD（偏差大，方差小）。&lt;/li&gt;
&lt;li&gt;$\lambda = 1$：即蒙特卡洛（无偏差，方差大）。&lt;/li&gt;
&lt;li&gt;$\lambda \in (0, 1)$：通常取 0.95，在两者之间取得最佳平衡。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;完整的 PPO 损失函数&lt;/h2&gt;
&lt;p&gt;在实际代码实现（如 Actor-Critic 架构）中，PPO 的总 Loss 包含三部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;策略损失 (Policy Loss)&lt;/strong&gt;：即 $L^{CLIP}$，让策略变好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;价值损失 (Value Loss)&lt;/strong&gt;：$L^{VF} = (V_\theta(s_t) - V_{target})^2$，让 Critic 估值更准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;熵奖励 (Entropy Bonus)&lt;/strong&gt;：$S[\pi_\theta]$，鼓励策略保持随机性，防止过早收敛到局部最优。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
L^{Total}_t(\theta) = - L^{CLIP}_t(\theta) + c_1 L^{VF}_t(\theta) - c_2 S&lt;a href=&quot;s_t&quot;&gt;\pi_\theta&lt;/a&gt;
$$
&lt;em&gt;(注：通常深度学习框架是最小化 Loss，所以最大化目标前加负号)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;PPO 算法流程&lt;/h2&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize policy parameters } \theta \text{ and value parameters } \phi \
&amp;#x26; \bullet ; \textbf{For } \text{iteration } k = 1, 2, \dots \textbf{ do}: \
&amp;#x26; \bullet \qquad \textbf{1. Data Collection:} \
&amp;#x26; \bullet \qquad \text{Run policy } \pi_{\theta_{old}} \text{ in environment for } T \text{ steps} \
&amp;#x26; \bullet \qquad \text{Compute advantage estimates } \hat{A}&lt;em&gt;1, \dots, \hat{A}&lt;em&gt;T \text{ using GAE} \
&amp;#x26; \bullet \qquad \textbf{2. Optimization:} \
&amp;#x26; \bullet \qquad \textbf{For } \text{epoch } = 1 \to K \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Shuffle data and divide into mini-batches} \
&amp;#x26; \bullet \qquad \qquad \textbf{For } \text{each mini-batch } B \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \qquad L = L^{CLIP}(\theta) - c_1 L^{VF}(\phi) + c_2 S[\pi&lt;/em&gt;\theta] \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Update } \theta, \phi \text{ using Adam optimizer} \
&amp;#x26; \bullet \qquad \qquad \textbf{End For} \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet \qquad \theta&lt;/em&gt;{old} \leftarrow \theta \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;PPO 之所以能成为 OpenAI 的默认算法（Default Algorithm），是因为它：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;简单&lt;/strong&gt;：只需要对梯度进行简单的截断（Clip），不需要复杂的二阶优化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稳定&lt;/strong&gt;：截断机制保证了策略不会因为一次糟糕的更新而崩溃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用&lt;/strong&gt;：既适用于离散动作（Atari），也适用于连续动作（机器人控制）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至此，经典的 Policy Gradient 家族（REINFORCE $\to$ Actor-Critic $\to$ TRPO $\to$ PPO）已经梳理完毕。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（11）：TRPO</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-11</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-11</guid><description>深度强化学习的里程碑：详解 TRPO 如何通过信任区域约束保证策略更新的单调性。涵盖目标函数推导、二阶泰勒近似、共轭梯度法及 HVP 技巧。</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在 REINFORCE 和 A2C 等策略梯度算法中，我们通常使用固定的学习率 $\alpha$ 来更新参数：$\theta \leftarrow \theta + \alpha \nabla J$。
但这有一个严重问题：&lt;strong&gt;策略参数的变化 $\Delta \theta$ 并不等同于策略行为的变化&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有时候参数改一点点，策略分布变动巨大（导致性能崩塌）。&lt;/li&gt;
&lt;li&gt;有时候参数改很多，策略分布几乎没变（训练效率低）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TRPO (Trust Region Policy Optimization)&lt;/strong&gt; 的核心思想是：我们不直接控制参数的变化量，而是控制&lt;strong&gt;策略分布的变化量&lt;/strong&gt;（用 KL 散度衡量）。我们在一个“信任区域”内进行优化，确保每一步更新后，策略的表现都是&lt;strong&gt;单调不减&lt;/strong&gt;的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;策略优化的单调性证明&lt;/h2&gt;
&lt;p&gt;我们的目标是找到一个新策略 $\pi_{\theta&apos;}$，使得它的期望回报 $J(\theta&apos;)$ 比旧策略 $J(\theta)$ 高。&lt;/p&gt;
&lt;h3&gt;性能差异引理 (Performance Difference Lemma)&lt;/h3&gt;
&lt;p&gt;首先推导新旧策略的目标函数之差：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
J(\theta^\prime)-J(\theta)
&amp;#x26;= \mathbb{E}&lt;em&gt;{s_0}[V^{\pi&lt;/em&gt;{\theta^\prime}}(s_0)]-\mathbb{E}&lt;em&gt;{s_0}[V^{\pi&lt;/em&gt;{\theta}}(s_0)]\notag\
&amp;#x26;=\mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;{\theta^\prime}}[\sum_{t=0}^\infty \gamma^t r(s_t,a_t)] - \mathbb{E}&lt;em&gt;{s_0}[\sum&lt;/em&gt;{t=0}^\infty \gamma^t V^{\pi_\theta}(s_t)-\sum_{t=1}^\infty \gamma^t V^{\pi_\theta}(s_t)] \notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;{\theta^\prime}}[\sum_{t=0}^\infty \gamma^t r(s_t,a_t)] - \mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;{\theta^\prime}}[\sum_{t=0}^\infty \gamma^t (V^{\pi_\theta}(s_t)-\gamma V^{\pi_\theta}(s_{t+1}))] \notag \
&amp;#x26;= \mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;{\theta^\prime}}[\sum_{t=0}^\infty \gamma^t (r(s_t,a_t)+\gamma V^{\pi_\theta}(s_{t+1})-V^{\pi_\theta}(s_t))] \notag \
&amp;#x26;=\mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;{\theta^\prime}}[\sum_{t=0}^\infty \gamma^t A^{\pi_\theta}(s_t,a_t )] \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;将期望展开为状态访问分布 $\nu^{\pi_{\theta&apos;}}$ 的形式：
$$
J(\theta^\prime)-J(\theta) = \sum_{t=0}^\infty \gamma^t \mathbb{E}&lt;em&gt;{s_t\sim p^{\pi&lt;/em&gt;{\theta^\prime}} \, ; a_t\sim\pi_{\theta^\prime}(\cdot|s_t)}[ A^{\pi_\theta}(s_t,a_t)]
= \frac{1}{1-\gamma} \mathbb{E}&lt;em&gt;{s\sim\nu^{\pi&lt;/em&gt;{\theta^\prime}}\, ;a\sim\pi_{\theta^\prime}(\cdot|s)}[A^{\pi_\theta}(s,a)]
$$&lt;/p&gt;
&lt;h3&gt;状态分布近似&lt;/h3&gt;
&lt;p&gt;上式很难计算，因为 $\nu^{\pi_{\theta&apos;}}$ 依赖于新策略（而新策略还没求出来）。
TRPO 做了一个关键假设：&lt;strong&gt;当新旧策略差距很小时，状态访问分布变化不大&lt;/strong&gt;，即 $\nu^{\pi_{\theta&apos;}} \approx \nu^{\pi_\theta}$。&lt;/p&gt;
&lt;p&gt;目标函数近似为：
$$
\begin{align}
J(\theta^\prime)-J(\theta) &amp;#x26;\approx \frac{1}{1-\gamma}\mathbb{E}&lt;em&gt;{s\sim\nu^{\pi&lt;/em&gt;\theta}\,; a\sim\pi_{\theta^\prime}(\cdot|s)}[A^{\pi_\theta}(s,a)] \notag \
&amp;#x26;= \frac{1}{1-\gamma}\mathbb{E}&lt;em&gt;{s\sim\nu^{\pi&lt;/em&gt;\theta}\,; a\sim\pi_{\theta}(\cdot|s)}\left[\frac{\pi_{\theta^\prime}(a|s)}{\pi_\theta(a|s)}A^{\pi_\theta}(s,a)\right] \quad \text{(重要性采样)} \notag
\end{align}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;信任区域约束&lt;/h2&gt;
&lt;p&gt;为了让上述近似成立，必须限制 $\pi_{\theta&apos;}$ 和 $\pi_\theta$ 不能差太多。我们使用 &lt;strong&gt;KL 散度&lt;/strong&gt; 作为约束条件。&lt;/p&gt;
&lt;p&gt;优化目标：
$$
\begin{align}
\max_{\theta^\prime} \quad &amp;#x26; \mathbb{E}&lt;em&gt;{s\sim\nu^{\pi&lt;/em&gt;\theta}\,; a\sim\pi_{\theta}(\cdot|s)}\left[\frac{\pi_{\theta^\prime}(a|s)}{\pi_\theta(a|s)}A^{\pi_\theta}(s,a)\right] \notag \
\text{s.t.} \quad &amp;#x26; \bar{D}&lt;em&gt;{KL}(\theta || \theta&apos;) = \mathbb{E}&lt;/em&gt;{s\sim\nu^{\pi_\theta}}[D_{KL}(\pi_{\theta}(\cdot|s) || \pi_{\theta&apos;}(\cdot|s))] \leqslant \delta \notag
\end{align}
$$
(注：忽略了常数系数 $\frac{1}{1-\gamma}$，因为它不影响梯度方向)&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;数学近似求解&lt;/h2&gt;
&lt;p&gt;为了求解这个带约束的优化问题，我们对其进行泰勒展开。&lt;/p&gt;
&lt;h3&gt;目标函数的一阶近似&lt;/h3&gt;
&lt;p&gt;令 $L(\theta&apos;) = \mathbb{E}[\frac{\pi_{\theta&apos;}}{\pi_\theta} A^{\pi_\theta}]$。在 $\theta&apos; = \theta$ 处展开：
$$
L(\theta&apos;) \approx L(\theta) + \nabla_{\theta&apos;} L(\theta&apos;)|&lt;em&gt;{\theta&apos;=\theta}^T (\theta&apos; - \theta)
$$
由于 $L(\theta) = \mathbb{E}[1 \cdot A^{\pi&lt;/em&gt;\theta}] = 0$ (优势函数的期望为0)，且 $\nabla_{\theta&apos;} L(\theta&apos;)|&lt;em&gt;{\theta} = \nabla&lt;/em&gt;\theta J(\theta)$ (策略梯度)。
记梯度为 $g$：
$$ L(\theta&apos;) \approx g^T (\theta&apos; - \theta) $$&lt;/p&gt;
&lt;h3&gt;约束条件的二阶近似&lt;/h3&gt;
&lt;p&gt;KL 散度在 $\theta&apos;=\theta$ 处的一阶导数为 0（因为是极小值点），所以必须展开到二阶。
$$
\bar{D}_{KL}(\theta || \theta&apos;) \approx \frac{1}{2} (\theta&apos; - \theta)^T \mathbf{H} (\theta&apos; - \theta)
$$
其中 $\mathbf{H}$ 是 KL 散度的 &lt;strong&gt;黑塞矩阵 (Hessian Matrix)&lt;/strong&gt;（也是 Fisher Information Matrix）。&lt;/p&gt;
&lt;h3&gt;近似后的优化问题&lt;/h3&gt;
&lt;p&gt;令更新步长 $\Delta \theta = \theta&apos; - \theta$，问题转化为：
$$
\begin{align}
\max_{\Delta \theta} \quad &amp;#x26; g^T \Delta \theta \notag \
\text{s.t.} \quad &amp;#x26; \frac{1}{2} \Delta \theta^T \mathbf{H} \Delta \theta \leqslant \delta \notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;解析解&lt;/h3&gt;
&lt;p&gt;利用拉格朗日乘数法（推导见你原笔记），解得：
$$
\Delta \theta = \sqrt{\frac{2\delta}{g^T \mathbf{H}^{-1} g}} \mathbf{H}^{-1} g
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;共轭梯度法 (Conjugate Gradient)&lt;/h2&gt;
&lt;p&gt;公式里需要计算 $\mathbf{H}^{-1} g$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;：$\mathbf{H}$ 是神经网络参数的 Hessian 矩阵。如果参数有 100万个，$\mathbf{H}$ 就是 $100w \times 100w$ 的矩阵，显式计算它的逆是不可能的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;思路&lt;/strong&gt;：我们不需要算 $\mathbf{H}^{-1}$，我们只需要算向量 $x = \mathbf{H}^{-1} g$。这等价于求解线性方程组 $\mathbf{H}x = g$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;共轭梯度法 (CG)&lt;/strong&gt; 是一种迭代算法，它可以只通过计算矩阵-向量乘积 ($\mathbf{H}v$)，在 $k$ 步内（$k \ll \text{参数维度}$）找到 $x$ 的近似解。&lt;/p&gt;
&lt;h3&gt;Hessian-Vector Product (HVP)&lt;/h3&gt;
&lt;p&gt;CG 算法需要计算 $\mathbf{H}v$。虽然我们算不起 $\mathbf{H}$，但可以利用反向传播算 $\mathbf{H}v$。
$$
\mathbf{H}v = \nabla_\theta (\nabla_\theta \bar{D}_{KL} \cdot v)
$$
&lt;strong&gt;代码实现技巧&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先算 KL 散度的梯度 $\nabla \bar{D}_{KL}$。&lt;/li&gt;
&lt;li&gt;算梯度和向量 $v$ 的点积：$scalar = \nabla \bar{D}_{KL}^T v$。&lt;/li&gt;
&lt;li&gt;对这个标量再求一次梯度：$\nabla_\theta (scalar)$。
这样只需要两次反向传播，就能算出 $\mathbf{H}v$，完全避免了存储巨大的 Hessian 矩阵。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;线搜索 (Line Search)&lt;/h2&gt;
&lt;p&gt;虽然我们算出了更新方向 $\Delta \theta$ 和最大步长 $\beta = \sqrt{\frac{2\delta}{g^T \mathbf{H}^{-1} g}}$，但由于泰勒展开只是&lt;strong&gt;局部近似&lt;/strong&gt;，直接走这么远可能会导致策略性能下降（KL 散度超标或目标函数下降）。&lt;/p&gt;
&lt;p&gt;TRPO 采用 &lt;strong&gt;回溯线搜索 (Backtracking Line Search)&lt;/strong&gt; 来确定最终步长：
设 $\theta_{new} = \theta + \alpha^j \beta \Delta \theta$，其中 $\alpha \in (0, 1)$ 是衰减系数（如 0.5）。
从 $j=0, 1, 2, \dots$ 开始尝试，直到满足以下两个条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KL 约束满足&lt;/strong&gt;：$\bar{D}&lt;em&gt;{KL}(\theta || \theta&lt;/em&gt;{new}) \leqslant \delta$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标函数提升&lt;/strong&gt;：$L(\theta_{new}) \geqslant 0$ (即性能确实提升了)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;TRPO 算法流程总结&lt;/h2&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize policy parameters } \theta_0 \
&amp;#x26; \bullet ; \textbf{For } k = 0, 1, 2, \dots \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Collect trajectories } \tau \text{ using } \pi_{\theta_k} \
&amp;#x26; \bullet \qquad \text{Estimate advantages } A^{\pi_{\theta_k}} \text{ (using GAE)} \
&amp;#x26; \bullet \qquad \text{Compute policy gradient } g = \nabla_\theta L(\theta)|&lt;em&gt;{\theta_k} \
&amp;#x26; \bullet \qquad \text{Use CG to compute } x \approx \mathbf{H}^{-1} g \text{ with HVP} \
&amp;#x26; \bullet \qquad \text{Compute max step length } \beta = \sqrt{\frac{2\delta}{x^T \mathbf{H} x}} \
&amp;#x26; \bullet \qquad \text{Perform Line Search to find best step size } \eta \in {\beta, 0.5\beta, 0.25\beta \dots} \
&amp;#x26; \bullet \qquad \text{Update } \theta&lt;/em&gt;{k+1} = \theta_k + \eta x \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;优缺点分析&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理论保证&lt;/strong&gt;：单调提升，不再担心学习率太大导致训练崩溃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据效率&lt;/strong&gt;：比 REINFORCE 高，因为利用了二阶信息（自然梯度）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;计算复杂&lt;/strong&gt;：CG 和 HVP 实现复杂，且计算量大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;约束太硬&lt;/strong&gt;：KL 散度是硬约束，处理起来不够灵活。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 预告&lt;/strong&gt;：
TRPO 虽然好，但太复杂了。有没有一种方法，既能保留 TRPO 的“信任区域”思想（稳定），又能像 SGD 一样简单（一阶优化）？
这就是 &lt;strong&gt;PPO (Proximal Policy Optimization)&lt;/strong&gt; 的由来（下一章内容）。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（10）：Actor-Critic</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-10</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-10</guid><description>策略梯度与价值函数的完美结合：详解 Actor-Critic 架构。从 Baseline 减小方差的数学证明，到优势函数 (Advantage) 的推导及 A2C 算法流程。</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的笔记中，我们学习了两种截然不同的强化学习路径：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Value-Based (如 Q-Learning)&lt;/strong&gt;：通过学习价值函数 $Q(s,a)$ 来间接导出策略。优点是方差小（利用了 TD 的一步更新），缺点是无法处理连续动作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy-Based (如 REINFORCE)&lt;/strong&gt;：直接学习策略 $\pi_\theta$。优点是可以处理连续动作，缺点是方差极大（因为使用了蒙特卡洛回报 $G_t$），且只能在回合结束后更新。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Actor-Critic (AC)&lt;/strong&gt; 架构旨在结合两者的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Actor (演员)&lt;/strong&gt;：即策略网络 $\pi_\theta(a|s)$，负责由状态输出动作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critic (评论家)&lt;/strong&gt;：即价值网络 $V_w(s)$ 或 $Q_w(s,a)$，负责评估 Actor 的动作好不好，帮助 Actor 减小方差加速学习。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;降低方差的技巧：基线 (Baseline)&lt;/h2&gt;
&lt;p&gt;回顾 REINFORCE 的梯度公式：
$$
\nabla_\theta J(\theta) = \mathbb{E}&lt;em&gt;{\tau \sim \pi&lt;/em&gt;\theta} \left[ \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \right]
$$
这里的 $G_t$ 是从 $t$ 时刻开始的累积回报。由于环境随机性和策略随机性，$G_t$ 的波动非常大，导致梯度估计不稳定。&lt;/p&gt;
&lt;p&gt;为了减小方差，我们引入一个 &lt;strong&gt;基线函数 (Baseline) $b(s)$&lt;/strong&gt;。基线函数只与状态有关，与动作无关。
我们把梯度修改为：
$$
\nabla_\theta J(\theta) = \mathbb{E} \left[ \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) (G_t - b(s_t)) \right]
$$&lt;/p&gt;
&lt;h3&gt;数学证明：引入基线不改变梯度期望&lt;/h3&gt;
&lt;p&gt;我们需要证明减去一项 $b(s_t)$ 后，梯度的期望值不变。即证明：
$$
\mathbb{E}&lt;em&gt;{a_t \sim \pi&lt;/em&gt;\theta} [\nabla_\theta \log \pi_\theta(a_t|s_t) \cdot b(s_t)] = 0
$$&lt;/p&gt;
&lt;p&gt;证明如下：
$$
\begin{align}
\mathbb{E}&lt;em&gt;{a \sim \pi} [\nabla&lt;/em&gt;\theta \log \pi(a|s) \cdot b(s)]
&amp;#x26;= \sum_{a} \pi(a|s) \frac{\nabla_\theta \pi(a|s)}{\pi(a|s)} b(s) \notag \
&amp;#x26;= b(s) \sum_{a} \nabla_\theta \pi(a|s) \notag \
&amp;#x26;= b(s) \nabla_\theta \sum_{a} \pi(a|s) \notag \
&amp;#x26;= b(s) \nabla_\theta (1) \notag \
&amp;#x26;= 0 \notag
\end{align}
$$
结论：只要 $b(s)$ 不依赖于动作 $a$，我们可以随意减去它而不改变梯度的方向，但能显著改变梯度的方差。通常，我们选择状态价值函数 $V(s)$ 作为基线。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Actor-Critic 架构演变&lt;/h2&gt;
&lt;h3&gt;Q Actor-Critic&lt;/h3&gt;
&lt;p&gt;如果我们用一个神经网络 $Q_w(s,a)$ 来近似 REINFORCE 中的 $G_t$，梯度变为：
$$
\nabla_\theta J(\theta) \approx \mathbb{E} [\nabla_\theta \log \pi_\theta(a|s) Q_w(s,a)]
$$
但这并没有解决问题，因为单纯拟合 $Q$ 值还是很难。&lt;/p&gt;
&lt;h3&gt;Advantage Actor-Critic (A2C)&lt;/h3&gt;
&lt;p&gt;为了利用 Baseline 减小方差，我们希望梯度形式为：
$$
\nabla_\theta J(\theta) \approx \mathbb{E} [\nabla_\theta \log \pi_\theta(a|s) (Q_w(s,a) - V_v(s))]
$$
其中 $Q(s,a) - V(s)$ 被称为 &lt;strong&gt;优势函数 (Advantage Function)&lt;/strong&gt;，记为 $A(s,a)$。它表示“在状态 $s$ 下，动作 $a$ 比平均情况好了多少”。&lt;/p&gt;
&lt;p&gt;但是，如果我们需要同时维护两个网络（一个算 $Q$，一个算 $V$），训练会很麻烦。我们可以利用 &lt;strong&gt;TD Error&lt;/strong&gt; 来近似优势函数。&lt;/p&gt;
&lt;p&gt;根据贝尔曼方程：
$$ Q(s_t, a_t) \approx r_t + \gamma V(s_{t+1}) $$
因此，优势函数可以写为：
$$
\begin{align}
A(s_t, a_t) &amp;#x26;= Q(s_t, a_t) - V(s_t) \notag \
&amp;#x26;\approx r_t + \gamma V(s_{t+1}) - V(s_t) \notag
\end{align}
$$
这恰好就是 &lt;strong&gt;TD Error ($\delta_t$)&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;因此，我们只需要维护一个 &lt;strong&gt;Actor 网络 $\pi_\theta(a|s)$&lt;/strong&gt; 和一个 &lt;strong&gt;Critic 网络 $V_w(s)$&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;A2C 算法流程&lt;/h2&gt;
&lt;p&gt;在 Advantage Actor-Critic 中，Critic 的任务是把 $V_w(s)$ 估得越准越好，Actor 的任务是利用 Critic 提供的 TD Error 来更新策略。&lt;/p&gt;
&lt;h3&gt;Critic 的更新 (Value Update)&lt;/h3&gt;
&lt;p&gt;Critic 的目标是最小化 TD Error 的平方（即回归问题）：
$$
L_{critic}(w) = \frac{1}{2} \left( r_t + \gamma V_w(s_{t+1}) - V_w(s_t) \right)^2
$$
梯度更新：
$$ w \leftarrow w + \alpha_c \delta_t \nabla_w V_w(s_t) $$&lt;/p&gt;
&lt;h3&gt;Actor 的更新 (Policy Update)&lt;/h3&gt;
&lt;p&gt;Actor 使用 TD Error 作为优势函数的估计值进行梯度上升：
$$
\nabla_\theta J(\theta) \approx \nabla_\theta \log \pi_\theta(a_t|s_t) \delta_t
$$
梯度更新：
$$ \theta \leftarrow \theta + \alpha_a \delta_t \nabla_\theta \log \pi_\theta(a_t|s_t) $$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 $\delta_t &gt; 0$（惊喜，结果比预期好）：增加动作 $a_t$ 的概率。&lt;/li&gt;
&lt;li&gt;如果 $\delta_t &amp;#x3C; 0$（失望，结果比预期差）：减小动作 $a_t$ 的概率。&lt;/li&gt;
&lt;li&gt;这里的“预期”就是 Critic 提供的 $V(s_t)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;A2C 伪代码&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize Actor } \pi_\theta \text{ and Critic } V_w \
&amp;#x26; \bullet ; \textbf{For } \text{episode } = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Initialize state } s \
&amp;#x26; \bullet \qquad \textbf{For } \text{step } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Sample action } a \sim \pi_\theta(\cdot|s) \
&amp;#x26; \bullet \qquad \qquad \text{Execute } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad \textbf{// Calculate TD Error (Advantage)} \
&amp;#x26; \bullet \qquad \qquad \delta \leftarrow r + \gamma V_w(s&apos;) - V_w(s) \
&amp;#x26; \bullet \qquad \qquad \textbf{// Update Critic} \
&amp;#x26; \bullet \qquad \qquad w \leftarrow w + \alpha_c \delta \nabla_w V_w(s) \
&amp;#x26; \bullet \qquad \qquad \textbf{// Update Actor} \
&amp;#x26; \bullet \qquad \qquad \theta \leftarrow \theta + \alpha_a \delta \nabla_\theta \log \pi_\theta(a|s) \
&amp;#x26; \bullet \qquad \qquad s \leftarrow s&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;偏差与方差的权衡 (Bias-Variance Tradeoff)&lt;/h2&gt;
&lt;p&gt;我们可以总结一下不同计算 Advantage 的方法，它们体现了 RL 中核心的权衡：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;蒙特卡洛 (REINFORCE)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;$A_t \approx G_t - V(s_t)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无偏差&lt;/strong&gt;：$G_t$ 是真实回报。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高方差&lt;/strong&gt;：受整个序列随机性影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actor-Critic (TD)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;$A_t \approx r_t + \gamma V(s_{t+1}) - V(s_t)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低方差&lt;/strong&gt;：只受一步随机性影响。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有偏差&lt;/strong&gt;：依赖于 Critic 的估计 $V(s_{t+1})$，如果 Critic 还没练好，Actor 就会被带偏。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了平衡两者，我们可以使用 &lt;strong&gt;多步 TD&lt;/strong&gt; 或者 &lt;strong&gt;GAE (Generalized Advantage Estimation)&lt;/strong&gt;，这是 PPO 等进阶算法的核心技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Actor-Critic 架构是现代深度强化学习的主流架构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它解决了 REINFORCE 方差大、更新慢的问题。&lt;/li&gt;
&lt;li&gt;它解决了 DQN 无法处理连续动作的问题。&lt;/li&gt;
&lt;li&gt;它是后续 &lt;strong&gt;A3C, DDPG, TRPO, PPO, SAC&lt;/strong&gt; 等高级算法的共同祖先。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（9）：REINFORCE</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-9</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-9</guid><description>从价值到策略：详解策略梯度 (Policy Gradient) 定理的完整数学推导，并介绍最基础的策略梯度算法——REINFORCE。</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的 DQN 等算法中，我们都是先学习价值函数 $Q(s,a)$，再根据价值函数推导出策略（例如 $\epsilon$-Greedy）。这类方法称为 &lt;strong&gt;Value-Based&lt;/strong&gt; 方法。&lt;/p&gt;
&lt;p&gt;但这类方法有一些局限：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无法处理连续动作空间&lt;/strong&gt;：在连续动作中找 $\max_a Q(s,a)$ 非常困难。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无法学习随机策略&lt;/strong&gt;：DQN 最终学到的是确定性策略，但在某些博弈场景（如剪刀石头布），随机策略才是最优的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，我们引入 &lt;strong&gt;Policy-Based&lt;/strong&gt; 方法：直接参数化策略 $\pi_\theta(a|s)$，通过调整参数 $\theta$ 来最大化期望回报。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;策略的表示&lt;/h2&gt;
&lt;p&gt;我们需要用一个函数（通常是神经网络）来表示策略。&lt;/p&gt;
&lt;h3&gt;随机策略 (Stochastic Policy)&lt;/h3&gt;
&lt;p&gt;输入状态 $s$，输出动作的概率分布。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离散动作&lt;/strong&gt;（如 Softmax）：
$$ \pi(a|s;\theta)=\frac{\exp(Q_\theta(s,a))}{\sum_{a^\prime}\exp(Q_\theta(s,a^\prime))} $$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续动作&lt;/strong&gt;（如高斯分布）：
$$ \pi(a|s;\theta) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{(a-\mu_\theta(s))^2}{2\sigma^2}\right) $$
通常网络输出均值 $\mu_\theta(s)$ 和标准差 $\sigma_\theta(s)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;确定性策略 (Deterministic Policy)&lt;/h3&gt;
&lt;p&gt;输入状态 $s$，直接输出动作值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离散动作&lt;/strong&gt;：$$ a=\operatorname{argmax}&lt;em&gt;{a} Q&lt;/em&gt;\theta(s,a) $$ （不可微，无法直接用梯度下降）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续动作&lt;/strong&gt;：$$ a=\mu_\theta(s) $$ （可微，用于 DDPG 等算法）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;策略梯度定理 (Policy Gradient Theorem)&lt;/h2&gt;
&lt;p&gt;这是 Policy-Based 方法的基石。我们的目标是最大化期望回报 $J(\theta)$，通过计算梯度 $\nabla_\theta J(\theta)$ 来更新参数。&lt;/p&gt;
&lt;h3&gt;目标函数&lt;/h3&gt;
&lt;p&gt;$$
J(\theta) = \mathbb{E}&lt;em&gt;{s_0}[V^{\pi&lt;/em&gt;\theta}(s_0)]
$$
其中 $s_0$ 是初始状态。&lt;/p&gt;
&lt;h3&gt;梯度推导 (The &quot;Hard&quot; Part)&lt;/h3&gt;
&lt;p&gt;我们需要计算 $\nabla_\theta V^{\pi_\theta}(s)$。根据贝尔曼方程展开：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
\nabla_\theta V^{\pi_\theta}(s)
&amp;#x26;= \nabla_\theta \sum_{a\in \mathcal{A}} \pi_\theta (a|s) Q^{\pi_\theta}(s,a) \notag \
&amp;#x26;= \sum_{a\in\mathcal{A}}\left[\nabla_\theta \pi_\theta (a|s) Q^{\pi_\theta}(s,a) +\pi_\theta (a|s) \nabla_\theta Q^{\pi_\theta}(s,a) \right] \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;这里的难点在于 $\nabla_\theta Q^{\pi_\theta}(s,a)$，因为 $Q$ 值本身也依赖于策略参数 $\theta$（未来的动作会变）。我们继续展开 $Q$：
$$
\begin{align}
\nabla_\theta Q^{\pi_\theta}(s,a) &amp;#x26;= \nabla_\theta \sum_{r,s^\prime} P(s^\prime, r| s, a) (r + \gamma V^{\pi_\theta}(s^\prime)) \notag \
&amp;#x26;= \sum_{s^\prime} P(s^\prime| s, a) \gamma \nabla_\theta V^{\pi_\theta}(s^\prime) \notag
\end{align}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：环境的动力学 $P$ 和奖励 $r$ 与 $\theta$ 无关，所以导数为 0。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;代回原式，得递归形式：
$$
\begin{align}
\nabla_\theta V^{\pi_\theta}(s)
&amp;#x26;= \underbrace{\sum_{a\in\mathcal{A}}\nabla_\theta\pi_\theta(a|s) Q^{\pi_\theta}(s,a)}&lt;em&gt;{\phi(s)} + \gamma \sum&lt;/em&gt;{a\in\mathcal{A}}\pi_\theta (a|s) \sum_{s^\prime \in \mathcal{S}} P(s^\prime| s, a) \nabla_\theta V^{\pi_\theta}(s^\prime) \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;定义转移概率 $d^{\pi_\theta}(s \to s&apos;, k)$ 为策略 $\pi_\theta$ 从 $s$ 出发走 $k$ 步到达 $s&apos;$ 的概率。反复迭代上述递归式：
$$
\begin{align}
\nabla_\theta V^{\pi_\theta}(s)
&amp;#x26;= \phi(s) + \gamma \sum_{s&apos;} d(s \to s&apos;, 1) \nabla_\theta V(s&apos;) \notag \
&amp;#x26;= \phi(s) + \gamma \sum_{s&apos;} d(s \to s&apos;, 1) [\phi(s&apos;) + \gamma \sum_{s&apos;&apos;} d(s&apos; \to s&apos;&apos;, 1) \nabla_\theta V(s&apos;&apos;)] \notag \
&amp;#x26;= \dots \notag \
&amp;#x26;= \sum_{x \in \mathcal{S}} \sum_{k=0}^\infty \gamma^k d^{\pi_\theta}(s \to x, k) \phi(x) \notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;引入状态访问分布&lt;/h3&gt;
&lt;p&gt;回到总目标函数 $J(\theta)$ 的梯度：
$$
\begin{align}
\nabla_\theta J(\theta) &amp;#x26;= \mathbb{E}&lt;em&gt;{s_0} [\nabla&lt;/em&gt;\theta V^{\pi_\theta}(s_0)] \notag \
&amp;#x26;= \sum_{s \in \mathcal{S}} \left( \sum_{k=0}^\infty \gamma^k d^{\pi_\theta}(s_0 \to s, k) \right) \phi(s) \notag
\end{align}
$$&lt;/p&gt;
&lt;p&gt;利用状态访问分布 $\nu^{\pi_\theta}(s)$ 的定义：
$$ \sum_{k=0}^\infty \gamma^k d^{\pi_\theta}(s_0 \to s, k) \propto \nu^{\pi_\theta}(s) $$&lt;/p&gt;
&lt;p&gt;我们得到了极其优雅的 &lt;strong&gt;策略梯度定理&lt;/strong&gt;：
$$
\begin{align}
\nabla_\theta J(\theta)
&amp;#x26;\propto \sum_{s \in \mathcal{S}} \nu^{\pi_\theta}(s) \phi(s) \notag \
&amp;#x26;= \sum_{s \in \mathcal{S}} \nu^{\pi_\theta}(s) \sum_{a \in \mathcal{A}} \nabla_\theta \pi_\theta(a|s) Q^{\pi_\theta}(s,a) \notag
\end{align}
$$&lt;/p&gt;
&lt;h3&gt;对数导数技巧 (Log-Derivative Trick)&lt;/h3&gt;
&lt;p&gt;为了能在采样中计算，我们利用恒等式 $\nabla \pi = \pi \frac{\nabla \pi}{\pi} = \pi \nabla \log \pi$：
$$
\begin{align}
\nabla_\theta J(\theta)
&amp;#x26;= \mathbb{E}&lt;em&gt;{s \sim \nu^{\pi&lt;/em&gt;\theta}} \left[ \sum_{a \in \mathcal{A}} \pi_\theta(a|s) \nabla_\theta \log \pi_\theta(a|s) Q^{\pi_\theta}(s,a) \right] \notag \
&amp;#x26;= \mathbb{E}&lt;em&gt;{\pi&lt;/em&gt;\theta} [\nabla_\theta \log \pi_\theta(a|s) Q^{\pi_\theta}(s,a)] \notag
\end{align}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：我们不需要知道环境的状态转移 $P$，也不需要对状态分布 $\nu(s)$ 求导。只要让智能体在环境里玩，收集数据，就可以计算梯度！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;REINFORCE 算法&lt;/h2&gt;
&lt;p&gt;REINFORCE 是最基础的策略梯度算法，它使用 &lt;strong&gt;蒙特卡洛方法 (Monte-Carlo)&lt;/strong&gt; 来估计 $Q^{\pi_\theta}(s,a)$。&lt;/p&gt;
&lt;p&gt;对于一条完整的轨迹 $\tau = {s_1, a_1, r_1, \dots, s_T, a_T, r_T}$，时刻 $t$ 的真实回报 $G_t$ 是 $Q(s_t, a_t)$ 的无偏估计：
$$ Q^{\pi_\theta}(s_t, a_t) \approx G_t = \sum_{k=t}^T \gamma^{k-t} r_k $$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参数更新公式&lt;/strong&gt;：
$$ \theta \leftarrow \theta + \alpha \gamma^t G_t \nabla_\theta \log \pi_\theta(a_t|s_t) $$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：如果某个动作 $a_t$ 带来了高回报 $G_t$，我们就增加它的概率（$\nabla \log \pi$ 方向）；如果回报低（甚至是负的），就减少它的概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;算法伪代码&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize policy parameters } \theta \
&amp;#x26; \bullet ; \textbf{For } \text{episode } e = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Generate trajectory } \tau = {s_1, a_1, r_1, \dots, s_T, a_T, r_T} \sim \pi_\theta \
&amp;#x26; \bullet \qquad \textbf{For } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad G_t \leftarrow \sum_{k=t}^T \gamma^{k-t} r_k \
&amp;#x26; \bullet \qquad \qquad \theta \leftarrow \theta + \alpha \gamma^t G_t \nabla_\theta \log \pi_\theta(a_t|s_t) \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;h3&gt;优缺点分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：可以直接处理连续动作；学习到的随机策略可以探索；数学推导优美。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方差极大&lt;/strong&gt;：一局游戏的结果随机性很大，导致梯度估计不稳定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Policy&lt;/strong&gt;：必须采集一条数据就更新一次，旧数据无法重复利用，效率低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回合更新&lt;/strong&gt;：必须等到游戏结束才能计算 $G_t$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 思考&lt;/strong&gt;：为了减小方差，我们通常会减去一个 &lt;strong&gt;基线 (Baseline)&lt;/strong&gt; $b(s)$，比如状态价值 $V(s)$。这不会改变梯度的期望，但能显著降低方差。这就是 &lt;strong&gt;Actor-Critic&lt;/strong&gt; 算法的雏形（下一章内容）。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（8）：DQN</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-8</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-8</guid><description>深度强化学习的开山之作。详解 DQN 如何利用神经网络拟合 Q 值，以及两大核心创新：经验回放与目标网络。进阶涵盖 Double DQN 与 Dueling DQN。</description><pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的 Q-Learning 算法中，我们使用一个矩阵（Q-Table）来记录每个状态动作对 $(s,a)$ 的价值。
这种方法有两个致命局限：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内存限制&lt;/strong&gt;：如果状态空间很大（例如围棋 $10^{170}$），表格根本存不下。这被称为&lt;strong&gt;维度灾难 (Curse of Dimensionality)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;泛化能力差&lt;/strong&gt;：对于没见过的状态，表格无法给出估计，而在连续状态空间中，几乎很难遇到完全一样的状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了解决这个问题，我们引入&lt;strong&gt;函数拟合 (Function Approximation)&lt;/strong&gt;。&lt;strong&gt;深度Q网络 (Deep Q-Network, DQN)&lt;/strong&gt; 使用一个神经网络 $Q_\omega(s, a)$ 来近似 $Q^*(s, a)$，输入状态 $s$，输出所有离散动作的 Q 值。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;深度 Q 网络 (DQN)&lt;/h2&gt;
&lt;h3&gt;核心定义&lt;/h3&gt;
&lt;p&gt;在 DQN 中，我们使用参数为 $\omega$ 的神经网络来拟合动作价值函数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：状态 $s$（例如游戏的屏幕像素）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：每个动作 $a \in \mathcal{A}$ 对应的价值 $Q(s,a)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;损失函数&lt;/h3&gt;
&lt;p&gt;类似于 Q-Learning，我们希望神经网络的输出逼近 TD Target。
对于一条数据 $(s_i, a_i, r_i, s_i^\prime)$，目标是最小化均方误差：&lt;/p&gt;
&lt;p&gt;$$
J(\omega)=\frac{1}{2N}\sum_{i=1}^{N}\left[ \underbrace{Q_\omega(s_i,a_i)}&lt;em&gt;{\text{预测值}} - \underbrace{\left(r_i+\gamma \max&lt;/em&gt;{a^\prime}Q_\omega(s_i^\prime,a^\prime)\right)}_{\text{TD Target}} \right]^2
$$&lt;/p&gt;
&lt;p&gt;然而，直接这样训练是不稳定的。DQN 引入了两大“法宝”来解决这个问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;创新一：经验回放 (Experience Replay)&lt;/h2&gt;
&lt;p&gt;在一般的监督学习中，我们假设训练数据是&lt;strong&gt;独立同分布 (i.i.d)&lt;/strong&gt; 的。但在强化学习中，智能体采集的数据是序列相关的（现在的状态依赖于上一秒的状态）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;做法&lt;/strong&gt;：
维护一个&lt;strong&gt;回放缓冲区 (Replay Buffer)&lt;/strong&gt; $\mathcal{R}$。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;智能体与环境交互，将产生的数据 $(s_t, a_t, r_t, s_{t+1})$ 存入缓冲区。&lt;/li&gt;
&lt;li&gt;训练时，从缓冲区中&lt;strong&gt;随机采样&lt;/strong&gt;一个批次 (Batch) 的数据进行梯度下降。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打破相关性&lt;/strong&gt;：随机采样消除了数据之间的时间相关性，满足独立同分布假设，稳定网络训练。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高样本效率&lt;/strong&gt;：一条经验数据可以被多次采样利用，而不是用完即弃。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;创新二：目标网络 (Target Network)&lt;/h2&gt;
&lt;p&gt;在原版 Q-Learning 中，TD Target 的计算也依赖于当前网络参数 $\omega$：
$$
y_i = r_i + \gamma \max_{a&apos;} Q_\omega(s&apos;_i, a&apos;)
$$
这就好比“在射箭的同时，靶子也在动”。更新 $\omega$ 会同时改变预测值和目标值，容易导致震荡发散。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;做法&lt;/strong&gt;：
引入一个结构相同但参数独立的&lt;strong&gt;目标网络 (Target Network)&lt;/strong&gt;，参数记为 $\omega^-$。
计算目标值时使用 $\omega^-$，更新网络时优化 $\omega$。&lt;/p&gt;
&lt;p&gt;$$
y_i = r_i + \gamma \max_{a&apos;} Q_{\omega^-}(s&apos;_i, a&apos;)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更新规则&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;训练网络 $\omega$&lt;/strong&gt;：每个 step 都进行梯度下降更新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标网络 $\omega^-$&lt;/strong&gt;：每隔 $C$ 步（例如 1000 步），将 $\omega$ 的值复制给 $\omega^-$ ($\omega^- \leftarrow \omega$)。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉&lt;/strong&gt;：固定住靶子一会儿，让射手（训练网络）安心瞄准，等射手练好了，再把靶子挪到新的位置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;DQN 算法伪代码&lt;/h2&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize main network } Q_\omega \text{ and target network } Q_{\omega^-} \text{ with weights } \omega \
&amp;#x26; \bullet ; \text{Initialize replay buffer } \mathcal{R} \
&amp;#x26; \bullet ; \textbf{For } \text{episode } e = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Initialize state } s \
&amp;#x26; \bullet \qquad \textbf{For } \text{step } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Select action } a \text{ using } \epsilon\text{-greedy based on } Q_\omega(s) \
&amp;#x26; \bullet \qquad \qquad \text{Execute } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad \text{Store transition } (s, a, r, s&apos;) \text{ in } \mathcal{R} \
&amp;#x26; \bullet \qquad \qquad \textbf{If } |\mathcal{R}| &gt; \text{batch_size}: \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Sample batch } {(s_i, a_i, r_i, s&apos;&lt;em&gt;i)}&lt;/em&gt;{i=1}^N \text{ from } \mathcal{R} \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Calculate targets: } y_i = r_i + \gamma \max_{a&apos;} Q_{\omega^-}(s&apos;&lt;em&gt;i, a&apos;) \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Update } \omega \text{ by minimizing } \frac{1}{N}\sum (Q&lt;/em&gt;\omega(s_i, a_i) - y_i)^2 \
&amp;#x26; \bullet \qquad \qquad \qquad \textbf{Every } C \text{ steps: } \omega^- \leftarrow \omega \
&amp;#x26; \bullet \qquad \qquad s \leftarrow s&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;进阶 1：Double DQN&lt;/h2&gt;
&lt;h3&gt;问题：过高估计 (Overestimation)&lt;/h3&gt;
&lt;p&gt;DQN 在计算目标值时使用了 $\max$ 操作：$y_i = r + \gamma \max_{a&apos;} Q(s&apos;, a&apos;)$。
由于神经网络本身存在估计误差，$\max$ 操作倾向于选择那些被&lt;strong&gt;高估&lt;/strong&gt;的值。这种&lt;strong&gt;最大化偏差 (Maximization Bias)&lt;/strong&gt; 会导致 Q 值普遍偏大，影响策略学习。&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;解耦选择与评估&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;选择动作&lt;/strong&gt;：使用当前网络 $Q_\omega$ 来决定哪个动作最好（即 argmax）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估价值&lt;/strong&gt;：使用目标网络 $Q_{\omega^-}$ 来计算那个动作的价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Double DQN 目标公式&lt;/strong&gt;：
$$
y_i = r_i + \gamma Q_{\omega^-}(s&apos;&lt;em&gt;i, \underset{a&apos;}{\operatorname{argmax}} Q&lt;/em&gt;\omega(s&apos;_i, a&apos;))
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;进阶 2：Dueling DQN&lt;/h2&gt;
&lt;h3&gt;核心思想&lt;/h3&gt;
&lt;p&gt;在很多状态下，&lt;strong&gt;状态本身的价值&lt;/strong&gt;比&lt;strong&gt;选择什么动作&lt;/strong&gt;更重要。
例如：在赛车游戏中，如果前面是死胡同（状态差），无论你向左转还是向右转（动作），价值都很低。
Dueling DQN 改变了网络结构，将 Q 值分解为两部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;状态价值函数 (Value Function)&lt;/strong&gt; $V(s)$：仅与状态有关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势函数 (Advantage Function)&lt;/strong&gt; $A(s,a)$：与动作有关，表示动作 $a$ 相比平均情况好多少。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
Q(s, a) = V(s) + A(s, a)
$$&lt;/p&gt;
&lt;h3&gt;可辨识性问题 (Identifiability)&lt;/h3&gt;
&lt;p&gt;如果直接用 $V+A$，网络会出现唯一性问题（$V$ 加 10，$A$ 减 10，总和 $Q$ 不变）。为了让 $V$ 和 $A$ 能被唯一确定，我们需要强行约束 $A$ 的某种性质。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;聚合公式 (Aggregation)&lt;/strong&gt;：
通常让优势函数 $A$ 对于某个状态的均值为 0，或者最大值为 0。
$$
Q(s,a;\theta,\alpha,\beta)=V(s;\theta,\beta) + \left( A(s,a;\theta,\alpha) - \frac{1}{|\mathcal{A}|}\sum_{a^\prime}A(s,a^\prime;\theta,\alpha) \right)
$$
或者：
$$
Q(s,a;\theta,\alpha,\beta)=V(s;\theta,\beta) + \left( A(s,a;\theta,\alpha) - \max_{a^\prime}A(s,a^\prime;\theta,\alpha) \right)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在动作对环境影响不大的状态下，能更快地学习状态价值 $V$。&lt;/li&gt;
&lt;li&gt;极大地提高了训练效率和稳定性。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/><enclosure url="https://pic.hana0721.top/rl-note-2.8vndvqvn7c.webp"/></item><item><title>RL笔记（7）：Dyna-Q</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-7</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-7</guid><description>从试错到规划：基于模型的强化学习 (Model-Based RL) 入门。详解 Dyna-Q 算法如何利用环境模型生成模拟数据，加速策略学习。</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在之前的 Q-Learning 和 SARSA 中，智能体只能通过&lt;strong&gt;真实&lt;/strong&gt;地与环境交互（摔跟头、吃金币）来学习，这被称为 &lt;strong&gt;无模型强化学习 (Model-Free RL)&lt;/strong&gt;。这种方式虽然稳健，但效率较低，因为真实交互往往昂贵且缓慢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基于模型的强化学习 (Model-Based RL)&lt;/strong&gt; 引入了一个新的思路：如果智能体能学会环境的运行规律（建立一个模型），它就可以在脑海中“推演”未来，从而减少对真实世界的依赖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model-Free (Q-Learning)&lt;/strong&gt;：像是在练习投篮，必须每次真把球投出去才知道进没进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model-Based (Dyna-Q)&lt;/strong&gt;：像是下棋高手，不仅在实战中学习，还在脑海中复盘和推演（Planning），“如果我走这一步，对手可能会那样走...”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;核心概念&lt;/h2&gt;
&lt;h3&gt;什么是模型 (Model)？&lt;/h3&gt;
&lt;p&gt;在 RL 中，模型 $M$ 指的是对环境动态的模拟。给定状态 $s$ 和动作 $a$，模型能预测出下一个状态 $s&apos;$ 和奖励 $r$：
$$
s&apos;, r \leftarrow M(s, a)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预知模型&lt;/strong&gt;：如下棋，规则是完全已知的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习模型&lt;/strong&gt;：如机器人走路，需要通过观测数据 $(s, a, r, s&apos;)$ 来拟合环境规律。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;两个关键指标&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;收敛效果&lt;/strong&gt;：算法收敛后能够获得的期望回报。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样本复杂度 (Sample Complexity)&lt;/strong&gt;：达到同样的性能，需要在真实环境中交互多少次。
&lt;ul&gt;
&lt;li&gt;Model-Based 的核心优势就是&lt;strong&gt;降低样本复杂度&lt;/strong&gt;（少走弯路）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;学习与规划&lt;/h3&gt;
&lt;p&gt;Dyna-Q 架构将 RL 过程分为了两部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;直接强化学习 (Direct RL)&lt;/strong&gt;：利用&lt;strong&gt;真实经验&lt;/strong&gt;更新价值函数（和 Q-Learning 一样）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规划 (Planning)&lt;/strong&gt;：利用&lt;strong&gt;模拟经验&lt;/strong&gt;（模型生成的）更新价值函数。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Dyna-Q 算法&lt;/h2&gt;
&lt;p&gt;Dyna-Q 是将 Q-Learning 与规划结合的最简单范例。它维护一个简单的&lt;strong&gt;查表式模型 (Table-based Model)&lt;/strong&gt;，记录在这个状态 $s$ 做动作 $a$ 曾经发生了什么。&lt;/p&gt;
&lt;h3&gt;算法流程&lt;/h3&gt;
&lt;p&gt;在每个时间步 $t$：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;行动&lt;/strong&gt;：在真实环境中执行动作，获得 $(s, a, r, s&apos;)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直接学习&lt;/strong&gt;：用真实数据更新 $Q(s,a)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型学习&lt;/strong&gt;：把 $(s, a) \to (r, s&apos;)$ 记入模型（如果是确定性环境，直接覆盖；如果是随机环境，可能需要记录分布）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规划 (Planning)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;重复 $N$ 次（比如 10 次）：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做梦&lt;/strong&gt;：随机从记忆中挑选一个&lt;strong&gt;曾经去过的&lt;/strong&gt;状态 $s_{sim}$ 和&lt;strong&gt;曾经做过的&lt;/strong&gt;动作 $a_{sim}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推演&lt;/strong&gt;：询问模型得到模拟结果 $r_{sim}, s&apos;_{sim}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;间接学习&lt;/strong&gt;：用模拟数据更新 $Q(s_{sim}, a_{sim})$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;算法伪代码&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize } Q(s,a), \text{Model } M(s,a) \
&amp;#x26; \bullet ; \textbf{For } \text{episode } e = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Initialize state } s \
&amp;#x26; \bullet \qquad \textbf{For } \text{step } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Choose action } a \text{ using } \epsilon\text{-greedy} \
&amp;#x26; \bullet \qquad \qquad \text{Execute } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad \textbf{1. Direct RL (Q-Learning update):} \
&amp;#x26; \bullet \qquad \qquad Q(s,a) \leftarrow Q(s,a) + \alpha [r + \gamma \max_{a&apos;} Q(s&apos;, a&apos;) - Q(s,a)] \
&amp;#x26; \bullet \qquad \qquad \textbf{2. Model Learning:} \
&amp;#x26; \bullet \qquad \qquad M(s, a) \leftarrow (r, s&apos;) \
&amp;#x26; \bullet \qquad \qquad \textbf{3. Planning (Loop N times):} \
&amp;#x26; \bullet \qquad \qquad \textbf{For } n = 1 \to N \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Randomly select } s_{sim} \text{ previously observed} \
&amp;#x26; \bullet \qquad \qquad \qquad \text{Randomly select } a_{sim} \text{ previously taken in } s_{sim} \
&amp;#x26; \bullet \qquad \qquad \qquad r_{sim}, s&apos;&lt;em&gt;{sim} \leftarrow M(s&lt;/em&gt;{sim}, a_{sim}) \
&amp;#x26; \bullet \qquad \qquad \qquad Q(s_{sim}, a_{sim}) \leftarrow Q(s_{sim}, a_{sim}) + \alpha [r_{sim} + \gamma \max_{a&apos;} Q(s&apos;&lt;em&gt;{sim}, a&apos;) - Q(s&lt;/em&gt;{sim}, a_{sim})] \
&amp;#x26; \bullet \qquad \qquad \textbf{End For} \
&amp;#x26; \bullet \qquad \qquad s \leftarrow s&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;优缺点分析&lt;/h2&gt;
&lt;h3&gt;优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;样本效率极高&lt;/strong&gt;：在每次与环境交互后，Dyna-Q 会进行 $N$ 次规划。这意味着&lt;strong&gt;一条真实经验被复用了 $N+1$ 次&lt;/strong&gt;。对于真实交互很昂贵的场景（如机器人实验），这非常有用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;劣势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型偏差 (Model Bias)&lt;/strong&gt;：这是 Model-Based RL 的死穴。
&lt;ul&gt;
&lt;li&gt;如果模型学错了（比如现实中走这一步会掉坑里，模型却认为会飞过去），那么规划得越多，智能体就在错误的道路上越走越远。&lt;/li&gt;
&lt;li&gt;解决方案通常涉及&lt;strong&gt;不确定性估计&lt;/strong&gt;（如果对模型预测不自信，就不要信它）或&lt;strong&gt;探索奖励&lt;/strong&gt;（Dyna-Q+，鼓励去验证模型不确定的地方）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Dyna-Q 完美展示了强化学习如何结合“行万里路”（真实交互）与“读万卷书”（模型规划）。
在下一章，我们将正式告别“表格型 (Tabular)”强化学习，引入神经网络，进入 &lt;strong&gt;深度强化学习 (Deep Reinforcement Learning)&lt;/strong&gt; 的时代。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>RL笔记（6）：时序差分</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-6</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-6</guid><description>结合了蒙特卡洛与动态规划的精华：详解时序差分 (TD) 学习。涵盖 SARSA、Q-Learning 及其多步扩展，深入对比 On-Policy 与 Off-Policy 的本质区别。</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言（Introduction）&lt;/h2&gt;
&lt;p&gt;在大部分强化学习的现实场景中，MDP 中的状态转移概率 $\mathcal{P}$ 和奖励函数 $\mathcal{R}$ 通常是未知的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为没有模型，我们无法直接用&lt;strong&gt;动态规划 (DP)&lt;/strong&gt; 来算出最优解。&lt;/li&gt;
&lt;li&gt;智能体必须像&lt;strong&gt;蒙特卡洛 (MC)&lt;/strong&gt; 那样，通过与环境交互、采样数据来学习。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类方法统称为 &lt;strong&gt;无模型强化学习 (Model-Free RL)&lt;/strong&gt;。本章将介绍其中最重要的一类方法：&lt;strong&gt;时序差分 (Temporal Difference, TD)&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;时序差分方法 (Temporal Difference)&lt;/h2&gt;
&lt;h3&gt;核心思想&lt;/h3&gt;
&lt;p&gt;时序差分 (TD) 结合了蒙特卡洛 (MC) 和动态规划 (DP) 的思想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;像 MC&lt;/strong&gt;：直接从经验（采样数据）中学习，不需要环境模型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;像 DP&lt;/strong&gt;：利用&lt;strong&gt;自举 (Bootstrapping)&lt;/strong&gt; 的思想，用后继状态的估计值来更新当前状态的估计值，而不需要等到回合结束。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;价值函数的更新&lt;/h3&gt;
&lt;p&gt;回顾蒙特卡洛 (MC) 的增量更新公式：
$$
V(s_t) \leftarrow V(s_t) + \alpha [G_t - V(s_t)]
$$
其中 $G_t$ 是从 $t$ 时刻开始直到回合结束的真实回报。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TD 的改进&lt;/strong&gt;：
TD 不想等到回合结束。它利用贝尔曼方程的性质，用 $r_t + \gamma V(s_{t+1})$ 来&lt;strong&gt;替代&lt;/strong&gt; $G_t$：
$$
V(s_t) \leftarrow V(s_t) + \alpha [\underbrace{r_t + \gamma V(s_{t+1})}_{\text{TD Target}} - V(s_t)]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TD Target&lt;/strong&gt;: $r_t + \gamma V(s_{t+1})$，这是我们对真实回报 $G_t$ 的一个有偏但方差更小的估计。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TD Error&lt;/strong&gt;: $\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)$，表示“当下的惊喜”——实际发生的情况比预期的好了多少。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;为什么可以替代？&lt;/h3&gt;
&lt;p&gt;根据 $V^\pi$ 的定义推导：
$$
\begin{align}
V^\pi(s) &amp;#x26;= \mathbb{E}&lt;em&gt;\pi[G_t | S_t=s] \notag \
&amp;#x26;= \mathbb{E}&lt;/em&gt;\pi [R_t + \gamma G_{t+1} | S_t=s] \notag \
&amp;#x26;= \mathbb{E}&lt;em&gt;\pi [R_t + \gamma V^\pi(S&lt;/em&gt;{t+1}) | S_t=s] \notag
\end{align}
$$
可见，$R_t + \gamma V(S_{t+1})$ 是 $V(s)$ 的无偏估计（假设 $V(S_{t+1})$ 准确）。随着迭代进行，最终 $V$ 会收敛到 $V^\pi$。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;SARSA 算法&lt;/h2&gt;
&lt;p&gt;SARSA 是 &lt;strong&gt;S&lt;/strong&gt;tate-&lt;strong&gt;A&lt;/strong&gt;ction-&lt;strong&gt;R&lt;/strong&gt;eward-&lt;strong&gt;S&lt;/strong&gt;tate-&lt;strong&gt;A&lt;/strong&gt;ction 的缩写，因为它利用五元组 $(s_t, a_t, r_t, s_{t+1}, a_{t+1})$ 进行更新。&lt;/p&gt;
&lt;h3&gt;从 V 到 Q&lt;/h3&gt;
&lt;p&gt;在 Model-Free 场景下，我们通常直接估计 &lt;strong&gt;动作价值函数 $Q(s,a)$&lt;/strong&gt;，而不是 $V(s)$，以便直接选取动作。
更新公式：
$$
Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [r_t + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t)]
$$&lt;/p&gt;
&lt;h3&gt;探索与利用&lt;/h3&gt;
&lt;p&gt;SARSA 需要解决两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;估计不准&lt;/strong&gt;：在训练初期，Q 值是不准确的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采样覆盖&lt;/strong&gt;：如果一直贪婪地选动作，可能永远无法发现更好的策略。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，SARSA 使用 &lt;strong&gt;$\epsilon$-贪婪策略 ($\epsilon$-Greedy)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以 $1-\epsilon$ 的概率选择 $\arg\max_a Q(s,a)$。&lt;/li&gt;
&lt;li&gt;以 $\epsilon$ 的概率随机选择动作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;算法伪代码&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize } Q(s,a) \
&amp;#x26; \bullet ; \textbf{For } \text{episode } = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Initialize state } s \
&amp;#x26; \bullet \qquad \text{Choose action } a \text{ from } s \text{ using } \epsilon\text{-greedy} \
&amp;#x26; \bullet \qquad \textbf{For } \text{step } = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Take action } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad \text{Choose action } a&apos; \text{ from } s&apos; \text{ using } \epsilon\text{-greedy} \
&amp;#x26; \bullet \qquad \qquad Q(s,a) \leftarrow Q(s,a) + \alpha [r + \gamma Q(s&apos;,a&apos;) - Q(s,a)] \
&amp;#x26; \bullet \qquad \qquad s \leftarrow s&apos;, a \leftarrow a&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;多步 SARSA ($n$-step SARSA)&lt;/h2&gt;
&lt;p&gt;MC 是无偏但方差大（要等很久），TD(0) 是偏差大但方差小（看一步）。我们可以折中一下，看 $n$ 步。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单步 TD (SARSA)&lt;/strong&gt;:
$$G_t^{(1)} = r_t + \gamma Q(s_{t+1}, a_{t+1})$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$n$ 步 TD&lt;/strong&gt;:
$$G_t^{(n)} = r_t + \gamma r_{t+1} + \dots + \gamma^n Q(s_{t+n}, a_{t+n})$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;$n$ 步 SARSA 更新规则&lt;/strong&gt;：
$$
Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [G_t^{(n)} - Q(s_t,a_t)]
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Q-Learning 算法&lt;/h2&gt;
&lt;p&gt;Q-Learning 是强化学习中最著名的算法之一，它与 SARSA 非常像，但有一个关键区别。&lt;/p&gt;
&lt;h3&gt;更新规则&lt;/h3&gt;
&lt;p&gt;$$
Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [r_t + \gamma \max_{a&apos;} Q(s_{t+1}, a&apos;) - Q(s_t,a_t)]
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键区别&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SARSA&lt;/strong&gt;：使用 $Q(s_{t+1}, a_{t+1})$。这里的 $a_{t+1}$ 是智能体&lt;strong&gt;实际采取&lt;/strong&gt;的动作（可能包含了 $\epsilon$ 的随机探索）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q-Learning&lt;/strong&gt;：使用 $\max_{a&apos;} Q(s_{t+1}, a&apos;)$。不管智能体下一步实际做了什么，我们在更新时都假设它会做&lt;strong&gt;最好的&lt;/strong&gt;那个动作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;算法伪代码&lt;/h3&gt;
&lt;p&gt;$$
\begin{aligned}
&amp;#x26; \bullet ; \text{Initialize } Q(s,a) \
&amp;#x26; \bullet ; \textbf{For } \text{episode } e = 1 \to E \textbf{ do}: \
&amp;#x26; \bullet \qquad \text{Initialize state } s \
&amp;#x26; \bullet \qquad \textbf{For } \text{step } t = 1 \to T \textbf{ do}: \
&amp;#x26; \bullet \qquad \qquad \text{Choose action } a \text{ from } s \text{ using } \epsilon\text{-greedy} \
&amp;#x26; \bullet \qquad \qquad \text{Take action } a, \text{ observe } r, s&apos; \
&amp;#x26; \bullet \qquad \qquad Q(s,a) \leftarrow Q(s,a) + \alpha [r + \gamma \max_{a&apos;} Q(s&apos;, a&apos;) - Q(s,a)] \
&amp;#x26; \bullet \qquad \qquad s \leftarrow s&apos; \
&amp;#x26; \bullet \qquad \textbf{End For} \
&amp;#x26; \bullet ; \textbf{End For}
\end{aligned}
$$&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;核心对比：在线策略 vs. 离线策略&lt;/h2&gt;
&lt;p&gt;这是强化学习中最重要的分类之一。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;行为策略 (Behavior Policy)&lt;/strong&gt;：智能体与环境交互、产生数据时使用的策略（通常包含随机性，如 $\epsilon$-greedy）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标策略 (Target Policy)&lt;/strong&gt;：我们想要学习和优化的策略（通常是贪婪策略，即最优策略）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;| 特性 | 在线策略 (On-Policy) | 离线策略 (Off-Policy) |
| :--- | :--- | :--- |
| &lt;strong&gt;定义&lt;/strong&gt; | 行为策略 &lt;strong&gt;==&lt;/strong&gt; 目标策略 | 行为策略 &lt;strong&gt;!=&lt;/strong&gt; 目标策略 |
| &lt;strong&gt;代表算法&lt;/strong&gt; | &lt;strong&gt;SARSA&lt;/strong&gt; | &lt;strong&gt;Q-Learning&lt;/strong&gt; |
| &lt;strong&gt;更新依据&lt;/strong&gt; | 使用&lt;strong&gt;实际执行&lt;/strong&gt;的下一个动作 $a_{t+1}$ 的价值 | 使用&lt;strong&gt;理论上最优&lt;/strong&gt;的动作 $\max Q$ 的价值 |
| &lt;strong&gt;优缺点&lt;/strong&gt; | 比较胆小。因为它知道自己下一步可能会乱走（随机探索），所以它会避开悬崖边缘（哪怕悬崖边有宝藏）。 | 比较大胆。它假设自己下一步一定会走最优路径，所以会勇敢地贴着悬崖走。 |
| &lt;strong&gt;数据效率&lt;/strong&gt; | 数据必须现采现用，不能使用旧策略产生的数据（Replay Buffer）。 | 可以使用过去的数据，或者别人玩的数据（适合结合 Experience Replay）。 |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 直觉理解&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SARSA&lt;/strong&gt; 像是一个&lt;strong&gt;谨慎的学生&lt;/strong&gt;：他在学习时会考虑到自己考试时可能会因为紧张（$\epsilon$ 随机性）而犯错，所以他平时练习时就尽量选容错率高的解法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q-Learning&lt;/strong&gt; 像是一个&lt;strong&gt;理想主义者&lt;/strong&gt;：他在学习时假设自己考试时绝对不会犯错（全选最优解 $\max Q$），所以他会学习那条理论上分数最高、但可能风险很大的路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>图床配置</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-5</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-5</guid><description>从模型到经验：如何不依赖状态转移矩阵，仅通过‘玩游戏’来估计价值？详解蒙特卡洛预测与控制、增量更新及 GLIE 性质。</description><pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考1：&lt;a href=&quot;https://axi404.top/blog/image-hosting&quot;&gt;图床选择与配置&lt;/a&gt; 该方法还是使用 github 作为图床&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;参考2：&lt;a href=&quot;https://axi404.top/blog/r2-image-host&quot;&gt;cloudflare r2 图床配置&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;参考3：&lt;a href=&quot;https://github.com/iawooo/cftc&quot;&gt;cloudflare 结合 telegram 实现图床配置&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文使用的是 &lt;strong&gt;参考 3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用的是 cloudflare pages&lt;/li&gt;
&lt;li&gt;注意 DATABASE 是 binding&lt;/li&gt;
&lt;li&gt;所有的变量都是必须的&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>Astro-Pure Blog 多平台部署(2) - cloudflare pages</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-4</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-4</guid><description>如何将 Astro-Pure 主题部署到 Cloudflare Pages 平台?</description><pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;接上一篇，现在已经有了 xx-blog 仓库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/deploy/cloudflare/#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-cicd-%E8%BF%9B%E8%A1%8C%E9%83%A8%E7%BD%B2&quot;&gt;部署你的 Astro 站点至 Cloudflare&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 注册 cloudflare 账号&lt;/h2&gt;
&lt;h2&gt;2. 登录至 Cloudflare dashboard&lt;/h2&gt;
&lt;p&gt;Compute (Workers) &gt; Workers &amp;#x26; Pages -&gt;  Create Application -&gt; 不要直接连接 github，选择下面的 &lt;strong&gt;Get Start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.cloudinwind4132.top/1769962721405.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后 Import an existing Git repository -&gt; 选择你想要部署的仓库（例如 xx-blog）-&gt; Begin setup&lt;/p&gt;
&lt;p&gt;配置项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Framework preset（框架预设）：Astro&lt;/li&gt;
&lt;li&gt;Build command（构建命令）：npm run build&lt;/li&gt;
&lt;li&gt;Build output directory（构建输出目录）：dist&lt;/li&gt;
&lt;li&gt;重要：Variables and Secrets 中添加 &lt;code&gt;DEPLOYMENT_PLATFORM&lt;/code&gt;，值为 &lt;code&gt;cloudflare&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 保存并部署，访问生产的链接&lt;/h2&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>Astro-Pure Blog 多平台部署(2) - github page</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-3</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-3</guid><description>如何将 astro-pure 主题部署到 github.io? 需要注意细节</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;接第一篇，现在已经有了 xx-blog 仓库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;目标：私有仓库 xx-blog（Astro 项目） → 每次 commit 自动构建 → 自动发布到公开的 xx.github.io → 通过 https://xx.github.io
访问&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;方案：👉 GitHub Actions + GitHub Pages（官方推荐玩法）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;xx-blog (私有, Astro 源码)
        |
        |  git push
        v
GitHub Actions
        |
        |  astro build
        v
xx.github.io (公开, 只存 dist 静态文件)
        |
        v
https://xx.github.io

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;xx-blog：私有，只放源码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xx.github.io：公开，只放构建后的静态文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub Actions 负责“搬运 + 构建 + 发布”&lt;/p&gt;
&lt;h2&gt;1. 创建 xx.github.io 仓库&lt;/h2&gt;
&lt;p&gt;如果用户名为 xx，则创建一个名为 xx.github.io 的仓库，属性为 &lt;code&gt;Public&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;2. github page 配置&lt;/h2&gt;
&lt;p&gt;xx.github.io → Settings → Pages&lt;/p&gt;
&lt;p&gt;设置为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source：Deploy from a branch&lt;/li&gt;
&lt;li&gt;Branch：main&lt;/li&gt;
&lt;li&gt;Folder：/ (root)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. github action 配置&lt;/h2&gt;
&lt;p&gt;Settings -&gt; Actions -&gt; General -&gt; Workflow permissions&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.cloudinwind4132.top/1769962883535.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;4. 配置 xx-blog 仓库&lt;/h2&gt;
&lt;h3&gt;4.1 修改配置文件&lt;/h3&gt;
&lt;p&gt;修改 &lt;code&gt;xx-blog/astro.config.mjs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default defineConfig({
  // Top-Level Options
  site: isGithubPages ? &apos;https://xx.github.io/&apos; : (isCloudflare ? &apos;https://xx.pages.dev/&apos; : &apos;https://xx.top/&apos;),
  // site: &apos;https://hana-blog.pages.dev/&apos;,
  // base: &apos;/docs&apos;,
  trailingSlash: &apos;never&apos;,

  // Internationalization
  i18n: {
    locales: [&apos;zh&apos;, &apos;en&apos;],
    defaultLocale: &apos;zh&apos;,
    routing: {
      prefixDefaultLocale: false
    }
  },

  adapter: isGithubPages ? undefined : (isCloudflare ? cloudflare() : vercel()),
  output: isGithubPages ? &apos;static&apos; : (isCloudflare ? &apos;static&apos; : &apos;server&apos;),

  image: {
    service: {
      entrypoint: &apos;astro/assets/services/sharp&apos;
    }
  },

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除 &lt;code&gt;package.json&lt;/code&gt; 中的 &lt;code&gt;overrides&lt;/code&gt; 字段（如果有的话）:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;overrides&quot;: {
    &quot;@emmetio/css-parser&quot;: &quot;0.5.0&quot;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 创建 token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开 Github 的创建 Token 的 &lt;a href=&quot;https://github.com/settings/personal-access-tokens/new&quot;&gt;页面&lt;/a&gt;，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Repository access 中选择 xx.github.io 的仓库，仓库权限中给 Content 的 read and write，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 xx-Blog 的仓库的 settings 中选择 Secrets and variables 中的 Actions 中添加一个 Secret，名字为 PERSONAL_TOKEN，值为刚刚创建的 Token。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4.3 新建 GitHub Actions 工作流&lt;/h3&gt;
&lt;p&gt;在 xx-blog 中创建文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.github/workflows/deploy.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Deploy to xx.github.io

on:
  push:
    branches:
      - main

permissions:
  contents: write

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Setup Bun
        uses: oven-sh/setup-bun@v1
        with:
          bun-version: latest

      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ~/.bun/install/cache
          key: ${{ runner.os }}-bun-${{ hashFiles(&apos;**/bun.lockb&apos;) }}
          restore-keys: |
            ${{ runner.os }}-bun-

      - name: Install dependencies
        run: bun i

      - name: Set environment variables
        run: |
          echo &quot;DEPLOYMENT_PLATFORM=github&quot; &gt;&gt; $GITHUB_ENV

      - name: Build site
        run: bun run build:github

      - name: Deploy to xx.github.io
        uses: peaceiris/actions-gh-pages@v3
        with:
          personal_token: ${{ secrets.PERSONAL_TOKEN }}
          external_repository: xx/xx.github.io
          publish_branch: main
          publish_dir: ./dist
          force_orphan: true

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 验证&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 cloudblog 中随便改点东西&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git push origin main&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开：cloudblog → Actions&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;看是否 Deploy Astro to GitHub Pages 变绿 ✅&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;查看 xx.github.io 里 应该只有这些东西&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cloud.github.io/
├── index.html
├── assets/
├── favicon.svg
├── _astro/
├── 404.html
└── ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;✔️ 全部是 Astro build 后的 dist 内容&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;访问：https://xx.github.io&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>Astro-Pure Blog 多平台部署(1)-Vercel</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-2</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-2</guid><description>将 astro 部署到 verel、 cloudflare pages</description><pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本篇内容适用于将 Astro-Pure 主题部署到 vercel&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;因为本人按照官方指南 使用 themplate 进行部署的时候，编译出现问题，故写此篇文章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;此处感谢：&lt;a href=&quot;https://axi404.com/&quot;&gt;Axi404&lt;/a&gt;，&lt;a href=&quot;https://hana0721.top/&quot;&gt;hana0721&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://axi404.top/blog/website-vercel&quot;&gt;Axi404 博客上手指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://axi404.top/blog/astro-multi-pages&quot;&gt;为 Astro 博客添加多部署站点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://axi404.top/blog/waline-install&quot;&gt;Waline 评论系统配置指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. github 仓库配置&lt;/h2&gt;
&lt;h3&gt;1.1 for 仓库&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;fork&lt;/code&gt; github仓库: https://github.com/Minakanmi-Yuki/hana-blog&lt;/p&gt;
&lt;p&gt;假设 fork 到个人 github 下的仓库名称为 xx-blog&lt;/p&gt;
&lt;h3&gt;1.2 xx-blog 仓库设置&lt;/h3&gt;
&lt;p&gt;修改配置 &lt;code&gt;astro.config.ts&lt;/code&gt;，只需要修改 &lt;code&gt;site&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// https://astro.build/config
export default defineConfig({
  // [Basic]
  site: &apos;https://xxx.top&apos;,
  // Deploy to a sub path
  // https://astro-pure.js.org/docs/setup/deployment#platform-with-base-path
  // base: &apos;/astro-pure/&apos;,
  trailingSlash: &apos;never&apos;,
  // root: &apos;./my-project-directory&apos;,
  server: { host: true },

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. Vercel 平台部署&lt;/h2&gt;
&lt;p&gt;使用 github 账号登录 vercel&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;import github repository&lt;/code&gt;，导入 xx-blog 仓库，然后部署，vercel 会自动完成部署，并提供一个免费的域名&lt;/p&gt;
&lt;h2&gt;3. 绑定专属域名&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://axi404.top/blog/website-vercel#%E6%AD%A5%E9%AA%A4%E4%B8%83%E5%8F%AF%E9%80%89%E7%BB%91%E5%AE%9A%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E5%9F%9F%E5%90%8D&quot;&gt;绑定自定义域名&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;4. 集成 Waline 评论系统&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://axi404.top/blog/waline-install&quot;&gt;Waline 评论系统配置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键：第一个在 https://your-waline-server-url/ui/ 中注册的账号是管理员，务必在部署后直接先行登录。&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item><item><title>Astro-Pure Blog 部署</title><link>https://vercel.cloudinwind4132.top/blog/rl-note-1</link><guid isPermaLink="true">https://vercel.cloudinwind4132.top/blog/rl-note-1</guid><description>如何将 astro-pure 主题部署到 github.io?</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本篇内容适用于将 Astro-Pure 主题部署到 xxx.github.io 仓库，然后通过 xxx.github.io 域名访问;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;但是按照本文方法部署后，导入到vercel 会报错，因为如果想把 blog 导入到 vercel，请看另一篇文章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;因为本人按照官方指南 使用 themplate 进行部署的时候，编译出现问题，故写此篇文章&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;此处感谢 &lt;a href=&quot;https://huang2202.github.io/&quot;&gt;huang2202&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 创建 xxx.github.io 并配置&lt;/h2&gt;
&lt;p&gt;Settings -&gt; Actions -&gt; General -&gt; Workflow permissions&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://p.ipic.vip/iuffch.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Setting-&gt;Pages-&gt;Build and deployment-&gt;选择 Github Action&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://p.ipic.vip/lajmey.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;2. git clone 相关代码&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git clone https://github.com/huang2202/huang2202.github.io.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载到本地后，删除 &lt;code&gt;.git&lt;/code&gt; 文件夹&lt;/p&gt;
&lt;h2&gt;3. git 配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cd huang2202.github.io

mv huang2202.github.io xxx.github.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关联自己的 github 仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git remote add origin https://github.com/xxx/xxx.github.io.git

git branch -M main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改配置 &lt;code&gt;astro.config.ts&lt;/code&gt;，只需要修改 &lt;code&gt;site&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// https://astro.build/config
export default defineConfig({
  // [Basic]
  site: &apos;https://xxx.github.io&apos;,
  // Deploy to a sub path
  // https://astro-pure.js.org/docs/setup/deployment#platform-with-base-path
  // base: &apos;/astro-pure/&apos;,
  trailingSlash: &apos;never&apos;,
  // root: &apos;./my-project-directory&apos;,
  server: { host: true },

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. push&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;init&quot;
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 登录github仓库，查看 Actions&lt;/h2&gt;
&lt;p&gt;查看是否部署成功，如果成功，则访问 https://xxx.github.io&lt;/p&gt;</content:encoded><h:img src="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/><enclosure url="https://pic.hana0721.top//rl-note.3yex1wenfg.webp"/></item></channel></rss>