想象你是一位餐厅主厨,拿到一份很有潜力的新菜谱,但菜谱上只写了主干步骤,火候大小、调料多少、放盐时机统统没写。你必须自己试出来,才能让这道菜每天稳定出品。强化学习工程师面对的就是同样的处境:算法框架(PPO、SAC)是菜谱,而超参数(学习率、折扣因子、熵系数、batch size、网络结构)就是那一堆等待定夺的“火候”和“调料”。调好了,模型一个晚上学会走路、打游戏、控制机器人;调差了,训练三周曲线纹丝不动,或者刚跑到一半就崩盘重来。 更麻烦的是,RL的超参比普通机器学习敏感得多——回报信号是非平稳的,环境本身在变,你调参时动一个数字,可能让整个训练从天堂掉进地狱。这篇文章将跟随主厨小川的研发日志,把超参数一个个拆开:它们各自控制什么、起手值怎么设、按什么顺序调、用网格搜索还是贝叶斯优化、最坑的陷阱是什么。读完你就能像老厨师一样,闻到味儿就知道下一步该放什么。

岗位关联

对 AI 从业者而言,调参是 RL 工程师的“灶台手艺”:掌握超参机制与系统调优流程,能让你的模型从“能跑”变成“稳定产出先进结果”,这是拉开初级与资深算法工程师差距的核心竞争力。

目录
  1. 可视化演示
  2. 第1节 学习率精调
  3. 第2节 折扣因子选择
  4. 第3节 熵系数控制
  5. 第4节 批次规模设定
  6. 第5节 网络结构配置
  7. 第6节 调参顺序策略
  8. 第7节 搜索方法抉择
  9. 第8节 调参陷阱规避
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示Hardhat与Truffle智能合约开发框架的工作流程,包括Solidity编译、测试与部署的核心环节,直观理解DApp开发工具链的运行机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Hardhat/Truffle开发框架 Hardhat:TypeScript原生支持,插件系统灵活,内置Solidity调试器 Truffle:成熟生态,合约迁移管理完善,Ganache本地链集成 共同流程:Solidity编译→单元测试→本地部署→主网上线 Workflow = Compile(.sol) → Test(Mocha) → Deploy(Migration) 开发框架提供从编写到部署的完整工具链

第1节 学习率精调

主厨小川研发新菜时有个习惯:每尝一口,就往锅里调整一点点调料。问题是“一点点”到底是多少。加多了,这一锅彻底咸死,只能倒掉重来;加少了,反复尝了五十次,味道还是原地踏步。学习率 α 在强化学习中扮演的正是这个角色——它决定每次看到训练信号后,策略网络的参数往“更好”的方向迈多大一步。

代码层面,策略网络输出动作的概率分布,环境返还回报,算法算出梯度 ∇J(θ)——一个指明“参数往哪个方向调能提高期望回报”的箭头。学习率就是给这个箭头乘上的缩放系数。RL 和监督学习的最大差异在于:回报信号是非平稳的,这个箭头本身忽左忽右,噪声很大,所以学习率通常要比 CV 任务更保守。Adam 优化器搭配 PPO 时,起手值常取 1e-4~3e-4;SAC 可略微放宽到 3e-4~1e-3。如果训练的 return 曲线像过山车一样剧烈震荡,先别急着改别的,把学习率砍半往往立竿见影。

火候的哲学就是:小川真正端上桌的菜,从来不是靠一次性猛火催出来的。学习率调小一点,多让模型“多尝几口”,很多看似玄学的 RL 失败案例,其实只是步子迈太大了。

θt+1=θt+α∇θJ(θt)\theta_{t+1} = \theta_t + \alpha \nabla_\theta J(\theta_t)
策略网络参数 θ 每步沿着“提高期望回报”的梯度方向挪动一小步,步长由学习率 α 决定。
  1. 当前参数θ_t 表示第 t 步训练时,策略网络里所有可学习的权重和偏置。
    θt\theta_t
  2. 梯度方向∇_θ J(θ_t) 是一个向量,指向让期望回报 J 上升最快的方向。
    ∇θJ(θt)\nabla_\theta J(\theta_t)
  3. 步长控制α 是学习率,它把梯度向量缩放成合适的更新幅度,防止一步迈过头。
    α\alpha
  4. 参数更新新参数等于旧参数加上缩放后的梯度,这就是一次完整的梯度上升。
    θt+1=θt+α∇θJ(θt)\theta_{t+1} = \theta_t + \alpha \nabla_\theta J(\theta_t)

