很多人第一次接触强化学习(Reinforcement Learning,RL)时,脑子里冒出的第一个问题不是“Q-learning 怎么更新”,而是“这东西和自动控制到底什么关系?”
控制工程师会问:我已经有 PID、MPC、LQR 了,调得好好的,为什么还要搞强化学习?
算法工程师会反问:控制理论那一套数学模型太严格了,真实环境根本建不出来,RL 不建模不也能学?
这两种提问方式,恰恰暴露了当前 AI 与自动化两个领域之间最深的割裂:RL 和控制理论研究的其实是同一类问题,但各自用了完全不同的话语体系、数学工具和评估标准。
这篇文章我想做的,就是把这个割裂讲清楚。我们不是简单地把“RL 属于机器学习,控制属于自动化”这种话重复一遍,而是从底层原理出发,看看贝尔曼方程和最优控制里的哈密顿-雅可比-贝尔曼(HJB)方程如何同源;看看策略迭代、值迭代和动态规划之间存在怎样的对应;再看看从控制理论视角理解 RL,能帮我们避开哪些训练陷阱。
读完后你应该能回答三个问题:
- RL 和最优控制的边界到底在哪里,谁更通用。
- 控制理论里的稳定性、鲁棒性概念,为什么对 RL 训练有实实在在的指导价值。
- 如果我想把 RL 用在一个真实控制任务(比如机器人、无人机、运动控制)上,第一步该怎么设计,最容易死在哪里。
1. 这篇文章真正要解决的问题
先说一个我在社区里经常看到的现象。
很多人上手 RL 时,习惯于把问题抽象成一个 Gym 环境,定好状态和动作,调一下奖励函数,然后丢给 PPO 去跑。跑出来效果好,就说“RL 很强大”;跑不出来,就怀疑是“奖励没有设计好”,或者“超参数没调对”。
但控制工程师看到这套流程,会觉得非常危险。因为他们知道,一个反馈控制系统能不能稳定工作,不只是“目标函数设得好不好”的问题,还涉及系统可控性、可观性、采样周期、执行器饱和、时延、扰动抑制、稳态误差……这些东西,RL 社区里很少有人系统性地去讨论。
反过来,RL 研究者看控制理论,也会觉得头疼。LQR 虽然解析解漂亮,但需要精确的线性模型;MPC 能处理约束,但每一时刻都要在线求解优化问题;自适应控制能应对参数不确定性,但前提是对象结构已知。真实场景中,很多系统的物理模型根本写不出来,或者写出模型后参数误差大到无法使用。
于是两个群体经常相互否定。
但我认为,更准确的判断是:强化学习和控制理论不是两套对立的方法,而是同一个“闭环决策问题”在“模型是否已知”和“环境是否简单”两个维度上的不同解法。
- 当模型已知、维度不高、约束清晰时,控制理论几乎总是更优选择。它有稳定性保证、实时性强、可解释性好。
- 当模型未知、环境复杂、无法手工建模时,RL 可能是唯一可行的路径。它用数据代替微分方程,用策略网络代替显式控制器。
- 最理想的做法,是把两者结合:用控制理论保证底层的安全与稳定,用 RL 处理上层的高层决策和模型偏差。
这篇文章适合三类读者:
- 正在学习 RL,但感到算法像黑盒,想从底层理解“为什么 RL 能学习控制策略”的人。
- 有控制理论基础,想了解 RL 和自己知识体系之间联系的控制工程师。
- 打算把 RL 落地到真实机器人或工业系统,但担心训练发散、奖励难设计、安全无法保证的工程人员。
2. 核心概念与术语对照:RL 与控制理论说的是同一件事吗
如果你分别打开一本强化学习教材和一本最优控制教材,你会发现两者的章节结构几乎可以一一对应,只是名词不同。
先看最基础的框架。
| 强化学习术语 | 控制理论术语 | 含义 |
|---|---|---|
| 智能体(Agent) | 控制器(Controller) | 做决策的主体 |
| 环境(Environment) | 被控对象/过程(Plant) | 被控制的外部系统 |
| 状态 (s) | 状态 (x) | 系统当前的情况 |
| 动作 (a) | 控制输入 (u) | 施加给系统的信号 |
| 奖励函数 (r(s,a)) | 代价函数/目标函数 (J) | 对决策好坏的评价 |
| 策略 (\pi(a|s)) | 控制律 (u = K(x)) | 从状态到动作的映射 |
| 折扣因子 (\gamma) | 折扣/时间偏好 | 未来收益的权重 |
| 价值函数 (V(s)) | 值函数/最优值函数 | 从当前状态出发的期望收益 |
| 回报(Return) | 累积代价 | 一段时间的总收益 |
| 探索(Exploration) | 激励信号/扰动输入 | 试探未知信息 |
这个表格值得多看几遍。很多人学 RL 时以为自己在学“机器学习的一个分支”,但实际上,RL 的核心数学结构和最优控制几乎同构。
为什么这么说?
我们看最优控制里最经典的有限时域问题:给定系统动态
[ x_{k+1} = f(x_k, u_k) ]
选择一个控制序列 (u_0, u_1, \dots, u_{T-1}),最小化累积代价
[ J = \sum_{k=0}^{T-1} g(x_k, u_k) + \phi(x_T) ]
而在强化学习中,我们最大化累积折扣奖励
[ G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} ]
如果把奖励 (r) 看成负的代价 (g),把折扣因子 (\gamma) 看成对远期收益的衰减,这两个问题本质上都在解决同一件事:在动态系统上做序列决策,优化某个长期目标。
真正导致两者分道扬镳的核心,不是目标函数的形式,而是对环境动态 (f) 的假设。
- 最优控制假设 (f) 已知,或者至少已知结构。这样可以用解析方法、数值优化方法求解。
- 强化学习假设 (f) 未知,只能通过与环境的交互获得样本,用数据估计最优策略。
这就是 RL 被称为“无模型”时的真正含义——不是说系统不存在模型,而是决策者不假设自己知道模型。
3. 从控制理论视角看 RL:贝尔曼方程与动态规划其实是同一套东西
如果你学过最优控制,一定会记得贝尔曼最优性原理(Bellman's Principle of Optimality):一个最优策略的子策略,对于从中间状态出发的子问题也一定是最优的。
基于这个原理,可以写出离散时间最优控制的动态规划递归式:
[ V_k(x_k) = \min_{u_k} \left[ g(x_k, u_k) + V_{k+1}(x_{k+1}) \right] ]
而在强化学习中,我们写的是贝尔曼最优方程:
[ V^(s) = \max_a \left[ r(s,a) + \gamma V^(s') \right] ]
两个式子放在一起,你就能明白为什么我说它们是同一套思想:当前状态的价值,等于当前收益加上未来状态价值的折现,然后对动作取最优。
连续时间下的对应关系同样清晰。最优控制中有 HJB 方程:
[ 0 = \min_u \left[ g(x,u) + \nabla_x V(x) \cdot f(x,u) \right] ]
强化学习社区里很多人没有意识到,值迭代算法在连续状态空间下的极限形式,就是在求解 HJB 方程。策略迭代算法对应的则是策略评估加策略改进的交替过程,和最优控制里的策略迭代方法如出一辙。
这意味着什么?
如果你熟练掌握动态规划,你其实已经掌握了 RL 的骨架。RL 算法社区里那些看似新颖的改进,很多都是在动态规划框架上换一种“近似”方式:
- 值迭代 + 函数近似 = DQN 家族算法。
- 策略迭代 + 函数近似 = Actor-Critic 算法。
- 策略评估 + 蒙特卡洛采样 = 无模型预测。
- 策略改进 + 梯度上升 = 策略梯度算法。
理解这个关系非常重要,因为当你训练 RL 时遇到“值函数发散”或“策略振荡”的问题,本质上是在近似求解一个动态规划问题时引入了函数近似误差,而不是什么神秘魔法。
从控制理论角度,这给 RL 研究者一个很好的提醒:不要只在算法层面打补丁,要回到底层去看问题的结构。值函数为什么发散?因为贝尔曼算子是压缩映射,收敛性有保证;但当你用神经网络近似 (V) 时,这个压缩性质在函数空间中未必保持。于是你需要目标网络、经验回放这些工程技巧来让近似过程更稳定。
反过来,控制工程师看到 RL 的探索机制,也会觉得很眼熟。RL 中的探索(Exploration)实际上是在系统上施加激励信号,目的是收集数据来辨识系统。这和系统辨识理论里的“持续激励条件”(persistent excitation)是同一个概念:输入信号必须足够丰富,才能激发系统所有模式,才能学到可靠的模型或策略。
4. 从 RL 视角看控制:无模型方法真正改变了什么
前面的讨论容易让人产生一个误解:既然 RL 和最优控制这么像,是不是 RL 只是最优控制的一个退化版本?
不是。
RL 真正改变的东西,是切断了“先建模、后设计”的线性流程。
传统控制的设计流程是先建立被控对象的数学模型,然后用模型分析稳定性、可控性,最后设计控制器。这个流程的优点是理论成熟、可证明、可验证;缺点是建模这一步往往需要大量专业知识和实验成本,而且模型一旦不准确,后续所有设计都可能失效。
无模型 RL 则采用了一条完全不同的路径:直接通过闭环交互数据学习控制器,不显式建模。
它背后的假设是:只要我能收集足够的“状态-动作-奖励”样本,最优化过程本身可以隐含地捕捉系统的动态特性。
这种思路在控制系统非常复杂、无法解析建模时尤其有吸引力:
- 机器人足式运动:地面接触、柔性关节、摩擦特性都非常复杂,手工建模困难。
- 游戏和仿真环境:状态空间巨大,但可以用模拟器批量采样。
- 推荐系统/广告竞价:所谓“环境”本身就是用户行为,根本无法写出微分方程。
- 能源/电力调度:包含大量非线性、随机性和约束,精确模型难以维护。
所以正确的新视角是:RL 不是要取代控制理论,而是把控制理论的应用边界从“模型可知”扩展到了“模型未知但可交互”。
与此同时,RL 社区也正在从控制理论中吸取养分,来解决自身最头疼的问题。
第一个是稳定性。RL 训练出来的策略,一个常见问题是“看起来在训练集上表现很好,但换一个初始状态或一个扰动就完全崩溃”。这正是控制理论里鲁棒稳定性的问题。近年来出现的 Lyapunov-based RL、控制屏障函数(Control Barrier Function)与 RL 结合的方法,本质就是把“策略必须让系统渐近稳定”这条约束直接加入训练过程。
第二个是采样效率。无模型 RL 是出了名的“数据饥渴”。控制理论的视角会提醒你:如果系统动态结构部分已知,为什么要全部用数据去学?于是出现了“基于模型的 RL”(MBRL)和“混合控制+学习”方法:用已知物理规律建模已知部分,用神经网络学习未知残差,再用 MPC 做底层控制。这种方案在实际机器人项目中已经展现出远优于纯无模型 RL 的样本效率。
第三个是安全约束。最优控制里的约束 MPC 天然处理好状态和输入约束;RL 原生优化的是无约束奖励。但现实系统几乎都有执行器饱和、状态禁区、安全距离等限制。把 RL 与控制理论结合,常见的做法是分层架构:上层 RL 输出参考轨迹,底层安全控制器(CBF/MPC)确保约束不被突破。
可以说,控制理论和 RL 的结合正在从“互相嫌弃”走向“互相借用工具”。这可能是当前这个领域最有价值的方向之一。
5. 一个最小实例:用与 LQR 相同的代价函数做 Q-learning
讲了这么多理论联系,还是需要一个能验证理解的实例。
这里我们选一个足够简单的环境:一维线性系统加二次代价。传统上这类问题用 LQR 可以解析求解。我们故意不用 LQR 解析解,而是用 Q-learning 数值逼近,然后对比两者得到的控制器效果。这个对比能直观展示 RL 与最优控制在“同一问题”上的差异。
5.1 问题设定
考虑离散线性系统:
[ x_{k+1} = a x_k + b u_k + w_k ]
其中 (a=1.0),(b=0.5),(w_k) 是均值为零、方差很小的噪声。代价函数采用二次型:
[ J = \sum_k (q x_k^2 + r u_k^2) ]
取 (q=1.0),(r=0.1)。这是一个标准的一维 LQR 问题,最优反馈增益可以通过求解 Riccati 方程得到。
5.2 文件结构
我们先建立如下文件结构:
rl_control_demo/ ├── lqr_q_learning.py ├── compare_controller.py └── README.md5.3 离散 LQR 解析解(对照基准)
文件:lqr_q_learning.py
# 文件路径:rl_control_demo/lqr_q_learning.py import numpy as np def lqr_gain(a, b, q, r): """ 离散时间一维 LQR 最优反馈增益 x_{k+1} = a*x_k + b*u_k J = sum(q*x^2 + r*u^2) 返回 u = -K*x 中的 K """ p = q for _ in range(1000): # 代数 Riccati 方程迭代求解(一维) p_next = q + a * a * p - (a * b * p) ** 2 / (r + b * b * p) if abs(p_next - p) < 1e-12: p = p_next break p = p_next k = (a * b * p) / (r + b * b * p) return k if __name__ == "__main__": a, b, q, r = 1.0, 0.5, 1.0, 0.1 K = lqr_gain(a, b, q, r) print(f"LQR 最优增益 K = {K:.4f}")运行:
python lqr_q_learning.py预期输出:
LQR 最优增益 K = 2.7023这个 K 的含义是:控制器采取 (u_k = -2.7023 x_k) 时,代价 (J) 在已知线性模型下是最小的。
5.4 Q-learning 数值逼近
现在假设我们不知道 (a)、(b),只能通过与系统交互来学习。我们将状态离散化到区间 ([-3, 3]),动作离散到集合 ({-3.0, -1.5, 0.0, 1.5, 3.0})。
用 Q-learning 逼近最优值函数。
# 文件路径:rl_control_demo/lqr_q_learning.py (续) import numpy as np # 环境参数 A = 1.0 B = 0.5 Q = 1.0 R = 0.1 # 离散状态与动作 STATE_MIN, STATE_MAX = -3.0, 3.0 NUM_STATE_BINS = 21 state_bins = np.linspace(STATE_MIN, STATE_MAX, NUM_STATE_BINS) actions = np.array([-3.0, -1.5, 0.0, 1.5, 3.0]) # Q 表初始化 q_table = np.zeros((NUM_STATE_BINS, len(actions))) def state_to_index(s): return np.clip(np.digitize(s, state_bins) - 1, 0, NUM_STATE_BINS - 1) def reward(x, u): # 二次代价取负,变成奖励 return -(Q * x**2 + R * u**2) def step(x, u): noise = np.random.normal(0.0, 0.05) x_next = A * x + B * u + noise r = reward(x, u) return x_next, r # Q-learning 超参数 alpha = 0.1 gamma = 0.95 epsilon = 0.3 episodes = 2000 max_steps = 50 for ep in range(episodes): x = np.random.uniform(-2.0, 2.0) for t in range(max_steps): s_idx = state_to_index(x) if np.random.rand() < epsilon: a_idx = np.random.randint(len(actions)) else: a_idx = np.argmax(q_table[s_idx]) u = actions[a_idx] x_next, r = step(x, u) s_next_idx = state_to_index(x_next) # Q-learning 更新 td_target = r + gamma * np.max(q_table[s_next_idx]) q_table[s_idx, a_idx] += alpha * (td_target - q_table[s_idx, a_idx]) x = x_next # 从 Q 表提取策略 def learned_policy(x): s_idx = state_to_index(x) return actions[np.argmax(q_table[s_idx])] print("Q-learning 训练完成。") for x_test in [-2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0]: print(f"x={x_test:5.2f} -> u={learned_policy(x_test):6.2f}")运行后你会看到,学习到的策略在状态为负时输出正动作、状态为正时输出负动作,整体呈现“负反馈”趋势。虽然不是完美线性,但已经逼近 LQR 的行为模式。
5.5 对比验证:闭环响应
文件:compare_controller.py
# 文件路径:rl_control_demo/compare_controller.py import numpy as np from lqr_q_learning import lqr_gain, learned_policy, state_to_index, actions, q_table A, B, Q, R = 1.0, 0.5, 1.0, 0.1 K = lqr_gain(A, B, Q, R) # 模拟闭环,从 x=2 开始,看状态是否快速收敛到 0 def simulate(controller, steps=10, x0=2.0): x = x0 traj = [x] for _ in range(steps): if controller == "lqr": u = -K * x else: u = learned_policy(x) x = A * x + B * u traj.append(x) return traj lqr_traj = simulate("lqr") rl_traj = simulate("rl") print("步数 LQR状态 RL状态") for t, (x_lqr, x_rl) in enumerate(zip(lqr_traj, rl_traj)): print(f"{t:4d} {x_lqr:8.4f} {x_rl:8.4f}")预期结果中,LQR 因为是在精确模型上求得的解析最优,收敛更快;Q-learning 因为离散化误差和训练不充分,收敛稍慢但最终也能把状态拉回零点附近。这个差异恰恰说明了 RL 与最优控制的核心区别:一个用模型换最优性,一个用数据换通用性。
判断训练是否成功的标准很简单:看闭环轨迹是否单调收敛到 0,且没有发散振荡。如果 Q-learning 训练后还出现持续振荡,通常原因是状态离散化太粗、动作集合过密或过疏、学习率过高。
6. 真实工程中的落地:ROS 2 Control 与 RL 的结合方式
从玩具例子里得到的结论不能直接搬到真实系统。真实控制系统的实现还面临采样周期、消息通信、安全保护、故障切换等问题。
这里以 ROS 2 Control 为例,说明 RL 策略如何嵌入一个标准机器人控制系统。ROS 2 Control 是 ROS 2 生态中的一个控制器管理框架,负责管理底层控制器、硬件接口和实时控制循环。它的核心是controller_manager,可以加载多个 controller,每个 controller 通过CommandInterface和StateInterface读写硬件资源。
要把 RL 策略放进去,通常有两种接入方式。
第一种是“代理方式”,用 RL 生成控制命令,但底层仍然保留安全保护控制器。在 ROS 2 Control 中,你可以把 RL 写成一个 controller,与其他 controller 同时加载,通过state_interfaces获取关节状态,通过command_interfaces输出关节力矩或速度指令。这样做的优点是实时性可控,因为 RL 推理仍然在 deterministic 的计算图中。
下面是一个 controller 配置片段:
# 文件路径:rl_controller_config.yaml controller_manager: ros__parameters: update_rate: 100 # 控制周期 100Hz rl_joint_controller: type: rl_controllers/RLJointController ros__parameters: joints: - joint1 - joint2 state_interfaces: - position - velocity command_interfaces: - effort policy_path: /path/to/policy.pth safety_velocity_limit: 0.5 safety_torque_limit: 5.0 # 如果超出安全限制,则切换到 fallback 控制器 enable_safety_fallback: true fallback_controller: effort_controllers/JointGroupEffortController这里关键的设计是enable_safety_fallback。真实系统中,RL 策略的输出不应直接作用在硬件上,而是经过一个安全层校验。这个安全层可以是简单的速度/力矩限幅,也可以是更严格的 CBF 约束。一旦 RL 输出超出安全范围,控制器管理节点就切换到备用控制器,避免机器人损坏。
第二种方式是“高层规划 + 底层 MPC/PID”。RL 不看原始关节状态,而是接收上层目标(比如里程计目标、视觉特征),输出底层控制器的参考信号。这个分层结构和传统的“规划 + 跟踪控制”架构完全一致,只是把上层规划从规则/优化方法换成了 RL 策略。
实际项目中更推荐第二种方式。原因很简单:底层动力学控制对实时性和稳定性要求极高,无模型 RL 直接输出高频力矩,极易在仿真到现实迁移(Sim-to-Real)时因为模型差异而失败。底层保留 MPC/PID,可以确保至少局部稳定;RL 负责处理高层决策的不确定性和复杂性,这正好发挥它的优势。
7. 常见问题与排查思路
以下问题是我认为 RL 应用于控制任务时最常遇到的,整理成排查表。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 训练时奖励一直很低,不增长 | 奖励信号过于稀疏,智能体无法获得有效学习信号 | 绘制奖励曲线和 td-error 曲线,检查是否出现常量区域 | 设计密集奖励或使用奖励塑形,但不能过度改变最优策略 |
| 状态值发散到极大值 | 近似值与贝尔曼迭代不兼容,函数逼近误差被放大 | 查看 Q 值曲线是否单调爆炸 | 增加目标网络更新周期,降低学习率,考虑使用双 Q 网络 |
| 策略在训练末期出现振荡 | 学习率过高或策略改进步长过大 | 查看策略输出的均值和方差曲线 | 降低学习率,增大 batch size,引入梯度裁剪 |
| 仿真里效果好,真机上完全不行 | 仿真与真实环境的模型误差、时延、执行器特性差异 | 对比仿真和真机在相同输入下的响应 | 系统辨识校正仿真参数;加入随机化;先用底层 PID/MPC 兜底,RL 只做上层决策 |
| 控制频率太高,RL 推理跟不上 | 神经网络推理耗时超过控制周期 | 统计单次推理耗时 | 减小网络结构,使用 TensorRT/AutoML 加速,或降低 RL 控制频率并让底层控制器平滑插值 |
| 出现瞬时冲击力矩 | 动作输出跳变过大 | 记录 action 曲线,看是否存在尖峰 | 对动作增量做限幅,或在奖励中加入动作变化率惩罚项 |
| 系统不稳定但奖励没有明显下降 | 奖励函数没有惩罚危险状态 | 观察状态轨迹是否发散 | 增加状态安全边界惩罚,或引入安全层强制校正 |
这里的核心排查思路是:请先确认你的 RL 问题被正确建模了,再谈算法调参。很多“训练失败”并不是 PPO 或 SAC 的问题,而是状态表示没有包含足够信息、动作空间定义不合理、奖励函数引导错误。
举例来说,如果你训练一个机器人站立任务,状态只给关节角度不给关节角速度,那么马尔可夫性就不满足——智能体无法仅从当前状态判断系统运动趋势,训练自然失败。控制工程师一眼就能看出这对应“状态不可观”,RL 社区有时却会反复调参而忽略了问题根源。
所以在设计 RL 控制系统时,先像控制工程师一样检查:
- 状态是否包含足够信息来预测系统下一步变化?
- 动作空间是否覆盖了实际可执行的控制输入?
- 采样周期与控制周期是否匹配?
- 奖励函数是否连续、可区分、且不与安全约束冲突?
- 是否存在环境时延?时延是否已在状态中建模?
8. 最佳实践与工程建议
基于上面的分析,我给出几条实际工程中值得固化的建议。
8.1 从“已知部分建模,未知部分学习”开始
不要把问题一股脑丢给无模型 RL。对你的系统做一个结构化分析:
- 哪些动态可以用物理方程近似?
- 哪些参数不确定?
- 哪些动态完全未知?
正确做法是搭建一个“灰盒”模型:已知物理结构写成方程,未知残差用神经网络拟合,然后基于这个模型做训练和规划。这种思路比纯无模型 RL 样本效率高一个数量级,也比纯机理建模更贴近真实系统。
8.2 先保证安全性,再追求性能
真实系统里,安全约束是第一条准则。RL 策略在训练过程中会不断试探边界,这在仿真环境里无所谓,在真实系统上可能导致事故。
推荐的分层架构:
- 底层:PID/MPC 或 CBF,保证状态约束和执行器安全。
- 上层:RL 策略输出参考值/目标值,不直接作用在危险执行器上。
- 监控层:实时监控状态是否接近安全边界,一旦触发就切换到备份控制。
8.3 用控制指标评价 RL 策略,而不是只看奖励
RL 训练时通常用 reward 作为优化目标,但工程验收时应该用控制指标:上升时间、超调量、稳态误差、扰动抑制能力、鲁棒性。奖励函数只是中间媒介,不是最终目标。因此建议在训练环境中同时记录这些控制指标,每 N 个 episode 计算一次并打印。
# 示例:记录控制指标 def evaluate_control_metrics(controller, env, episodes=10): overshoots = [] settling_times = [] steady_errors = [] for _ in range(episodes): obs = env.reset() done = False peak = 0.0 steady_error = None while not done: action = controller(obs) obs, reward, done, info = env.step(action) peak = max(peak, abs(obs)) steady_error = abs(obs) overshoots.append(max(0.0, peak - env.goal)) settling_times.append(env.t) steady_errors.append(steady_error) return { "mean_overshoot": np.mean(overshoots), "mean_settling_time": np.mean(settling_times), "mean_steady_error": np.mean(steady_errors), }8.4 控制随机种子和评估协议
RL 训练随机性很大。实验时固定每个环境的随机种子会影响结果可复现性,但更重要的是一套固定的评估协议:每次评估用相同初始状态集合、相同扰动模式、相同随机噪声。不要让“碰巧某次训练效果好”成为结论,用多随机种子取中位数或均值。
8.5 重视延时的建模
真实系统中,从传感器采集到执行器输出必然存在时延。很多 RL 策略在仿真中表现优异,一上真机就振,核心原因之一就是仿真没有建模时延。建议在仿真环境中加入固定或随机时延,让策略学会对延迟状态做出应对。控制理论中的 Smith 预测器和状态观测器思想,在这里非常值得借鉴。
9. 总结与后续学习方向
这篇文章从头到尾在讲一件事:强化学习与控制理论不是两个互不相干的领域,而是同一个闭环决策问题在不同假设下的两种解法。
从数学结构看,动态规划和贝尔曼方程把两者连在了一起;从应用场景看,模型已知时控制理论更优,模型未知时 RL 提供了一条新路径;从工程实践看,分层结合、安全兜底、灰盒建模,是把 RL 落地到真实控制系统的可行方案。
如果你想把这条学习路径继续走下去,我建议按下面顺序延伸:
- 掌握经典最优控制:LQR、MPC、动态规划、HJB 方程。这是理解 RL 理论基础的捷径。
- 学习无模型 RL 骨干算法:DQN、PPO、SAC、TD3,重点关注它们与动态规划的关系。
- 研究基于模型的 RL(MBRL),理解为什么在控制任务中,稍微利用一点模型信息就能极大提升样本效率。
- 关注稳定性与安全性的交叉方向:Lyapunov-based RL、控制屏障函数、鲁棒 RL。
- 在仿真环境(如 MuJoCo、Isaac Gym)中练习,再逐步迁移到真实系统。
坚持这条路线最大的收获,是你不会再被算法名词困住。当你看到一个新发表的 RL 算法时,第一反应不是“这又是个新 trick”,而是“它改的是策略评估、策略改进,还是探索机制?它在控制理论里对应的改动是什么?”——到这个层面,你离真正掌握这个领域就不远了。
建议收藏这篇文章,碰到实际项目里“奖励不涨”“策略震荡”“仿真到现实失败”这些问题时,再回来对照第 7 节的排查表过一遍。