用强化学习做最优控制,本质上是在模型信息不完全的情况下,通过数据学习一个最优策略。Policy Iteration (PI) 的前提是必须先有一个 admissible policy 来启动迭代。但求解 admissible policy 本身需要模型信息——形成循环依赖。
什么是 Admissible Policy?
给定广义代价函数 $$ J(x_0) = \int_0^\infty \left[ Q(x) + u^T R(x) u \right] dt $$ 称 $u(x)$ 是 admissible 的,当且仅当:对任意初始状态 $x_0$,$J(x_0)$ 有限,且系统状态被驱动到原点。
对原始系统动态方程做同伦变换,人为引入阻尼项:
$$ \underbrace{\dot{x} = f(x) + g(x)u}_{\text{原始系统}} \quad\longrightarrow\quad \underbrace{\dot{x} = f(x) - L_i x + g(x)u_i(x)}_{\text{同伦系统}} $$加上 $-L_i x$ 之后,即使 $u = 0$(零控制),系统也是稳定的。$u=0$ 天然就是 admissible 的,PI 可以直接启动。然后逐步减小 $L_i$,让同伦系统逼近原始系统。当 $L_i$ 归零时,得到原系统下的 admissible 策略。
关键点
同伦项 $-L_i x$ 是人工阻尼让系统自治稳定,不是去「抵消」未知动态 $f,g$。$f,g$ 的未知性通过 off-policy 积分消除 + 深度神经网络逼近来绕过。
Policy Iteration
- 策略评估
给定 $u_i^0$,求解 $V_i^0$($V_i^0(0)=0$): $$ 0 = \left( \frac{\partial V_i^0}{\partial x} \right)^T \bigl( f + g u_i^0 \bigr) + Q + (u_i^0)^T R u_i^0 \tag{8} $$- 策略改进
$$ u_{i+1}^0(x) = -\frac{1}{2} R^{-1} g^T \frac{\partial V_i^0}{\partial x} \tag{9} $$
PI 保证 $V_{i+1}^0(x) \le V_i^0(x)$,收敛到最优解。前提:$u_0^0$ 必须是 admissible 的。
Definition 2 (Lipschitz Admissibility)
零控制 $u=0$ 是 Lipschitz admissible 的,如果存在 $L$ 使得 $\dot{x} = f(x) - Lx + g(x)u$ 渐近稳定。充分条件:$L > L_f$。
收敛性保证
- $u_{i+1}$ 在同伦系统下是 admissible 的。
- 若 $(\frac{\partial V_i}{\partial x})^T x \ge \beta V_i(x)$,有限步内 $L_i = 0$。
将系统重写为:$\dot{x} = \underbrace{f - L_i x + g u_i}_{\text{同伦系统}} \;+\; L_i x + g v_i \tag{18}$,其中 $v_i = u - u_i$ 是实际执行的 control(PE + 旧策略)与目标策略的偏差。
沿轨迹积分消去 $f,g$:
$$ V_i(x(t_{k+1})) - V_i(x(t_k)) - \int_{t_k}^{t_{k+1}} \left(\frac{\partial V_i}{\partial x}\right)^T L_i x\,dt = -\int_{t_k}^{t_{k+1}} \Bigl[ Q + u_i^T R u_i + 2u_{i+1}^T R v_i \Bigr] dt \tag{20} $$为什么能绕过 $f$ 和 $g$?
$f,g$ 被 $V_i(x(t_{k+1})) - V_i(x(t_k))$ 隐式替代,等式仅含状态采样和待求函数。
本实现用深度神经网络替代多项式基函数,彻底规避多项式带来的多重共线性问题(原多项式 cond(A) ~ 1e9,矩阵奇异)。
CriticNN — 值函数 $V(x) \ge 0$
Linear(2, 32, bias=False) → Tanh Linear(32, 32, bias=False) → Tanh Linear(32, 2, bias=False) # 原始输出 z₁, z₂ V(x) = z₁(x)² + z₂(x)² # 结构保证 V≥0, V(0)=0bias=False全程保证 $V(0)=0$(结构保证)。两个输出头使原点 Hessian 可达 rank-2。
ActorNN — 策略 $u(x): \mathbb{R}^2 \to \mathbb{R}$
Linear(2, 32, bias=True) → Tanh Linear(32, 32, bias=True) → Tanh Linear(32, 1, bias=True) # 有符号控制输出
Critic Loss — Bellman 残差
$$ \text{Loss}_C = \mathbb{E}\left[ \left( \Delta V_k - \textstyle\int \nabla V \cdot (Lx)dt + \textstyle\int (Q + R\hat{u}^2)dt + \textstyle\int 2R\hat{u}_{\text{new}} v\,dt \right)^2 \right] $$ Actor 输出被.detach(),梯度仅流向 Critic。
Actor Loss — 最优策略回归
$$ \text{Loss}_A = \mathbb{E}\left[ \left( u_{\text{NN}}(x) - \left(-\frac{1}{2}R^{-1}g^T(x)\nabla V(x)\right) \right)^2 \right] $$ 对倒立摆 ($J=1, R=1$):$u^* = -0.5 \cdot \partial V / \partial x_2$
Critic 梯度被.detach(),梯度仅流向 Actor。两个网络各有独立 Adam 优化器。
为什么解耦?
原论文用线性系统 $A\theta = b$ 联合求解 Critic 和 Actor 权重。对于 NN,联合训练 Bellman 残差会导致 Actor 梯度通过积分项传播,噪声大且不稳定。解耦后 Actor 直接学习最优控制律 $u^* = -(1/2)R^{-1}g^T\nabla V$(策略改进公式 13),训练稳定且收敛快。
Algorithm 1:完整执行流程
- Phase One — 寻找 L₀
- 用 $u =$ PE 信号(零策略)采集一条轨迹
- 扫描所有 $L \in [L_{\text{start}}, L_{\text{max}}]$,每个 L 训练独立 trainer
- 选取 Bellman 残差最低 的 L(而非第一个正定的 L)
- Critic 必须通过正定性检验:Hessian at origin PD + $V(x) \ge 0$ on trajectory
- Phase Two — 同伦收缩至 $L=0$
- 用当前策略 + PE 采集新轨迹
- 解耦训练:Critic 极小化 Bellman 残差,Actor 回归最优控制律
- 用 safety constraint (14) 计算步长 $\alpha$,$L \leftarrow \max(0, L - \alpha)$
- PD 不通过 → 回退到 best weights;连续拒绝 > 15 次 → 提前终止
- Phase Three — 标准 PI($L=0$)
- 设 $L = 0$,用 Phase Two 策略作初始
- 交替 Critic 评估 + Actor 改进,直到 loss 收敛
- 输出 $u^*(x)$ 和 $V^*(x)$
| 模块 | 文件 | 职责 |
|---|---|---|
| NN 模型 | hpi/nn_models.py |
CriticNN, ActorNN, compute_q, check_positive_definite, check_lyapunov_decrease |
| 训练器 | hpi/nn_trainer.py |
NNTrainer: 解耦 Critic/Actor 损失 + Adam 优化 |
| 控制器 | hpi/hpi_controller.py |
三阶段 HPI 主循环 + safety constraint |
| 数据采集 | hpi/data_collector.py |
倒立摆仿真 + PE 信号生成 |