Ornstein-Uhlenbeck过程

本文深入探讨了强化学习中Ornstein-Uhlenbeck过程(OU过程)的应用,揭示其作为均值回归过程的本质,对比高斯噪声,强调OU过程在惯性系统控制任务中的优势。通过数学公式和Python实验,展示OU过程的参数意义及其时序相关性,适用于DDPG等算法的探索策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在强化学习中(如DDPG算法),可能会用到Ornstein-Uhlenbeck(奥恩斯坦-乌伦贝克)过程,即OU过程。

这篇博客将从三个角度解释一下OU过程:

  1. 什么是OU过程?
  2. OU过程适用于哪些场景?
  3. OU过程的验证实验

前言: DDPG论文中使用Ornstein-Uhlenbeck噪声用于探索,为什么不用高斯噪声呢?

1. OU过程定义

OU过程有下面的随机微分方程: d x t = θ ( μ − x t ) d t + σ d W t dx_t = \theta(\mu - x_t)dt + \sigma dW_t dxt=θ(μxt)dt+σdWt 其中,其中 θ > 0 \theta>0 θ>0 μ \mu μ(均值), σ > 0 \sigma>0 σ>0(方差)均为参数, W t W_{t} Wt 为维纳过程(布朗运动)。


可以将OU过程表达为离散形式研究一下,暂且不考虑第二项(扰动项):
d x t = x ( t + Δ t ) − x ( t ) = − θ ( x t − μ ) Δ t dx_t = x(t + \Delta t) - x(t) = -\theta(x_t - \mu)\Delta t dxt=x(t+Δt)x(t)=θ(xtμ)Δt 可以发现,OU过程是均值回归过程,当 x t x_t xt 比均值 μ \mu μ 大的时候,下一步状态值 x t + Δ t x_{t + \Delta t} xt+Δt就会变小;反之,下一步状态值会变大。简单地说就是状态值偏离均值的时候会被拉回。


那么 θ > 0 \theta>0 θ>0 μ \mu μ σ > 0 \sigma>0 σ>0 各个参数有什么作用呢?先看结论:
在这里插入图片描述

现在对OU过程有下面的随机微分方程 d x t = θ ( μ − x t ) d t + σ d W t dx_t = \theta(\mu - x_t)dt + \sigma dW_t dxt=θ(μxt)dt+σdWt
进行分析,这显然是一个一阶线性微分方程,求解过程如下:
在这里插入图片描述

注:求解过程中用 α \alpha α 表示 μ \mu μ,用 β \beta β 表示 θ \theta θ

不考虑维纳过程,可以得到: x t = μ + ( x 0 − μ ) e − θ t x_t = \mu + (x_0 - \mu)e^{-\theta t} xt=μ+(x0μ)eθt 所以 θ \theta θ 表示系统对干扰的反映程度,即 θ \theta θ 越大,干扰变得越小,保持状态值在均值附近。

再考虑扰动项(维纳过程),每一段时间间隔内的增量是服从高斯分布的:
W ( t ) − W ( s ) ∼ N ( 0 , σ 2 ( t − s ) ) W(t) - W(s) \sim N(0, \sigma^2(t - s)) W(t)W(s)N(0,σ2(ts)) 所以 方差 σ \sigma σ 表示噪音的大小或变化,即决定扰动的变化尺度。

2. OU过程适适用场景

OU过程是时序相关的,所以在强化学习的前一步和后一步的动作选取过程中可以利用OU过程产生时序相关的探索,以提高在惯性系统(即环境)中的控制任务的探索效率。(注:高斯噪声是时序上不相关的,前一步和后一步选取动作的时候噪声都是独立的。前后两动作之间也只是通过状态使其独立。)
所以OU过程的适用场景有:

  1. 相比于独立噪声,OU噪声适合于惯性系统,尤其是时间离散化粒度较小的情况。
  2. 可以保护实际系统,如机械臂。

本部分参考知乎专栏强化学习中Ornstein-Uhlenbeck噪声是鸡肋吗?

3. OU过程实验

import numpy as np
import matplotlib.pyplot as plt