第2节 折扣因子选择

小川做的是正经宴席,不是街边快餐。设计一道招牌菜时,他得决定:评价这道菜好不好吃,是只看入口的第一口,还是要把前菜、主菜、收尾甜点的整体体验都算进来?这就是折扣因子 γ 的取舍。γ 决定策略优化时智能体愿意为“未来的回报”付出多少注意力。

技术上说,RL 目标函数里的回报不是单步奖励,而是一条轨迹上所有即时奖励的加权和。γ 越接近 1,远处奖励被保留得越多,智能体越“深谋远虑”;γ 越小,智能体越急功近利,只顾眼前几步。看起来“越远视越好”?未必。γ 接近 1 会让回报的方差急剧膨胀——未来充满不确定性,你把遥远的奖励也算得那么重,梯度信号就会被噪声淹没。短回合任务(如走迷宫、单步决策)常用 0.9~0.95;长时程任务(如机器人走 1000 步、打整局游戏)用 0.99~0.995。γ 是刻画任务本身结构的参数,它错了,后面调什么都像是在错误地基上盖楼。

小川的宴席菜单总是先定“宴席规格”——是三道菜的快餐还是十道菜的盛宴,这决定了每道菜在整体体验中的分量。折扣因子就是 RL 里的“宴席规格”,务必要在动手调其他参数之前想清楚。

Gt=∑k=0∞γkRt+k+1G_t = \displaystyle\sum_{k=0}^{\infty} \gamma^k R_{t+k+1}
从时刻 t 起把未来的每一步奖励 R 逐级打 γ 这个折扣后累加起来,得到总回报 G_t。
  1. 未来奖励R_{t+k+1} 表示往后第 k+1 步拿到的即时奖励。
    Rt+k+1R_{t+k+1}
  2. 折扣权重γ^k 让越远的奖励权重越小,γ=0.99 时第 100 步奖励的权重只剩约 0.37。
    γk\gamma^k
  3. 累加求和把从当前开始的所有折扣奖励全部加起来,构成轨迹回报。
    ∑k=0∞\sum_{k=0}^{\infty}
  4. 总回报G_t 就是智能体在状态 t 之后追求的“折扣化长远收益”。
    GtG_t

第3节 熵系数控制

小川给新菜定完火候和宴席规格后,还得决定一件事:要不要在菜谱里给厨师留一点临场发挥的自由?如果菜谱把每步操作写得死死的,厨师永远按同一种方式翻锅,出品稳定但毫无惊喜;如果完全放飞,厨师天马行空,今天的菜和明天的菜可能完全是两个物种。熵系数 β 就是 RL 里控制“临场发挥自由度”的旋钮。

策略熵衡量策略输出动作分布的随机程度:分布越平坦,策略越随机,探索性越强。训练目标会在原始回报之外加上一项熵的加权,鼓励策略保持一定随机性,防止过早收敛到局部最优。PPO 中熵系数初始值通常取 0.01~0.1;SAC 算法更进一步,它让温度系数自动调节——探索多了就自动收紧,探索少了就自动放松。熵系数设太大,策略一直“疯疯癫癫”随机乱走,奖励曲线迟迟上不去;设太小,策略过早固步自封,困在差动作里出不来。

自由度是一道菜的灵气所在,但小川深知:创新要在可复制的框架内发生。熵系数调得好,模型既不会变成复读机,也不会变成失控的即兴艺术家。

H(π(⋅∣s))=−∑a∈Aπ(a∣s)log⁡π(a∣s)H(\pi(\cdot|s)) = -\displaystyle\sum_{a \in \mathcal{A}} \pi(a|s) \log \pi(a|s)
熵 H 越大,策略在状态 s 下选各动作的概率越均匀,行为越随机、越爱探索。
  1. 策略分布π(a|s) 表示智能体在状态 s 下选择动作 a 的概率。
    π(a∣s)\pi(a|s)
  2. 信息量log π(a|s) 反映了“看到这个动作发生”带来的信息量,概率越小信息量越大。
    log⁡π(a∣s)\log \pi(a|s)
  3. 加权求和把所有动作的概率乘以信息量再加负号,得到该状态下策略的熵。
    ∑a∈A\sum_{a \in \mathcal{A}}
  4. 熵的意义分布越均匀,H 值越大,策略的探索性越强。
    H(π(⋅∣s))H(\pi(\cdot|s))

