深度学习驱动的控制方法详解(九):神经网络自适应控制

系列导读:本篇讲解神经网络自适应控制,结合神经网络的逼近能力与自适应控制的稳定性保证。


1. 引言:稳定性优先的学习控制

前面章节介绍的深度强化学习方法强大但存在关键问题:无法保证闭环稳定性

对于安全攸关系统(航空航天、医疗机器人等),这是不可接受的。

神经网络自适应控制(NN-based Adaptive Control)提供了一条融合学习与稳定性的路径:

神经网络 ⏟ 逼近未知动力学 + Lyapunov设计 ⏟ 保证稳定性 = 可靠的学习控制 \underbrace{\text{神经网络}}_{\text{逼近未知动力学}} + \underbrace{\text{Lyapunov设计}}_{\text{保证稳定性}} = \text{可靠的学习控制} 逼近未知动力学 神经网络+保证稳定性 Lyapunov设计=可靠的学习控制


2. 自适应控制基础

2.1 问题设定

考虑非线性系统:

x ˙ = f ( x ) + g ( x ) u + Δ ( x ) \dot{x} = f(x) + g(x)u + \Delta(x) x˙=f(x)+g(x)u+Δ(x)

其中:

  • f ( x ) , g ( x ) f(x), g(x) f(x),g(x):已知的标称动力学
  • Δ ( x ) \Delta(x) Δ(x)未知的不确定性/扰动
  • u u u:控制输入

目标:设计控制器使系统输出跟踪参考信号 y d ( t ) y_d(t) yd(t)

2.2 模型参考自适应控制(MRAC)

经典MRAC设计参考模型:

x ˙ m = A m x m + B m r \dot{x}_m = A_m x_m + B_m r x˙m=Amxm+Bmr

控制律:

u = θ ^ T ϕ ( x ) + k r u = \hat{\theta}^T \phi(x) + k r u=θ^Tϕ(x)+kr

自适应律:

θ ^ ˙ = − Γ ϕ ( x ) e T P B \dot{\hat{\theta}} = -\Gamma \phi(x) e^T P B θ^˙=Γϕ(x)eTPB

问题 ϕ ( x ) \phi(x) ϕ(x) 需要人工选择,且线性参数化假设可能不成立。

2.3 神经网络的角色

用神经网络逼近未知函数 Δ ( x ) \Delta(x) Δ(x)

Δ ( x ) = W ∗ T ϕ ( x ) + ϵ ( x ) \Delta(x) = W^{*T} \phi(x) + \epsilon(x) Δ(x)=WTϕ(x)+ϵ(x)

其中:

  • W ∗ W^* W:理想权重(未知)
  • ϕ ( x ) \phi(x) ϕ(x):神经网络基函数(自动学习的特征)
  • ϵ ( x ) \epsilon(x) ϵ(x):逼近误差(有界)

3. 神经网络自适应控制设计

3.1 基本架构

参考信号 r

参考模型

期望轨迹 x_d

实际状态 x

误差 e = x - x_d

神经网络
NN(x; W)

不确定性估计
Δ_hat

基线控制器
u_baseline

补偿控制
u_ad

总控制
u = u_baseline + u_ad

被控系统

3.2 控制律设计

总控制律由两部分组成:

u = u b l ( x , x d ) + u a d ( x , W ^ ) u = u_{bl}(x, x_d) + u_{ad}(x, \hat{W}) u=ubl(x,xd)+uad(x,W^)

基线控制器(假设无不确定性):

u b l = g ( x ) − 1 ( − f ( x ) + x ˙ d − K e ) u_{bl} = g(x)^{-1} \left( -f(x) + \dot{x}_d - K e \right) ubl=g(x)1(f(x)+x˙dKe)

其中 K > 0 K > 0 K>0 是反馈增益。

自适应补偿(神经网络):

u a d = − g ( x ) − 1 W ^ T ϕ ( x ) u_{ad} = -g(x)^{-1} \hat{W}^T \phi(x) uad=g(x)1W^Tϕ(x)

3.3 自适应律推导

基于Lyapunov稳定性理论设计自适应律。

选择Lyapunov函数

V = 1 2 e T P e + 1 2 tr ( W ~ T Γ − 1 W ~ ) V = \frac{1}{2} e^T P e + \frac{1}{2} \text{tr}(\tilde{W}^T \Gamma^{-1} \tilde{W}) V=21eTPe+21tr(W~TΓ1W~)

