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算法的第一步:收集初始数据。具体过程为:
- 创建OpenAI Gym中的倒立摆环境
- 使用随机策略进行5次rollout(每次40步),收集状态转移数据
- 将数据组织为输入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+1−xt
这与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的初始化:
- 确定状态维度和控制维度
- 初始化RBF控制器,使用10个基函数(也可使用线性控制器)
- 初始化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()
对应论文中的"学习动态模型"步骤。在此步骤中:
- 使用现有数据优化多输出高斯过程回归(MGPR)模型的超参数
- 对每个状态维度训练一个独立的GP模型
- 优化内核参数(长度尺度、信号方差、噪声方差)
这一步的数学原理是最大化边际似然:
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(y∣x)=−21yT(K+σn2I)−1y−21log∣K+σn2I∣−2nlog(2π)
3.2 策略优化(optimize_policy)
pilco.optimize_policy()
对应论文中的"基于模型的策略搜索"步骤。在此步骤中:
- 固定动态模型参数,只优化控制器参数
- 使用解析梯度方法优化期望回报
- 通过长期轨迹预测评估控制器性能
这一步实现了论文中的核心创新:通过解析梯度优化策略。它计算期望回报关于策略参数的梯度:
∂ 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=0∑T−1∫∫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))
这部分对应论文中的"应用控制器"和"收集新数据"步骤:
- 使用优化后的控制器在实际环境中执行100步
- 收集新的状态转移数据
- 将新数据添加到训练集
- 更新PILCO模型的数据集
这一过程体现了PILCO的迭代学习特性,通过不断收集新数据来改进模型和策略。
4. 算法内部计算过程
虽然inverted_pendulum.py
没有显式展示算法内部计算,但基于PILCO实现,实际发生了以下计算:
4.1 动态模型预测
当PILCO预测未来状态时,它执行以下计算:
- 获取当前状态分布 p ( x t ) = N ( m t , S t ) p(x_t) = \mathcal{N}(m_t, S_t) p(xt)=N(mt,St)
- 计算控制输入分布 p ( u t ∣ x t ) p(u_t|x_t) p(ut∣xt)
- 联合分布 p ( x t , u t ) p(x_t, u_t) p(xt,ut) 通过矩匹配近似为高斯分布
- 使用GP模型预测下一状态差分分布 p ( Δ t ∣ x t , u t ) p(\Delta_t|x_t,u_t) p(Δt∣xt,ut)
- 计算下一状态分布 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(x−xtarget)TW(x−xtarget))
其中 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=0∑T−1Ext[r(xt)]
5. 倒立摆任务的特点与PILCO适用性
倒立摆是一个经典的控制问题,具有以下特点:
- 连续状态空间:倒立摆的状态包括位置、角度及其导数
- 连续动作空间:控制输入是连续的力或力矩
- 非线性动态:倒立摆的动态方程是非线性的
- 不稳定平衡点:直立位置是不稳定平衡点
PILCO特别适合解决倒立摆问题,因为:
- PILCO可以高效处理连续状态和动作空间
- 高斯过程模型可以捕捉系统的非线性动态
- PILCO的不确定性处理机制可以应对模型误差
- 基于模型的预测允许长期规划,克服不稳定平衡点的挑战
6. 实验效果分析
通过代码中设置的3次迭代,PILCO通常能够学习到有效的倒立摆控制策略。每次迭代后,我们可以观察到:
- 系统动态模型变得更加准确
- 控制策略的性能逐步提高
- 倒立摆保持直立的时间延长
PILCO的高数据效率在倒立摆任务中表现突出,通常只需少量迭代(3-5次)就能学习到有效策略,而传统强化学习方法可能需要数千次迭代。
总结
inverted_pendulum.py
完整实现了PILCO论文中的算法流程,应用于倒立摆控制任务:
- 收集初始随机数据
- 学习高斯过程动态模型
- 基于模型优化控制策略
- 应用策略并收集新数据
- 迭代更新模型和策略
整个过程充分体现了PILCO的核心特点:数据高效性、不确定性建模、长期预测和基于梯度的策略优化。这种方法使PILCO能够在极少的实际交互中学习到有效的控制策略,特别适合倒立摆这类非线性控制任务。