第4节 批次规模设定

后厨试菜有个现实约束:一道菜做好后,得分几批端给食客尝。一次只端一碟,意见收集得慢,而且单个食客的口味偏见可能误导你;一口气端五十碟,意见是平均了,但后厨得等很久才能集齐一轮反馈,改菜速度就慢了。RL 中的 batch size 正是“一次端多少份经验上桌”。

训练时,算法从经验池里抽出一批 transition(状态、动作、奖励的转移记录),用这批样本的平均梯度来更新策略。直觉上,批量越大梯度越准——这没错,方差确实随批次增大而下降。但 RL 里批次并非越大越好:样本来自非平稳环境,大批次会稀释近期经验,让策略反应迟钝;更现实的是,显存和计算资源有限。PPO 中经验采集和梯度更新分离,常用 256~4096;SAC 这类 off-policy 算法常用 256。调 batch 时观察两个信号:更新后回报是否平滑上升(批次适中),以及训练是否像“醉酒”一样剧烈抖动(批次太小)。

小川最后定下的上菜节奏是:既不能等到客人走光了才收集完意见,也不能只听一两位客人的片面之词。批次的智慧,是在反馈频率与反馈质量之间找到平衡。

Var(∇θJB(θ))=σg2B\text{Var}(\nabla_\theta J_B(\theta)) = \dfrac{\sigma_g^2}{B}
用 B 条样本估计梯度时,估计的方差约为单样本梯度方差的 1/B,批次越大,梯度噪声越小。
  1. 单样本梯度方差σ_g² 描述单条 transition 算出的梯度有多不稳定。
    σg2\sigma_g^2
  2. 批次大小B 是一次参数更新实际使用的样本条数。
    BB
  3. 方差反比关系批次越大,平均梯度的波动按 1/B 比例被压平。
    σg2B\dfrac{\sigma_g^2}{B}
  4. 权衡点方差小不等于效果好,大 batch 让训练稳定但可能错过对新鲜经验的快速响应。
    Var(∇θJB(θ))\text{Var}(\nabla_\theta J_B(\theta))

第5节 网络结构配置

小川的餐厅后厨不大,但他见过太多同行:一上来就买了一整套顶级不锈钢设备,结果大部分机器常年吃灰,还占地方。网络结构之于 RL 就像后厨设备——够用、顺手、能快速出菜才是关键。很多刚入门的人习惯把 CV 领域那套“网络越深越宽越好”的直觉搬过来,这在 RL 里往往是灾难。

策略网络和价值网络的常见配置是两层 MLP,每层 256 或 512 个神经元,足以处理 MuJoCo、Atari 等一大票标准环境。网络过深过宽会带来三个问题:训练更慢、更容易过拟合当前经验、对超参数更敏感。激活函数首选 ReLU(中间层),输出层根据动作空间选 Tanh(连续动作)或 Softmax(离散动作)。另一个实用技巧是输入特征归一化——把观测标准化到零均值单位方差,能显著提升训练稳定性。在扩大模型之前,务必先在简化版环境或小预算下验证训练流程本身没问题。

小川的经验之谈是:好餐厅的招牌菜靠的是对火候和食材的理解,而不是堆设备。先跑通一个小网络,再按需加宽加深,是 RL 工程中最省心省力的路径。

h(l)=ReLU(W(l)h(l−1)+b(l))h^{(l)} = \text{ReLU}(W^{(l)} h^{(l-1)} + b^{(l)})
第 l 层隐藏层把上一层输出做线性变换后,用 ReLU 激活函数做非线性映射。
  1. 上一层输出h^{(l-1)} 是前一个隐藏层产出的特征向量。
    h(l−1)h^{(l-1)}
  2. 线性变换W^{(l)} 和 b^{(l)} 是本层的权重矩阵与偏置,完成一次仿射映射。
    W(l)h(l−1)+b(l)W^{(l)} h^{(l-1)} + b^{(l)}
  3. 激活函数ReLU 把负值压成 0、正值原样保留,引入非线性表达能力。
    ReLU(⋅)\text{ReLU}(\cdot)
  4. 本层输出h^{(l)} 作为下一层的输入,层层堆叠构成整个网络。
    h(l)h^{(l)}

第6节 调参顺序策略

