PILCO论文原理在倒立摆实现中的计算过程详解

发布于:2025-06-28 ⋅ 阅读:(22) ⋅ 点赞:(0)

PILCO论文原理在倒立摆实现中的计算过程详解

结合PILCO论文的原理,我将详细阐述inverted_pendulum.py中的计算过程,解析PILCO算法如何应用于解决倒立摆问题。

1. 初始化与数据收集阶段

env = gym.make('InvertedPendulum-v2')
# 初始随机rollout生成数据集
X,Y, _, _ = rollout(env=env, pilco=None, random=True, timesteps=40, render=True)
for i in range(1,5):
    X_, Y_, _, _ = rollout(env=env, pilco=None, random=True, timesteps=40, render=True)
    X = np.vstack((X, X_))
    Y = np.vstack((Y, Y_))

这部分代码实现了PILCO算法的第一步:收集初始数据。具体过程为:

  1. 创建OpenAI Gym中的倒立摆环境
  2. 使用随机策略进行5次rollout(每次40步),收集状态转移数据
  3. 将数据组织为输入X和输出Y:
    • X包含状态和动作的组合 ( x t , u t ) (x_t, u_t) (xt,ut)
    • Y包含状态差分 Δ t = x t + 1 − x t \Delta_t = x_{t+1} - x_t Δt=xt+1xt

这与PILCO论文中的初始数据收集阶段一致,目的是提供足够的初始数据来学习系统动态模型。

2. 模型与控制器初始化

state_dim = Y.shape[1]
control_dim = X.shape[1] - state_dim
controller = RbfController(state_dim=state_dim, control_dim=control_dim, num_basis_functions=10)
# controller = LinearController(state_dim=state_dim, control_dim=control_dim)

pilco = PILCO((X, Y), controller=controller, horizon=40)

这部分代码实现了PILCO的初始化:

  1. 确定状态维度和控制维度
  2. 初始化RBF控制器,使用10个基函数(也可使用线性控制器)
  3. 初始化PILCO模型,指定:
    • 训练数据 (X, Y)
    • 控制器类型
    • 预测时域长度(40步)

在PILCO论文中,控制器通常采用非线性形式(如RBF网络),以提供足够的表达能力。RBF控制器按照论文中5.3.2节描述实现:将控制器表示为确定性高斯过程。此处选择10个基函数,这是控制器复杂度的超参数。

3. 迭代优化过程

for rollouts in range(3):
    pilco.optimize_models()
    pilco.optimize_policy()
    X_new, Y_new, _, _ = rollout(env=env, pilco=pilco, timesteps=100, render=True)
    # 更新数据集
    X = np.vstack((X, X_new)); Y = np.vstack((Y, Y_new))
    pilco.mgpr.set_data((X, Y))

这部分代码实现了PILCO算法的核心迭代过程,完全遵循论文中的算法流程:

3.1 模型优化(optimize_models)

pilco.optimize_models()对应论文中的"学习动态模型"步骤。在此步骤中:

  1. 使用现有数据优化多输出高斯过程回归(MGPR)模型的超参数
  2. 对每个状态维度训练一个独立的GP模型
  3. 优化内核参数(长度尺度、信号方差、噪声方差)

这一步的数学原理是最大化边际似然:
log ⁡ p ( y ∣ x ) = − 1 2 y T ( K + σ n 2 I ) − 1 y − 1 2 log ⁡ ∣ K + σ n 2 I ∣ − n 2 log ⁡ ( 2 π ) \log p(y|x) = -\frac{1}{2}y^T(K+\sigma_n^2I)^{-1}y - \frac{1}{2}\log|K+\sigma_n^2I| - \frac{n}{2}\log(2\pi) logp(yx)=21yT(K+σn2I)1y21logK+σn2I2nlog(2π)

3.2 策略优化(optimize_policy)

pilco.optimize_policy()对应论文中的"基于模型的策略搜索"步骤。在此步骤中:

  1. 固定动态模型参数,只优化控制器参数
  2. 使用解析梯度方法优化期望回报
  3. 通过长期轨迹预测评估控制器性能

这一步实现了论文中的核心创新:通过解析梯度优化策略。它计算期望回报关于策略参数的梯度:
∂ J π ( θ ) ∂ θ = ∂ ∂ θ ∑ t = 0 T − 1 ∫ ∫ r ( x t ) p ( x t ) d x t \frac{\partial J_\pi(\theta)}{\partial \theta} = \frac{\partial}{\partial \theta}\sum_{t=0}^{T-1}\int\int r(x_t)p(x_t)dx_t θJπ(θ)=θt=0T1∫∫r(xt)p(xt)dxt