其中 W ~ = W ∗ − W ^ \tilde{W} = W^* - \hat{W} W~=WW^ 是权重估计误差, Γ > 0 \Gamma > 0 Γ>0 是自适应增益矩阵。

求导

V ˙ = e T P e ˙ − tr ( W ~ T Γ − 1 W ^ ˙ ) \dot{V} = e^T P \dot{e} - \text{tr}(\tilde{W}^T \Gamma^{-1} \dot{\hat{W}}) V˙=eTPe˙tr(W~TΓ1W^˙)

代入闭环动力学后,选择:

W ^ ˙ = Γ ϕ ( x ) e T P B \dot{\hat{W}} = \Gamma \phi(x) e^T P B W^˙=Γϕ(x)eTPB

可使 V ˙ ≤ 0 \dot{V} \leq 0 V˙0,保证稳定性。


4. Lyapunov稳定性分析

4.1 稳定性定理

定理:对于系统

x ˙ = f ( x ) + g ( x ) u + W ∗ T ϕ ( x ) + ϵ ( x ) \dot{x} = f(x) + g(x)u + W^{*T}\phi(x) + \epsilon(x) x˙=f(x)+g(x)u+WTϕ(x)+ϵ(x)

采用控制律 u = u b l + u a d u = u_{bl} + u_{ad} u=ubl+uad 和自适应律 W ^ ˙ = Γ ϕ ( x ) e T P B \dot{\hat{W}} = \Gamma \phi(x) e^T P B W^˙=Γϕ(x)eTPB,则:

  1. 误差 e ( t ) e(t) e(t) 一致最终有界(UUB)
  2. 权重估计 W ^ \hat{W} W^ 有界
  3. 如果 ϵ ( x ) \epsilon(x) ϵ(x) 充分小,误差可任意小

4.2 证明要点

Lyapunov函数导数:

V ˙ = − e T Q e + e T P B ϵ ( x ) \dot{V} = -e^T Q e + e^T P B \epsilon(x) V˙=eTQe+eTPBϵ(x)

其中 Q = − P A − A T P > 0 Q = -PA - A^T P > 0 Q=PAATP>0

利用Young不等式:

e T P B ϵ ≤ 1 2 e T P B B T P e + 1 2 ϵ ˉ 2 e^T P B \epsilon \leq \frac{1}{2} e^T P B B^T P e + \frac{1}{2} \bar{\epsilon}^2 eTPBϵ21eTPBBTPe+21ϵˉ2

最终得到:

V ˙ ≤ − λ m i n ( Q ) ∥ e ∥ 2 + 1 2 ϵ ˉ 2 \dot{V} \leq -\lambda_{min}(Q) \|e\|^2 + \frac{1}{2} \bar{\epsilon}^2 V˙λmin(Q)e2+21ϵˉ2

∥ e ∥ > ϵ ˉ 2 λ m i n ( Q ) \|e\| > \frac{\bar{\epsilon}}{\sqrt{2\lambda_{min}(Q)}} e>2λmin(Q) ϵˉ 时, V ˙ < 0 \dot{V} < 0 V˙<0

4.3 σ-修正与e-修正

防止参数漂移的修正技术:

σ-修正

W ^ ˙ = Γ ϕ ( x ) e T P B − σ W ^ \dot{\hat{W}} = \Gamma \phi(x) e^T P B - \sigma \hat{W} W^˙=Γϕ(x)eTPBσW^

e-修正(死区):