小川研发新菜有条铁律:先定食材清单,再定烹饪流程,最后才琢磨摆盘装饰。如果一上来就纠结盘边那朵萝卜花,食材却选错了,整道菜注定失败。超参数的调整同样有严格的优先级顺序——这不是玄学,因为超参数之间存在依赖关系,某些参数选错,会让其他参数的调优结果失去意义。

推荐的顺序是:第一步先定“环境相关参数”——折扣因子 γ 和奖励结构,它们定义了任务的目标函数,错了则全盘皆错;第二步调“训练核心参数”——学习率 α 和 batch size,它们决定梯度信号能否被有效利用;第三步才是“正则与细节参数”——熵系数 β、GAE 的 λ、PPO 的 clip 范围 ε。明白这个顺序,你还需要一个纪律:每次只动一个参数。只有单变量变化,你才能把训练结果的改善或恶化归因到具体某个旋钮上。RL 训练本身噪声就大,同时改三个参数,你永远不知道是哪个改动起了作用。

做菜的因果链决定了下锅顺序:食材定了味道上限,火候决定能否逼近上限,摆盘只是锦上添花。调参也一样,顺序对了,每次调试都在积累可复用的经验。

Ltotal(θ)=Lclip(θ)+c1Lvalue(θ)−c2H(πθ)L_{\text{total}}(\theta) = L_{\text{clip}}(\theta) + c_1 L_{\text{value}}(\theta) - c_2 H(\pi_\theta)
PPO 的总损失由策略损失、价值损失和熵正则三部分组成,调参顺序实际是围绕这三个分量的优先级展开。
  1. 策略损失L_clip(θ) 负责更新策略网络,让动作概率向着更优方向移动。
    Lclip(θ)L_{\text{clip}}(\theta)
  2. 价值损失L_value(θ) 训练价值网络估计状态价值,是策略更新的“评分标尺”。
    Lvalue(θ)L_{\text{value}}(\theta)
  3. 熵正则项-c_2 H(π_θ) 鼓励策略保持探索,系数 c_2 就是熵系数。
    −c2H(πθ)- c_2 H(\pi_\theta)
  4. 权重系数c_1、c_2 控制三个目标的相对重要性,也是超参数调优的一部分。
    c1,c2c_1, c_2

第7节 搜索方法抉择

当新菜涉及的变量太多,小川就不能靠一双手慢慢试了,他需要一套“试菜方法论”。最笨的办法是把所有调料组合成一张大表,挨个试——这就是网格搜索。问题是:如果有 5 个参数,每个取 10 档,组合数是 10 的 5 次方,一辈子也试不完。随机搜索聪明一点,在参数空间随机撒点,高维下比网格更高效,因为它不会把预算浪费在“均匀覆盖”上。而贝叶斯优化是请了一位“食评家”:每试完一道菜,食评家就更新对各参数区域的判断,下道菜专挑最有希望的区域试。

贝叶斯优化的核心是用一个代理模型(通常高斯过程)拟合“超参数到回报”的关系,然后用采集函数决定下一个采样点。采集函数在高回报区域(利用)和不确定区域(探索)之间做权衡。网格搜索适合参数少、预算充足、可大规模并行的场景;贝叶斯优化适合预算在 20~50 次、每轮训练很贵(如机器人训练、大模型 RLHF)的场景。好消息是 Optuna 这类工具已经把贝叶斯优化封装得很友好,你只需要定义搜索空间和目标函数。

小川很感谢这位“食评家”——它让每次试菜的预算都花在刀刃上,而不是在地图上漫无目的地兜圈子。

UCB(x)=μ(x)+κσ(x)\text{UCB}(x) = \mu(x) + \kappa \sigma(x)
UCB 采集函数把高斯过程预测的均值 μ(x) 和不确定性 σ(x) 相加,κ 控制“贪心利用”与“大胆探索”的平衡。
  1. 候选参数x 是一个待评估的超参组合,比如 (学习率,折扣因子,熵系数)。
    xx
  2. 预测均值μ(x) 是代理模型对“该参数组合能拿多少回报”的当前估计。
    μ(x)\mu(x)
  3. 不确定性σ(x) 是代理模型对该估计的信心程度,没试过的区域 σ 大。
    σ(x)\sigma(x)
  4. 权衡系数κ 大则偏爱探索未知区域,κ 小则死磕已知高回报区域。
    κ\kappa

第8节 调参陷阱规避