3.3 策略执行与数据收集

X_new, Y_new, _, _ = rollout(env=env, pilco=pilco, timesteps=100, render=True)
X = np.vstack((X, X_new)); Y = np.vstack((Y, Y_new))
pilco.mgpr.set_data((X, Y))

这部分对应论文中的"应用控制器"和"收集新数据"步骤:

  1. 使用优化后的控制器在实际环境中执行100步
  2. 收集新的状态转移数据
  3. 将新数据添加到训练集
  4. 更新PILCO模型的数据集

这一过程体现了PILCO的迭代学习特性,通过不断收集新数据来改进模型和策略。

4. 算法内部计算过程

虽然inverted_pendulum.py没有显式展示算法内部计算,但基于PILCO实现,实际发生了以下计算:

4.1 动态模型预测

当PILCO预测未来状态时,它执行以下计算:

  1. 获取当前状态分布 p ( x t ) = N ( m t , S t ) p(x_t) = \mathcal{N}(m_t, S_t) p(xt)=N(mt,St)
  2. 计算控制输入分布 p ( u t ∣ x t ) p(u_t|x_t) p(utxt)
  3. 联合分布 p ( x t , u t ) p(x_t, u_t) p(xt,ut) 通过矩匹配近似为高斯分布
  4. 使用GP模型预测下一状态差分分布 p ( Δ t ∣ x t , u t ) p(\Delta_t|x_t,u_t) p(Δtxt,ut)
  5. 计算下一状态分布 p ( x t + 1 ) = p ( x t + Δ t ) p(x_{t+1}) = p(x_t + \Delta_t) p(xt+1)=p(xt+Δt)

4.2 长期轨迹预测

在策略优化过程中,PILCO从初始状态分布开始,迭代应用上述计算过程,预测整个时域内的状态分布序列。

4.3 奖励计算

对于倒立摆问题,默认的奖励函数是一个指数奖励函数:
r ( x ) = exp ⁡ ( − 1 2 ( x − x t a r g e t ) T W ( x − x t a r g e t ) ) r(x) = \exp\left(-\frac{1}{2}(x-x_{target})^TW(x-x_{target})\right) r(x)=exp(21(xxtarget)TW(xxtarget))

其中 x t a r g e t x_{target} xtarget是目标状态(倒立摆保持直立), W W W是权重矩阵。

4.4 策略改进

策略优化过程通过梯度上升法最大化期望累积奖励:
J ( θ ) = ∑ t = 0 T − 1 E x t [ r ( x t ) ] J(\theta) = \sum_{t=0}^{T-1} \mathbb{E}_{x_t}[r(x_t)] J(θ)=t=0T1Ext[r(xt)]

5. 倒立摆任务的特点与PILCO适用性

倒立摆是一个经典的控制问题,具有以下特点:

  1. 连续状态空间:倒立摆的状态包括位置、角度及其导数
  2. 连续动作空间:控制输入是连续的力或力矩
  3. 非线性动态:倒立摆的动态方程是非线性的
  4. 不稳定平衡点:直立位置是不稳定平衡点

PILCO特别适合解决倒立摆问题,因为:

  1. PILCO可以高效处理连续状态和动作空间
  2. 高斯过程模型可以捕捉系统的非线性动态
  3. PILCO的不确定性处理机制可以应对模型误差
  4. 基于模型的预测允许长期规划,克服不稳定平衡点的挑战

6. 实验效果分析

通过代码中设置的3次迭代,PILCO通常能够学习到有效的倒立摆控制策略。每次迭代后,我们可以观察到:

  1. 系统动态模型变得更加准确
  2. 控制策略的性能逐步提高
  3. 倒立摆保持直立的时间延长

PILCO的高数据效率在倒立摆任务中表现突出,通常只需少量迭代(3-5次)就能学习到有效策略,而传统强化学习方法可能需要数千次迭代。

总结

inverted_pendulum.py完整实现了PILCO论文中的算法流程,应用于倒立摆控制任务:

  1. 收集初始随机数据
  2. 学习高斯过程动态模型
  3. 基于模型优化控制策略
  4. 应用策略并收集新数据
  5. 迭代更新模型和策略

整个过程充分体现了PILCO的核心特点:数据高效性、不确定性建模、长期预测和基于梯度的策略优化。这种方法使PILCO能够在极少的实际交互中学习到有效的控制策略,特别适合倒立摆这类非线性控制任务。


网站公告

今日签到

点亮在社区的每一天
去签到