W ^ ˙ = { Γ ϕ ( x ) e T P B if  ∥ e ∥ > e 0 0 otherwise \dot{\hat{W}} = \begin{cases} \Gamma \phi(x) e^T P B & \text{if } \|e\| > e_0 \\ 0 & \text{otherwise} \end{cases} W^˙={Γϕ(x)eTPB0if e>e0otherwise


5. 径向基函数网络(RBFNN)

5.1 为什么用RBF?

RBF网络在自适应控制中特别流行:

优点 说明
局部逼近 激活函数有紧支撑
结构简单 单隐层即可
理论成熟 逼近误差分析完善
计算高效 参数更新简单

5.2 RBF网络结构

Δ ^ ( x ) = ∑ i = 1 N w i ϕ i ( x ) = W T Φ ( x ) \hat{\Delta}(x) = \sum_{i=1}^{N} w_i \phi_i(x) = W^T \Phi(x) Δ^(x)=i=1Nwiϕi(x)=WTΦ(x)

高斯基函数

ϕ i ( x ) = exp ⁡ ( − ∥ x − c i ∥ 2 2 σ i 2 ) \phi_i(x) = \exp\left( -\frac{\|x - c_i\|^2}{2\sigma_i^2} \right) ϕi(x)=exp(2σi2xci2)

5.3 PyTorch实现

import torch
import torch.nn as nn

class RBFNetwork(nn.Module):
    """径向基函数网络"""
    def __init__(self, input_dim, num_centers, output_dim):
        super().__init__()
        self.num_centers = num_centers

        # RBF中心(可学习或固定)
        self.centers = nn.Parameter(
            torch.randn(num_centers, input_dim) * 0.5
        )

        # 宽度参数
        self.log_sigmas = nn.Parameter(
            torch.zeros(num_centers)
        )

        # 输出权重
        self.weights = nn.Parameter(
            torch.zeros(num_centers, output_dim)
        )

    def rbf(self, x):
        """计算RBF激活"""
        # x: [B, D], centers: [N, D]
        # 计算距离
        diff = x.unsqueeze(1) - self.centers.unsqueeze(0)  # [B, N, D]
        dist_sq = (diff ** 2).sum(dim=-1)  # [B, N]

        # 高斯激活
        sigmas = torch.exp(self.log_sigmas)
        phi = torch.exp(-dist_sq / (2 * sigmas ** 2))  # [B, N]
        return phi

    def forward(self, x):
        phi = self.rbf(x)
        output = phi @ self.weights  # [B, O]
        return output

    def get_phi(self, x):
        """返回基函数值(用于自适应律)"""
        return self.rbf(x)

class NNAdaptiveController:
    """神经网络自适应控制器"""
    def __init__(self, state_dim, control_dim, num_centers=50,
                 gamma=1.0, sigma=0.01):
        self.nn = RBFNetwork(state_dim, num_centers, control_dim)
        self.gamma = gamma  # 自适应增益
        self.sigma = sigma  # σ-修正系数

        # 控制增益
        self.K = torch.eye(state_dim) * 5.0

    def compute_control(self, x, x_d, x_d_dot, f_x, g_x):
        """计算控制输入"""
        # 跟踪误差
        e = x - x_d

        # 基线控制(反馈线性化)
        g_inv = torch.inverse(g_x)
        u_bl = g_inv @ (-f_x + x_d_dot - self.K @ e)

        # 自适应补偿
        delta_hat = self.nn(x.unsqueeze(0)).squeeze(0)
        u_ad = -g_inv @ delta_hat

        return u_bl + u_ad, e

    def update_weights(self, x, e, P, B):
        """更新神经网络权重(自适应律)"""
        phi = self.nn.get_phi(x.unsqueeze(0)).squeeze(0)  # [N]

        # 梯度方向
        grad = torch.outer(phi, e @ P @ B)  # [N, O]

        # σ-修正
        with torch.no_grad():
            self.nn.weights.data += self.gamma * grad
            self.nn.weights.data -= self.sigma * self.nn.weights.data

6. 深度神经网络自适应控制

6.1 深度网络的挑战

使用深度网络代替RBF带来新挑战:

  1. 非凸优化:权重更新不能用简单自适应律
  2. 稳定性分析:Lyapunov分析更复杂
  3. 在线学习:需要防止灾难性遗忘

6.2 分层方法

方法1:仅更新输出层

固定特征提取层,仅在线更新最后一层:

class DeepAdaptiveController:
    """深度自适应控制器(输出层自适应)"""
    def __init__(self, state_dim, control_dim):
        # 预训练的特征提取器(固定)
        self.feature_extractor = nn.Sequential(
            nn.Linear(state_dim, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU()
        )
        for param in self.feature_extractor.parameters():
            param.requires_grad = False

        # 自适应输出层
        self.output_weights = torch.zeros(64, control_dim)
        self.gamma = 1.0

    def forward(self, x):
        with torch.no_grad():
            features = self.feature_extractor(x)
        return features @ self.output_weights

    def adapt(self, x, e, P, B):
        with torch.no_grad():
            features = self.feature_extractor(x)

        # 类似RBF的自适应律
        grad = torch.outer(features.squeeze(), e @ P @ B)
        self.output_weights += self.gamma * grad

6.3 复合学习

复合学习结合跟踪误差和预测误差:

W ^ ˙ = Γ ( ϕ e T P B + k p ϕ Δ ~ T ) \dot{\hat{W}} = \Gamma \left( \phi e^T P B + k_p \phi \tilde{\Delta}^T \right) W^˙=Γ(ϕeTPB+kpϕΔ~T)

其中 Δ ~ = Δ − Δ ^ \tilde{\Delta} = \Delta - \hat{\Delta} Δ~=ΔΔ^ 是预测误差。


7. 神经网络反步控制

7.1 反步法(Backstepping)

反步法是处理严格反馈系统的经典方法:

x ˙ 1 = x 2 + f 1 ( x 1 ) x ˙ 2 = x 3 + f 2 ( x 1 , x 2 ) ⋮ x ˙ n = u + f n ( x ) \begin{aligned} \dot{x}_1 &= x_2 + f_1(x_1) \\ \dot{x}_2 &= x_3 + f_2(x_1, x_2) \\ &\vdots \\ \dot{x}_n &= u + f_n(x) \end{aligned} x˙1x˙2x˙n=x2+f1(x1)=x3+f2(x1,x2)=u+fn(x)

7.2 神经网络增强反步

用神经网络逼近未知函数 f i f_i fi

class NNBacksteppingController:
    """神经网络反步控制器"""
    def __init__(self, n_states):
        self.n = n_states
        self.nns = [RBFNetwork(i+1, 30, 1) for i in range(n_states)]
        self.K = [2.0] * n_states  # 控制增益

    def compute_control(self, x, x_d, dt):
        """反步控制律计算"""
        alpha = []  # 虚拟控制
        z = []      # 误差变量

        # 第一步
        z.append(x[0] - x_d)
        f1_hat = self.nns[0](x[0:1].unsqueeze(0)).squeeze()
        alpha.append(-self.K[0] * z[0] - f1_hat)

        # 递推步骤
        for i in range(1, self.n):
            z.append(x[i] - alpha[i-1])

            # 神经网络估计
            fi_hat = self.nns[i](x[:i+1].unsqueeze(0)).squeeze()

            # 虚拟控制
            alpha_dot_prev = self._compute_alpha_dot(alpha[i-1], x, i-1, dt)
            alpha.append(-self.K[i] * z[i] - z[i-1] - fi_hat + alpha_dot_prev)

        # 最终控制
        u = alpha[-1]
        return u, z

8. 稳定性保证的强化学习

8.1 Lyapunov约束强化学习

将Lyapunov稳定性作为约束嵌入RL:

max ⁡ π J ( π ) s.t. V ˙ ( x , π ( x ) ) ≤ − α V ( x ) , ∀ x \max_\pi J(\pi) \quad \text{s.t.} \quad \dot{V}(x, \pi(x)) \leq -\alpha V(x), \forall x πmaxJ(π)s.t.V˙(x,π(x))αV(x),x

8.2 神经Lyapunov函数

学习Lyapunov函数本身:

class NeuralLyapunov(nn.Module):
    """神经Lyapunov函数"""
    def __init__(self, state_dim, hidden_dim=64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, 1)
        )

    def forward(self, x):
        # 确保正定:V(0) = 0, V(x) > 0 for x ≠ 0
        phi = self.net(x)
        V = phi ** 2 + 1e-6 * (x ** 2).sum(dim=-1, keepdim=True)
        return V

    def gradient(self, x):
        """计算梯度 ∇V"""
        x.requires_grad_(True)
        V = self.forward(x)
        grad = torch.autograd.grad(V.sum(), x, create_graph=True)[0]
        return grad

def lyapunov_loss(lyap_net, dynamics, policy, states):
    """Lyapunov稳定性损失"""
    V = lyap_net(states)
    grad_V = lyap_net.gradient(states)

    # 闭环动力学
    actions = policy(states)
    x_dot = dynamics(states, actions)

    # Lyapunov导数
    V_dot = (grad_V * x_dot).sum(dim=-1, keepdim=True)

    # 损失:希望 V_dot < 0
    loss = torch.relu(V_dot + 0.1 * V).mean()

    return loss

9. 实际应用案例

9.1 机械臂轨迹跟踪

class RobotArmAdaptiveControl:
    """机械臂自适应控制"""
    def __init__(self, n_joints=2):
        self.n = n_joints
        self.nn = RBFNetwork(2*n_joints, 100, n_joints)

        # 已知的惯性矩阵和科氏矩阵(标称值)
        self.M_nominal = np.eye(n_joints)
        self.C_nominal = np.zeros((n_joints, n_joints))

        # 控制增益
        self.Kp = np.diag([100, 100])
        self.Kd = np.diag([20, 20])

    def control(self, q, q_dot, q_d, q_d_dot, q_d_ddot):
        """计算关节力矩"""
        # 跟踪误差
        e = q_d - q
        e_dot = q_d_dot - q_dot

        # PD控制(基线)
        tau_pd = self.Kp @ e + self.Kd @ e_dot

        # 标称前馈
        tau_ff = self.M_nominal @ q_d_ddot + self.C_nominal @ q_d_dot

        # 神经网络补偿
        state = np.concatenate([q, q_dot])
        delta_hat = self.nn(torch.FloatTensor(state)).detach().numpy()

        # 总控制
        tau = tau_pd + tau_ff + delta_hat
        return tau

9.2 四旋翼姿态控制

class QuadrotorAdaptiveAttitude:
    """四旋翼自适应姿态控制"""
    def __init__(self):
        # 标称惯量
        self.J_nominal = np.diag([0.01, 0.01, 0.02])

        # 自适应神经网络(补偿气动干扰等)
        self.nn = RBFNetwork(input_dim=6, num_centers=50, output_dim=3)

        # 控制增益
        self.K_att = np.diag([5, 5, 2])
        self.K_rate = np.diag([1, 1, 0.5])

    def control(self, attitude, angular_rate, att_d, rate_d):
        """计算力矩指令"""
        # 姿态误差(四元数或欧拉角)
        e_att = att_d - attitude
        e_rate = rate_d - angular_rate

        # PD控制
        tau_pd = self.K_att @ e_att + self.K_rate @ e_rate

        # 自适应补偿
        state = np.concatenate([attitude, angular_rate])
        tau_ad = self.nn(torch.FloatTensor(state)).detach().numpy()

        return tau_pd + tau_ad

10. 总结

本篇系统介绍了神经网络自适应控制:

核心要点

  1. 问题本质:用NN逼近未知不确定性
  2. 稳定性保证:Lyapunov设计自适应律
  3. RBF网络:自适应控制的经典选择
  4. 深度网络:分层适应或复合学习
  5. 应用场景:机械臂、飞行器等精确控制

关键公式

控制律:
u = u b l + u a d = g − 1 ( − f + x ˙ d − K e ) − g − 1 W ^ T ϕ ( x ) u = u_{bl} + u_{ad} = g^{-1}(-f + \dot{x}_d - Ke) - g^{-1}\hat{W}^T\phi(x) u=ubl+uad=g1(f+x˙dKe)g1W^Tϕ(x)

自适应律:
W ^ ˙ = Γ ϕ ( x ) e T P B − σ W ^ \dot{\hat{W}} = \Gamma \phi(x) e^T P B - \sigma \hat{W} W^˙=Γϕ(x)eTPBσW^

Lyapunov函数:
V = 1 2 e T P e + 1 2 tr ( W ~ T Γ − 1 W ~ ) V = \frac{1}{2} e^T P e + \frac{1}{2} \text{tr}(\tilde{W}^T \Gamma^{-1} \tilde{W}) V=21eTPe+21tr(W~TΓ1W~)

选择建议

  • 需要稳定性保证 → NN自适应控制
  • 样本效率不是主要问题 → 深度RL
  • 两者结合 → Lyapunov约束RL

参考文献

  1. Lewis, F. L., et al. (1999). Neural Network Control of Robot Manipulators and Nonlinear Systems. Taylor & Francis.
  2. Ge, S. S., & Wang, C. (2002). Adaptive NN control of uncertain nonlinear pure-feedback systems. Automatica.
  3. Berkenkamp, F., et al. (2017). Safe Model-based Reinforcement Learning with Stability Guarantees. NeurIPS.
  4. Chang, Y. C., et al. (2019). Neural Lyapunov Control. NeurIPS.

下一篇预告深度学习驱动的控制方法详解(十):Physics-Informed Neural Networks控制

我们将学习如何将物理约束嵌入神经网络,实现物理一致的学习控制。


如果觉得本文有帮助,欢迎点赞收藏,关注本系列后续更新!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