餐厅开久了,小川见过太多后厨翻车现场:有厨师一口气往锅里加了五种调料,结果菜咸了,愣是不知道是哪瓶酱油的问题;有厨师只让一位熟客试菜就断定菜品优秀,换一桌客人全砸了;还有厨师死磕某一道菜,把餐厅所有食材都耗在这道菜上,结果环境一换直接歇业。这些正是 RL 调参最常见的四大陷阱。

第一,同时调多个参数——梯度信号里混入了太多变量,你无法归因,这违背了第 6 节讲的单变量纪律。第二,忽视随机种子——RL 对种子极其敏感,同一配置换一个种子,回报能差出几个标准差。只跑一个 seed 就下结论,相当于只让一个食客评价菜品。第三,在单一环境上过度调优——反复针对某个测试环境精调,相当于为了一道菜把整个菜单绑架了,换环境就失效。第四,忽略热启动——如果之前有个训练到一半的模型,完全可以加载它继续调参,从零开始训练既慢又引入了新的随机性。多 seed 评估是验证超参效果的基本素养。

小川最终总结出一套“开店哲学”:调料一次只改一味,评价要多请几桌客人,菜单要能应对不同季节,老汤底子要懂得续用。做到这四点,后厨才配谈稳定出品——RL 项目也才配谈稳定产出。

SEM=σJN\text{SEM} = \dfrac{\sigma_J}{\sqrt{N}}
用 N 个独立随机种子各跑一遍训练,回报均值的标准误 SEM 随 N 平方根下降,提示你不要只看单次结果。
  1. 回报标准差σ_J 表示同一超参配置在多个种子下最终回报的波动程度。
    σJ\sigma_J
  2. 种子数量N 是独立重复训练的随机种子数。
    NN
  3. 标准误公式均值估计的误差随 N 增大而变小,4 个种子能把误差减半。
    σJN\dfrac{\sigma_J}{\sqrt{N}}
  4. 工程含义SEM 小才说明超参效果可靠,否则只是某次运气的产物。
    SEM\text{SEM}

AI 应用场景

场景一:游戏 AI 的快速调参

阶段:超参数优化 / 模型训练效率提升

解决的问题:游戏公司在训练 NPC(非玩家角色)时,传统做法是算法工程师手动试学习率和折扣因子,一个组合训练要十几个小时,试几轮就一周过去了。手动调参还常常因为两个参数同时改而搞不清是谁的功劳。

具体案例:某 MOBA 游戏训练英雄对战 AI,工程师先用 Optuna 做贝叶斯优化,搜索空间限定为学习率 1e-4~3e-4、折扣因子 0.95~0.995、熵系数 0.01~0.05,预算 30 次。相比之前网格搜索需 100 次,最终以三分之一预算找到更优配置,胜率提升了 12%。

场景二:机器人步态策略的稳定落地

阶段:策略训练与仿真到真机迁移

解决的问题:四足机器人步态策略训练成本极高,每一次仿真训练都消耗大量 GPU 算力。团队按“先环境参数、再训练参数、后正则细节”的顺序,先用 γ=0.99 锁定长时程任务框架,再单变量微调学习率,避免了多参数同改导致的归因混乱。

具体案例:机器人公司训练后空翻策略时,先跑 5 个随机种子确认基线回报稳定,再用贝叶斯优化调整学习率和批大小,最终把训练周期从两周压缩到五天,且 sim-to-real 迁移成功率从 60% 提升到 85%。

场景三:推荐系统模拟环境中的策略评估

阶段:离线策略评估与超参验证

解决的问题:用强化学习做推荐排序时,线上 A/B 测试太贵,只能在模拟环境里先调参。但模拟环境与真实环境存在偏差,直接按单次模拟结果调参容易过拟合模拟器。

具体案例:电商平台推荐团队用日志数据训练用户模拟器,在调参流程中强制要求“每个超参组合跑 5 个不同随机种子、取 SEM 最小的组合”,并预留 10% 训练预算用于热启动续训。新策略上线后 CTR 提升 3.4%,且周级波动显著降低。

Python 演示

