PILCO: 基于模型的高效策略搜索方法原理解析
PILCO: 基于模型的高效策略搜索方法原理解析
PILCO (Probabilistic Inference for Learning Control) 是一种基于模型的强化学习算法,由Marc Deisenroth和Carl Rasmussen于2011年提出。该算法在数据效率方面表现出色,能够以极少的样本数据实现有效学习。下面我将详细阐述PILCO的核心原理。
1. 算法基本框架
PILCO算法的基本框架包含三个主要组成部分:
- 基于高斯过程的动态模型学习
- 长期轨迹预测与不确定性传播
- 基于解析梯度的策略优化
PILCO的工作流程为:
- 收集少量初始数据
- 学习系统动态模型
- 基于模型进行长期预测
- 优化控制策略
- 执行策略并收集新数据
- 迭代上述过程
2. 基于高斯过程的系统动态建模
2.1 高斯过程回归
PILCO使用高斯过程(GP)来建模系统动态。高斯过程是一种非参数贝叶斯方法,可以捕捉输入空间中的不确定性。
对于系统状态 x t x_t xt 和控制输入 u t u_t ut,PILCO学习状态转移函数:
Δ t = f ( x t , u t ) = x t + 1 − x t \Delta_t = f(x_t, u_t) = x_{t+1} - x_t Δt=f(xt,ut)=xt+1−xt
高斯过程定义了一个分布在函数空间上的先验,通过观测数据更新为后验分布。对于输入 ( x , u ) (x, u) (x,u),高斯过程预测下一状态的分布为高斯分布:
p ( f ( x , u ) ∣ D ) = N ( m ( x , u ) , v ( x , u ) ) p(f(x, u)|D) = \mathcal{N}(m(x, u), v(x, u)) p(f(x,u)∣D)=N(m(x,u),v(x,u))
其中 D D D 是训练数据, m ( x , u ) m(x, u) m(x,u) 是均值函数, v ( x , u ) v(x, u) v(x,u) 是方差函数。
2.2 多输出高斯过程
对于多维状态空间,PILCO使用多个独立的高斯过程模型,每个模型预测状态向量的一个维度。在代码中,这通过MGPR(多输出高斯过程回归)类实现:
class MGPR(gpflow.Module):def __init__(self, data, name=None):# 初始化多个独立的GP模型,每个模型对应一个状态维度
3. 长期轨迹预测与不确定性传播
PILCO的一个关键创新是如何进行长期预测并处理不确定性的传播。
3.1 状态分布的表示
PILCO使用高斯分布来表示状态:
p ( x t ) = N ( m t , S t ) p(x_t) = \mathcal{N}(m_t, S_t) p(xt)=N(mt,St)
其中 m t m_t mt 是均值向量, S t S_t St 是协方差矩阵。
3.2 不确定性的传播
当状态和动作都是分布时,预测下一状态分布变得复杂。PILCO使用矩匹配(moment matching)技术将复杂分布近似为高斯分布:
-
首先计算控制器输出的动作分布:
m_u, s_u, c_xu = self.controller.compute_action(m_x, s_x)
-
将状态和动作分布合并:
m = tf.concat([m_x, m_u], axis=1) s1 = tf.concat([s_x, s_x@c_xu], axis=1) s2 = tf.concat([tf.transpose(s_x@c_xu), s_u], axis=1) s = tf.concat([s1, s2], axis=0)
-
基于高斯过程模型预测下一状态分布:
M_dx, S_dx, C_dx = self.mgpr.predict_on_noisy_inputs(m, s) M_x = M_dx + m_x S_x = S_dx + s_x + s1@C_dx + tf.matmul(C_dx, s1, transpose_a=True, transpose_b=True)
这种方法允许PILCO在长期预测中明确考虑模型不确定性。
4. 基于解析梯度的策略优化
4.1 期望回报的计算
PILCO定义了一个基于状态的奖励函数 r ( x ) r(x) r(x),通常是一个关于状态与目标状态距离的指数函数:
class ExponentialReward(Module):def compute_reward(self, m, s):# 计算状态分布下的期望奖励及其方差
长期预测的累积奖励作为策略的评估指标:
def predict(self, m_x, s_x, n):# 从初始状态分布预测n步,并累积奖励_, m_x, s_x, reward = tf.while_loop(lambda j, m_x, s_x, reward: j < n,lambda j, m_x, s_x, reward: (j + 1,*self.propagate(m_x, s_x),tf.add(reward, self.reward.compute_reward(m_x, s_x)[0])), loop_vars)return m_x, s_x, reward
4.2 策略梯度优化
PILCO使用解析梯度方法优化策略参数,而不是使用样本估计。这通过TensorFlow的自动微分功能实现:
def training_loss(self):# 计算负期望回报作为损失函数reward = self.predict(self.m_init, self.S_init, self.horizon)[2]return -rewarddef optimize_policy(self, maxiter=50, restarts=1):# 使用梯度下降优化策略参数self.optimizer.minimize(self.training_loss, self.trainable_variables, options=dict(maxiter=maxiter))
为避免局部最优,PILCO支持多次随机重启:
for restart in range(restarts):self.controller.randomize()self.optimizer.minimize(self.training_loss, self.trainable_variables)
5. 控制器设计
PILCO支持多种控制器类型,包括:
5.1 线性控制器
class LinearController(gpflow.Module):def compute_action(self, m, s, squash=True):# 线性映射:u = Wx + bM = m @ tf.transpose(self.W) + self.bS = self.W @ s @ tf.transpose(self.W)# 可选的动作范围限制if squash:M, S, V2 = squash_sin(M, S, self.max_action)
5.2 RBF控制器
class RbfController(MGPR):def compute_action(self, m, s, squash=True):# 使用RBF网络实现非线性控制with tf.name_scope("controller"):iK, beta = self.calculate_factorizations()M, S, V = self.predict_given_factorizations(m, s, 0.0 * iK, beta)
6. PILCO的优势
PILCO具有以下几个显著优势:
-
数据高效性:PILCO能够以极少的样本数据实现有效学习,这在实际机器人应用中尤为重要。
-
处理模型不确定性:PILCO明确考虑模型不确定性,并将其纳入长期规划中,这使得算法对模型错误更加鲁棒。
-
解析梯度优化:通过使用解析梯度而不是样本估计,PILCO能够更高效地优化策略参数。
-
概率框架:PILCO采用完全概率化的框架,能够系统地处理不确定性。
7. 应用示例
PILCO已成功应用于多种控制任务,如:
- 倒立摆稳定与摆杆上摆
- 双倒立摆控制
- 山地小车问题
- 机器人游泳者控制
在这些任务中,PILCO通常能在几次迭代内学习到有效的控制策略,而传统强化学习方法可能需要数千次迭代。
总结
PILCO算法通过将高斯过程建模与概率推断相结合,实现了高效的策略搜索。其核心创新在于使用概率模型来表示系统动态,并通过矩匹配方法传播不确定性,从而在长期规划中考虑模型误差。这种方法使PILCO在数据效率和鲁棒性方面表现出色,特别适合于实际机器人和控制任务。