已合并
docs: refresh Wordle RL training guidance #455
zhoujian创建于 7月28日
docs: refresh Wordle RL training guidance #455
已合并
共 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 | ||
| 7 | 3. × | 7 | 3. × |
| 8 | -解析:param_offload=True 表示训练参数从 GPU 卸载到 CPU,释放显存给 vLLM 推理使用,而非保留在 GPU 中。 | 8 | +解析:param_offload=True 表示训练参数从 NPU 设备内存卸载到 CPU,释放 NPU 设备内存供 vLLM-Ascend rollout 使用,而非始终保留在 NPU 上。 |
| 9 | 9 | ||
| 10 | 4. B | 10 | 4. 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 | ||
| 10 | 4. √ | 10 | 4. √ |
| 11 | -解析:Hybrid Engine 通过时分复用让训练和推理交替占用同一组卡。训练时参数在 GPU,推理时卸载到 CPU 释放显存给 vLLM,2 卡即可完成 RL 训练。 | 11 | +解析:Hybrid Engine 通过时分复用让训练和推理交替占用同一组 NPU 卡。训练时参数加载到 NPU,rollout 时卸载到 CPU,释放 NPU 设备内存供 vLLM-Ascend 使用,因此 2 张 NPU 卡即可完成 RL 训练。 |
| 12 | 12 | ||
| 13 | 5. √ | 13 | 5. √ |
| 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 | ||
| 22 | 8. B | 22 | 8. B |
| 23 | -解析:param_offload=True 将训练参数从 GPU 卸载到 CPU,释放显存给 vLLM 推理使用。这是 Hybrid Engine 时分复用的关键机制。 | 23 | +解析:param_offload=True 将训练参数从 NPU 设备内存卸载到 CPU,释放 NPU 设备内存供 vLLM-Ascend rollout 使用。这是 Hybrid Engine 时分复用的关键机制。 |
| 24 | 24 | ||
| 25 | 9. B | 25 | 9. 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 | ||
| 13 | 5. B | 13 | 5. B |
| 14 | -解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均代替。这减少了显存开销和训练复杂度,特别适合资源受限的场景。 | 14 | +解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均代替。这减少了设备内存开销和训练复杂度,特别适合资源受限的场景。 |
| 15 | 15 | ||
| 16 | 6. A、B、D | 16 | 6. 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 | ||
| 7 | 3. × | 7 | 3. × |
| 8 | -解析:Entropy bonus 的作用是鼓励模型保持探索能力(高熵),而非降低探索性。它在 loss 中加入 -entropy_coeff × H(π),熵越低惩罚越大,推高熵。 | 8 | +解析:Entropy bonus 的作用是鼓励模型保持探索能力(高熵),而非降低探索性。它在 loss 中加入 -entropy_coeff × H(π),最小化 loss 时较高的 H(π) 会使这一项更小,从而提供鼓励高熵分布的梯度。 |
| 9 | 9 | ||
| 10 | 4. B | 10 | 4. 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 | ||
| 13 | 5. × | 13 | 5. × |
| 14 | -解析:Entropy bonus 设置过大会导致 entropy 失控飙升,模型过度探索不收敛。需要选择适中的值(如 0.001)。 | 14 | +解析:Entropy bonus 设置过大会导致 entropy 失控飙升,模型过度探索不收敛。合适的系数需要保持其他参数不变,通过短程实验联合观察 entropy、KL 和验证 correct。 |
| 15 | 15 | ||
| 16 | 6. √ | 16 | 6. √ |
| 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 | ||
| 22 | 8. B | 22 | 8. B |
| 23 | -解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均奖励作为 baseline 来计算优势,减少了显存和计算开销。 | 23 | +解析:GRPO 的核心优势是不需要 Critic 模型,用组内平均奖励作为 baseline 来计算优势,减少了设备内存和计算开销。 |
| 24 | 24 | ||
| 25 | 9. C | 25 | 9. C |
| 26 | 解析:策略崩塌的典型表现:entropy 趋近 0、response_length 全部打满、correct 归零。模型输出退化为固定模式。 | 26 | 解析:策略崩塌的典型表现:entropy 趋近 0、response_length 全部打满、correct 归零。模型输出退化为固定模式。 |
| @@ -29,7 +29,7 @@ | |||
| 29 | 解析:保留参考策略是为了通过 KL 正则化防止当前策略偏离初始模型太远,避免模型为了追求高奖励而忘记原有的语言能力。 | 29 | 解析:保留参考策略是为了通过 KL 正则化防止当前策略偏离初始模型太远,避免模型为了追求高奖励而忘记原有的语言能力。 |
| 30 | 30 | ||
| 31 | 11. B | 31 | 11. B |
| 32 | -解析:entropy_coeff=0.01 过大,会导致 entropy 失控飙升,模型过度探索不收敛。实测中 25 步内 entropy 从 0.56 飙到 4.5。 | 32 | +解析:在本课程实验配置中,entropy_coeff=0.01 会让 entropy bonus 的相对影响过强,造成 entropy 膨胀、模型过度探索而不收敛。 |
| 33 | 33 | ||
| 34 | 12. D | 34 | 12. 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 | - "训练单步约 250s,155 步约 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 @@ | |||
| 1 | 1. √ | 1 | 1. √ |
| 2 | -解析:val-aux/wordle/correct/mean@1 表示验证集的猜中率,是衡量模型猜词能力最直接的指标。 | 2 | +解析:val-core/wordle/correct/mean@5 表示每个测试词采样 5 次后的验证集平均猜中率,是衡量模型猜词能力最直接的指标。 |
| 3 | 3 | ||
| 4 | 2. √ | 4 | 2. √ |
| 5 | 解析:actor/entropy 反映模型输出的不确定性(探索能力)。entropy 高表示模型在尝试不同策略,低表示趋于确定性输出。 | 5 | 解析:actor/entropy 反映模型输出的不确定性(探索能力)。entropy 高表示模型在尝试不同策略,低表示趋于确定性输出。 |
| 6 | 6 | ||
| 7 | 3. × | 7 | 3. × |
| 8 | -解析:健康训练中 entropy 应缓慢下降但不应崩塌到 0。entropy 突然跌到 0 是策略崩塌的信号。 | 8 | +解析:健康训练中 entropy 应平稳变化。持续快速下降到 0 是策略崩塌信号,需要结合验证 correct、KL 和输出长度共同判断。 |
| 9 | 9 | ||
| 10 | 4. B | 10 | 4. B |
| 11 | -解析:val-aux/wordle/correct/mean@1 表示验证集猜中率,直接反映模型猜中秘密单词的能力。 | 11 | +解析:val-core/wordle/correct/mean@5 表示验证集的平均猜中率,直接反映模型猜中秘密单词的能力。 |
| 12 | 12 | ||
| 13 | 5. C | 13 | 5. C |
| 14 | -解析:训练崩塌的典型信号是 entropy 突然跌到 0、response_length 全部打满 3232、correct 归零。entropy 缓慢下降(D)是正常现象。 | 14 | +解析:训练崩塌的典型信号是 entropy 突然跌到 0、response_length 全部打满 3232、correct 归零。entropy 逐步变化且验证 correct 没有持续恶化(D)不是崩塌信号。 |
| 15 | 15 | ||
| 16 | 6. A、B、C、D | 16 | 6. 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 | ||
| 19 | 7. × | 19 | 7. × |
| 20 | -解析:val-aux/wordle/correct/mean@1 表示验证集(test set)的猜中率,不是训练集。 | 20 | +解析:val-core/wordle/correct/mean@5 表示每个测试词采样 5 次后的验证集(test set)平均猜中率,不是训练集。 |
| 21 | 21 | ||
| 22 | 8. B | 22 | 8. 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 | ||
| 31 | 11. C | 31 | 11. C |
| 32 | -解析:健康训练中 entropy 缓慢下降但未崩塌。持续飙升(A)是 entropy bonus 过强的信号,突然跌到 0(B)是策略崩塌,保持不变(D)不太常见。 | 32 | +解析:健康训练中的 entropy 可以平稳或逐步变化,但必须结合验证 correct 是否改善。持续快速上升(A)或突然跌到 0(B)都需要进一步诊断。 |
| 33 | 33 | ||
| 34 | 12. A、B、C、D | 34 | 12. 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 | ||
| 43 | 15. A、B、C | 43 | 15. 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", |
Mtutorials/rl_training_pipeline/04_tuning_and_troubleshooting/04.02_hyperparameter_tuning.ipynb+48-54
| @@ -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.55,step 90 回落到 0.42 |\n", |
| 25 | - "| 0.002 | 0.534 → 0.451(step 25)→ 0.223(step 155)| `0701_1404` 稳定完成,correct 达 70% |\n", | 25 | + "| 0.005 | 0.521 → 3.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 步观察 entropy、KL、验证 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 | { |
Mtutorials/rl_training_pipeline/04_tuning_and_troubleshooting/04.03_training_collapse_analysis.ipynb+48-45
| @@ -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=0,kl_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 @@ | |||
| 1 | 1. √ | 1 | 1. √ |
| 2 | -解析:entropy_coeff=0 时没有 entropy bonus,pg_loss 完全主导,entropy 持续下降,可能导致策略崩塌。 | 2 | +解析:先运行 25~30 步,同时观察 entropy、KL、验证 correct 和输出长度,再根据曲线调节 entropy_coeff。 |
| 3 | 3 | ||
| 4 | 2. × | 4 | 2. × |
| 5 | -解析:entropy_coeff 过大(如 0.01)会导致 entropy 失控飙升,模型过度探索不收敛。需要在探索和利用之间平衡,0.005 是更合理的选择。 | 5 | +解析:entropy_coeff 过大会让 entropy bonus 的相对影响过强,模型可能过度探索而不收敛;更大的系数不等于更安全。 |
| 6 | 6 | ||
| 7 | 3. √ | 7 | 3. √ |
| 8 | 解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。RL 学习率通常比 SFT 低 1-2 个数量级。 | 8 | 解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。RL 学习率通常比 SFT 低 1-2 个数量级。 |
| 9 | 9 | ||
| 10 | 4. B | 10 | 4. 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 | ||
| 13 | 5. B | 13 | 5. B |
| 14 | -解析:调参应先用默认参数跑 50 步观察 entropy 趋势,再根据趋势决定加 entropy_coeff 还是降。盲目设置大值会导致失控。 | 14 | +解析:比较 entropy_coeff 时应固定模型、数据、seed、batch、学习率和评测协议做短程实验,并联合观察 entropy、KL、验证 correct 和输出长度。 |
| 15 | 15 | ||
| 16 | -6. A、B、C | 16 | +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 | ||
| 4 | 2. × | 4 | 2. × |
| 5 | -解析:策略崩塌的根因是策略梯度(pg_loss)过强,压过了 KL 正则和 entropy bonus。KL 正则过强反而会限制学习,但不会导致崩塌。 | 5 | +解析:该案例中策略更新逐渐集中,而 entropy bonus 缺失、KL 约束较弱,最终发生策略崩塌。KL 正则过强通常表现为模型更新受限。 |
| 6 | 6 | ||
| 7 | 3. × | 7 | 3. × |
| 8 | -解析:entropy_coeff=0.01 过大,会导致 entropy 失控飙升(25 步内从 0.56 到 4.51)。0.005 比 0.01 更安全。 | 8 | +解析:entropy_coeff 过大会让 entropy bonus 的相对影响过强,导致探索失控;系数越大不代表越安全。 |
| 9 | 9 | ||
| 10 | 4. C | 10 | 4. 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 | ||
| 13 | 5. B | 13 | 5. B |
| 14 | -解析:加 entropy_coeff=0.005 可以在 pg_loss 和 entropy 之间建立平衡,防止 entropy 崩塌。降低 entropy_coeff(A)会加重崩塌,提高学习率(C)会加速崩塌。 | 14 | +解析:应先回退到验证指标较好的 checkpoint,保持其他参数不变,小幅调整 entropy_coeff 做短程对比。一次修改多项参数无法判断哪项有效。 |
| 15 | 15 | ||
| 16 | 6. A、B、C、D | 16 | 6. A、B、C、D |
| 17 | -解析:崩溃诊断需要检查 entropy(是否崩塌)、response_length(是否打满)、correct 率(是否归零)、grad_norm(是否爆炸)。四个指标缺一不可。 | 17 | +解析:崩溃诊断需要联合检查 entropy、response_length、验证 correct、KL 和 grad_norm,不能由单一指标推断根因。 |
| 18 | 18 | ||
| 19 | 7. A、B、D | 19 | 7. 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 @@ | |||
| 1 | 1. √ | 1 | 1. √ |
| 2 | -解析:entropy_coeff=0 时没有 entropy bonus 保护,pg_loss 完全主导,entropy 持续下降可能导致崩塌。 | 2 | +解析:先运行 25~30 步,同时观察 entropy、KL、验证 correct 和输出长度,再根据曲线调节 entropy_coeff。 |
| 3 | 3 | ||
| 4 | 2. × | 4 | 2. × |
| 5 | -解析:entropy_coeff 过大(如 0.01)会导致 entropy 失控飙升。需要在探索和利用之间平衡,0.005 更合理。 | 5 | +解析:entropy_coeff 过大会让 entropy bonus 的相对影响过强,可能造成探索失控。系数需要通过固定其他参数的短程实验调试。 |
| 6 | 6 | ||
| 7 | 3. √ | 7 | 3. √ |
| 8 | 解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。学习率通常比 SFT 低 1-2 个数量级。 | 8 | 解析:RL 更新基于 noisy 的优势估计,需要更保守的步长。学习率通常比 SFT 低 1-2 个数量级。 |
| 9 | 9 | ||
| 10 | 4. √ | 10 | 4. √ |
| 11 | -解析:策略崩塌的根因是三种力失衡——pg_loss(降低 entropy)压过了 kl_loss(限制漂移)和 entropy_bonus(推高 entropy)。 | 11 | +解析:entropy 反映探索变化,KL 反映策略漂移,验证 correct 反映任务效果,输出长度用于识别输出退化,需要联合观察。 |
| 12 | 12 | ||
| 13 | 5. √ | 13 | 5. √ |
| 14 | -解析:KL loss 限制策略漂移方向,entropy bonus 限制分布形状(防止过于集中)。两者协同维持训练稳定。 | 14 | +解析:KL loss 限制当前策略相对参考策略的漂移,entropy bonus 降低分布过早集中的风险。两者互补但不能相互替代。 |
| 15 | 15 | ||
| 16 | 6. × | 16 | 6. × |
| 17 | 解析:单一指标不能判断训练健康度。reward 可能因为 format 分而不归零,掩盖崩塌。需要同时看 entropy、correct、response_length 等多个指标。 | 17 | 解析:单一指标不能判断训练健康度。reward 可能因为 format 分而不归零,掩盖崩塌。需要同时看 entropy、correct、response_length 等多个指标。 |
| 18 | 18 | ||
| 19 | 7. √ | 19 | 7. √ |
| 20 | -解析:策略崩塌通常发生在训练早期(前 100 步),因为此时模型还未形成稳定策略,容易受到 noisy 梯度的影响。 | 20 | +解析:前 25~30 步重点观察 entropy、KL 和输出长度,可以及时发现探索失控、策略漂移和输出退化。 |
| 21 | 21 | ||
| 22 | 8. B | 22 | 8. B |
| 23 | -解析:entropy_coeff=0.01 导致 entropy bonus 过强,压过了策略梯度。25 步内 entropy 从 0.56 飙升到 4.51。 | 23 | +解析:entropy_coeff=0.005 实验中 entropy 上升到 3.638,而验证 correct 没有改善,说明 entropy bonus 的相对影响过强。 |
| 24 | 24 | ||
| 25 | 9. C | 25 | 9. 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 | ||
| 28 | 10. B | 28 | 10. B |
| 29 | -解析:加 entropy_coeff=0.005 可以在 pg_loss 和 entropy 之间建立平衡,防止崩塌。降低 entropy_coeff(A)会加重崩塌。 | 29 | +解析:应先回退到验证指标较好的 checkpoint,保持其他参数不变,小幅调整 entropy_coeff 做短程对比。一次修改多项参数无法判断哪项有效。 |
| 30 | 30 | ||
| 31 | 11. A、B、C | 31 | 11. 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 | ||
| 34 | 12. A、B、C、D | 34 | 12. A、B、C、D |
| 35 | -解析:崩溃诊断需要检查 entropy、response_length、correct 率、grad_norm。四个指标缺一不可。 | 35 | +解析:崩溃诊断需要检查 entropy、response_length、验证 correct、KL 和 grad_norm,并结合配置判断。 |
| 36 | 36 | ||
| 37 | 13. A、B、C、D | 37 | 13. 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 | ||
| 40 | 14. A、B、D | 40 | 14. 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 | ||