python85 行
"""对比:网格/朴素均匀搜索 vs UCB贝叶斯优化调超参(模拟黑盒)."""import mathimport random  def simulate_return(lr, gamma, entropy):    """模拟一次RL训练后的最终回报(带噪声黑盒函数).    真实最优在学习率约1e-3、gamma约0.98、熵系数约0.05附近."""    lr_log = math.log10(lr)    x = -(lr_log + 3.0) ** 2 / 0.01    y = -(gamma - 0.98) ** 2 / 0.00004    z = -(entropy - 0.05) ** 2 / 0.001    return 100.0 * math.exp(x + y + z) + random.gauss(0.0, 2.0)  class UCB:    """最简贝叶斯优化风格搜索器:高斯过程近似+UCB采集函数."""     def __init__(self, bounds):        self.bounds = bounds        self.history = []        self.values = []     def propose(self, kappa=1.5):        best_x, best_s = None, -1e9        for _ in range(300):            cand = [random.uniform(a, b) for a, b in self.bounds]            score = self._ucb(cand, kappa)            if score > best_s:                best_x, best_s = cand, score        return best_x     def add(self, x, y):        self.history.append(x)        self.values.append(y)     def _ucb(self, x, kappa):        """用最近邻距离近似高斯过程的均值与方差."""        if not self.history:            return random.random()        dist = []        for xi, yi in zip(self.history, self.values):            d2 = sum((a - b) ** 2 for a, b in zip(xi, x))            dist.append((d2, yi))        dist.sort(key=lambda t: t[0])        mu = dist[0][1]        sigma = math.sqrt(max(0.0, dist[1][0] - dist[0][0])) if len(dist) > 1 else 1.0        return mu + kappa * sigma  def uniform_budget_search(budget):    """朴素均匀搜索:没有反馈利用,近似网格/随机搜索."""    best = (0.0, None)    for _ in range(budget):        lr = 10 ** random.uniform(-4.5, -2.5)        gamma = random.uniform(0.9, 0.999)        entropy = random.uniform(0.0, 0.2)        r = simulate_return(lr, gamma, entropy)        if r > best[0]:            best = (r, (lr, gamma, entropy))    return best  def ucb_budget_search(budget):    """UCB贝叶斯优化:每次按采集函数选点,并更新模型."""    searcher = UCB([(1e-4, 3e-3), (0.9, 0.999), (0.0, 0.2)])    best = (0.0, None)    for _ in range(budget):        x = searcher.propose()        y = simulate_return(*x)        searcher.add(x, y)        if y > best[0]:            best = (y, x)    return best  if __name__ == "__main__":    random.seed(42)    budget = 25    g_best = uniform_budget_search(budget)    u_best = ucb_budget_search(budget)    print("均匀搜索最好回报: %.2f" % g_best[0])    print("UCB搜索最好回报: %.2f" % u_best[0])    print("UCB找到配置: lr=%.5f gamma=%.3f entropy=%.3f"          % u_best[1])
目的:在相同预算(25 次训练)下,对比“朴素均匀搜索”(网格/随机搜索的同族)与“UCB 贝叶斯优化”的调参效果。运行后可看到 UCB 通常能找到更高回报的超参组合,且随着预算增加,差距更明显。
  1. def simulate_return(lr, gamma, entropy)用高斯形状黑盒函数模拟一次 RL 训练的最终表现,真实最优值故意设在常见推荐值附近,让搜索有“宝藏”可挖。
  2. random.gauss(0.0, 2.0)给模拟回报加测量噪声,还原 RL 训练中“同一参数跑两次结果不同”的真实感。
  3. self.history` / `self.values记录每一次已评估的超参组合与回报,这是贝叶斯优化的“记忆”,让后续采样有据可依。
  4. def propose(self, kappa=1.5)采集函数在参数空间随机生成 300 个候选,用 UCB 分数挑出最值得一试的那个。
  5. def _ucb(self, x, kappa)用最近邻距离近似高斯过程的均值与方差,距离近的历史点贡献高相关度。
  6. uniform_budget_search完全没有反馈利用,每次都随机撒点,代表网格/随机搜索这一类“一顿乱试”风格。
  7. ucb_budget_search每评估一次就把结果记入记忆,下一次采样自动避开差区域、聚焦好区域,实现“越调越准”。

常见误区

误区我总觉得学习率就像跑步速度,设大一点,模型就能更快收敛。于是我直接把学习率调到 0.01,结果训练曲线像过山车一样上下乱窜,我还以为是环境奖励设计有问题,调了一周奖励函数。其实锅大概率在学习率上。

正解学习率是“步长”而非“速度”。步长太大,参数更新会越过最优区域,在附近来回震荡甚至发散;RL 的梯度噪声本来就大,大学习率会被噪声放大到完全失控。正确做法是从 3e-4 这类安全值起步,若曲线震荡剧烈,优先把学习率砍半观察。

