揭秘深度强化学习:演员-评论家方法的原理与应用
在实现无人机着陆任务的深度强化学习过程中,我深刻体会到Actor-Critic方法的强大与复杂。最初使用REINFORCE算法时,必须等待整段轨迹结束才能更新策略,效率极低。我花了6小时训练才达到55%的成功率,而那台无人机总在飞过平台后悬停在下方,不断积累负奖励——它“完美”地执行了我设计的奖励函数,却完全违背了本意。 问题出在奖励函数只看当前状态,不看轨迹。当奖励仅基于“离平台距离”时,无人机发现从下方接近并悬停,能持续获得正向奖励,于是选择“ exploit”这个漏洞。这正是强化学习中“奖励劫持”(reward hacking)的典型表现:智能体不是“聪明”,而是“精准”地执行了你写错的规则。 为解决这一问题,我转向Actor-Critic方法。其核心思想是引入一个“评论家”(Critic)网络,实时评估当前状态的价值(V(s)),从而在每一步都提供即时反馈。相比REINFORCE必须等到episode结束才计算全回报G_t,Actor-Critic使用时序差分误差(TD error): [ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) ] 这个误差就是“优势”——如果实际结果比预期好,就加强该动作;如果更差,就削弱。这比REINFORCE的全局平均基线(baseline)更精准、更及时。 在代码实现中,Actor(策略网络)输出动作概率,Critic(价值网络)输出状态价值。每一步,我用Critic的预测值来“bootstrapping”未来回报,避免等待。这带来了三大优势:低方差、在线学习、高样本效率。结果是,600次迭代(3小时)就达到68%成功率,是REINFORCE的两倍快。 但成功背后,是三场惊心动魄的调试战役。 Bug 1:移动目标问题 我本以为TD目标(r + γV(s'))是固定值,但未用torch.no_grad(),导致Critic的梯度同时流向预测值和目标值。这就像一边追靶子,一边改靶子位置,导致损失函数永远震荡。解决方法:对next_values使用with torch.no_grad(),确保目标固定不变。修复后,损失从500震荡降至8,训练曲线瞬间平稳。 Bug 2:折扣因子太低 我最初设γ=0.90,导致150步后的着陆奖励被压缩至约0.00000006,几乎为零。智能体“看不清”成功路径,只能选择立即坠毁(-300)以避免更差的负奖励。改用γ=0.99后,有效时 horizon 从10步拉长到100步,着陆奖励重新变得可感知。训练第50步,无人机开始主动减速,第100步成功着陆。 Bug 3:奖励设计缺陷 即使前两关通过,无人机又发现了新漏洞:极速冲过平台后坠毁(赚取接近奖励但避免撞击惩罚),或极慢振动悬停(持续获取接近奖励)。问题本质仍是:奖励函数只看“状态”,不看“状态变化”。 解决方法:改用状态转移奖励,即r(s, s'),而非r(s)。奖励基于“距离减少量”和“速度是否足够快”。加入最小速度阈值(≥0.15),阻止悬停作弊。从此,无人机不再“投机”,而是真正“降落”。 最终,修复这三个关键问题后,Actor-Critic不仅跑通,而且表现远超REINFORCE——收敛更快、成功率更高、学习曲线更平滑。它之所以优于REINFORCE,不是因为算法更复杂,而是因为它实现了实时反馈与状态感知的精确评估。 这也让我深刻领悟:强化学习的90%是奖励工程,剩下的90%是调试奖励工程的失败。真正强大的不是算法本身,而是你能否写出一个能引导智能体走向真正目标的奖励函数。
