已合并
docs: refresh Wordle RL training guidance #455
docs: refresh Wordle RL training guidance #455
已合并
zhoujian创建于 7月28日
22 个文件变更+227-224
@@ -113,7 +113,7 @@
113 "source": [113 "source": [
114 "### 2.1 环境检查\n",114 "### 2.1 环境检查\n",
115 "\n",115 "\n",
116- "课程指定镜像 `cann_9.0.0 py3.11-A3-arm` 已包含 CANN 和 ATB。安装训练组件前,先运行下面的单元格确认两个环境脚本均可用。"116+ "课程运行环境需要提供 CANN 和 ATB。安装训练组件前,先运行下面的单元格确认两个环境脚本均可用。"
117 ]117 ]
118 },118 },
119 {119 {
@@ -139,7 +139,7 @@
139 "ATB_ENV=/home/developer/Ascend/nnal/atb/set_env.sh\n",139 "ATB_ENV=/home/developer/Ascend/nnal/atb/set_env.sh\n",
140 "if [ ! -r \"${ATB_ENV}\" ]; then\n",140 "if [ ! -r \"${ATB_ENV}\" ]; then\n",
141 " echo \"未找到 ATB 环境脚本: ${ATB_ENV}\" >&2\n",141 " echo \"未找到 ATB 环境脚本: ${ATB_ENV}\" >&2\n",
142- " echo \"请确认使用课程指定CANNLab 镜像:cann_9.0.0 py3.11-A3-arm\" >&2\n",142+ " echo \"请确认当前 CANNLab 环境已包含课程所需ATB 组件\" >&2\n",
143 " exit 1\n",143 " exit 1\n",
144 "fi\n",144 "fi\n",
145 "echo \"ATB 环境检查通过: ${ATB_ENV}\"\n"145 "echo \"ATB 环境检查通过: ${ATB_ENV}\"\n"
@@ -41,7 +41,7 @@
41 "cell_type": "markdown",41 "cell_type": "markdown",
42 "metadata": {},42 "metadata": {},
43 "source": [43 "source": [
44- "`wake` / `sleep` 控制的是 **vLLM rollout 引擎**:rollout 前唤醒并同步最新 Actor 权重,rollout 后释放 KV cache,并按 sleep level 释放 rollout 权重。`actor.fsdp_config.param_offload=True` 则是另一项独立配置,用于把训练侧 FSDP 参数卸载到 CPU;它不是 vLLM `sleep` 的含义。\n\n因此,Hybrid Engine 解决的是**训练与推理资源切换和权重同步**问题,使同一组 NPU 能在不同阶段分别执行 Actor 更新和 rollout。\n\n---\n\n## 3. 关键配置参数\n\n| 参数 | 含义 | 默认值 |\n|------|------|--------|\n| `rollout.n` | 每个 prompt 的 rollout 数(GRPO 组大小) | 8 |\n| `train_batch_size` | 每步处理的 prompt 数 | 64 |\n| `rollout.tensor_model_parallel_size` | vLLM 张量并行度 | 2 |\n| `multi_turn.max_user_turns` | Wordle 最大猜词轮次 | 6 |\n| `actor.optim.lr` | Actor 学习率 | 1e-6 |\n| `actor.fsdp_config.param_offload` | 训练侧 FSDP 参数 CPU 卸载 | True |\n\n---\n\n## 课后练习\n"44+ "`wake` / `sleep` 控制的是 **vLLM rollout 引擎**:rollout 前唤醒并同步最新 Actor 权重,rollout 后释放 KV cache,并按 sleep level 释放 rollout 权重。`actor.fsdp_config.param_offload=True` 则是另一项独立配置,用于把训练侧 FSDP 参数卸载到 CPU;它不是 vLLM `sleep` 的含义。\n\n因此,Hybrid Engine 解决的是**训练与推理资源切换和权重同步**问题,使同一组 NPU 能在不同阶段分别执行 Actor 更新和 rollout。\n\n---\n\n## 3. 关键配置参数\n\n| 参数 | 含义 | 默认值 |\n|------|------|--------|\n| `rollout.n` | 每个 prompt 的 rollout 数(GRPO 组大小) | 8 |\n| `train_batch_size` | 每步处理的 prompt 数 | 128 |\n| `rollout.tensor_model_parallel_size` | vLLM 张量并行度 | 2 |\n| `multi_turn.max_user_turns` | Wordle 最大猜词轮次 | 6 |\n| `actor.optim.lr` | Actor 学习率 | 1e-6 |\n| `actor.fsdp_config.param_offload` | 训练侧 FSDP 参数 CPU 卸载 | True |\n\n---\n\n## 课后练习\n"
45 ]45 ]
46 },46 },
47 {47 {
@@ -52,7 +52,7 @@
52 "\n",52 "\n",
53 "2. (判断题)AgentLoop 是多轮交互的逻辑单元,WordleAgentLoop 负责发送游戏反馈(G/Y/X)给模型。\n",53 "2. (判断题)AgentLoop 是多轮交互的逻辑单元,WordleAgentLoop 负责发送游戏反馈(G/Y/X)给模型。\n",
54 "\n",54 "\n",
55- "3. (判断题)`param_offload=True` 表示训练参数始终保留在 GPU 存中,不卸载到 CPU。\n",55+ "3. (判断题)`param_offload=True` 表示训练参数始终保留在 NPU 设备内存中,不卸载到 CPU。\n",
56 "\n",56 "\n",
57 "4. (单选题)在 verl 架构中,哪个组件负责生成模型的回复(rollout)?\n",57 "4. (单选题)在 verl 架构中,哪个组件负责生成模型的回复(rollout)?\n",
58 " A. TaskRunner\n",58 " A. TaskRunner\n",
@@ -40,8 +40,8 @@
40 " D. pyarrow\n",40 " D. pyarrow\n",
41 "\n",41 "\n",
42 "8. (单选题)Hybrid Engine 中 `param_offload=True` 的作用是?\n",42 "8. (单选题)Hybrid Engine 中 `param_offload=True` 的作用是?\n",
43- " A. 将优化器状态卸载到 GPU\n",43+ " A. 将优化器状态卸载到 CPU\n",
44- " B. 将训练参数卸载到 CPU,释放 vLLM\n",44+ " B. 将训练参数卸载到 CPU,释放 NPU 设备内 vLLM-Ascend rollout 使用\n",
45 " C. 将 vLLM 模型卸载到 CPU\n",45 " C. 将 vLLM 模型卸载到 CPU\n",
46 " D. 禁用参数更新\n",46 " D. 禁用参数更新\n",
47 "\n",47 "\n",
@@ -5,7 +5,7 @@
5解析:WordleAgentLoop 是多轮交互的核心逻辑单元,负责在模型猜词后计算 G/Y/X 反馈并返回给模型,实现多轮交互。5解析:WordleAgentLoop 是多轮交互的核心逻辑单元,负责在模型猜词后计算 G/Y/X 反馈并返回给模型,实现多轮交互。
6 6 
73. ×73. ×
8-解析:param_offload=True 表示训练参数从 GPU 卸载到 CPU,释放 vLLM 推理使用,而非保留在 GPU 8+解析:param_offload=True 表示训练参数从 NPU 设备内存卸载到 CPU,释放 NPU 设备内 vLLM-Ascend rollout 使用,而非始终保留在 NPU
9 9 
104. B104. B
11解析:vLLM Server 负责生成模型回复(rollout)。TaskRunner 是总调度者,Ray Train (FSDP) 负责训练更新,AgentLoopManager 管理 rollout 并行处理。11解析:vLLM Server 负责生成模型回复(rollout)。TaskRunner 是总调度者,Ray Train (FSDP) 负责训练更新,AgentLoopManager 管理 rollout 并行处理。
@@ -8,7 +8,7 @@
8解析:verl 基于 Ray 构建分布式训练系统,TaskRunner 是训练的总调度者,控制推理、奖励、训练的循环。8解析:verl 基于 Ray 构建分布式训练系统,TaskRunner 是训练的总调度者,控制推理、奖励、训练的循环。
9 9 
104. √104. √
11-解析:Hybrid Engine 通过时分复用让训练和推理交替占用同一组卡。训练时参数 GPU推理时卸载到 CPU 释放 vLLM,2 卡即可完成 RL 训练。11+解析:Hybrid Engine 通过时分复用让训练和推理交替占用同一组 NPU 卡。训练时参数加载到 NPUrollout 时卸载到 CPU释放 NPU 设备内 vLLM-Ascend 使用因此 2 张 NPU 卡即可完成 RL 训练。
12 12 
135. √135. √
14解析:git apply 补丁会做两件事:新增 wordle_agent_loop.py 文件,修改 __init__.py 注册 WordleAgentLoop 类。简单复制文件会漏掉注册步骤。14解析:git apply 补丁会做两件事:新增 wordle_agent_loop.py 文件,修改 __init__.py 注册 WordleAgentLoop 类。简单复制文件会漏掉注册步骤。
@@ -20,7 +20,7 @@
20解析:verl 会自动安装 ray、pandas、pyarrow 等依赖,但 nltk 和 textarena 是 Wordle 训练特有的依赖,需要单独安装。20解析:verl 会自动安装 ray、pandas、pyarrow 等依赖,但 nltk 和 textarena 是 Wordle 训练特有的依赖,需要单独安装。
21 21 
228. B228. B
23-解析:param_offload=True 将训练参数从 GPU 卸载到 CPU,释放 vLLM 推理使用。这是 Hybrid Engine 时分复用的关键机制。23+解析:param_offload=True 将训练参数从 NPU 设备内存卸载到 CPU,释放 NPU 设备内 vLLM-Ascend rollout 使用。这是 Hybrid Engine 时分复用的关键机制。
24 24 
259. B259. B
26解析:AgentLoopManager 管理多个 AgentLoop Worker,每个 Worker 并行处理一组 rollout。参数更新由 Ray Train (FSDP) 负责。26解析:AgentLoopManager 管理多个 AgentLoop Worker,每个 Worker 并行处理一组 rollout。参数更新由 Ray Train (FSDP) 负责。
@@ -103,7 +103,7 @@
103 "标准 PPO 需要一个 **Critic 模型**来估计每个状态的价值(value),再用它作为 baseline 来计算优势。这意味着:\n",103 "标准 PPO 需要一个 **Critic 模型**来估计每个状态的价值(value),再用它作为 baseline 来计算优势。这意味着:\n",
104 "\n",104 "\n",
105 "- 额外训练一个与策略模型同等大小的 Critic 模型\n",105 "- 额外训练一个与策略模型同等大小的 Critic 模型\n",
106- "- 额外的存和计算开销\n",106+ "- 额外的设备内存和计算开销\n",
107 "- Critic 训练不好会导致优势估计不准\n",107 "- Critic 训练不好会导致优势估计不准\n",
108 "\n",108 "\n",
109 "这在资源受限的环境下(如 2 卡)是一个很大的负担。\n",109 "这在资源受限的环境下(如 2 卡)是一个很大的负担。\n",
@@ -175,13 +175,13 @@
175 "|------|-----|------|\n",175 "|------|-----|------|\n",
176 "| 优势计算 | Critic 模型估计 | 组内平均 |\n",176 "| 优势计算 | Critic 模型估计 | 组内平均 |\n",
177 "| 额外模型 | 需要 Critic | 不需要 |\n",177 "| 额外模型 | 需要 Critic | 不需要 |\n",
178- "| 存开销 | 高(两个模型) | 低(一个模型) |\n",178+ "| 设备内存开销 | 高(两个模型) | 低(一个模型) |\n",
179 "| 适合场景 | 有 Critic 的场景 | 资源受限、规则奖励 |\n",179 "| 适合场景 | 有 Critic 的场景 | 资源受限、规则奖励 |\n",
180 "| Clip 机制 | 有 | 有(继承 PPO) |\n",180 "| Clip 机制 | 有 | 有(继承 PPO) |\n",
181 "\n",181 "\n",
182 "### 3.3 为什么 Wordle 适合 GRPO\n",182 "### 3.3 为什么 Wordle 适合 GRPO\n",
183 "\n",183 "\n",
184- "Wordle 的奖励是**规则计算**的(猜中/部分匹配/格式),不需要 Critic 来估计价值。而且 2 卡环境下存有限,省掉 Critic 模型意味着可以用更大的 batch size 或更长的序列。\n",184+ "Wordle 的奖励是**规则计算**的(猜中/部分匹配/格式),不需要 Critic 来估计价值。而且 2 卡环境下 NPU 设备内存有限,省掉 Critic 模型意味着可以用更大的 batch size 或更长的序列。\n",
185 "\n",185 "\n",
186 "---\n",186 "---\n",
187 "\n",187 "\n",
@@ -25,13 +25,13 @@
25 "策略崩塌的典型表现\n",25 "策略崩塌的典型表现\n",
26 "\n",26 "\n",
27 "正常训练:\n",27 "正常训练:\n",
28- " step 1: entropy=0.56, correct=15%, response_length=1700\n",28+ " step 5: entropy=0.535, correct=20%, response_length=1789\n",
29- " step 75: entropy=0.28, correct=40%, response_length=1550\n",29+ " step 75: entropy=0.235, correct=55%, response_length=1417\n",
30- " -> 稳定,entropy 缓慢下降\n",30+ " -> 稳定,correct 整体提升,response_length 逐步缩短\n",
31 "\n",31 "\n",
32 "策略崩塌:\n",32 "策略崩塌:\n",
33- " step 1: entropy=0.56, correct=15%, response_length=1700\n",33+ " step 1: entropy=0.56, correct=15%, response_length=1755\n",
34- " step 75: entropy=0.28, correct=40%, response_length=1550\n",34+ " step 75: entropy=0.15, correct=45%, response_length=1650\n",
35 " step 100: entropy=0.001, correct=0%, response_length=3232 (全部打满)\n",35 " step 100: entropy=0.001, correct=0%, response_length=3232 (全部打满)\n",
36 " -> entropy 突然崩塌,输出退化为固定模式\n",36 " -> entropy 突然崩塌,输出退化为固定模式\n",
37 "```"37 "```"
@@ -94,10 +94,10 @@
94 "\n",94 "\n",
95 "| KL coef | 效果 | 风险 |\n",95 "| KL coef | 效果 | 风险 |\n",
96 "|---------|------|------|\n",96 "|---------|------|------|\n",
97- "| 0.0001 | 几乎无约束 | 策略漂移可能崩塌 |\n",97+ "| 0.0001 | 约束很弱 | 策略漂移可能不足 |\n",
98- "| 0.001 | 轻微约束 | 多数环境够用漂移较大时偏弱 |\n",98+ "| 0.001 | 轻微约束 | 本 recipe 的调试起点仍需观察实际 KL |\n",
99- "| 0.01 | 中等约束 | 配合 entropy_coeff 使用,推荐 |\n",99+ "| 0.01 | 中等约束 | 可能抑制策略更新 |\n",
100- "| 0.1 | 强约束 | 模型无法学习新策略 |\n",100+ "| 0.1 | 强约束 | 容易让模型难以学习新策略 |\n",
101 "\n",101 "\n",
102 "---\n",102 "---\n",
103 "\n",103 "\n",
@@ -118,8 +118,8 @@
118 "H(pi) = 策略的熵 (entropy)\n",118 "H(pi) = 策略的熵 (entropy)\n",
119 "entropy_coeff = 熵系数\n",119 "entropy_coeff = 熵系数\n",
120 "\n",120 "\n",
121- "效果: 熵越低 (探索性越差)-entropy_coeff * H(pi) 越大,loss 越高\n",121+ "最小化 total_loss 较高的 H(pi) 会让负号后的 entropy 项更小\n",
122- "-> 梯度会推高熵,鼓励模型保持探索能力\n",122+ "-> 梯度会鼓励模型保持探索能力\n",
123 "```"123 "```"
124 ]124 ]
125 },125 },
@@ -134,12 +134,12 @@
134 "| entropy_coeff | 效果 | 风险 |\n",134 "| entropy_coeff | 效果 | 风险 |\n",
135 "|---------------|------|------|\n",135 "|---------------|------|------|\n",
136 "| 0 | 无 entropy bonus | 策略崩塌风险较高 |\n",136 "| 0 | 无 entropy bonus | 策略崩塌风险较高 |\n",
137- "| 0.001 | 轻微探索 | 多数环境稳定,但熵偏低(~0.1)|\n",137+ "| 0.002 | 较弱探索 | entropy 可能下降较快 |\n",
138- "| 0.002 | 适度探索 | 熵稳定(~0.2),多数环境最优 |\n",138+ "| 0.003 | 适度探索 | 可用于短程对比 |\n",
139- "| 0.005 | 较强探索 | ⚠️ 边界,部分环境熵飙升 |\n",139+ "| 0.004 | 适度探索 | 当前 recipe 默认值 |\n",
140- "| 0.01+ | 强探索 | 几乎必飙升(0.56→4.51 in 25 步)|\n",140+ "| 0.005 | 强探索 | 部分 run entropy 持续上升 |\n",
141 "\n",141 "\n",
142- "> ⚠️ **entropy_coeff 的合适值受 SFT 模型状态、随机种子和硬件浮点差异影响**。本 recipe 从已完整验证的 `0.002` 开始,跑约 30 步同时观察 entropy、correct 和 reward,再决定是否调整。\n",142+ "> 新环境运行 25~30 步同时观察 entropy、KL、验证 correct 和输出长度。entropy 持续上升且 correct 不涨时下系数;entropy 快速下降且 correct、输出长度同步恶化时小幅上调。每次只调一个参数。\n",
143 "\n",143 "\n",
144 "### 3.2 三种力的平衡\n",144 "### 3.2 三种力的平衡\n",
145 "\n",145 "\n",
@@ -153,7 +153,7 @@
153 "```text\n",153 "```text\n",
154 "RL 训练中的三种力\n",154 "RL 训练中的三种力\n",
155 "\n",155 "\n",
156- "pg_loss:优化 reward,让模型更倾向于高奖励输出,但也会让分布变得更确定,entropy 下降。\n",156+ "pg_loss:根据势信号优策略,让模型更倾向于高奖励输出。\n",
157 "kl_loss:把当前策略拉回参考策略附近,限制策略漂移。\n",157 "kl_loss:把当前策略拉回参考策略附近,限制策略漂移。\n",
158 "entropy_bonus:鼓励探索,避免输出过早收缩到固定模式。\n",158 "entropy_bonus:鼓励探索,避免输出过早收缩到固定模式。\n",
159 "```"159 "```"
@@ -164,7 +164,7 @@
164 "metadata": {},164 "metadata": {},
165 "source": [165 "source": [
166 "\n",166 "\n",
167- "三者不是越大越好,而是要保持合适的平衡:pg_loss 过强容易策略崩塌entropy_bonus 过强又可能探索失控,kl_loss 负责限制模型偏离参考策略太远。"167+ "三者不是越大越好,而是要保持合适的平衡:策略梯度负责学习奖励信号KL 则限制策略漂移,entropy bonus 保留探索能力判断训练状态时,同时观察 entropy、KL、验证 correct 和 response_length。"
168 ]168 ]
169 },169 },
170 {170 {
@@ -173,7 +173,7 @@
173 "source": [173 "source": [
174 "<img src=\"./images/three_forces.png\" alt=\"RL 训练三种力平衡\" width=\"90%\">\n",174 "<img src=\"./images/three_forces.png\" alt=\"RL 训练三种力平衡\" width=\"90%\">\n",
175 "\n",175 "\n",
176- "图中的平衡点表示稳定训练状态:模型既能朝高奖励方向学习,又不会过度偏离参考策略,也不会失去必要的探索能力。"176+ "图中的平衡点表示稳定训练状态:模型朝高奖励方向学习,同时限制策略漂移并保持必要的探索能力。"
177 ]177 ]
178 },178 },
179 {179 {
@@ -188,11 +188,11 @@
188 "\n",188 "\n",
189 "| 指标 | 健康范围 | 危险信号 |\n",189 "| 指标 | 健康范围 | 危险信号 |\n",
190 "|------|----------|----------|\n",190 "|------|----------|----------|\n",
191- "| entropy | 缓慢下降 | 突然跌到 0(崩塌)或持续(失控) |\n",191+ "| entropy | 平稳或随学习逐步变化 | 快速逼近 0或持续加速上升 |\n",
192- "| kl_loss | 缓慢上升 | 飙升过快(漂移过大) |\n",192+ "| kl_loss | 与参考策略保持可控差异 | 持续速增大(漂移过大) |\n",
193 "| grad_norm | 稳定 | 突然飙升(梯度爆炸) |\n",193 "| grad_norm | 稳定 | 突然飙升(梯度爆炸) |\n",
194 "| response_length | 稳定 | 全部打满(输出退化) |\n",194 "| response_length | 稳定 | 全部打满(输出退化) |\n",
195- "| reward | 上升趋势 | 突然归零(策略崩溃) |\n",195+ "| reward / correct | 验证集整体趋势改善 | 训练 reward 上升但验证 correct 持续回落 |\n",
196 "\n",196 "\n",
197 "> 这些指标会在第 3 章训练实战中实际观察和解读。\n",197 "> 这些指标会在第 3 章训练实战中实际观察和解读。\n",
198 "\n",198 "\n",
@@ -11,7 +11,7 @@
11解析:PPO 中 Critic 模型用于估计每个状态的价值(value),从而计算优势(advantage = reward - value)。GRPO 用组内平均代替了这个功能。11解析:PPO 中 Critic 模型用于估计每个状态的价值(value),从而计算优势(advantage = reward - value)。GRPO 用组内平均代替了这个功能。
12 12 
135. B135. B
14-解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均代替。这减少了存开销和训练复杂度,特别适合资源受限的场景。14+解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均代替。这减少了设备内存开销和训练复杂度,特别适合资源受限的场景。
15 15 
166. A、B、D166. A、B、D
17解析:PPO clip 机制限制新旧策略的概率比(A)、防止策略突变(B)、保证每次更新幅度在安全范围内(D)。clip 机制本身不加速收敛(C 错误)。17解析:PPO clip 机制限制新旧策略的概率比(A)、防止策略突变(B)、保证每次更新幅度在安全范围内(D)。clip 机制本身不加速收敛(C 错误)。
@@ -5,7 +5,7 @@
5解析:KL 散度正则化通过在 loss 中加入 KL(π || π_ref) 惩罚项,限制当前策略与参考策略之间的距离。模型偏离越远,惩罚越大,梯度会拉回模型。5解析:KL 散度正则化通过在 loss 中加入 KL(π || π_ref) 惩罚项,限制当前策略与参考策略之间的距离。模型偏离越远,惩罚越大,梯度会拉回模型。
6 6 
73. ×73. ×
8-解析:Entropy bonus 的作用是鼓励模型保持探索能力(高熵),而非降低探索性。它在 loss 中加入 -entropy_coeff × H(π),熵越低惩罚越大高熵。8+解析:Entropy bonus 的作用是鼓励模型保持探索能力(高熵),而非降低探索性。它在 loss 中加入 -entropy_coeff × H(π),最小化 loss 时较高的 H(π) 会使这一项更小从而提供鼓励高熵分布的梯度
9 9 
104. B104. B
11解析:kl_loss_coef=0.001 提供轻微的 KL 约束,平衡探索和利用。太大会限制学习新策略,太小则无法防止漂移。11解析:kl_loss_coef=0.001 提供轻微的 KL 约束,平衡探索和利用。太大会限制学习新策略,太小则无法防止漂移。
@@ -11,7 +11,7 @@
11解析:PPO clip 机制限制新旧策略的概率比在 [1-ε, 1+ε] 范围内,防止策略突变。11解析:PPO clip 机制限制新旧策略的概率比在 [1-ε, 1+ε] 范围内,防止策略突变。
12 12 
135. ×135. ×
14-解析:Entropy bonus 设置过大会导致 entropy 失控飙升,模型过度探索不收敛。需要选择值(如 0.001)14+解析:Entropy bonus 设置过大会导致 entropy 失控飙升,模型过度探索不收敛。适的系数需要保持其他参数不变,通过短程实验联合观察 entropy、KL 和验证 correct
15 15 
166. √166. √
17解析:KL 正则化在 loss 中加入 KL(π || π_ref) 惩罚项,限制当前策略与参考策略之间的距离,防止策略漂移过大。17解析:KL 正则化在 loss 中加入 KL(π || π_ref) 惩罚项,限制当前策略与参考策略之间的距离,防止策略漂移过大。
@@ -20,7 +20,7 @@
20解析:correct_answer 只有猜中才有,是稀疏奖励;partial_answer 每轮都有部分匹配分数,是密集奖励。两者结合加速学习。20解析:correct_answer 只有猜中才有,是稀疏奖励;partial_answer 每轮都有部分匹配分数,是密集奖励。两者结合加速学习。
21 21 
228. B228. B
23-解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均奖励作为 baseline 来计算优势,减少了存和计算开销。23+解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均奖励作为 baseline 来计算优势,减少了设备内存和计算开销。
24 24 
259. C259. C
26解析:策略崩塌的典型表现:entropy 趋近 0、response_length 全部打满、correct 归零。模型输出退化为固定模式。26解析:策略崩塌的典型表现:entropy 趋近 0、response_length 全部打满、correct 归零。模型输出退化为固定模式。
@@ -29,7 +29,7 @@
29解析:保留参考策略是为了通过 KL 正则化防止当前策略偏离初始模型太远,避免模型为了追求高奖励而忘记原有的语言能力。29解析:保留参考策略是为了通过 KL 正则化防止当前策略偏离初始模型太远,避免模型为了追求高奖励而忘记原有的语言能力。
30 30 
3111. B3111. B
32-解析:entropy_coeff=0.01 过大,导致 entropy 失控飙升,模型过度探索不收敛。实测中 25 步内 entropy 从 0.56 飙到 4.5。32+解析:在本课程实验配置中,entropy_coeff=0.01 会 entropy bonus 的相对影响过强造成 entropy 膨胀、模型过度探索不收敛。
33 33 
3412. D3412. D
35解析:Wordle 奖励函数包含 correct_answer、partial_answer、length_bonus、format_reward。critic_value 不是奖励组件,是 PPO 中 Critic 模型的输出。35解析:Wordle 奖励函数包含 correct_answer、partial_answer、length_bonus、format_reward。critic_value 不是奖励组件,是 PPO 中 Critic 模型的输出。
@@ -77,7 +77,7 @@
77 "source": [77 "source": [
78 "### 1.2 启动训练\n",78 "### 1.2 启动训练\n",
79 "\n",79 "\n",
80- "训练单步约 250s155 10 时。为避免 notebook kernel 或浏览器连接中断影响任务,本课程约定**长时间训练只在 CANNLab 终端执行**。请先运行下方检查单元格,它会根据课程仓与训练代码仓的实际位置,输出包含绝对路径的终端命令;复制输出的两行命令执行即可。\n",80+ "默认训练 5 个 epoch(本数据配置下为 75 个优化 step)并且每 5 执行一次 100 条 rollout 的采样验证,实际耗会随输出长度和硬件状态变化。为避免 notebook kernel 或浏览器连接中断影响任务,本课程约定**长时间训练只在 CANNLab 终端执行**。请先运行下方检查单元格,它会根据课程仓与训练代码仓的实际位置,输出包含绝对路径的终端命令;复制输出的两行命令执行即可。\n",
81 "\n",81 "\n",
82 "终端关闭会终止前台训练,请保持终端会话。训练日志和 checkpoint 会分别写入 `tensorboard_log/` 与 `checkpoint/`。\n"82 "终端关闭会终止前台训练,请保持终端会话。训练日志和 checkpoint 会分别写入 `tensorboard_log/` 与 `checkpoint/`。\n"
83 ]83 ]
@@ -114,26 +114,31 @@
114 "| 参数 | 默认值 | 说明 |\n",114 "| 参数 | 默认值 | 说明 |\n",
115 "|------|--------|------|\n",115 "|------|--------|------|\n",
116 "| `MODEL_PATH` | `./models/Qwen3-1.7B-Wordle-SFT` | SFT 模型权重路径 |\n",116 "| `MODEL_PATH` | `./models/Qwen3-1.7B-Wordle-SFT` | SFT 模型权重路径 |\n",
117- "| `TRAIN_BATCH_SIZE` | 64 | 训练 batch size |\n",117+ "| `TRAIN_BATCH_SIZE` | 128 | 训练 batch size |\n",
118 "| `MAX_PROMPT_LENGTH` | 1024 | prompt 最大 token |\n",118 "| `MAX_PROMPT_LENGTH` | 1024 | prompt 最大 token |\n",
119 "| `MAX_RESPONSE_LENGTH` | 4096 | response 最大 token |\n",119 "| `MAX_RESPONSE_LENGTH` | 4096 | response 最大 token |\n",
120 "| `ROLLOUT_N` | 8 | 每个 prompt 的并行 rollout 数 |\n",120 "| `ROLLOUT_N` | 8 | 每个 prompt 的并行 rollout 数 |\n",
121 "| `MAX_TURNS` | 6 | Wordle 最大猜词轮次 |\n",121 "| `MAX_TURNS` | 6 | Wordle 最大猜词轮次 |\n",
122 "| `ACTOR_LR` | 1e-6 | Actor 学习率 |\n",122 "| `ACTOR_LR` | 1e-6 | Actor 学习率 |\n",
123- "| `NGPUS_PER_NODE` | 2 | 训练卡数 |\n",123+ "| `ENTROPY_COEFF` | 0.004 | 熵奖励系,可通过短程实验调节 |\n",
124+ "| `NGPUS_PER_NODE` | 2 | 训练卡数(变量名沿用上游配置,本课程中表示 Ascend NPU 卡数)|\n",
124 "| `ROLLOUT_TP` | 2 | vLLM tensor parallel |\n",125 "| `ROLLOUT_TP` | 2 | vLLM tensor parallel |\n",
125 "\n",126 "\n",
126- "脚本内置关键超参(如需修改请编辑脚本):\n",127+ "脚本使用的其他关键超参:\n",
127 "\n",128 "\n",
128 "| 超参 | 值 | 说明 |\n",129 "| 超参 | 值 | 说明 |\n",
129 "|------|-----|------|\n",130 "|------|-----|------|\n",
130- "| `entropy_coeff` | 0.002 | 熵奖励系数,维持探索 |\n",
131 "| `kl_loss_coef` | 0.001 | KL 散度损失系数 |\n",131 "| `kl_loss_coef` | 0.001 | KL 散度损失系数 |\n",
132 "| `lr_scheduler_type` | cosine | 余弦退火,防止后期过更新 |\n",132 "| `lr_scheduler_type` | cosine | 余弦退火,防止后期过更新 |\n",
133 "| `min_lr_ratio` | 0.1 | 余弦退火终点的 LR 比例 |\n",133 "| `min_lr_ratio` | 0.1 | 余弦退火终点的 LR 比例 |\n",
134- "| `lr_warmup_steps_ratio` | 0.03 | LR 热身步数占比 |\n",134+ "| `lr_warmup_steps` | 5 | LR 热身步数 |\n",
135 "| `total_epochs` | 5 | 训练总轮数 |\n",135 "| `total_epochs` | 5 | 训练总轮数 |\n",
136 "| `save_freq` | 25 | checkpoint 保存间隔(步)|\n",136 "| `save_freq` | 25 | checkpoint 保存间隔(步)|\n",
137+ "| `test_freq` | 5 | 每 5 个优化 step 验证一次 |\n",
138+ "| `val_kwargs.temperature` | 0.7 | 验证采样温度 |\n",
139+ "| `val_kwargs.n` | 5 | 每个测试词采样 5 次 |\n",
140+ "\n",
141+ "> 正式训练前先运行 25~30 步观察 entropy、KL、验证 correct 和输出长度。调节 `ENTROPY_COEFF` 时保持其他参数不变,具体方法见第 4 章。\n",
137 "\n",142 "\n",
138 "---\n",143 "---\n",
139 "\n",144 "\n",
@@ -158,7 +163,7 @@
158 " critic/score/mean:0.7463 <- 平均奖励(verl 沿用的指标命名,本实验没有 Critic 模型)\n",163 " critic/score/mean:0.7463 <- 平均奖励(verl 沿用的指标命名,本实验没有 Critic 模型)\n",
159 " response_length/mean:1816.15 <- 平均回复长度\n",164 " response_length/mean:1816.15 <- 平均回复长度\n",
160 " num_turns/mean:5.80 <- 平均交互轮次\n",165 " num_turns/mean:5.80 <- 平均交互轮次\n",
161- " perf/time_per_step:250.00 <- 单耗时(秒)\n",166+ " perf/time_per_step:350.00 <- 单个优化 step 耗时(秒)\n",
162 "```"167 "```"
163 ]168 ]
164 },169 },
@@ -180,12 +185,12 @@
180 "```text\n",185 "```text\n",
181 "验证指标\n",186 "验证指标\n",
182 "\n",187 "\n",
183- "val-core/wordle/reward/mean@1 <- 验证集平均总奖励\n",188+ "val-core/wordle/correct/mean@5 <- 验证集猜中率(核心指标)\n",
184- "val-aux/wordle/correct/mean@1 <- 验证集猜中率\n",189+ "val-aux/wordle/reward/mean@5 <- 验证集平均总奖励\n",
185- "val-aux/wordle/partial/mean@1 <- 验证集部分匹配分\n",190+ "val-aux/wordle/partial/mean@5 <- 验证集部分匹配分\n",
186- "val-aux/wordle/length_bonus/mean@1 <- 验证集步数奖励\n",191+ "val-aux/wordle/length_bonus/mean@5 <- 验证集步数奖励\n",
187- "val-aux/wordle/format/mean@1 <- 验证集格式正确率\n",192+ "val-aux/wordle/format/mean@5 <- 验证集格式正确率\n",
188- "val-aux/wordle/num_guesses/mean@1 <- 验证集平均猜测次数\n",193+ "val-aux/wordle/num_guesses/mean@5 <- 验证集平均猜测次数\n",
189 "```"194 "```"
190 ]195 ]
191 },196 },
@@ -197,35 +202,36 @@
197 "\n",202 "\n",
198 "## 4. 训练曲线解读\n",203 "## 4. 训练曲线解读\n",
199 "\n",204 "\n",
200- "以下是 Qwen3-1.7B Wordle RL 的典型训练曲线(2 x Ascend 910C):\n",205+ "以下是 Qwen3-1.7B Wordle RL 的训练曲线(2 x Ascend 910C,`entropy_coeff=0.004`):\n",
201 "\n",206 "\n",
202 "### 4.1 Reward 和 Correct 率\n",207 "### 4.1 Reward 和 Correct 率\n",
203 "\n",208 "\n",
204 "| step | reward | correct | 说明 |\n",209 "| step | reward | correct | 说明 |\n",
205 "|------|--------|---------|------|\n",210 "|------|--------|---------|------|\n",
206- "| 0 | 0.82 | 15% | 初始水平 |\n",211+ "| 0 | 0.852 | 19% | 训练前基线 |\n",
207- "| 35 | 0.99 | 35% | 快速提升阶段 |\n",212+ "| 30 | 1.072 | 44% | 验证指标明显改善 |\n",
208- "| 75 | 1.03 | 40% | 持续提升 |\n",213+ "| 75 | 1.156 | 55% | 5 个 epoch 训练完成 |\n",
209- "| 155 | 1.20 | 70% | 持续上升(cosine 调度)|\n",214+ "| 90 | 1.042 | 42% | 额外训练 1 个 epoch 后回落 |\n",
210 "\n",215 "\n",
211 "### 4.2 Entropy\n",216 "### 4.2 Entropy\n",
212 "\n",217 "\n",
213 "| step | entropy | 说明 |\n",218 "| step | entropy | 说明 |\n",
214 "|------|---------|------|\n",219 "|------|---------|------|\n",
215- "| 1 | 0.53 | 初始熵 |\n",220+ "| 1 | 0.529 | 初始熵 |\n",
216- "| 50 | 0.35 | 缓慢下降(正常)|\n",221+ "| 30 | 0.472 | 逐步下降 |\n",
217- "| 100 | 0.28 | 继续下降 |\n",222+ "| 60 | 0.334 | 继续下降 |\n",
218- "| 155 | 0.22 | 稳定(未崩塌)|\n",223+ "| 75 | 0.235 | 保持有效探索 |\n",
224+ "| 90 | 0.179 | 继续下降,但验证 correct 已回落 |\n",
219 "\n",225 "\n",
220 "### 4.3 健康训练的特征\n",226 "### 4.3 健康训练的特征\n",
221 "\n",227 "\n",
222- "- **reward 上升趋势**:从 0.82 上升到 1.20\n",228+ "- **验证 correct 和 reward 的整体趋势改善**,允许单次采样点有波动\n",
223- "- **correct 率提升**:从 15% 提升到 70%\n",229+ "- **entropy 没有快速逼近 0 或持续加速上升**,并且验证 correct 同期没有持续恶化\n",
224- "- **entropy 缓慢下降**:从 0.53 降到 0.22但未崩塌到 0\n",230+ "- **response_length 未全部打满**,输出没有退化为固定的超长模式\n",
225- "- **response_length 稳定**:约 1700 token未全部打满\n",231+ "- **KL grad_norm 没有异常放大**策略更新幅度仍然可控\n",
226- "- **grad_norm 稳定**:0.4-1.0 范围内\n",232+ "- **训练 reward 不能单独作为依据**:应结合验证 correct 判断 checkpoint 效果\n",
227 "\n",233 "\n",
228- "> 如果 entropy 突然跌到 0 response_length 全部打满 3232,说明训练可能崩塌详见第 4 章。\n",234+ "> 20 个测试词会各采样 5 次,共 100 条验证 rollout采样评测存在波动,应结合多次验证的整体趋势选择 checkpoint。\n",
229 "\n",235 "\n",
230 "---\n",236 "---\n",
231 "\n",237 "\n",
@@ -233,9 +239,9 @@
233 "\n",239 "\n",
234 "| 指标 | 参考值 |\n",240 "| 指标 | 参考值 |\n",
235 "|------|--------|\n",241 "|------|--------|\n",
236- "| 单耗时 | 约 250s |\n",242+ "| 单个优化 step 耗时 | 约 350s,不含每 5 步的采样验证 |\n",
237- "| 单步吞吐 | 约 1500 token/s |\n",243+ "| 单步吞吐 | 约 1300 token/s |\n",
238- "| 存占用 | 约 47GB/卡 |\n",244+ "| NPU 设备内存占用 | 约 48GB/卡 |\n",
239 "\n",245 "\n",
240 "---\n",246 "---\n",
241 "\n",247 "\n",
@@ -266,7 +272,7 @@
266 "cell_type": "markdown",272 "cell_type": "markdown",
267 "metadata": {},273 "metadata": {},
268 "source": [274 "source": [
269- "1. (判断题)验证指标 `val-aux/wordle/correct/mean@1` 表示验证集猜中率。\n",275+ "1. (判断题)验证指标 `val-core/wordle/correct/mean@5` 表示每个测试词采样 5 次后的验证集平均猜中率。\n",
270 "\n",276 "\n",
271 "2. (判断题)训练日志中的 `actor/entropy` 指标反映了模型的探索能力。\n",277 "2. (判断题)训练日志中的 `actor/entropy` 指标反映了模型的探索能力。\n",
272 "\n",278 "\n",
@@ -274,20 +280,20 @@
274 "\n",280 "\n",
275 "4. (单选题)以下哪个指标可以判断模型是否猜中了秘密单词?\n",281 "4. (单选题)以下哪个指标可以判断模型是否猜中了秘密单词?\n",
276 " A. actor/entropy\n",282 " A. actor/entropy\n",
277- " B. val-aux/wordle/correct/mean@1\n",283+ " B. val-core/wordle/correct/mean@5\n",
278 " C. response_length/mean\n",284 " C. response_length/mean\n",
279 " D. actor/grad_norm\n",285 " D. actor/grad_norm\n",
280 "\n",286 "\n",
281 "5. (单选题)训练崩塌的典型信号是什么?\n",287 "5. (单选题)训练崩塌的典型信号是什么?\n",
282 " A. reward 缓慢上升\n",288 " A. reward 缓慢上升\n",
283- " B. correct 率从 15% 提升到 45%\n",289+ " B. 验证 correct 率整体提升\n",
284 " C. entropy 突然跌到 0,response_length 全部打满 3232\n",290 " C. entropy 突然跌到 0,response_length 全部打满 3232\n",
285- " D. entropy 0.53 缓慢下降到 0.22\n",291+ " D. entropy 逐步变化且验证 correct 没有持续恶化\n",
286 "\n",292 "\n",
287 "6. (多选题)以下哪些是健康训练的特征?\n",293 "6. (多选题)以下哪些是健康训练的特征?\n",
288- " A. reward 上升趋势\n",294+ " A. 验证 reward 整体改善\n",
289- " B. correct 率提升\n",295+ " B. 验证 correct 率整体提升\n",
290- " C. entropy 缓慢下降但未崩塌\n",296+ " C. entropy 没有快速逼近 0 或持续加速上升\n",
291 " D. response_length 稳定,未全部打满"297 " D. response_length 稳定,未全部打满"
292 ]298 ]
293 },299 },
@@ -29,7 +29,7 @@
29 "\n",29 "\n",
30 "6. (判断题)训练数据中的秘密单词来自 TextArena Wordle-v0 的词表。\n",30 "6. (判断题)训练数据中的秘密单词来自 TextArena Wordle-v0 的词表。\n",
31 "\n",31 "\n",
32- "7. (判断题)验证指标 `val-aux/wordle/correct/mean@1` 表示训练集的猜中率。\n",32+ "7. (判断题)验证指标 `val-core/wordle/correct/mean@5` 表示训练集的猜中率。\n",
33 "\n",33 "\n",
34 "8. (单选题)WordleAgentLoop 的 response_mask 中,值为 1 表示什么?\n",34 "8. (单选题)WordleAgentLoop 的 response_mask 中,值为 1 表示什么?\n",
35 " A. 环境追加的 token(不计算梯度)\n",35 " A. 环境追加的 token(不计算梯度)\n",
@@ -52,7 +52,7 @@
52 "11. (单选题)健康训练中 entropy 的典型表现是?\n",52 "11. (单选题)健康训练中 entropy 的典型表现是?\n",
53 " A. 持续快速上升到 5.0\n",53 " A. 持续快速上升到 5.0\n",
54 " B. 突然跌到 0\n",54 " B. 突然跌到 0\n",
55- " C. 缓慢下降但未崩塌\n",55+ " C. 平稳或逐步变化,并且验证 correct 整体改善\n",
56 " D. 保持不变\n",56 " D. 保持不变\n",
57 "\n",57 "\n",
58 "12. (多选题)WordleAgentLoop 的职责包括哪些?\n",58 "12. (多选题)WordleAgentLoop 的职责包括哪些?\n",
@@ -77,7 +77,7 @@
77 " A. ROLLOUT_N(GRPO 组大小)\n",77 " A. ROLLOUT_N(GRPO 组大小)\n",
78 " B. MAX_TURNS(最大猜词轮次)\n",78 " B. MAX_TURNS(最大猜词轮次)\n",
79 " C. ACTOR_LR(学习率)\n",79 " C. ACTOR_LR(学习率)\n",
80- " D. NGPUS_PER_NODE(训练卡数)"80+ " D. NGPUS_PER_NODE(训练卡数,本课程中表示 NPU 卡数)"
81 ]81 ]
82 },82 },
83 {83 {
@@ -1,17 +1,17 @@
11. √11. √
2-解析:val-aux/wordle/correct/mean@1 表示验证集猜中率,是衡量模型猜词能力最直接的指标。2+解析:val-core/wordle/correct/mean@5 表示每个测试词采样 5 次后的验证集平均猜中率,是衡量模型猜词能力最直接的指标。
3 3 
42. √42. √
5解析:actor/entropy 反映模型输出的不确定性(探索能力)。entropy 高表示模型在尝试不同策略,低表示趋于确定性输出。5解析:actor/entropy 反映模型输出的不确定性(探索能力)。entropy 高表示模型在尝试不同策略,低表示趋于确定性输出。
6 6 
73. ×73. ×
8-解析:健康训练中 entropy 应缓慢下降但不应崩塌到 0。entropy 突然跌到 0 是策略崩塌信号。8+解析:健康训练中 entropy 应平稳变化。持续快速下降到 0 是策略崩塌信号,需要结合验证 correct、KL 和输出长度共同判断
9 9 
104. B104. B
11-解析:val-aux/wordle/correct/mean@1 表示验证集猜中率,直接反映模型猜中秘密单词的能力。11+解析:val-core/wordle/correct/mean@5 表示验证集的平均猜中率,直接反映模型猜中秘密单词的能力。
12 12 
135. C135. C
14-解析:训练崩塌的典型信号是 entropy 突然跌到 0、response_length 全部打满 3232、correct 归零。entropy 缓慢下降(D)是正常现象14+解析:训练崩塌的典型信号是 entropy 突然跌到 0、response_length 全部打满 3232、correct 归零。entropy 逐步变化且验证 correct 没有持续恶化(D)崩塌信号
15 15 
166. A、B、C、D166. A、B、C、D
17-解析:健康训练的特征:reward 上升趋势(A)、correct 率提升(B)、entropy 缓慢下降但未崩塌(C)、response_length 稳定未全部打满(D)。17+解析:健康训练需要联合观察验证 reward correct 整体改善A、B)、entropy 没有快速逼近 0 或持续加速上升(C)、response_length 未退化为全部打满(D)。
@@ -17,7 +17,7 @@
17解析:词表来源于 TextArena Wordle-v0,TextArena 使用 NLTK 的 pos_tag 过滤出 5 字母名词作为有效词表。17解析:词表来源于 TextArena Wordle-v0,TextArena 使用 NLTK 的 pos_tag 过滤出 5 字母名词作为有效词表。
18 18 
197. ×197. ×
20-解析:val-aux/wordle/correct/mean@1 表示验证集(test set)猜中率,不是训练集。20+解析:val-core/wordle/correct/mean@5 表示每个测试词采样 5 次后的验证集(test set)平均猜中率,不是训练集。
21 21 
228. B228. B
23解析:response_mask 值为 1 表示模型生成的 token(如猜词内容),需要计算梯度;值为 0 表示环境追加的 token(如 G/Y/X 反馈),不计算梯度。23解析:response_mask 值为 1 表示模型生成的 token(如猜词内容),需要计算梯度;值为 0 表示环境追加的 token(如 G/Y/X 反馈),不计算梯度。
@@ -29,7 +29,7 @@
29解析:Wordle 奖励函数包含 correct_answer、partial_answer、length_bonus、format_reward。critic_value 是 PPO 中 Critic 模型的输出,不是 Wordle 奖励组件。29解析:Wordle 奖励函数包含 correct_answer、partial_answer、length_bonus、format_reward。critic_value 是 PPO 中 Critic 模型的输出,不是 Wordle 奖励组件。
30 30 
3111. C3111. C
32-解析:健康训练中 entropy 缓慢下降未崩塌。持续升(A)是 entropy bonus 过强的信号,突然跌到 0(B)是策略崩塌,保持不变(D)不太常见32+解析:健康训练中 entropy 可以平稳或逐步变化,必须结合验证 correct 是否改善。持续快速上升(A)突然跌到 0(B)都需要进一步诊断
33 33 
3412. A、B、C、D3412. A、B、C、D
35解析:WordleAgentLoop 的职责:发送游戏 prompt(A)、接收模型猜词(B)、计算 G/Y/X 反馈(C)、追加反馈到对话(D)。35解析:WordleAgentLoop 的职责:发送游戏 prompt(A)、接收模型猜词(B)、计算 G/Y/X 反馈(C)、追加反馈到对话(D)。
@@ -41,4 +41,4 @@
41解析:训练日志包含 Actor 指标(entropy、loss、grad_norm)、Critic 指标(score、rewards、advantages)、序列长度指标(prompt_length、response_length)、性能指标(time_per_step、throughput)。41解析:训练日志包含 Actor 指标(entropy、loss、grad_norm)、Critic 指标(score、rewards、advantages)、序列长度指标(prompt_length、response_length)、性能指标(time_per_step、throughput)。
42 42 
4315. A、B、C4315. A、B、C
44-解析:ROLLOUT_N 影响 GRPO 组大小(A),MAX_TURNS 影响最大猜词轮次(B),ACTOR_LR 影响学习率(C)。NGPUS_PER_NODE(D)影响训练资源分配但不直接影响训练行为。44+解析:ROLLOUT_N 影响 GRPO 组大小(A),MAX_TURNS 影响最大猜词轮次(B),ACTOR_LR 影响学习率(C)。NGPUS_PER_NODE(D,变量名沿用上游配置,本课程中表示 Ascend NPU 卡数)影响训练资源分配但不直接影响训练行为。
@@ -8,7 +8,7 @@
8 "\n",8 "\n",
9 "在第 3 章中,我们成功运行了 Wordle GRPO 训练。但实际训练中,你可能会遇到各种问题——训练不收敛、策略崩塌、entropy 失控等。本章将基于真实的训练实验数据,介绍如何调优超参数和排查训练问题。\n",9 "在第 3 章中,我们成功运行了 Wordle GRPO 训练。但实际训练中,你可能会遇到各种问题——训练不收敛、策略崩塌、entropy 失控等。本章将基于真实的训练实验数据,介绍如何调优超参数和排查训练问题。\n",
10 "\n",10 "\n",
11- "本章使用本 recipe 的真实 TensorBoard 事件文件作为案例,其中稳定 run 为 `qwen3_1.7b_wordle_0701_1404`。这些数值用于演示诊断方法,不应视为跨模型、随机种子和硬件都固定不变的阈值。\n",11+ "本章使用本 recipe 的真实 TensorBoard 事件文件作为案例,其中稳定 run 为 `qwen3_1.7b_wordle_0727_2000`。\n",
12 "\n",12 "\n",
13 "---\n",13 "---\n",
14 "\n",14 "\n",
@@ -16,19 +16,17 @@
16 "\n",16 "\n",
17 "### 实验数据\n",17 "### 实验数据\n",
18 "\n",18 "\n",
19- "以下使用同一个 SFT 模型(Qwen3-1.7B-Wordle-SFT),仅改变 entropy_coeff:\n",19+ "以下使用同一个 SFT 模型(Qwen3-1.7B-Wordle-SFT)和 batch 128,仅改变 entropy_coeff:\n",
20 "\n",20 "\n",
21 "| entropy_coeff | 观测到的 entropy | 结果 |\n",21 "| entropy_coeff | 观测到的 entropy | 结果 |\n",
22 "|---------------|------------------|------|\n",22 "|---------------|------------------|------|\n",
23- "| 0 | 0.54 → 0.15(step 75)| 持续下降,策略崩塌风险较高 |\n",23+ "| 0.003 | 0.524 → 0.188(step 57)| correct/mean@5 峰值 0.44(step 45)|\n",
24- "| 0.001 | 0.56 → 0.48(step 25)| 轻度保护仍需继续观察 |\n",24+ "| 0.004 | 0.529 0.235(step 75)→ 0.179(step 90)| correct/mean@5 在 step 75 达 0.55step 90 回落到 0.42 |\n",
25- "| 0.002 | 0.5340.451(step 25→ 0.223(step 155)| `0701_1404` 稳定完成,correct 70% |\n",25+ "| 0.005 | 0.5213.638(step 60)| entropy 明显膨胀,correct/mean@5 峰值仅 0.39 |\n",
26- "| 0.005 | 0.531 → 0.998(step 25)→ **3.721**(step 38)| `0630_1646` 熵快速飙升并停止 |\n",
27- "| 0.01 | 约 0.56 → **4.51**(step 25)| entropy bonus 明显过强 |\n",
28 "\n",26 "\n",
29 "### 分析\n",27 "### 分析\n",
30 "\n",28 "\n",
31- "> ⚠️ **entropy_coeff 的合适值受 SFT 模型状态、随机种子和硬件浮点差异影响**。本 recipe 使用已完整验证的 `0.002` 作为默认值;新环境先跑约 30 步观察趋势,如果 entropy 持续加速上升则下调,如果快速逼近 0 则结合 KL、学习率和 reward 一起排查。\n"29+ "> 本 recipe 默认使用 `0.004`新环境先运行 25~30 步观察 entropyKL、验证 correct 和 response_length,再根据曲线调整系数。\n"
32 ]30 ]
33 },31 },
34 {32 {
@@ -38,16 +36,17 @@
38 "```text\n",36 "```text\n",
39 "entropy_coeff 的影响\n",37 "entropy_coeff 的影响\n",
40 "\n",38 "\n",
41- "entropy_coeff=0 (无 bonus)\n",39+ "entropy 快速下降,同时 correct 回落、response_length 异常\n",
42- " pg_loss 完全主导 -> entropy 持续下降 -> 最终崩塌\n",40+ " -> 策略可能过度收缩\n",
41+ " -> 小幅提高 entropy_coeff 只是候选操作,还要检查学习率和 KL 是否合适\n",
43 "\n",42 "\n",
44- "entropy_coeff=0.01 (过强)\n",43+ "entropy 持续加速上升,同时 correct 不涨\n",
45- " entropy_bonus 压过 pg_loss -> entropy 飙升 -> 模型度探索\n",44+ " -> entropy bonus 的相对影响可能\n",
46- " 25步内 entropy 从 0.56 飙到 4.51增长\n",45+ " -> 下调 entropy_coeff并保持其他参不变重新短跑\n",
47- " reward 上升但 correct 不涨 (靠 partial 而非猜中)\n",
48 "\n",46 "\n",
49- "entropy_coeff=0.002 (适中)\n",47+ "entropy 平稳或逐步变化,同时验证 correct 改善、KL 可控\n",
50- " 三种力平衡 -> entropy 缓慢下降到 ~0.2 稳定 -> 训练稳定\n",48+ " -> 当前三种力的相对强弱仍支持学习\n",
49+ " -> 继续训练并按验证峰值选择 checkpoint\n",
51 "```"50 "```"
52 ]51 ]
53 },52 },
@@ -63,9 +62,9 @@
63 "\n",62 "\n",
64 "| kl_loss_coef | 效果 | 风险 |\n",63 "| kl_loss_coef | 效果 | 风险 |\n",
65 "|-------------|------|------|\n",64 "|-------------|------|------|\n",
66- "| 0.001 | 轻微约束 | 可能不足以阻止漂移 |\n",65+ "| 0.001 | 轻微约束 | 当前 recipe 的调试起点,仍需观察实际 KL |\n",
67- "| 0.01 | 中等约束 | 配合 entropy_coeff 使用 |\n",66+ "| 0.01 | 中等约束 | 可能抑制策略更新 |\n",
68- "| 0.1 | 强约束 | 模型无法学习新策略 |\n",67+ "| 0.1 | 强约束 | 容易让模型难以学习新策略 |\n",
69 "\n",68 "\n",
70 "### KL loss 与 entropy 的关系\n",69 "### KL loss 与 entropy 的关系\n",
71 "\n",70 "\n",
@@ -77,15 +76,15 @@
77 "metadata": {},76 "metadata": {},
78 "source": [77 "source": [
79 "```text\n",78 "```text\n",
80- "KL loss: 拉回参考策略 (限制漂移)\n",79+ "KL loss: 约束当前策略与参考策略的距离\n",
81 " kl_loss = KL(pi || pi_ref)\n",80 " kl_loss = KL(pi || pi_ref)\n",
82 " 偏离越远 -> kl_loss 越大 -> 梯度拉回\n",81 " 偏离越远 -> kl_loss 越大 -> 梯度拉回\n",
83 "\n",82 "\n",
84- "entropy_bonus: 推高探索 (防止崩塌)\n",83+ "entropy_bonus: 鼓励分布保留探索\n",
85 " entropy_bonus = -entropy_coeff * H(pi)\n",84 " entropy_bonus = -entropy_coeff * H(pi)\n",
86- " 熵-> 惩罚越大 -> 梯度推高\n",85+ " 较高的策略会降total_loss 中的 entropy \n",
87 "\n",86 "\n",
88- "两者协同: KL 限制方向, entropy 限制分布形状\n",87+ "两者协同: KL 限制策略漂移,entropy bonus 保持探索能力\n",
89 "```"88 "```"
90 ]89 ]
91 },90 },
@@ -102,7 +101,7 @@
102 "| ACTOR_LR | 效果 | 风险 |\n",101 "| ACTOR_LR | 效果 | 风险 |\n",
103 "|----------|------|------|\n",102 "|----------|------|------|\n",
104 "| 1e-7 | 更新太慢 | 训练效率低 |\n",103 "| 1e-7 | 更新太慢 | 训练效率低 |\n",
105- "| 1e-6 | 缓慢稳定 | 当前配置推荐 |\n",104+ "| 1e-6 | 较保守 | 当前 recipe 的调试起点仍需验证 |\n",
106 "| 1e-5 | 更新较快 | 可能导致梯度爆炸 |\n",105 "| 1e-5 | 更新较快 | 可能导致梯度爆炸 |\n",
107 "| 1e-4 | 更新过快 | 训练不稳定 |\n",106 "| 1e-4 | 更新过快 | 训练不稳定 |\n",
108 "\n",107 "\n",
@@ -117,13 +116,13 @@
117 "| constant(默认) | LR 恒定不变 | 短训练、调试阶段 |\n",116 "| constant(默认) | LR 恒定不变 | 短训练、调试阶段 |\n",
118 "| cosine | LR 余弦退火,后期逐步降低 | 正式训练,防止后期过更新 |\n",117 "| cosine | LR 余弦退火,后期逐步降低 | 正式训练,防止后期过更新 |\n",
119 "\n",118 "\n",
120- "> **实测发现**:使用 constant 调度时,reward 在 step 135 附近见顶后回落(越峰退化);切换为 cosine 调度`min_lr_ratio=0.1`, `lr_warmup_steps_ratio=0.03`)后,reward 持续爬到 step 155,correct 突破 70%。**建议正式训练使用 cosine 调度**。\n",119+ "> 当前 recipe 使用 cosine 调度`min_lr_ratio=0.1` 和固定 `lr_warmup_steps=5`。warmup 让初始学习率逐步降低训练初期更新过猛的风险。验证 correct step 75 达到峰值,因此默认训练 5 个 epoch。\n",
121 "\n",120 "\n",
122 "---\n",121 "---\n",
123 "\n",122 "\n",
124 "## 4. 超参数组合建议\n",123 "## 4. 超参数组合建议\n",
125 "\n",124 "\n",
126- "基于实验数据,推荐以下组合:"125+ "基于实验数据,推荐以下起始组合:"
127 ]126 ]
128 },127 },
129 {128 {
@@ -131,29 +130,24 @@
131 "metadata": {},130 "metadata": {},
132 "source": [131 "source": [
133 "```text\n",132 "```text\n",
134- "推荐超参数组合\n",133+ "推荐起始组合\n",
135 "\n",134 "\n",
136- "组合 A (保守稳定):\n",135+ "当前起点:\n",
137- " entropy_coeff = 0.002\n",136+ " entropy_coeff = 0.004\n",
138 " kl_loss_coef = 0.001\n",137 " kl_loss_coef = 0.001\n",
139 " ACTOR_LR = 1e-6\n",138 " ACTOR_LR = 1e-6\n",
140 " lr_scheduler = cosine\n",139 " lr_scheduler = cosine\n",
141 " min_lr_ratio = 0.1\n",140 " min_lr_ratio = 0.1\n",
141+ " warmup_steps = 5\n",
142 " save_freq = 25\n",142 " save_freq = 25\n",
143- "\n",143+ " total_epochs = 5\n",
144- "组合 B (更强约束):\n",
145- " entropy_coeff = 0.002\n",
146- " kl_loss_coef = 0.01\n",
147- " ACTOR_LR = 1e-6\n",
148- " lr_scheduler = cosine\n",
149- " min_lr_ratio = 0.1\n",
150- " save_freq = 25\n",
151 "\n",144 "\n",
152 "调参顺序建议:\n",145 "调参顺序建议:\n",
153- "1. 先用默认参跑 50 步观察 entropy 趋势\n",146+ "1. 固定模型、据、seed、batch、学习率和评测协议只改变 entropy_coeff\n",
154- "2. 如果 entropy 下降过快 -> entropy_coeff\n",147+ "2. 先跑 25~30 步,同时观察 entropy、KL、验证 correct 和 response_length\n",
155- "3. 如果 entropy 失控飙升 -> entropy_coeff\n",148+ "3. entropy 加速上 correct 不涨 -> 下调 entropy_coeff\n",
156- "4. 如果策略漂移过大 -> kl_loss_coef\n",149+ "4. entropy 快速下降且 correct 回落、输出异常 -> 检查学习率和 KL,再小幅上调 entropy_coeff\n",
150+ "5. 训练 reward 上升但验证 correct 回落 -> 保留较早 checkpoint,不要仅凭 reward 继续训练\n",
157 "```"151 "```"
158 ]152 ]
159 },153 },
@@ -170,29 +164,29 @@
170 "cell_type": "markdown",164 "cell_type": "markdown",
171 "metadata": {},165 "metadata": {},
172 "source": [166 "source": [
173- "1. (判断题)entropy_coeff=0(默认值)时,模型没有任何探索保护机制,可能导致策略崩塌。\n",167+ "1. (判断题)entropy_coeff 需要通过短程实验观察训练曲线后再进行调节。\n",
174 "\n",168 "\n",
175- "2. (判断题)entropy_coeff=0.01 比 entropy_coeff=0.005 更安全,因为更强的探索保证。\n",169+ "2. (判断题)entropy_coeff 越大越安全,因为更强的探索一定能防止训练失衡。\n",
176 "\n",170 "\n",
177 "3. (判断题)RL 的学习率通常比 SFT 低 1-2 个数量级。\n",171 "3. (判断题)RL 的学习率通常比 SFT 低 1-2 个数量级。\n",
178 "\n",172 "\n",
179- "4. (单选题)entropy_coeff=0.01 导致 entropy 升到 4.51,说明什么?\n",173+ "4. (单选题)实验中 entropy_coeff=0.005 使 entropy 升到 3.638而验证 correct 没有改善,最可能说明什么?\n",
180 " A. KL 正则太强\n",174 " A. KL 正则太强\n",
181- " B. Entropy bonus 过强,了策略梯度\n",175+ " B. Entropy bonus 的相对影响过强,模型探索过度\n",
182 " C. 学习率太低\n",176 " C. 学习率太低\n",
183 " D. 训练正常\n",177 " D. 训练正常\n",
184 "\n",178 "\n",
185- "5. (单选题)调参应该先观察什么?\n",179+ "5. (单选题)比较 entropy_coeff ,哪种做法最可靠?\n",
186- " A. 直接设置最大 entropy_coeff\n",180+ " A. 同时修改学习率和 batch,尽快找到高 reward\n",
187- " B. 先用默认参数跑 50 步,观察 entropy 趋势\n",181+ " B. 固定其他参数做短程对比并同时观察 entropy、KL、验证 correct 和输出长度\n",
188- " C. 先调学习率\n",182+ " C. 只比较最后一步训练 reward\n",
189- " D. 先调 KL coef\n",183+ " D. 只要 entropy 下降就立即提高系数\n",
190 "\n",184 "\n",
191- "6. (多选题)以下哪些超参数影响 RL 训练稳定性?\n",185+ "6. (多选题)判断三种力的相对强弱是否仍支持学习时,应联合观察哪些指标?\n",
192- " A. entropy_coeff\n",186+ " A. entropy\n",
193- " B. kl_loss_coef\n",187+ " B. KL\n",
194- " C. ACTOR_LR\n",188+ " C. 验证 correct\n",
195- " D. ROLLOUT_N"189+ " D. response_length"
196 ]190 ]
197 },191 },
198 {192 {
@@ -12,7 +12,7 @@
12 "\n",12 "\n",
13 "## 1. 案例背景\n",13 "## 1. 案例背景\n",
14 "\n",14 "\n",
15- "使用同一个 SFT 模型(Qwen3-1.7B-Wordle-SFT),在不同超参数下进行训练。其中一个 run 在 75 步后崩溃,另一个稳定训练 155 步。\n",15+ "使用同一个 SFT 模型(Qwen3-1.7B-Wordle-SFT),在不同超参数下进行训练。其中一个 run 在 75 步后继续训练时崩溃,另一个稳定训练 75 步。\n",
16 "\n",16 "\n",
17 "---\n",17 "---\n",
18 "\n",18 "\n",
@@ -26,16 +26,16 @@
26 "metadata": {},26 "metadata": {},
27 "source": [27 "source": [
28 "```text\n",28 "```text\n",
29- "正常训练 (稳定 run)\n",29+ "正常训练稳定 run\n",
30 "\n",30 "\n",
31 "step entropy correct response_length reward\n",31 "step entropy correct response_length reward\n",
32- "1 0.57 15% 2078 0.74\n",32+ "5 0.535 20% 1789 0.845\n",
33- "50 0.24 40% 1737 1.04\n",33+ "30 0.472 44% 1565 1.072\n",
34- "100 0.15 50% 1664 1.16\n",34+ "60 0.334 48% 1467 1.127\n",
35- "155 0.22 70% 1255 1.20\n",35+ "75 0.235 55% 1417 1.156\n",
36- "-> 稳定: entropy 缓慢下降到 0.22, correct 提升到 70%, response_length 稳定\n",36+ "-> 稳定: correct 整体提升, response_length 逐步缩短\n",
37 "\n",37 "\n",
38- "崩溃训练 (同一模型, 不同 run)\n",38+ "崩溃训练同一模型, 不同 run\n",
39 "\n",39 "\n",
40 "step entropy correct response_length reward\n",40 "step entropy correct response_length reward\n",
41 "1 0.56 15% 1755 0.76\n",41 "1 0.56 15% 1755 0.76\n",
@@ -53,14 +53,14 @@
53 "source": [53 "source": [
54 "### 2.2 关键差异\n",54 "### 2.2 关键差异\n",
55 "\n",55 "\n",
56- "| 指标 | 正常 (step 155) | 崩溃 (step 150) |\n",56+ "| 指标 | 正常 (step 75) | 崩溃 (step 150) |\n",
57 "|------|----------------|-----------------|\n",57 "|------|----------------|-----------------|\n",
58- "| entropy | 0.22 | **0.0003** |\n",58+ "| entropy | 0.235 | **0.0003** |\n",
59- "| correct | 70% | **0%** |\n",59+ "| correct | 55% | **0%** |\n",
60- "| response_length | 1255 | **3232 (全部打满)** |\n",60+ "| response_length | 1417 | **3232 (全部打满)** |\n",
61- "| num_turns | 5.0 | **6.0 (全部打满)** |\n",61+ "| num_turns | 4.86 | **6.0 (全部打满)** |\n",
62- "| kl_loss | 0.13 | 0.35 |\n",62+ "| kl_loss | 0.103 | 0.35 |\n",
63- "| reward | 1.20 | **0.20** (仅 format) |\n",63+ "| reward | 1.156 | **0.20** (仅 format) |\n",
64 "\n",64 "\n",
65 "---\n",65 "---\n",
66 "\n",66 "\n",
@@ -77,21 +77,21 @@
77 "崩溃诊断流程\n",77 "崩溃诊断流程\n",
78 "\n",78 "\n",
79 "Step 1: 检查 entropy\n",79 "Step 1: 检查 entropy\n",
80- " - 缓慢下降 -> 正常\n",80+ " - 平稳或逐步变化 -> 继续结合验证指标观察\n",
81- " - 突然跌到 0 -> 策略崩塌\n",81+ " - 快速逼近 0 -> 检查是否伴随 correct 回落和输出退化\n",
82- " - 持续升 -> entropy bonus 过强\n",82+ " - 持续加速上升 -> 检查是否伴随 correct 停滞,entropy bonus 可能过强\n",
83 "\n",83 "\n",
84 "Step 2: 检查 response_length\n",84 "Step 2: 检查 response_length\n",
85- " - 稳定 (约 1700) -> 正常\n",85+ " - 在合理区间波动 -> 继续观察\n",
86 " - 全部打满 (3232) -> 输出退化\n",86 " - 全部打满 (3232) -> 输出退化\n",
87 "\n",87 "\n",
88 "Step 3: 检查 correct 率\n",88 "Step 3: 检查 correct 率\n",
89- " - 持续提升 -> 正常\n",89+ " - 整体趋势改善 -> 当前更新仍有效\n",
90- " - 突然归零 -> 策略崩溃\n",90+ " - 持续回落或突然归零 -> 检查 checkpoint 和其他指标\n",
91 "\n",91 "\n",
92 "Step 4: 检查 kl_loss\n",92 "Step 4: 检查 kl_loss\n",
93- " - 缓慢上升 -> 正常\n",93+ " - 保持可控 -> 当前策略未明显远离参考策略\n",
94- " - 飙升过快 -> 策略漂移过大\n",94+ " - 持续速增大 -> 策略漂移过大\n",
95 "\n",95 "\n",
96 "Step 5: 检查 grad_norm\n",96 "Step 5: 检查 grad_norm\n",
97 " - 稳定 (0.4-1.0) -> 正常\n",97 " - 稳定 (0.4-1.0) -> 正常\n",
@@ -107,7 +107,7 @@
107 "\n",107 "\n",
108 "## 4. 崩溃原因分析\n",108 "## 4. 崩溃原因分析\n",
109 "\n",109 "\n",
110- "策略崩塌的根因是 **三种力失衡**——策略梯度(pg_loss)压过了 KL 正则和 entropy bonus:"110+ "策略崩塌的根因是 **三种力失衡**策略更新逐渐集中到少数输出,KL 正则和 entropy bonus 未能维持稳定训练:"
111 ]111 ]
112 },112 },
113 {113 {
@@ -117,17 +117,20 @@
117 "```text\n",117 "```text\n",
118 "三种力失衡分析\n",118 "三种力失衡分析\n",
119 "\n",119 "\n",
120- "正常训练:\n",120+ "仍可学习的状态:\n",
121- " pg_loss (降低 entropy) <-> kl_loss (限制漂移) + entropy_bonus (推高 entropy)\n",121+ " pg_loss 按优势信号调整动作概率\n",
122- " 三者平衡 -> 稳定 run 的 entropy 缓慢下降到 0.22\n",122+ " kl_loss 限制当前策略偏离参考策略\n",
123+ " entropy_bonus 鼓励策略不要过早集中\n",
124+ " -> 验证 correct 改善、KL 可控、输出未退化\n",
123 "\n",125 "\n",
124 "崩溃训练:\n",126 "崩溃训练:\n",
125- " pg_loss 过强 -> entropy 快速下降 -> 探索能力丧失\n",127+ " 优势驱动的更新逐渐集中到少数输出,而 entropy bonus 、KL 约束相对不足\n",
128+ " -> entropy 快速下降,策略失去有效探索\n",
126 " -> 模型输出退化为固定模式 -> correct 归零\n",129 " -> 模型输出退化为固定模式 -> correct 归零\n",
127 " -> response_length 全部打满 (固定输出填满 token)\n",130 " -> response_length 全部打满 (固定输出填满 token)\n",
128 "\n",131 "\n",
129- "根因: entropy_coeff=0 (无 entropy bonus) + kl_loss_coef=0.001 (太弱)\n",132+ "配置: entropy_coeff=0kl_loss_coef=0.001\n",
130- "-> pg_loss 无约束地降低 entropy -> 崩塌\n",133+ "-> 缺少 entropy bonus,且 KL 约束较弱,策略逐渐收缩并发生崩塌\n",
131 "```"134 "```"
132 ]135 ]
133 },136 },
@@ -139,22 +142,22 @@
139 "\n",142 "\n",
140 "## 5. 修复方案\n",143 "## 5. 修复方案\n",
141 "\n",144 "\n",
142- "根据崩溃原因,修复策略是增强稳定性机制:\n",145+ "根据联合指标位更可能的失衡方向,再做针对调整:\n",
143 "\n",146 "\n",
144 "| 方案 | 操作 | 适用场景 |\n",147 "| 方案 | 操作 | 适用场景 |\n",
145 "|------|------|----------|\n",148 "|------|------|----------|\n",
146- "| entropy bonus | `entropy_coeff=0.002` | entropy 下降过快 |\n",149+ "| 小幅提高 entropy_coeff | 固定其他参数做短程对比 | entropy 快速下降 correct、输出长度同步恶化 |\n",
147- "| 提高 KL coef | `kl_loss_coef=0.01` | 策略漂移过大 |\n",150+ "| 小幅提高 KL coef | 观察 KL 和策略学习是否恢复可控 | 策略持续远离参考模型 |\n",
148- "| 降低学习率 | `ACTOR_LR=5e-7` | 梯度更新过快 |\n",151+ "| 降低学习率 | 减小单次参数更新幅度 | KL 或 grad_norm 增长过快 |\n",
149- "| 组合使用 | 以上多个 | 严重崩塌 |\n",152+ "| 回退 checkpoint | 从验证指标更好的节点重新试验 | 训练 reward 上升但验证 correct 已回落 |\n",
150 "\n",153 "\n",
151- "> **注意**:entropy_coeff 不宜过大。实测过大的系数会让 entropy 快速飙升、模型过度探索而不收敛。本 recipe 使用已完整验证的 `0.002` 作为起点;调整后做短程实验,再决定是否完成 155 步训练。\n",154+ "> **注意**:当前 recipe 默认使用 `entropy_coeff=0.004`调整参数后先运行 25~30 步,联合观察 entropy、KL、证 correct 和 response_length,再决定是否完成 75 步训练。\n",
152 "\n",155 "\n",
153 "---\n",156 "---\n",
154 "\n",157 "\n",
155 "## 6. 训练监控最佳实践\n",158 "## 6. 训练监控最佳实践\n",
156 "\n",159 "\n",
157- "1. **前 50 步密切监控**:策略崩塌通常发生在训练\n",160+ "1. **前 25~30 步密切监控**:识别 entropy 加速变化、KL 漂移和输出退化\n",
158 "2. **设置 checkpoint 频率**:`save_freq=25`,崩溃时可回退\n",161 "2. **设置 checkpoint 频率**:`save_freq=25`,崩溃时可回退\n",
159 "3. **观察验证指标**:每 5 步的 val 指标比训练指标更可靠\n",162 "3. **观察验证指标**:每 5 步的 val 指标比训练指标更可靠\n",
160 "4. **同时看多个指标**:单一指标不能判断训练健康度\n",163 "4. **同时看多个指标**:单一指标不能判断训练健康度\n",
@@ -173,7 +176,7 @@
173 "\n",176 "\n",
174 "2. (判断题)策略崩塌的根因是 KL 正则过强,限制了模型学习新策略。\n",177 "2. (判断题)策略崩塌的根因是 KL 正则过强,限制了模型学习新策略。\n",
175 "\n",178 "\n",
176- "3. (判断题)entropy_coeff=0.01 比 0.002 更安全,因为更强的探索保证更好地防止崩塌。\n",179+ "3. (判断题)entropy_coeff 越大越安全,因为更强的探索一定能防止策略崩塌。\n",
177 "\n",180 "\n",
178 "4. (单选题)崩溃训练中 reward 降到 0.20,这个 0.20 来自哪里?\n",181 "4. (单选题)崩溃训练中 reward 降到 0.20,这个 0.20 来自哪里?\n",
179 " A. correct_answer\n",182 " A. correct_answer\n",
@@ -181,20 +184,20 @@
181 " C. format_reward (0.2 * 1.0)\n",184 " C. format_reward (0.2 * 1.0)\n",
182 " D. length_bonus\n",185 " D. length_bonus\n",
183 "\n",186 "\n",
184- "5. (单选题)下哪个是修复策略崩塌的有效方案?\n",187+ "5. (单选题)发现 entropy 快速降、验证 correct 回落且输出长度异常时,种处理最合理?\n",
185- " A. 降低 entropy_coeff\n",188+ " A. 同时大幅提高 entropy_coeff 和 KL coef\n",
186- " B. entropy_coeff=0.002\n",189+ " B. 回退稳定 checkpoint,固定其他参数后小幅调整 entropy_coeff 做短程对比\n",
187- " C. 提高学习率\n",190+ " C. 只因为训练 reward 还在上升就继续长跑\n",
188- " D. 减小 batch size\n",191+ " D. 直接提高学习率\n",
189 "\n",192 "\n",
190 "6. (多选题)崩溃诊断流程中需要检查哪些指标?\n",193 "6. (多选题)崩溃诊断流程中需要检查哪些指标?\n",
191 " A. entropy\n",194 " A. entropy\n",
192 " B. response_length\n",195 " B. response_length\n",
193 " C. correct 率\n",196 " C. correct 率\n",
194- " D. grad_norm\n",197+ " D. KL 和 grad_norm\n",
195 "\n",198 "\n",
196 "7. (多选题)以下哪些是训练监控的最佳实践?\n",199 "7. (多选题)以下哪些是训练监控的最佳实践?\n",
197- " A. 前 50 步密切监控\n",200+ " A. 前 25~30 步密切监控\n",
198 " B. 设置 checkpoint 频率\n",201 " B. 设置 checkpoint 频率\n",
199 " C. 只看 reward 一个指标\n",202 " C. 只看 reward 一个指标\n",
200 " D. 同时看多个指标"203 " D. 同时看多个指标"
@@ -17,23 +17,23 @@
17 "cell_type": "markdown",17 "cell_type": "markdown",
18 "metadata": {},18 "metadata": {},
19 "source": [19 "source": [
20- "1. (判断题)entropy_coeff=0(默认值)时,模型没有任何探索保护机制,可能导致策略崩塌。\n",20+ "1. (判断题)entropy_coeff 需要通过短程实验观察训练曲线后再进行调节。\n",
21 "\n",21 "\n",
22 "2. (判断题)entropy_coeff 越大越好,可以充分保证模型的探索能力。\n",22 "2. (判断题)entropy_coeff 越大越好,可以充分保证模型的探索能力。\n",
23 "\n",23 "\n",
24 "3. (判断题)RL 的学习率通常比 SFT 低 1-2 个数量级。\n",24 "3. (判断题)RL 的学习率通常比 SFT 低 1-2 个数量级。\n",
25 "\n",25 "\n",
26- "4. (判断题)策略崩塌的根因是三种力失衡——策略梯度压过了 KL 正则和 entropy bonus。\n",26+ "4. (判断题)判断训练稳定性需要同时观察 entropy、KL、验证 correct 和输出长度。\n",
27 "\n",27 "\n",
28- "5. (判断题)KL loss 和 entropy bonus 是互补的稳定性机制,KL 限制方向entropy 限制分布形状。\n",28+ "5. (判断题)KL loss 和 entropy bonus 是互补机制:前者限制相对参考策略的漂移后者降低策略过早集中的风险。\n",
29 "\n",29 "\n",
30 "6. (判断题)训练监控时只需要看 reward 一个指标即可判断训练健康度。\n",30 "6. (判断题)训练监控时只需要看 reward 一个指标即可判断训练健康度。\n",
31 "\n",31 "\n",
32- "7. (判断题)策略崩塌通常发生在训练早期(100。\n",32+ "7. (判断题)前 25~30的短程实验有助于发现 entropy、KL 和输出长度的异常趋势。\n",
33 "\n",33 "\n",
34- "8. (单选题)entropy_coeff=0.01 导致 entropy 升到 4.51,说明什么?\n",34+ "8. (单选题)实验中 entropy_coeff=0.005 使 entropy 升到 3.638而验证 correct 没有改善,最可能说明什么?\n",
35 " A. KL 正则太强\n",35 " A. KL 正则太强\n",
36- " B. Entropy bonus 过强,了策略梯度\n",36+ " B. Entropy bonus 的相对影响过强,模型探索过度\n",
37 " C. 学习率太低\n",37 " C. 学习率太低\n",
38 " D. 训练正常\n",38 " D. 训练正常\n",
39 "\n",39 "\n",
@@ -43,13 +43,13 @@
43 " C. format_reward (0.2 * 1.0)\n",43 " C. format_reward (0.2 * 1.0)\n",
44 " D. length_bonus\n",44 " D. length_bonus\n",
45 "\n",45 "\n",
46- "10. (单选题)下哪个是修复策略崩塌的有效方案?\n",46+ "10. (单选题)发现 entropy 快速降、验证 correct 回落且输出长度异常时,种处理最合理?\n",
47- " A. 降低 entropy_coeff\n",47+ " A. 同时大幅提高 entropy_coeff 和 KL coef\n",
48- " B. entropy_coeff=0.002\n",48+ " B. 回退稳定 checkpoint,固定其他参数后小幅调整 entropy_coeff 做短程对比\n",
49- " C. 提高学习率\n",49+ " C. 只因为训练 reward 还在上升就继续长跑\n",
50- " D. 减小 batch size\n",50+ " D. 直接提高学习率\n",
51 "\n",51 "\n",
52- "11. (多选题)以下哪些超参数影响 RL 训练稳定性?\n",52+ "11. (多选题)以下哪些超参数直接配置三种力的权重或参数更新步长?\n",
53 " A. entropy_coeff\n",53 " A. entropy_coeff\n",
54 " B. kl_loss_coef\n",54 " B. kl_loss_coef\n",
55 " C. ACTOR_LR\n",55 " C. ACTOR_LR\n",
@@ -59,7 +59,7 @@
59 " A. entropy\n",59 " A. entropy\n",
60 " B. response_length\n",60 " B. response_length\n",
61 " C. correct 率\n",61 " C. correct 率\n",
62- " D. grad_norm\n",62+ " D. KL 和 grad_norm\n",
63 "\n",63 "\n",
64 "13. (多选题)以下哪些是策略崩塌的典型表现?\n",64 "13. (多选题)以下哪些是策略崩塌的典型表现?\n",
65 " A. entropy 突然跌到 0\n",65 " A. entropy 突然跌到 0\n",
@@ -68,7 +68,7 @@
68 " D. reward 降到仅 format 分\n",68 " D. reward 降到仅 format 分\n",
69 "\n",69 "\n",
70 "14. (多选题)以下哪些是训练监控的最佳实践?\n",70 "14. (多选题)以下哪些是训练监控的最佳实践?\n",
71- " A. 前 50 步密切监控\n",71+ " A. 前 25~30 步密切监控\n",
72 " B. 设置 checkpoint 频率\n",72 " B. 设置 checkpoint 频率\n",
73 " C. 只看 reward 一个指标\n",73 " C. 只看 reward 一个指标\n",
74 " D. 同时看多个指标"74 " D. 同时看多个指标"
@@ -1,17 +1,17 @@
11. √11. √
2-解析:entropy_coeff=0没有 entropy bonus,pg_loss 完全主导entropy 持续下降,可能导致策略崩塌2+解析:先运行 25~30 步,同观察 entropy、KL、验证 correct 和输出长度再根据曲线调节 entropy_coeff
3 3 
42. ×42. ×
5-解析:entropy_coeff 过大(如 0.01)导致 entropy 失控飙升,模型过度探索不收敛。需要在探索和利用之间平衡,0.005 是合理选择5+解析:entropy_coeff 过大会 entropy bonus 的相对影响过强,模型可能过度探索不收敛系数不等于更安全
6 6 
73. √73. √
8解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。RL 学习率通常比 SFT 低 1-2 个数量级。8解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。RL 学习率通常比 SFT 低 1-2 个数量级。
9 9 
104. B104. B
11-解析:entropy_coeff=0.01 导致 entropy bonus 过强压过了策略梯度。25 步内 entropy 0.56 飙升到 4.51,模型过度探索。11+解析:entropy_coeff=0.005 实验中 entropy 上升到 3.638而验证 correct 没有改善,说明 entropy bonus 的相对影响过强,模型探索过度
12 12 
135. B135. B
14-解析:调参应先用默认参数跑 50 观察 entropy 趋势,再根据趋势决定加 entropy_coeff 还是降盲目设置大值会导致失控。14+解析:比较 entropy_coeff 时应固定模型、数据、seed、batch、学习率和评测协议做短程实验,并联合观察 entropy、KL、验证 correct 和输出长度
15 15 
16-6. A、B、C16+6. A、B、C、D
17-解析:entropy_coeff(探索控制)kl_loss_coef(漂移控制)ACTOR_LR(更新步长)直接影响训练稳定性。ROLLOUT_N 影响组大小通过优势估计质量间接影响稳定性,但不属于直接控制训练稳定机制的核心超参数17+解析:entropy、KL、验证 correct 和 response_length 分别反映探索变化策略漂移、任务效果和输出退化风险需要联合判断三种力的相对影响是否仍支持学习
@@ -2,19 +2,19 @@
2解析:策略崩塌的典型表现:entropy 突然跌到 0、correct 归零、response_length 全部打满 3232。模型输出退化为固定模式。2解析:策略崩塌的典型表现:entropy 突然跌到 0、correct 归零、response_length 全部打满 3232。模型输出退化为固定模式。
3 3 
42. ×42. ×
5-解析:策略崩塌的根因是策略梯度(pg_loss)过强压过了 KL 正则和 entropy bonus。KL 正则过强反而会制学习,但不会导致崩塌5+解析:该案例中策略更新逐渐集中 entropy bonus 缺失、KL 约束较弱,最终发生策略崩塌。KL 正则过强通常表现为模型更新受限。
6 6 
73. ×73. ×
8-解析:entropy_coeff=0.01 过大导致 entropy 失控飙升(25 步内从 0.56 到 4.51)。0.005 比 0.01 更安全。8+解析:entropy_coeff 过大会 entropy bonus 的相对影响过强,导致探索失控;系数越大不代表越安全。
9 9 
104. C104. C
11解析:崩溃后 correct=0、partial=0、length_bonus=0,只有 format_reward=1.0,加权后 0.2*1.0=0.20。模型虽然输出退化为固定模式,但格式仍然正确。11解析:崩溃后 correct=0、partial=0、length_bonus=0,只有 format_reward=1.0,加权后 0.2*1.0=0.20。模型虽然输出退化为固定模式,但格式仍然正确。
12 12 
135. B135. B
14-解析: entropy_coeff=0.005 可以在 pg_loss 和 entropy 之间建立平衡防止 entropy 崩塌降低 entropy_coeff(A)会加重崩塌,提高学习率(C)会加速崩塌14+解析:应先回退到验证指标较好的 checkpoint保持其他参数不变,小幅调整 entropy_coeff 做短程对比一次修改多项参数无法判断哪项有效
15 15 
166. A、B、C、D166. A、B、C、D
17-解析:崩溃诊断需要检查 entropy(是否崩塌)、response_length(是否打满)correct 率(是否归零)、grad_norm(是否爆炸)。四个指标缺一不可17+解析:崩溃诊断需要联合检查 entropy、response_length、验证 correctKL 和 grad_norm,不能由单一指标推断根因
18 18 
197. A、B、D197. A、B、D
20-解析:训练监控最佳实践:前 50 步密切监控(A)、设置 checkpoint 频率(B)、同时看多个指标(D)。只看 reward(C)是错误做法,reward 可能因为 format 分而不归零,掩盖崩塌。20+解析:训练监控最佳实践:前 25~30 步密切监控(A)、设置 checkpoint 频率(B)、同时看多个指标(D)。只看 reward(C)是错误做法,reward 可能因为 format 分而不归零,掩盖崩塌。
@@ -1,41 +1,41 @@
11. √11. √
2-解析:entropy_coeff=0没有 entropy bonus 保护pg_loss 完全主导,entropy 持续下降可能导致崩塌2+解析:先运行 25~30 步,同观察 entropy、KL、验证 correct 和输出长度再根据曲线调节 entropy_coeff
3 3 
42. ×42. ×
5-解析:entropy_coeff 过大(如 0.01)导致 entropy 失控飙升。需要在探索和利用之间平衡,0.005 更合理5+解析:entropy_coeff 过大会 entropy bonus 的相对影响过强,可能造成探索失控。系数需要通过固定其他参数的短程实验调试
6 6 
73. √73. √
8解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。学习率通常比 SFT 低 1-2 个数量级。8解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。学习率通常比 SFT 低 1-2 个数量级。
9 9 
104. √104. √
11-解析:策略崩塌的根因是三种力失衡——pg_loss(降低 entropy)压过了 kl_loss(限制漂移)和 entropy_bonus(推高 entropy)11+解析:entropy 反映探索变化,KL 反映策略漂移,验证 correct 反映任务效果,输出长度用于识别输出退化,需要联合观察
12 12 
135. √135. √
14-解析:KL loss 限制策略漂移方向,entropy bonus 限制分布形状(防止集中。两者协同维持训练稳定14+解析:KL loss 限制当前策略相对参考策略的漂移,entropy bonus 降低分布过集中的风险。两者互补但不能相互替代
15 15 
166. ×166. ×
17解析:单一指标不能判断训练健康度。reward 可能因为 format 分而不归零,掩盖崩塌。需要同时看 entropy、correct、response_length 等多个指标。17解析:单一指标不能判断训练健康度。reward 可能因为 format 分而不归零,掩盖崩塌。需要同时看 entropy、correct、response_length 等多个指标。
18 18 
197. √197. √
20-解析:策略崩塌通常发生在训练早期(100因为此模型还未形成稳定策略,容易受到 noisy 梯度的影响20+解析:前 25~30重点观察 entropy、KL 和输出长度可以及发现探索失控、策略漂移和输出退化
21 21 
228. B228. B
23-解析:entropy_coeff=0.01 导致 entropy bonus 过强压过了策略梯度。25 步内 entropy 0.56 飙升到 4.5123+解析:entropy_coeff=0.005 实验中 entropy 上升到 3.638而验证 correct 没有改善,说明 entropy bonus 的相对影响过强
24 24 
259. C259. C
26解析:崩溃后 correct=0、partial=0、length_bonus=0,只有 format_reward=1.0,加权后 0.2*1.0=0.20。模型格式仍然正确但无法猜词。26解析:崩溃后 correct=0、partial=0、length_bonus=0,只有 format_reward=1.0,加权后 0.2*1.0=0.20。模型格式仍然正确但无法猜词。
27 27 
2810. B2810. B
29-解析: entropy_coeff=0.005 可以在 pg_loss 和 entropy 之间建立平衡防止崩塌。降低 entropy_coeff(A)会加重崩塌29+解析:应先回退到验证指标较好的 checkpoint保持其他参数不变,小幅调整 entropy_coeff 做短程对比一次修改多项参数无法判断哪项有效。
30 30 
3111. A、B、C3111. A、B、C
32解析:entropy_coeff(探索控制)、kl_loss_coef(漂移控制)、ACTOR_LR(更新步长)直接影响训练稳定性。ROLLOUT_N 影响组大小,通过优势估计质量间接影响稳定性,但不属于直接控制训练稳定机制的核心超参数。32解析:entropy_coeff(探索控制)、kl_loss_coef(漂移控制)、ACTOR_LR(更新步长)直接影响训练稳定性。ROLLOUT_N 影响组大小,通过优势估计质量间接影响稳定性,但不属于直接控制训练稳定机制的核心超参数。
33 33 
3412. A、B、C、D3412. A、B、C、D
35-解析:崩溃诊断需要检查 entropy、response_length、correct 、grad_norm。四个指标缺一不可。35+解析:崩溃诊断需要检查 entropy、response_length、验证 correctKL 和 grad_norm,并结合配置判断
36 36 
3713. A、B、C、D3713. A、B、C、D
38解析:策略崩塌的典型表现:entropy 跌到 0(A)、correct 归零(B)、response_length 全部打满(C)、reward 降到仅 format 分(D)。38解析:策略崩塌的典型表现:entropy 跌到 0(A)、correct 归零(B)、response_length 全部打满(C)、reward 降到仅 format 分(D)。
39 39 
4014. A、B、D4014. A、B、D
41-解析:训练监控最佳实践:前 50 步密切监控(A)、设置 checkpoint 频率(B)、同时看多个指标(D)。只看 reward(C)是错误做法。41+解析:训练监控最佳实践:前 25~30 步密切监控(A)、设置 checkpoint 频率(B)、同时看多个指标(D)。只看 reward(C)是错误做法。
@@ -16,9 +16,9 @@
16 16 
17本教程支持以下在线体验环境:17本教程支持以下在线体验环境:
18 18 
19-| 体验环境 | 镜像模板 / 版本 | Python 内核 | 说明 |19+| 体验环境 | 环境要求 | Python 内核 | 说明 |
20| --- | --- | --- | --- |20| --- | --- | --- | --- |
21-| CANNLab 云开发环境 | cann_9.0.0 py3.11-A3-arm | Python 3.11.4 |参考 [CANNLab 环境体验指南](https://gitcode.com/cann/cann-learning-hub/blob/master/docs/CANNLab_env_experience_guide.md)创建CANNLab环境运行notebook |21+| CANNLab 云开发环境 | 已安装 CANN 和 ATB | Python 3.11 |参考 [CANNLab 环境体验指南](https://gitcode.com/cann/cann-learning-hub/blob/master/docs/CANNLab_env_experience_guide.md)创建CANNLab环境运行notebook |
22 22 
23本课程从 `cann-learning-hub` 课程仓进入 CANNLab,课程 notebook 已随仓库提供,无须再次克隆课程仓。首次进入后,请打开 [01.01 章节介绍](01_environment_setup/01.01_chapter_intro.ipynb),运行其中的仓库拉取单元格,将 `cann-recipes-train` 克隆到课程仓的同级目录。环境安装、数据准备和检查由 notebook 单元格完成,长时间训练在终端运行;TensorBoard 日志由训练脚本自动生成,并按 03.04 节说明复制到本地查看。23本课程从 `cann-learning-hub` 课程仓进入 CANNLab,课程 notebook 已随仓库提供,无须再次克隆课程仓。首次进入后,请打开 [01.01 章节介绍](01_environment_setup/01.01_chapter_intro.ipynb),运行其中的仓库拉取单元格,将 `cann-recipes-train` 克隆到课程仓的同级目录。环境安装、数据准备和检查由 notebook 单元格完成,长时间训练在终端运行;TensorBoard 日志由训练脚本自动生成,并按 03.04 节说明复制到本地查看。
24 24