为何常见:监督学习里偶尔用较大学习率配合学习率调度也能收敛,给人留下“大学习率=快”的直觉,但忽略了 RL 非平稳目标带来的噪声放大效应。

误区网上很多 RL 示例代码都写 gamma=0.99,我也就照抄,不管任务是什么。后来训练一个每回合只有十几步的简单导航任务,发现回报方差特别大,明明是很简单的任务,策略却一直不稳定。

正解折扣因子必须匹配任务的时间尺度。短回合任务里,如果 γ 设成 0.99,未来十几步的奖励几乎全被保留,方差被不必要的长远预测放大;而任务本身根本不需要那么长的视野。短任务用 0.9~0.95,长时程任务才用 0.99 以上。

为何常见:公开代码库大多跑的是长时程基准环境,0.99 是这些环境的经验值,被初学者当成万能默认值带走,忽略了任务结构假设。

误区我为了“不漏掉最优解”,把学习率、折扣因子、熵系数、batch size、网络层数全都放进网格里,每维取十档,觉得枚举得越细越不可能错过好参数。结果训练了整整一个月,预算耗尽也没试完组合。

正解网格搜索在参数维度升高时会遭遇组合爆炸——5 个参数各 10 档就是 10 万次训练。且网格均匀采样在低维高效,高维时随机搜索或贝叶斯优化更有优势。正确的姿势是:先用贝叶斯优化锁定期望区域,再在最优区域附近做小网格精修。

为何常见:人类天然偏好“系统全面”的枚举思维,但在高维空间里,“全面”本身就是一个不可能完成的任务,“智能地不全面”才是工程现实。

误区训练一次 RL 要好几个小时,跑多个种子太奢侈了。我觉得只要这个超参组合跑出来的曲线好看,就说明它效果好。结果提交评估时换了环境初始化,效果直接对半砍。

正解RL 对随机种子的敏感度高到令人发指,一次训练结果可能只是“幸运样本”。同一配置至少跑 3~5 个种子,用回报均值和标准误(SEM)来判断。SEM 大说明配置本身不稳定,哪怕均值高也不可轻信。多 seed 验证是 RL 调参的基本职业素养。

为何常见:监督学习中数据量大、评估相对稳定,单次训练结果的可靠性较高,把这种习惯迁移到 RL 就踩了坑。

误区我看到别人的 Transformer 策略网络在复杂环境表现好,也立刻把手上的两层 MLP 换成又深又宽的 Transformer,结果训练速度慢了十倍,回报反而更差。我觉得是训练技巧不行,又开始调学习率。

正解RL 的训练信号比监督学习稀疏得多,大模型在小样本条件下极易过拟合当前经验,且对超参数更敏感。标准做法是先用两层 MLP 256 宽验证任务可行性,确认存在可学习的策略后再渐进式扩网络,同时配合更大预算和更保守的学习率。

为何常见:深度学习时代“大模型=强能力”的直觉深入人心,但 RL 中支配效果的往往是样本效率和探索问题,模型容量只是瓶颈之一,不是越强越好。

面试题

Q1. 强化学习中学习率 α 的核心作用是什么?

单选题 · easy

  • A.控制每步参数更新幅度← 正确答案
  • B.决定折扣因子的数值
  • C.调整熵系数的衰减速度
  • D.控制回放缓冲的大小

答案:A。学习率是策略参数沿梯度方向的步长,α 越大每步参数挪动越多。B/C/D 描述的是折扣因子、熵系数和回放缓冲这些其他组件,与学习率无关。主厨试菜时“每次加多少调料”,就是学习率。

Q2. 折扣因子 γ 接近 1(如 0.99)时,智能体的行为倾向于?

单选题 · easy

  • A.只关注当前即时奖励
  • B.更看重长期累积回报← 正确答案
  • C.完全忽略未来奖励
  • D.只使用离线数据训练

答案:B。γ 越接近 1,未来奖励的折扣权重衰减越慢,智能体越“远视”。γ 小才只顾眼前奖励,C 是 γ=0 的极端情况,D 与折扣因子无关。像主厨考虑整桌宴席体验而非只看第一口菜。

Q3. 在每回合只有十几步的短任务中,折扣因子 γ 的合理选择是?

单选题 · mid

  • A.0.9 左右的较小值← 正确答案
  • B.越接近 1 越好
  • C.必须严格等于 0
  • D.不需要设置该参数

