Code
def actor_critic_loss(policy_objective, value_loss, entropy, value_coef, entropy_coef):
"""policy_objective 是要最大化的量。"""
# TODO:只补齐下面这个表达式。
return ______
assert abs(actor_critic_loss(.2, .8, .5, .5, .01) - .195) < 1e-12学完后你应能:组合 policy/value/entropy 三项损失,并解释每项的梯度方向与量纲。
通过必须同时满足:
在现代深度强化学习(尤其是 Actor-Critic 与 PPO)架构中,智能体通常需要在单一计算图中同时优化三个性质迥异、量纲不一且往往相互博弈的子目标:
策略代理收益(Policy Objective, ):驱动 Actor 参数向高优势动作方向移动,目标是最大化期望累积回报;
价值拟合均方差(Value Loss, ):拟合真实采样回报(Return / TD 目标),目标是最小化状态价值预估误差,为 Actor 提供高质量的基线与优势估计;
策略信息熵奖励(Policy Entropy, ):衡量动作分布的多样性,目标是最大化策略熵,防止神经网络因随机初始采样而在训练早期过早陷入局部次优的确定性死锁(Exploration Collapse)。
它解决的核心工程问题是:多目标梯度的量纲失衡(Dimensional Mismatch)、符号冲突与表征竞争(Negative Gradient Interference)。策略损失、均方误差(通常是标量平方,数值尺度极大)与信息熵(通常在 区间)在量纲上完全异质。如果损失组合符号颠倒或权重配置失衡,会导致价值拟合淹没策略更新,或者策略丧失探索能力。
联合损失函数结构与探索度退火生命周期如图 6-1 与图 6-2 所示:
图 6-1:策略、价值与信息熵三合一多任务优化空间
由于主流深度学习框架(PyTorch / JAX)的优化器默认执行梯度下降(Gradient Descent: ),所有需要最大化的目标在输入优化器前必须反转为负损失: - 策略收益 需要被最大化 转换为负项 ; - 价值均方误差 需要被最小化 转换为正项 ; - 信息熵 需要被最大化 转换为负项 ; 标准标量化联合损失定义为: 其中 (通常取 0.5~1.0)为价值损失权重,(通常取 0.01~0.001)为熵正则化系数。
图 6-2:强化学习训练过程中策略熵与探索度的动态退火轨迹
熵符号反转导致“主动扼杀探索”(Entropy Sign Bug): 极易发生的灾难性错误是在总损失中将熵项写为加号:loss = -policy + c_v * value + c_e * entropy。在梯度下降驱动下,优化器会全力最小化策略熵,会较快地把动作分布推向近似确定的单点分布,探索能力随之丧失。
Total Loss 虚假收敛陷阱: 在工程监控看板中,绝对不能仅观察 total_loss。因为价值回归损失 的绝对数值通常比策略损失大 1~2 个数量级。当 Critic 网络从随机初值快速拟合时,Value Loss 会从数十骤降至接近零,带动 Total Loss 呈现极为漂亮的断崖式下降曲线;而此时策略网络可能正在发生崩溃(Reward 暴跌)。必须对 Policy Loss、Value Loss、Entropy 和 Episode Return 进行完全解耦的独立指标监控。
离散熵与连续微分熵的量纲陷阱: 离散动作分布的香农熵 恒为非负数();而连续高斯策略的微分熵(Differential Entropy)公式为 。当动作标准差 时,微分熵会变为负数。熵为负并不改变梯度方向:每一维有 ,熵奖励始终以固定力度推大 。问题在于这个力度随动作维度线性累加,且熵的数值无法与离散任务对照,所以离散环境的熵系数不能直接复制到连续控制任务中。
设当前 Mini-batch 评估出的未加权分量指标如下:
代入标准最小化联合损失公式: 计算结果严格等于 0.195。在反向传播时,优化器将同时推动策略收益增加、价值误差降低、策略熵升高。
补齐最小化形式的总损失。
规则:只能修改 TODO/______ 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
运行本单元格;所有 assert 必须通过。另手工构造一个边界输入,解释预期结果。
提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。
不要背定义:请从输入、状态变化和输出三个阶段解释“价值损失、熵与多目标优化”的工作机制。
你的答案:
total loss 下降但策略 reward 下降,为什么不矛盾?
你的答案:
离散动作和高维连续动作的 entropy 数值能直接用同一系数吗?
你的答案:
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
输入:策略目标 (最大化)、价值损失 (最小化)、策略熵 (最大化),以及系数 、。
状态变化:按梯度下降的符号约定合成 (详见第 2 节);共享参数上三项梯度线性相加,、 用来防止数值较大的价值梯度主导更新。
输出:更新后的参数。Critic 提供基线,策略向正优势动作移动,熵项延缓策略过早收敛到确定性输出。
Total Loss 持续下降而真实环境回报(Episode Reward)反而持续恶化,在多任务深度强化学习中是极其常见且完全合理的现象,因果剖析如下:
量纲主导掩盖(Scale Domination):价值回归损失 通常比无量纲的策略代理损失 大几个数量级(例如 Value 损失为 20.0,而 Policy 损失仅为 0.05)。在训练初期,Critic 网络拟合速度极快,Value 损失迅速从 20.0 跌到 1.0,带动 Total Loss 呈现极为显著的下降态势;
负向迁移与表征破坏(Gradient Interference):若 Actor 与 Critic 共享特征提取层,Value 损失的巨大梯度会以压倒性优势重新塑造共享层的权重空间,破坏了此前对动作决策至关重要的语义特征,导致策略分支输出的动作概率分布发生恶化,进而引发实际 Rollout 表现暴跌;
优化目标与环境现实脱节:策略代理损失 是基于已采样的旧分布计算的局部代数近似。若策略由于参数更新剧烈漂移或者发生了 Reward Hacking,虽然在当前批次上代数损失看似在降低,但在真实环境中的泛化性能可能已崩溃。因此工程上必须单独记录未加权的各个分量损失。
绝对不能直接复用同一个熵系数,甚至不能用相同的量纲去理解,二者存在本质的数学与物理维度鸿沟:
数学定义与取值域截然不同:
维度放大效应(Dimensionality Scaling):微分熵随着连续动作维度 呈线性倍数放大()。在 20 维的机械臂控制任务中,若标准差缩小到 ,微分熵约为 。
后果与工程对策: 只是损失值的常数偏移,本身不改变梯度。影响训练的是梯度:熵项对每一维 的梯度恒为 ,总推力随维度 线性增加,且与该维动作对回报的敏感度无关。因此连续控制中熵系数需要按任务重新调(PPO 连续控制常取 0 或很小的值),或者像 SAC 一样设定目标熵、自动学习温度。
资料用于建立事实基线;面试回答仍需用自己的语言组织。
---
title: "第 6 课:价值损失、熵与多目标优化"
jupyter: python3
---
## 本课目标与完成标准
学完后你应能:组合 policy/value/entropy 三项损失,并解释每项的梯度方向与量纲。
通过必须同时满足:
- 独立补齐本课唯一的代码填空题,并通过给定检查;
- 三个问答题均说明因果链,而不是只报术语;
- 能指出至少一个正确性边界和一个性能取舍;
- 总分不低于 8/10,且没有一票否决级概念错误。
## 前置关系
- 课程前置:Python、概率期望、基本深度学习
- 本课在路线中的作用:Actor-Critic 通常同时优化策略目标、价值回归和熵奖励;三者共享参数时是多目标优化。
## 核心心智模型
### 1. 它是什么,解决什么问题
在现代深度强化学习(尤其是 Actor-Critic 与 PPO)架构中,智能体通常需要在单一计算图中同时优化三个性质迥异、量纲不一且往往相互博弈的子目标:
1. **策略代理收益(Policy Objective, $\mathcal{J}_{\text{CLIP}}$)**:驱动 Actor 参数向高优势动作方向移动,目标是**最大化**期望累积回报;
2. **价值拟合均方差(Value Loss, $\mathcal{L}_{\text{VF}}$)**:拟合真实采样回报(Return / TD 目标),目标是**最小化**状态价值预估误差,为 Actor 提供高质量的基线与优势估计;
3. **策略信息熵奖励(Policy Entropy, $\mathcal{H}$)**:衡量动作分布的多样性,目标是**最大化**策略熵,防止神经网络因随机初始采样而在训练早期过早陷入局部次优的确定性死锁(Exploration Collapse)。
它解决的核心工程问题是:**多目标梯度的量纲失衡(Dimensional Mismatch)、符号冲突与表征竞争(Negative Gradient Interference)**。策略损失、均方误差(通常是标量平方,数值尺度极大)与信息熵(通常在 $[0, \log|\mathcal{A}|]$ 区间)在量纲上完全异质。如果损失组合符号颠倒或权重配置失衡,会导致价值拟合淹没策略更新,或者策略丧失探索能力。
### 2. 它如何工作
联合损失函数结构与探索度退火生命周期如图 6-1 与图 6-2 所示:
1. **标量化联合损失构造(图 6-1)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-sg" data-nid="MultiObjective" data-depth="0"><div class="fd-sg-title">Actor-Critic 联合优化损失函数</div><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank fd-few"><div class="fd-node fd-box" data-nid="L_clip">策略目标: L_CLIP(θ)<br>(最大化期望回报)</div><div class="fd-node fd-box" data-nid="L_vf">价值损失: c1 * L_VF(θ)<br>(最小化均方误差)</div><div class="fd-node fd-box" data-nid="L_ent">策略熵奖励: c2 * S[π_θ]<br>(促进环境探索)</div></div></div></div></div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Total">总联合损失:<br>L = - L_CLIP + c1*L_VF - c2*S</div></div></div></div><i class="fd-e" data-s="L_clip" data-t="Total" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="L_vf" data-t="Total" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="L_ent" data-t="Total" data-k="solid" data-h="1" data-b="0"></i></div>
```
<p class="caption" align="center"><em>图 6-1:策略、价值与信息熵三合一多任务优化空间</em></p>
由于主流深度学习框架(PyTorch / JAX)的优化器默认执行**梯度下降**(Gradient Descent: $\theta \leftarrow \theta - \eta \nabla \mathcal{L}$),所有需要最大化的目标在输入优化器前必须反转为**负损失**:
- 策略收益 $\mathcal{J}_{\text{policy}}$ 需要被最大化 $\implies$ 转换为负项 $-\mathcal{J}_{\text{policy}}$;
- 价值均方误差 $\mathcal{L}_{\text{value}}$ 需要被最小化 $\implies$ 转换为正项 $+ c_v \mathcal{L}_{\text{value}}$;
- 信息熵 $\mathcal{H}(\pi)$ 需要被最大化 $\implies$ 转换为负项 $- c_e \mathcal{H}(\pi)$;
标准标量化联合损失定义为:
$$ \mathcal{L}_{\text{total}}(\theta) = - \mathcal{J}_{\text{policy}}(\theta) + c_v \mathcal{L}_{\text{value}}(\theta) - c_e \mathcal{H}(\pi_\theta) $$
其中 $c_v$(通常取 0.5~1.0)为价值损失权重,$c_e$(通常取 0.01~0.001)为熵正则化系数。
2. **探索度动态退火机制(图 6-2)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-lr" data-minw="688"><div class="fd-rank"><div class="fd-node fd-box" data-nid="Early">训练前期: 熵权重大 ➔ 探索未知状态空间</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Middle">训练中期: 策略趋于稳定 ➔ 熵系数线性衰减</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Late">训练后期: 价值误差逼近极小 ➔ 确定性微调策略收敛</div></div></div></div><i class="fd-e" data-s="Early" data-t="Middle" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Middle" data-t="Late" data-k="solid" data-h="1" data-b="0"></i></div>
```
<p class="caption" align="center"><em>图 6-2:强化学习训练过程中策略熵与探索度的动态退火轨迹</em></p>
- **初期(高熵探索)**:配置较高的 $c_e$,强力约束 Softmax 分布趋向均匀分布,迫使智能体积极探索低频状态与未知动作空间;
- **中期(线性衰减)**:随着 Critic 价值函数逐渐拟合稳定,逐步衰减 $c_e$,允许策略网络开始向高回报动作倾斜;
- **后期(确定性微调)**:$c_e \to 0$,策略熵自然下降,模型专注于最优策略的微调收敛,杜绝持续的高熵扰动破坏稳定表现。
3. **PPO 价值裁剪(Value Function Clipping)**:
为了防止 Critic 在小批次迭代中因非平稳回报产生灾难性更新,通常对价值函数也施加类似于策略比率的悲观裁剪:
$$ \mathcal{L}_{\text{VF}}^{\text{CLIP}} = \frac{1}{2} \max \left( (V_\theta - y)^2, \, \left( V_{\text{old}} + \text{clip}(V_\theta - V_{\text{old}}, -\epsilon_v, \epsilon_v) - y \right)^2 \right) $$
使价值网络在每轮更新中的变化有限。不过实证研究(Engstrom et al., 2020;Andrychowicz et al., 2021)发现价值裁剪不一定有益,甚至可能有害,应作为可选项做对照实验。
### 3. 正确性条件与常见误区
- **熵符号反转导致“主动扼杀探索”(Entropy Sign Bug)**:
极易发生的灾难性错误是在总损失中将熵项写为加号:`loss = -policy + c_v * value + c_e * entropy`。在梯度下降驱动下,优化器会全力**最小化策略熵**,会较快地把动作分布推向近似确定的单点分布,探索能力随之丧失。
- **Total Loss 虚假收敛陷阱**:
在工程监控看板中,**绝对不能仅观察 `total_loss`**。因为价值回归损失 $\mathcal{L}_{\text{value}}$ 的绝对数值通常比策略损失大 1~2 个数量级。当 Critic 网络从随机初值快速拟合时,Value Loss 会从数十骤降至接近零,带动 Total Loss 呈现极为漂亮的断崖式下降曲线;而此时策略网络可能正在发生崩溃(Reward 暴跌)。必须对 Policy Loss、Value Loss、Entropy 和 Episode Return 进行完全解耦的独立指标监控。
- **离散熵与连续微分熵的量纲陷阱**:
离散动作分布的香农熵 $\mathcal{H} = -\sum p \log p$ 恒为非负数($0 \le \mathcal{H} \le \log K$);而连续高斯策略的微分熵(Differential Entropy)公式为 $\mathcal{H} = \frac{1}{2} \log(2\pi e \sigma^2)$。当动作标准差 $\sigma < \frac{1}{\sqrt{2\pi e}} \approx 0.242$ 时,微分熵会变为**负数**。熵为负并不改变梯度方向:每一维有 $\partial \mathcal{H} / \partial \log \sigma = 1$,熵奖励始终以固定力度推大 $\sigma$。问题在于这个力度随动作维度线性累加,且熵的数值无法与离散任务对照,所以离散环境的熵系数不能直接复制到连续控制任务中。
### 4. 性能与工程取舍
- **共享骨干(Shared Backbone)vs 独立双塔(Separate Networks)**:
- **共享骨干**:Actor 与 Critic 共享底层特征抽取层(如视觉 ResNet 或文本 Transformer),仅在最后一层分立不同的 Head。显存占用极小,Rollout 推理吞吐高;但在多任务反向传播时,Policy 梯度与 Value 梯度可能在共享层相互冲突;
- **独立双塔**:Actor 与 Critic 各自维护独立的物理网络。消除了多任务负迁移冲突,调参极为鲁棒;代价是参数量和前向显存约翻倍。LLM 的 PPO 式 RLHF 通常使用独立的 Critic 模型;GRPO(如 DeepSeek-R1)则不使用 Critic。
- **熵系数的自适应动态调节(SAC 式自动化)**:
固定熵系数难以兼顾复杂任务的各个阶段。高级算法(如 SAC)将熵作为对偶变量(Dual Variable),设定目标最低期望熵 $\bar{\mathcal{H}}$,通过拉格朗日乘子自动梯度调节温度系数 $\alpha$,在探索与利用间自适应平衡(目标熵本身仍是需要设定的超参数)。
## 具体演示:标量化损失的代数核算
设当前 Mini-batch 评估出的未加权分量指标如下:
- 策略代理收益:$\mathcal{J}_{\text{policy}} = 0.2$(希望最大化此项)
- 价值均方损失:$\mathcal{L}_{\text{value}} = 0.8$(希望最小化此项)
- 策略信息熵:$\mathcal{H} = 0.5$(希望最大化此项)
- 超参数配置:价值系数 $c_v = 0.5$,熵系数 $c_e = 0.01$
代入标准最小化联合损失公式:
$$ \mathcal{L}_{\text{total}} = - \mathcal{J}_{\text{policy}} + c_v \mathcal{L}_{\text{value}} - c_e \mathcal{H} = -0.2 + (0.5 \times 0.8) - (0.01 \times 0.5) = -0.2 + 0.4 - 0.005 = 0.195 $$
计算结果严格等于 0.195。在反向传播时,优化器将同时推动策略收益增加、价值误差降低、策略熵升高。
## 实践任务:唯一代码填空题
补齐最小化形式的总损失。
规则:只能修改 `TODO`/`______` 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
```{python}
#| course_role: exercise
def actor_critic_loss(policy_objective, value_loss, entropy, value_coef, entropy_coef):
"""policy_objective 是要最大化的量。"""
# TODO:只补齐下面这个表达式。
return ______
assert abs(actor_critic_loss(.2, .8, .5, .5, .01) - .195) < 1e-12
```
### 检查方法
运行本单元格;所有 `assert` 必须通过。另手工构造一个边界输入,解释预期结果。
提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。
### Q1
不要背定义:请从输入、状态变化和输出三个阶段解释“价值损失、熵与多目标优化”的工作机制。
**你的答案:**
### Q2
total loss 下降但策略 reward 下降,为什么不矛盾?
**你的答案:**
### Q3
离散动作和高维连续动作的 entropy 数值能直接用同一系数吗?
**你的答案:**
## 评分与通过规则
- 代码 4 分:正常输入 2 分,边界输入 1 分,解释实现 1 分;
- Q1~Q3 各 2 分;
- 一票否决:结果碰巧正确但核心因果链错误、删除边界检查、把未运行结果说成实测。
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
::: {.callout-tip collapse="true" title="💡 点击展开参考答案与详细代码实现" icon="false"}
## 参考答案(仅 answer 分支)
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
```{python}
#| course_role: solution
def actor_critic_loss(policy_objective, value_loss, entropy, value_coef, entropy_coef):
"""policy_objective 是要最大化的量。"""
# 参考实现:表达式直接对应上文不变量。
return -policy_objective + value_coef * value_loss - entropy_coef * entropy
assert abs(actor_critic_loss(.2, .8, .5, .5, .01) - .195) < 1e-12
```
### Q1 参考答案
1. **输入**:策略目标 $\mathcal{J}_{\text{policy}}$(最大化)、价值损失 $\mathcal{L}_{\text{value}}$(最小化)、策略熵 $\mathcal{H}$(最大化),以及系数 $c_v$、$c_e$。
2. **状态变化**:按梯度下降的符号约定合成 $\mathcal{L}_{\text{total}} = -\mathcal{J}_{\text{policy}} + c_v \mathcal{L}_{\text{value}} - c_e \mathcal{H}$(详见第 2 节);共享参数上三项梯度线性相加,$c_v$、$c_e$ 用来防止数值较大的价值梯度主导更新。
3. **输出**:更新后的参数。Critic 提供基线,策略向正优势动作移动,熵项延缓策略过早收敛到确定性输出。
### Q2 参考答案
Total Loss 持续下降而真实环境回报(Episode Reward)反而持续恶化,在多任务深度强化学习中是极其常见且完全合理的现象,因果剖析如下:
1. **量纲主导掩盖(Scale Domination)**:价值回归损失 $\mathcal{L}_{\text{value}} = (V(s) - y)^2$ 通常比无量纲的策略代理损失 $\mathcal{J}_{\text{policy}}$ 大几个数量级(例如 Value 损失为 20.0,而 Policy 损失仅为 0.05)。在训练初期,Critic 网络拟合速度极快,Value 损失迅速从 20.0 跌到 1.0,带动 Total Loss 呈现极为显著的下降态势;
2. **负向迁移与表征破坏(Gradient Interference)**:若 Actor 与 Critic 共享特征提取层,Value 损失的巨大梯度会以压倒性优势重新塑造共享层的权重空间,破坏了此前对动作决策至关重要的语义特征,导致策略分支输出的动作概率分布发生恶化,进而引发实际 Rollout 表现暴跌;
3. **优化目标与环境现实脱节**:策略代理损失 $\mathcal{J}_{\text{policy}}$ 是基于已采样的旧分布计算的局部代数近似。若策略由于参数更新剧烈漂移或者发生了 Reward Hacking,虽然在当前批次上代数损失看似在降低,但在真实环境中的泛化性能可能已崩溃。因此工程上必须单独记录未加权的各个分量损失。
### Q3 参考答案
**绝对不能直接复用同一个熵系数,甚至不能用相同的量纲去理解**,二者存在本质的数学与物理维度鸿沟:
1. **数学定义与取值域截然不同**:
- **离散动作空间(Shannon 熵)**:定义为 $\mathcal{H} = -\sum_{i=1}^K p_i \log p_i$。其值域严格落在 $[0, \log K]$ 区间内,且恒为非负数(Non-negative)。在离散任务中,熵系数 $c_e$(如 0.01)乘以正熵,能够稳定地提供一个幅度受控的正向探索奖励;
- **高维连续动作空间(微分熵 Differential Entropy)**:通常假设动作服从多元高斯分布 $\mathcal{N}(\mu, \Sigma)$,其微分熵公式为 $\mathcal{H} = \frac{1}{2} \log \left( (2\pi e)^d |\Sigma| \right)$。微分熵**不是概率度量,而是相对概率密度的几何测度,其数值完全可以为负数(当协方差较小时趋向 $-\infty$)**。
2. **维度放大效应(Dimensionality Scaling)**:微分熵随着连续动作维度 $d$ 呈线性倍数放大($d \log \sigma$)。在 20 维的机械臂控制任务中,若标准差缩小到 $\sigma = 0.1$,微分熵约为 $20 \times \ln(0.1 \sqrt{2\pi e}) \approx -17.7$。
3. **后果与工程对策**:$-c_e \mathcal{H} = -0.01 \times (-17.7) \approx +0.18$ 只是损失值的常数偏移,本身不改变梯度。影响训练的是梯度:熵项对每一维 $\log \sigma$ 的梯度恒为 $c_e$,总推力随维度 $d$ 线性增加,且与该维动作对回报的敏感度无关。因此连续控制中熵系数需要按任务重新调(PPO 连续控制常取 0 或很小的值),或者像 SAC 一样设定目标熵、自动学习温度。
## 参考资料
- [PPO paper](https://arxiv.org/abs/1707.06347)
- [SAC paper](https://arxiv.org/abs/1801.01290)
资料用于建立事实基线;面试回答仍需用自己的语言组织。
:::
::: {.course-pagination}
[**← 上一课**<br>第 5 课:PPO](lesson05_ppo.qmd){.pagination-link .pagination-prev}
[**下一课 →**<br>第 7 课:DQN](lesson07_dqn.qmd){.pagination-link .pagination-next}
:::