class OrnsteinUhlenbeckActionNoise:
    def __init__(self, mu, sigma=1.0, theta=0.15, dt=1e-2, x0=None):
        self.theta = theta
        self.mu = mu
        self.sigma = sigma
        self.dt = dt
        self.x0 = x0
        self.reset()

    def __call__(self):
        x = self.x_prev + self.theta * (self.mu - self.x_prev) * self.dt + \
            self.sigma * np.sqrt(self.dt) * np.random.normal(size=self.mu.shape)
        self.x_prev = x
        return x

    def reset(self):
        self.x_prev = self.x0 if self.x0 is not None else np.zeros_like(self.mu)

    def __repr__(self):
        return 'OrnsteinUhlenbeckActionNoise(mu={}, sigma={})'.format(self.mu, self.sigma)


if __name__ == "__main__":
    ou_noise = OrnsteinUhlenbeckActionNoise(mu=np.zeros(1))
    plt.figure()
    y1 = []
    y2 = np.random.normal(0, 1, 1000)
    t = np.linspace(0, 100, 1000)
    for _ in t:
        y1.append(ou_noise())

    # plt.plot(t, y1, c='r')
    plt.plot(t, y2, c='b')
    plt.show()

在这里插入图片描述在这里插入图片描述

从上面结果可以很清楚地区分了OU过程的时序相关性与高斯随机过程的前后无关性。OU noise往往不会高斯噪声一样相邻的两步的值差别那么大,而是会绕着均值附近正向或负向探索一段距离,就像物价和利率的波动一样,这有利于在一个方向上探索。

好的,我可以为您提供生成OU过程随机样本轨道并画出95%置信区间的Matlab代码。请您先确认您已经安装了Matlab软件,然后按照以下步骤进行操作: 步骤1:定义OU过程的参数 ```matlab %定义OU过程的参数 theta = 0.1; %回归参数 mu = 0; %均值 sigma = 0.2; %标准差 T = 1; %时间间隔 N = 1000; %时间步长 t = linspace(0,T,N);%时间序列 X0 = 0; %初始值 ``` 步骤2:生成OU过程随机样本轨道 ```matlab %生成OU过程随机样本轨道 X = zeros(1,N); %初始化向量 X(1) = X0; %将初始值赋给第一个元素 for i=2:N X(i) = X(i-1) + theta*(mu-X(i-1))*T + sigma*sqrt(T)*randn; end ``` 步骤3:计算95%置信区间 ```matlab %计算95%置信区间 alpha = 0.05; %显著性水平 z = norminv(1-alpha/2); %z分位数 CI = z*sigma/sqrt(theta)*(exp(-theta*t)+exp(-2*theta*t))./... (1+exp(-theta*t)); %置信区间 ``` 步骤4:绘制OU过程随机样本轨道和95%置信区间 ```matlab %绘制OU过程随机样本轨道和95%置信区间 plot(t,X,'b-',t,CI+mu,'r--',t,-CI+mu,'r--'); xlabel('Time'); ylabel('OU Process'); title('OU Process with 95% Confidence Interval'); legend('OU Process','95% Confidence Interval'); ``` 完整的Matlab代码如下: ```matlab %定义OU过程的参数 theta = 0.1; %回归参数 mu = 0; %均值 sigma = 0.2; %标准差 T = 1; %时间间隔 N = 1000; %时间步长 t = linspace(0,T,N);%时间序列 X0 = 0; %初始值 %生成OU过程随机样本轨道 X = zeros(1,N); %初始化向量 X(1) = X0; %将初始值赋给第一个元素 for i=2:N X(i) = X(i-1) + theta*(mu-X(i-1))*T + sigma*sqrt(T)*randn; end %计算95%置信区间 alpha = 0.05; %显著性水平 z = norminv(1-alpha/2); %z分位数 CI = z*sigma/sqrt(theta)*(exp(-theta*t)+exp(-2*theta*t))./... (1+exp(-theta*t)); %置信区间 %绘制OU过程随机样本轨道和95%置信区间 plot(t,X,'b-',t,CI+mu,'r--',t,-CI+mu,'r--'); xlabel('Time'); ylabel('OU Process'); title('OU Process with 95% Confidence Interval'); legend('OU Process','95% Confidence Interval'); ``` 希望能够帮助到您!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值