答案:A。短任务未来视野有限,γ 设太大(接近 1)会让回报方差被不必要的远期预测放大,训练不稳定。0.9 左右足够覆盖十几步的规划范围。γ=0 只看当前步,丢失决策深度;γ 是 RL 标准必选超参,不可能不设置。

Q4. 熵系数 β 设置过大时,策略会出现哪些情况?

多选题 · mid

  • A.动作选择更倾向随机← 正确答案
  • B.训练过程绝对稳定
  • C.收敛后熵值依然偏高← 正确答案
  • D.立即过拟合训练环境

答案:AC。β 过大意味着熵正则权重太高,策略被强烈鼓励保持随机,表现为“一直乱走”不收敛,收敛后也维持高熵(C)。随机性强反而使训练更不稳定(B 错);过拟合是熵过小导致过早固化时的现象(D 错)。

Q5. 网格搜索调参最主要的缺点是?

单选题 · mid

  • A.参数维度增加时组合数爆炸← 正确答案
  • B.完全无法利用历史评估结果
  • C.结果方差永远为零
  • D.在低维时比贝叶斯优化更差

答案:A。网格搜索均匀铺满参数空间,维度从 3 维升到 5 维,每维 10 档就从 1000 次变 10 万次。B 描述也很负面,但“无法利用历史”是网格与贝叶斯的本质差异之一,题目问“最主要缺点”指维度灾难。低维时网格未必比贝叶斯差,C 明显错误。

Q6. 贝叶斯优化中 UCB 采集函数的系数 κ 控制什么?

单选题 · hard

  • A.探索与利用的平衡程度← 正确答案
  • B.学习率的衰减速率
  • C.折扣因子的取值范围
  • D.策略网络的隐藏层宽度

答案:A。UCB = μ(x) + κσ(x),均值项代表利用(已知高回报区域),方差项代表探索(未充分评估区域),κ 是二者的权重。κ 大偏爱探索,κ 小偏爱吃老本,和学习率、折扣因子、网络宽度无关。

Q7. 以下哪些属于 RL 调参中的常见陷阱?

多选题 · mid

  • A.同时修改多个超参数导致无法归因← 正确答案
  • B.只用单个随机种子评估配置效果← 正确答案
  • C.在单一环境上反复精调导致过拟合← 正确答案
  • D.每次只改变一个参数进行诊断

答案:ABC。调参铁律是“一次只动一个变量”以便归因(A 是陷阱)。单 seed 评估被 RL 的种子敏感性坑害(B 是陷阱)。单一环境精调会让策略丧失泛化能力(C 是陷阱)。D 是好习惯,不是陷阱。

Q8. 调参时应优先确定折扣因子 γ 和奖励结构,主要原因是?

单选题 · hard

  • A.它们定义了任务的目标函数← 正确答案
  • B.它们是最容易调到最优值的
  • C.它们对学习率完全没影响
  • D.它们的取值固定为全局常数

答案:A。γ 和奖励结构共同刻画了 MDP 的目标语义——智能体在为什么而优化,错了则后续学习率、batch 的调优都建立在错误地基上。它们不是“容易调”或“固定常数”,且通过回报尺度间接影响梯度,B/C/D 均错。

Q9. RL 中网络结构配置的合理做法有哪些?

多选题 · easy

  • A.优先使用小而浅的 MLP← 正确答案
  • B.直接用最大最深的网络
  • C.在简化原型上验证再扩展← 正确答案
  • D.隐藏层越宽必然效果越好

答案:AC。RL 训练信号稀疏,小网络优先(A)能降低过拟合和调参难度;先在小环境验证可行性再渐进扩网络(C)是工程正道。B 和 D 是“大即好”的误区,大网络在 RL 中往往更慢且更敏感。

Q10. 用 N 个随机种子评估超参配置时,回报均值标准误 SEM 的计算公式是?

单选题 · extreme

  • A.SEM = σ_J / √N← 正确答案
  • B.SEM = σ_J × √N
  • C.SEM = √(σ_J) × N
  • D.SEM = σ_J² / N

答案:A。标准误是标准差除以样本数的平方根,反映均值估计的可靠程度。N=4 时 SEM 减半,N=16 时只剩四分之一。B 弄反了分母,C 和 D 的运算维度都不对。多条 seed 验证就是让“多请几桌客人试菜”,SEM 越小结论越可信。