当前位置: 首页 > article >正文

强化学习 - 基于策略搜索和策略优化: 高斯策略

最近在做毕设需要用强化学习来做控制,对强化学习的知识点做一下总结。

高斯策略

高斯策略属于强化学习中的基于策略优化的分支(Policy Optimization),尤其是策略梯度方法(Policy Gradient Methods) 的一部分。这一分支专注于通过优化策略的参数来直接提升策略的性能,而不需要显式地学习一个价值函数。


高斯策略在强化学习中的位置

强化学习可以按照以下几个主要分支分类:

  1. 基于价值函数的方法(Value-Based Methods)

    • 如Q-Learning、深度Q网络(DQN)。
    • 这些方法学习状态-动作值函数 ( Q(s, a) ),然后通过选择最大值的动作来构建策略。
  2. 基于策略的方法(Policy-Based Methods)

    • 直接对策略进行建模并优化。
    • 高斯策略属于这一类方法,特别是策略梯度方法(Policy Gradient Methods),因为它通过优化概率分布(高斯分布)来学习策略。
  3. 基于策略与价值的混合方法(Actor-Critic Methods)

    • 同时学习策略(Actor)和价值函数(Critic),如A3C、DDPG等。
    • 虽然高斯策略本身是策略梯度的一部分,但它也经常在这些方法中作为Actor的策略模型使用。

高斯策略与策略梯度的关系

高斯策略是一种经典的连续动作空间中的策略表示形式,其主要特点是将策略建模为一个概率分布(通常是高斯分布):
π θ ( a ∣ s ) = N ( μ θ ( s ) , Σ θ ( s ) ) \pi_{\theta}(a|s) = \mathcal{N}(\mu_{\theta}(s), \Sigma_{\theta}(s)) πθ(as)=N(μθ(s),Σθ(s))

  • 均值 μ θ ( s ) \mu_{\theta}(s) μθ(s)协方差 Σ θ ( s ) \Sigma_{\theta}(s) Σθ(s) 是需要学习的策略参数。
  • 通过最大化期望累计奖励 J ( θ ) = E π θ [ R ] J(\theta) = \mathbb{E}_{\pi_{\theta}}[R] J(θ)=Eπθ[R]来优化策略。
策略梯度方法的核心公式:

通过策略梯度定理,我们可以计算梯度并优化策略参数:
∇ θ J ( θ ) = E π θ [ ∇ θ log ⁡ π θ ( a ∣ s ) Q π ( s , a ) ] \nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}} \left[ \nabla_{\theta} \log \pi_{\theta}(a|s) Q^{\pi}(s, a) \right] θJ(θ)=Eπθ[θlogπθ(as)Qπ(s,a)]
其中:

  • log ⁡ π θ ( a ∣ s ) \log \pi_{\theta}(a|s) logπθ(as)是高斯分布的对数似然。
  • Q π ( s , a ) Q^{\pi}(s, a) Qπ(s,a) 是状态-动作值函数,用于评估策略的表现。

高斯策略在连续动作空间中的广泛应用,得益于高斯分布的可微性和灵活性,适合通过梯度优化调整策略。


高斯策略适用的场景

  1. 适用场景:
    • 机器人控制:如臂式机器人轨迹规划。
    • 无人机导航:优化无人机通过动态障碍的策略(如论文中提到的任务)。
    • 自动驾驶:优化车辆在连续状态和动作空间中的驾驶策略。

高斯策略的实际应用:Policy Gradient vs Actor-Critic

  • 纯策略梯度方法(如REINFORCE):
    高斯策略直接使用策略梯度定理更新参数,但容易出现高方差问题。

  • Actor-Critic方法:
    高斯策略作为Actor,由Critic(价值函数)提供更稳定的梯度信号,常见于:

    • 深度确定性策略梯度(DDPG)
    • 近端策略优化(PPO)
    • 信任区域策略优化(TRPO)

总结

高斯策略属于强化学习的基于策略优化的分支,具体归类为策略梯度方法。它特别适合解决连续动作空间中的任务,并在机器人控制、无人机飞行等领域得到广泛应用。结合其他强化学习算法(如Actor-Critic),高斯策略还能实现更稳定和高效的策略优化。


看一个GPT给的代码,理解高斯策略优化

import time
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import gym# =========== 1. 创建 Pendulum 环境 ===========
env = gym.make("Pendulum-v1", render_mode="human")# =========== 2. 定义高斯策略网络 ===========
class GaussianPolicy(nn.Module):def __init__(self, state_dim, action_dim):super(GaussianPolicy, self).__init__()self.fc = nn.Sequential(nn.Linear(state_dim, 64),nn.ReLU(),nn.Linear(64, action_dim))self.log_std = nn.Parameter(torch.zeros(action_dim))def forward(self, state):"""state: [batch_size, state_dim]  (例如 [1, 3])返回:mean: [batch_size, action_dim]std:  [action_dim] (可广播为 [batch_size, action_dim])"""mean = self.fc(state)std = torch.exp(self.log_std)return mean, std #前向传播输出的是均值和方差(动作的)# =========== 3. 初始化策略、优化器 ===========
state_dim = env.observation_space.shape[0]  # 3 for Pendulum
action_dim = env.action_space.shape[0]      # 1 扭矩
policy = GaussianPolicy(state_dim, action_dim) # model
optimizer = optim.Adam(policy.parameters(), lr=0.01) # 用adam优化器,优化model的参数# =========== 4. 策略梯度训练 (REINFORCE) ===========
def train(policy, env, episodes=300, gamma=0.99, render=False):for episode in range(episodes):state, _ = env.reset()log_probs = []rewards   = []total_reward = 0while True:# (A) 将状态转换为 [1, state_dim] 的张量state_t = torch.tensor(state, dtype=torch.float32).unsqueeze(0)# (B) 前向传播:获取动作分布mean, std = policy(state_t) # input: current state ; output: mean and std of actiondist = torch.distributions.Normal(mean, std) # 知道均值和方差,就可以直到action的高斯分布了。# (C) 采样动作,并计算 log_probaction = dist.sample()  # shape: (1, 1) 对动作空间采样log_prob = dist.log_prob(action).sum(dim=-1)  # 计算action的对数概率,为了策略梯度# (D) 裁剪动作并与环境交互action_env = action.detach().numpy()[0]action_env = np.clip(action_env,env.action_space.low[0],env.action_space.high[0])# 执行动作next_state, reward, terminated, truncated, info = env.step(action_env)# (E) 保存 log_prob & rewardlog_probs.append(log_prob)rewards.append(reward)total_reward += rewardstate = next_stateif terminated or truncated:break# ========== 回合结束:计算回报并更新策略 ==========returns = []G = 0for r in reversed(rewards): # 存放每个时间步的折扣累计奖励G = r + gamma * Greturns.insert(0, G)returns = torch.tensor(returns, dtype=torch.float32)# 标准化回报returns = (returns - returns.mean()) / (returns.std() + 1e-9)# REINFORCE 损失loss = 0# 对每个时间步的 (log_prob, return) 求和,前面加负号是因为要最大化期望回报,相当于最小化负的期望回报。for log_p, R in zip(log_probs, returns):loss -= log_p * Roptimizer.zero_grad()loss.backward()optimizer.step()# 打印训练进度if (episode + 1) % 50 == 0:print(f"Episode {episode+1}/{episodes}, Total Reward: {total_reward:.2f}")env.close()# =========== 5. 运行训练并渲染 ===========
if __name__ == "__main__":train(policy, env, episodes=300, render=True)

代码解析

在这行代码里:

dist = torch.distributions.Normal(mean, std)

我们使用了 PyTorch 提供的 概率分布模块torch.distributions)来构建一个高斯(正态)分布对象。以下是这句代码背后的原理与作用:

1. 为什么要构建 torch.distributions.Normal(mean, std)

  1. 表示连续动作策略
    在连续动作空间(如倒立摆),我们经常用高斯分布 (\mathcal{N}(\mu, \sigma^2)) 来表示“策略”,其中:

    • μ \mu μ(mean):动作的均值
    • σ \sigma σ(std):动作的标准差
  2. 进行动作采样
    有了这个 Normal(mean, std) 对象,就可以用

    action = dist.sample()
    

    来采样一个连续值的动作 action,从而在不同状态下能产生随机探索的效果。

  3. 计算对数概率(log_prob)
    在策略梯度强化学习里,需要用对数概率 log ⁡ π ( a ∣ s ) \log \pi(a|s) logπ(as) 来进行梯度更新。
    这个 dist 对象提供了 dist.log_prob(action),可以直接得到对数似然,方便我们实现 REINFORCE、PPO 等算法的损失函数。



3. 原理:高斯分布中的参数

一个一维高斯(正态)分布通常由两个参数决定:
X ∼ N ( μ , σ 2 ) X \sim \mathcal{N}(\mu, \sigma^2) XN(μ,σ2)

  • μ \mu μ(mean):分布的均值。
  • σ \sigma σ(std):分布的标准差。

**分布的概率密度函数(PDF)**为:
p ( x ) = 1 2 π σ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) . p(x) = \frac{1}{\sqrt{2 \pi} \, \sigma} \exp\left( -\frac{(x - \mu)^2}{2 \sigma^2} \right). p(x)=2π σ1exp(2σ2(xμ)2).

在代码中,meanstd 就是分别对应 (\mu) 和 (\sigma);因此 torch.distributions.Normal(mean, std) 可以完整表达这个分布。


4. 强化学习中的用法

在许多连续控制的强化学习算法里(如REINFORCETRPOPPO),我们往往直接建模一个高斯策略

  1. 网络输出:均值 μ ( s ) \mu(s) μ(s) + 对数标准差 log ⁡ σ \log \sigma logσ
  2. 构造分布
    dist = torch.distributions.Normal(mean, std)
    
  3. 采样动作
    action = dist.sample()
    
  4. 计算对数概率
    log_prob = dist.log_prob(action)
    
    并用于策略梯度:
    ∇ θ ∑ t log ⁡ π θ ( a t ∣ s t ) ⋅ G t \nabla_{\theta} \sum_t \log \pi_{\theta}(a_t | s_t) \cdot G_t θtlogπθ(atst)Gt

这样就能在训练时学习到使期望回报最大的分布参数(meanstd),兼顾到探索(由 std 控制)和开销之间的平衡。


小结

  • dist = torch.distributions.Normal(mean, std) 是在 PyTorch 中创建一个正态(高斯)分布对象。
  • 通过这个对象可以采样动作计算对数概率,这是连续动作空间的经典做法。
  • 在强化学习中,这种高斯策略能实现探索,并且可通过梯度反向传播来学习 (\mu, \sigma) 等参数,从而自动优化控制策略。

为什么高斯策略最后能够使得policy最优?

连续动作空间的强化学习中,使用高斯策略(Gaussian Policy)是一种非常常见且有效的做法。核心原因并不在于高斯分布“本质上就能保证全局最优”,而是由于高斯策略作为可微分且可训练的分布形式,能够通过策略梯度方法不断逼近最优策略。下面从几个关键角度解释为什么高斯策略在实践中常能得到很好的(局部)最优策略。


1. 高斯策略的可微性及易于优化

  1. 连续空间需要可微分的概率分布

    • 在连续动作空间(如无人机控制、机械臂操作)中,需要一种能对动作进行可微分采样可微分对数概率计算的方法。
    • 高斯分布 N ( μ , σ 2 ) \mathcal{N}(\mu, \sigma^2) N(μ,σ2)拥有简单的概率密度函数和已知的对数似然形式,使得我们可以用梯度下降来优化 μ \mu μ σ \sigma σ
  2. PyTorch支持自动求导

    • 通过 torch.distributions.Normal,可以方便地计算 log ⁡ π ( a ∣ s ) \log\pi(a|s) logπ(as) 并反向传播到网络参数。
    • 这满足了策略梯度的核心需求: ∇ θ log ⁡ π θ ( a ∣ s ) \nabla_{\theta} \log \pi_{\theta}(a|s) θlogπθ(as)
  3. 均值+协方差(或标准差)可学习

    • 只要用一个神经网络输出均值 μ ( s ) \mu(s) μ(s)标准差 σ ( s ) \sigma(s) σ(s)(或者对数标准差),就可以表示很多不同形状(在动作空间)的高斯分布。
    • 在训练过程中,通过梯度更新,这两个部分会朝使预期奖励更高的方向移动,从而逼近最优解。

2. 策略梯度方法能找到(局部)最优解

在策略梯度(Policy Gradient)或者 Actor-Critic 方法(如 PPO、TRPO)中:

  1. 目标函数

    • 最大化期望累积奖励 J ( θ ) = E τ ∼ π θ [ ∑ r t ] J(\theta) = \mathbb{E}_{\tau\sim\pi_\theta}[\sum r_t] J(θ)=Eτπθ[rt]
    • 在连续动作场景下,为了对动作进行探索和梯度计算,需要将策略表示成某种分布 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as)。高斯分布是常见选择。
  2. 梯度更新

    • 策略参数 (\theta) 通过公式
      θ ← θ + α ∇ θ E [ ∑ log ⁡ π θ ( a t ∣ s t ) R t ] \theta \leftarrow \theta + \alpha \nabla_{\theta} \mathbb{E}[\sum \log \pi_\theta(a_t|s_t) R_t] θθ+αθE[logπθ(atst)Rt]
      (或其他 Actor-Critic 变体)
      不断迭代,尝试提升期望回报 (J(\theta))。
  3. 高斯分布的好处

    • log ⁡ π θ ( a ∣ s ) \log \pi_\theta(a|s) logπθ(as) 有解析形式:
      log ⁡ N ( a ∣ μ , σ 2 ) = − 1 2 ( a − μ σ ) 2 − log ⁡ σ − 1 2 log ⁡ ( 2 π ) \log \mathcal{N}(a|\mu,\sigma^2) = -\frac12 \left(\frac{a-\mu}{\sigma}\right)^2 - \log \sigma - \frac12\log(2\pi) logN(aμ,σ2)=21(σaμ)2logσ21log(2π)
      易于对 μ \mu μ σ \sigma σ 求梯度。

只要给定足够丰富的函数逼近(例如神经网络的隐层足够大),该策略能在梯度信息的指引下,不断“爬”向局部最优甚至全局最优区域。在很多问题上,高斯策略通常能达到不错的解。


3. 高斯策略的探索性与单峰假设

  1. 探索性

    • 高斯分布是连续的且带有标准差(KaTeX parse error: Can't use function '\)' in math mode at position 7: \sigma\̲)̲)这一可调参量,可以自动学到合…\sigma$ 会变大;若需要精确决策, σ \sigma σ 会缩小。
  2. 单峰分布可能足够

    • 高斯分布是单峰分布,意味着策略假设动作分布呈现一个峰值。
    • 在很多控制问题中,这已经足以找到满意的(局部)最优,因系统动力学往往在最优附近相对平滑。
  3. 可能的局限

    • 如果最优解呈多峰分布或非常复杂的形状(可能出现多种动作选择都能高回报),单一高斯很难同时捕捉;但通常通过神经网络(隐层非线性)和反复迭代,也能逼近到一个“较优”峰值。

4. 神经网络强大的函数逼近能力

  • 均值网络 μ θ ( s ) \mu_\theta(s) μθ(s) 本身是一个多层感知机(MLP),可以在状态空间上逼近相当复杂的映射;
  • 标准差网络 σ θ ( s ) \sigma_\theta(s) σθ(s) 也可以是状态相关,从而在不同区域探索力度不同。

这种多层神经网络 + 高斯分布的组合,实际上能够表达“随状态而变化的单峰分布”,对很多控制任务已经足够。在理想条件(无限样本、合适的优化超参)下,策略梯度就能收敛到一个局部最优策略;在很多实际任务中,这个局部最优也已经很好了。


5. 小结

  • 高斯策略最优的本质
    它并不是因为“高斯分布本身必然找到全局最优”,而是由于梯度优化(如REINFORCE、PPO)的迭代过程,可以持续地提高期望回报,最终收敛到一个**(局部)最优足够优**的策略。
  • 连续动作空间的易用分布
    高斯分布可微且计算对数概率方便,能够在策略梯度过程中被梯度更新,从而实现策略的改进。
  • 最终效果
    足够丰富的网络表征 + 合理的超参数选择,让高斯策略在多数连续控制任务中表现良好,而且在实践中广泛应用(如机器人控制、无人机飞行等)。

因此,高斯策略并不必然是唯一最优,但它提供了一个可学习、可微、易实现的方式让策略梯度算法在连续动作空间中工作,从而“使得 policy(在梯度更新下)收敛到最优或近似最优解”。

下面是一份较为系统且深入的数学原理和解析,涵盖了这段 Pendulum 环境中所用的**高斯策略(Gaussian Policy)以及策略梯度(Policy Gradient, REINFORCE)**方法的核心数学背景和推导。为方便说明,以下内容将结合代码中的关键步骤,深入剖析它背后的原理与公式。


总览

在一个连续动作空间的强化学习场景下(例如 Pendulum),我们常使用高斯分布来表示策略 $\pi_\theta(a \mid s))。然后通过策略梯度(Policy Gradient)或其变体(如 Actor-Critic、PPO、TRPO 等)不断更新策略参数,使期望累积奖励最大化。

  • 高斯策略 π θ ( a ∣ s ) = N ( a ∣ μ θ ( s ) , Σ θ ( s ) ) \pi_\theta(a \mid s) = \mathcal{N}(a \mid \mu_\theta(s),\, \Sigma_\theta(s)) πθ(as)=N(aμθ(s),Σθ(s))
  • REINFORCE:一种基本的策略梯度方法,核心思想是采样状态-动作轨迹并利用 log ⁡ π θ ( a ∣ s ) \log \pi_\theta(a\mid s) logπθ(as)的梯度来更新策略。

以下将从高斯策略的定义开始,到折扣回报梯度更新公式一步步展开。


一、高斯策略

1.1 策略表示

在代码中,策略用一个神经网络来输出动作的均值( μ \mu μ),并维护一个可学习的
对数标准差($\log\sigma $)。

  1. 形如 π θ ( a ∣ s ) = N ( a ∣ μ θ ( s ) , d i a g ( σ θ 2 ) ) \pi_\theta(a\mid s) = \mathcal{N}\bigl(a \mid \mu_\theta(s),\, \mathrm{diag}(\sigma^2_\theta)\bigr) πθ(as)=N(aμθ(s),diag(σθ2))
  2. 在代码中,$\mu_\theta(s)) 由 self.fc(state) 计算得出,其形状是 [batch_size, action_dim]
  3. $\sigma_\theta) 由 std = torch.exp(self.log_std) 得到,形状 [action_dim],若是多维动作也可以扩展成对角协方差矩阵。

一维高斯分布(动作维度=1)时,其概率密度函数(PDF)为

π θ ( a ∣ s ) = 1 2 π σ θ ( s ) exp ⁡ ⁣ ( − ( a − μ θ ( s ) ) 2 2 σ θ ( s ) 2 ) . \pi_\theta(a \mid s) \;=\; \frac{1}{\sqrt{2\pi}\,\sigma_\theta(s)} \exp\!\Bigl(-\frac{(a - \mu_\theta(s))^2}{2\,\sigma_\theta(s)^2}\Bigr). πθ(as)=2π σθ(s)1exp(2σθ(s)2(aμθ(s))2).

若 $\mu) 和 $\sigma) 依赖于状态 $s) 的神经网络输出,则得到一个条件高斯分布

1.2 采样与对数概率

  • 采样:代码中

    action = dist.sample()
    

    就是从 N ( μ , σ 2 ) \mathcal{N}(\mu,\sigma^2) N(μ,σ2) 中进行一次采样,得到动作 $a)。

  • 对数概率

    log_prob = dist.log_prob(action)
    

    对应 log ⁡ π θ ( a ∣ s ) \log \pi_\theta(a\mid s) logπθ(as),其解析形式是一维时:

log ⁡ π θ ( a ∣ s ) = − 1 2 ( a − μ θ ( s ) σ θ ( s ) ) 2 − log ⁡ σ θ ( s ) − 1 2 log ⁡ ( 2 π ) . \log \pi_\theta(a\mid s) \;=\; -\frac12 \Bigl(\frac{a - \mu_\theta(s)}{\sigma_\theta(s)}\Bigr)^2 \;-\; \log \sigma_\theta(s) \;-\; \frac12 \log (2\pi). logπθ(as)=21(σθ(s)aμθ(s))2logσθ(s)21log(2π).

在高维时会有类似形式,只是用向量运算或对角协方差。


二、强化学习核心:马尔可夫决策过程

在强化学习中,我们通常有一个马尔可夫决策过程 (MDP),由 (\langle \mathcal{S}, \mathcal{A}, P, r, \gamma \rangle) 表示:

  • S \mathcal{S} S:状态空间,如 Pendulum 的 [cosθ, sinθ, θ̇] (3 维)。
  • A \mathcal{A} A:动作空间,如扭矩 [–2, 2] 连续区间 (1 维)。
  • P ( s t + 1 ∣ s t , a t ) P(s_{t+1} \mid s_t, a_t) P(st+1st,at):状态转移概率,这里由环境动力学给出。
  • r ( s t , a t ) r(s_t, a_t) r(st,at):奖励函数。
  • γ \gamma γ:折扣因子。

通过与环境交互(step 函数)、收集状态(s_t)、动作(a_t)、奖励(r_t) 的序列,可以估计策略性能。


三、REINFORCE(策略梯度)原理

在策略梯度方法中,我们的优化目标是最大化期望折扣回报:

J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T − 1 γ t r ( s t , a t ) ] , J(\theta) \;=\; \mathbb{E}_{\tau \sim \pi_\theta}\Bigl[\sum_{t=0}^{T-1} \gamma^t\,r(s_t,a_t)\Bigr], J(θ)=Eτπθ[t=0T1γtr(st,at)],
其中 τ = ( s 0 , a 0 , s 1 , a 1 , … ) \tau=(s_0,a_0,s_1,a_1,\dots) τ=(s0,a0,s1,a1,) 表示一条轨迹,依赖于策略 π θ \pi_\theta πθ

3.1 策略梯度定理

经典的策略梯度定理告诉我们如何计算对 θ \theta θ 的梯度:

∇ θ J ( θ ) = E τ ∼ π θ [ ∇ θ ∑ t = 0 T − 1 log ⁡ π θ ( a t ∣ s t ) ( ∑ k = t T − 1 γ k − t r k ) ] . \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \Bigl[ \nabla_\theta \sum_{t=0}^{T-1} \log \pi_\theta(a_t \mid s_t)\, \Bigl(\sum_{k=t}^{T-1}\gamma^{k-t} r_k\Bigr)\Bigr]. θJ(θ)=Eτπθ[θt=0T1logπθ(atst)(k=tT1γktrk)].

  • 这意味着:要更新参数 θ \theta θ,需要对对数概率 log ⁡ π θ \log \pi_\theta logπθ 与折扣累计回报 G t = ∑ k = t T − 1 γ k − t r k G_t = \sum_{k=t}^{T-1}\gamma^{k-t} r_k Gt=k=tT1γktrk做乘积,然后对整个期望取梯度。

3.2 REINFORCE 算法流程

在 REINFORCE 算法中,具体做法是:

  1. 采样:与环境交互一个回合(episode),收集状态、动作、即时奖励: { ( s 0 , a 0 , r 0 ) , … , ( s T − 1 , a T − 1 , r T − 1 ) } \{(s_0,a_0,r_0), \dots, (s_{T-1},a_{T-1},r_{T-1})\} {(s0,a0,r0),,(sT1,aT1,rT1)}
  2. 计算回报:对每个时间步 t t t 计算折扣累计回报
    G t = ∑ k = t T − 1 γ k − t r k . G_t = \sum_{k=t}^{T-1} \gamma^{k-t}r_k. Gt=k=tT1γktrk.
  3. 累积损失
    L ( θ ) = − ∑ t = 0 T − 1 log ⁡ π θ ( a t ∣ s t ) ( G t − b t ) , L(\theta) \;=\; -\sum_{t=0}^{T-1} \log \pi_\theta(a_t\mid s_t)\,\bigl(G_t - b_t\bigr), L(θ)=t=0T1logπθ(atst)(Gtbt),
    其中 b t b_t bt 可以是基线(此示例中未使用或可视为 0)。此处加负号是因为要最大化 J ( θ ) J(\theta) J(θ),等价于最小化损失。
  4. 梯度更新
    θ ← θ − α ∇ θ L ( θ ) . \theta \;\leftarrow\; \theta - \alpha\, \nabla_\theta L(\theta). θθαθL(θ).

在代码中可以看到,这个过程实现为:

loss = 0
for (log_prob, G) in zip(log_probs, returns):loss -= log_prob * G

对应上面公式中的 − log ⁡ π θ ( a t ∣ s t ) G t -\log \pi_\theta(a_t|s_t)\,G_t logπθ(atst)Gt 之和。


四、折扣回报与标准化

4.1 折扣回报

对每个时间步 t t t,折扣累计回报(Return)定义:
G t = ∑ k = t T − 1 γ k − t r k G_t \;=\; \sum_{k=t}^{T-1} \gamma^{k-t}\,r_k Gt=k=tT1γktrk
这是对未来奖励的一个加权和((\gamma\in(0,1]))。

在代码中,做法是:

G = 0
for r in reversed(rewards):G = r + gamma * Greturns.insert(0, G)

这样就得到 { G 0 , G 1 , … } \{G_0, G_1, \dots\} {G0,G1,}

4.2 标准化回报

代码中还把 returns 做了一步统计标准化:

returns = (returns - returns.mean()) / (returns.std() + 1e-9)
  • 这样可减少回报的数值范围差异,帮助训练稳定
  • 其本质是把回报视为一个随机变量,对其做 Z-Score 归一化,有助于减少梯度的高方差。

五、带入高斯策略的梯度更新

结合高斯策略 (\pi_\theta(a|s)):

  1. 动作分布
    π θ ( a ∣ s ) = N ( a ∣ μ θ ( s ) , σ θ ( s ) 2 ) . \pi_\theta(a\mid s) = \mathcal{N}\bigl(a\;\big|\;\mu_\theta(s), \sigma_\theta(s)^2\bigr). πθ(as)=N(a μθ(s),σθ(s)2).
  2. 对数概率
    log ⁡ π θ ( a ∣ s ) = − 1 2 ( a − μ θ ( s ) σ θ ( s ) ) 2 − log ⁡ σ θ ( s ) − 1 2 log ⁡ ( 2 π ) . \log \pi_\theta(a\mid s) \;=\; -\frac{1}{2}\Bigl(\frac{a-\mu_\theta(s)}{\sigma_\theta(s)}\Bigr)^2 \;-\; \log \sigma_\theta(s)\;-\;\frac12 \log (2\pi). logπθ(as)=21(σθ(s)aμθ(s))2logσθ(s)21log(2π).
  3. 梯度传播
    • μ θ ( s ) \mu_\theta(s) μθ(s) 由网络输出 σ θ \sigma_\theta σθ 也可以由网络或参数 log_std 生成。
    • 当计算 ∇ θ log ⁡ π θ ( a ∣ s ) \nabla_\theta\log \pi_\theta(a\mid s) θlogπθ(as) 时,误差信号会经过均值网络和标准差网络的权重,更新两部分参数。

在代码中,则是利用 PyTorch 的自动求导机制来完成这个过程,关键在于:

dist = torch.distributions.Normal(mean, std)
action = dist.sample()
log_prob = dist.log_prob(action).sum(dim=-1)
...
loss -= log_prob * G
loss.backward()

PyTorch 会自动计算对应的梯度并更新 mean, std(包括网络中的权重 fc(...)log_std)。


六、为什么高斯策略可以学到最优?

  1. 梯度方法保证不断改进

    • 在理论上,只要策略是可微分的,且学习率、样本充分,就能在梯度指引下逐步增大期望回报
    • 高斯分布为我们提供了一个简单、连续、且具有可计算对数似然的形式。
  2. 高斯策略具有探索能力

    • σ θ \sigma_\theta σθ 决定探索幅度;若初始大,可在动作空间随机试探。
    • 学到后期, σ θ \sigma_\theta σθ 可能收敛到较小的值,使动作接近最优均值 μ θ ( s ) \mu_\theta(s) μθ(s),减少随机抖动。
  3. 局部最优

    • 严格来说,这种方法往往收敛于局部最优;在很多连续控制任务中,局部最优已经相当好。

七、与代码的对应关系

从数学公式到代码实现,可以总结出对应:

  1. GaussianPolicy

    • self.fc(state) μ θ ( s ) \mu_\theta(s) μθ(s)
    • torch.exp(self.log_std) σ θ \sigma_\theta σθ
  2. dist = torch.distributions.Normal(mean, std)

    • 建立高斯分布 N ( a ∣ μ , σ ) \mathcal{N}(a|\mu,\sigma) N(aμ,σ)
  3. action = dist.sample()

    • 等价于抽取 a t ∼ N ( μ θ ( s t ) , σ θ ( s t ) 2 ) a_t \sim \mathcal{N}(\mu_\theta(s_t), \sigma_\theta(s_t)^2) atN(μθ(st),σθ(st)2)
  4. log_prob = dist.log_prob(action)

    • 等价于 log ⁡ π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) logπθ(atst)
  5. 收集 (log_prob, reward),计算折扣回报 returns

    • 对应策略梯度公式中的 ∑ t log ⁡ π θ ( a t ∣ s t ) G t \sum_t \log \pi_\theta(a_t|s_t) G_t tlogπθ(atst)Gt
  6. loss -= log_prob * Gloss.backward()

    • 负号是因为要最大化 log ⁡ π θ ⋅ G \log \pi_\theta \cdot G logπθG
    • PyTorch 会自动根据 μ θ ( s ) \mu_\theta(s) μθ(s) σ θ \sigma_\theta σθ 的计算图进行梯度传递。
  7. optimizer.step()

    • 完成一次梯度更新,即 θ ← θ + α ∇ θ J ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) θθ+αθJ(θ)

八、总结

  1. 高斯策略的数学本质

    • 用一个可微函数(神经网络)映射状态到 μ ( s ) \mu(s) μ(s);再用可学习的 log ⁡ σ \log\sigma logσ 得到 σ \sigma σ。这样组成一个在连续动作上的概率分布
    • 可微分 + 有解析形式 → 可以很方便地计算 log ⁡ π θ ( a ∣ s ) \log \pi_\theta(a|s) logπθ(as) 并做梯度更新。
  2. REINFORCE

    • 基于采样梯度上升的原理,将 log ⁡ π θ ( a ∣ s ) \log \pi_\theta(a|s) logπθ(as)与相应的回报 G t G_t Gt 乘起来,更新策略参数,使期望收益不断提升。
  3. 折扣回报与标准化

    • 通过折扣系数 γ \gamma γ 让未来奖励“递减影响”,更好地处理无限或长时序问题。
    • 通过标准化回报减少数值不稳定性。
  4. 局部最优

    • 该方法常可收敛到一个足够好的解,特别是在 Pendulum 之类的平滑且单峰问题中,常能获得理想表现。

参考要点

  • 策略梯度定理 ∇ θ J ( θ ) = E [ ∇ θ log ⁡ π θ ( a ∣ s ) G t ] \nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta(a|s) \,G_t] θJ(θ)=E[θlogπθ(as)Gt]
  • 高斯分布的可微属性: log ⁡ π θ \log\pi_\theta logπθ μ \mu μ σ \sigma σ可微,易编程实现。
  • 可视化:在 Pendulum 中,随着训练进行, μ θ \mu_\theta μθ 不断变得“更加准确”, σ θ \sigma_\theta σθ 可能逐渐变小,从而在扭矩上更精确地控制摆的倒立平衡。

在实践中,高斯策略 + REINFORCE是强化学习的一个最小可行例子。更复杂的场景或更先进的方法(PPO, DDPG, SAC 等)本质上都遵循类似的思路,只是改进了更新方式与稳定性,但核心仍离不开策略可微+对数概率+梯度驱动的理论基础。

相关文章:

强化学习 - 基于策略搜索和策略优化: 高斯策略

最近在做毕设需要用强化学习来做控制,对强化学习的知识点做一下总结。 高斯策略 高斯策略属于强化学习中的基于策略优化的分支(Policy Optimization),尤其是策略梯度方法(Policy Gradient Methods) 的一部…...

126周日复盘 (166)本周回顾

关键词:帧数测试 1、上午继续各处排查,优化帧数。 中午打包测试。 显卡锁60帧,720p窗口模式,画质3下, 低负载时50-60帧,密集战斗时35-45帧,基本达到预期, 硬件占用,显…...

08-Elasticsearch

黑马商城作为一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 首先,查询效率较低。 由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很…...

SQL在DBA手里-改写篇

背景 最近运营需要做月报汇总交易情况,之前一直是他们手工出的数据,他们想做成月初自动发送邮件,从而减轻他们的工作量。于是他们提供SQL我们在邮件服务器配置做定时发送任务。 表介绍(表及字段已做脱敏处理) trans…...

02-机器学习-核心概念

以下是机器学习核心概念的详细梳理。 1. 机器学习三大范式 类型定义典型应用监督学习使用带标签的数据训练模型,预测未知数据的标签。分类(邮件垃圾过滤)、回归(房价预测)无监督学习从无标签的数据中发现隐藏模式或结…...

企业财务管理系统的需求设计和实现

该作者的原创文章目录: 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…...

Couchbase UI: Server

在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址&#xff1…...

【软件设计师中级】-笔记缩减版本-计算机系统基础知识

1. 计算机系统基础知识 1.1. 计算机系统硬件基本组成硬件 中央处理器(CPU)硬件系统的核心 运算器 控制器 存储器(记忆设备) 内部存储器(速度高,容量小):临时存放程序、数据及中间结…...

SAP MM 记录一次SAP外协采购收货提示 这种物料的特殊库存 O 0100003359 14019002不存在的问题

根据采购订单收货,调用时 BAPI_GOODSMVT_CREATE时返回 { "TYPE":"E", "ID":"M7", "NUMBER":"076", "MESSAGE":"这种物料的特殊库存 O 0100003359 14019002不存在"…...

2025牛客寒假算法基础集训营2

H 一起画很大的圆&#xff01; 看起来像是一道计算几何的题&#xff0c;实际上通过分析和猜想&#xff0c;是有O1复杂度的结论的。具体证明略&#xff0c;结论是三点越接近共线&#xff0c;得出的半径越大。 #include <bits/stdc.h> using namespace std; #define endl \…...

统计学中的样本概率论中的样本

不知道当初谁想的把概率论和数理统计合并&#xff0c;作为一门课。这本身是可以合并&#xff0c;完整的一条线&#xff0c;看这里。但是&#xff0c;作为任课老师应该从整体上交代清楚&#xff0c;毕竟是两个学科&#xff0c;不同的学科合并必然会有各种不协调的问题。 举个最…...

DDD-全面理解领域驱动设计中的各种“域”

一、DDD-领域 在领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;中&#xff0c;**领域&#xff08;Domain&#xff09;**指的是软件系统所要解决的特定业务问题的范围。它涵盖了业务知识、规则和逻辑&#xff0c;是开发团队与领域专家共同关注的核心…...

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了&#xff0c;换个日志收集工具 Splunk 是一种 IT 工具&#xff0c;可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说&#xff0c;它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…...

计算机网络 (60)蜂窝移动通信网

一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于&#xff0c;将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域&#xff0c;称为蜂窝小区。每个小区设置一个基站&#xff0c;负责本小区内移…...

壁纸设计过程中如何增加氛围感

在壁纸设计过程中&#xff0c;增加氛围感是提升整体视觉效果和情感传达的关键。以下是一些具体的方法和技巧&#xff0c;帮助你在设计中营造出强烈的氛围感&#xff1a; 一、色彩运用 选择主题色&#xff1a; 根据你想要传达的情感选择主色调。例如&#xff0c;温暖的色调&…...

|Python新手小白中级教程|第二十九章:面向对象编程(Python类的拓展延伸与10道实操题目)(5)

文章目录 前言1.类变量与实例变量2.静态方法和类方法1.静态方法2.类方法 3.实操使用1. 创建一个名为Person的类&#xff0c;包含属性name和age&#xff0c;并且有一个方法introduce()用于介绍自己的名字和年龄。2. 创建一个名为Circle的类&#xff0c;包含属性radius和color&am…...

专为课堂打造:宏碁推出三款全新耐用型 Chromebook

IT之家 1 月 25 日消息&#xff0c;宏碁&#xff08;Acer&#xff09;昨日&#xff08;1 月 24 日&#xff09;发布公告&#xff0c;针对教育市场&#xff0c;推出 Chromebook Spin 512 (R857T)、Chromebook Spin 511 (R757T) 和 Chromebook 511 (C737) 三款产品&#xff0c;兼…...

UE求职Demo开发日志#12 完善击杀获得物品逻辑和UI

1 实现思路 1.给WarehouseManager添加一个按TArray增加物品的函数 2.Enemy身上一个变量记录掉落物品&#xff0c;死亡时调用增加物品函数 3.同时调用UI显示 2 实现过程 2.1 在WarehouseManager里添加一个AddItemByArray函数 遍历数组调用添加函数 void UWarehouseManage…...

Oracle查看数据库表空间使用情况

Oracle RAC环境查看表空间使用情况 查询字段释义&#xff1a; NEED_ADDFILE,--是否需增加表空间文件 TABLESPACE_NAME,--表空间名称 TABLESPACE_FILE_COUNT, --表空间当前数据文件数量 NOW_FILEENABLE_BLOCKS,--表空间文件当前数据块数 NOW_FILEENABLE_BYTES_GB,--表空间文件当…...

安装Ubuntu22.04

1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大...

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…...

scratch七彩六边形 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch七彩六边形 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…...

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 Alfresco Content Services&#xff08;简称ACS&#xff09;是一款功能完备的企业内容管理&#xff08;ECM&#xff09;解决方案&#xff0c;主要面向那些对企业级内容管理有高要求的组织。具体…...

Spring无法解决的循环依赖

在Spring框架中&#xff0c;循环依赖是指两个或多个Bean相互依赖&#xff0c;形成一个闭环。例如&#xff0c;Bean A依赖于Bean B&#xff0c;而Bean B又依赖于Bean A。虽然Spring通过三级缓存&#xff08;一级缓存、二级缓存、三级缓存&#xff09;机制解决了大多数情况下的循…...

电子应用设计方案105:智能家庭AI拖把系统设计

智能家庭 AI 拖把系统设计 一、引言 智能家庭 AI 拖把系统旨在为用户提供更高效、便捷和智能化的地面清洁解决方案&#xff0c;减轻家务劳动负担。 二、系统概述 1. 系统目标 - 自动清洁地面&#xff0c;包括吸尘、拖地和擦干功能。 - 智能识别地面材质和污渍程度&#xff0c…...

01-02 三元组与七元组

01-02 三元组与七元组 好的&#xff01;以下是关于网络中的 三元组&#xff08;3-Tuple&#xff09; 和 七元组&#xff08;7-Tuple&#xff09; 的详细扩展说明&#xff0c;包括它们的组成、用途以及与五元组的对比。 1. 三元组&#xff08;3-Tuple&#xff09; 组成 三元组…...

Spring整合Mybatis、junit纯注解

如何创建一个Spring项目 错误问题 不知道什么原因&#xff0c;大概是依赖版本不兼容、java版本不对的问题&#xff0c;折磨了好久就是搞不成。 主要原因看pom.xml配置 pom.xml配置 java版本 由于是跟着22年黑马视频做的&#xff0c;java版本换成了jdk-11&#xff0c;用21以…...

vue3中customRef的用法以及使用场景

1. 基本概念 customRef 是 Vue3 提供的用于创建自定义响应式引用的 API&#xff0c;允许显式地控制依赖追踪和触发响应。它返回一个带有 get 和 set 函数的工厂函数来自定义 ref 的行为。 1.1 基本语法 import { customRef } from vuefunction createCustomRef(value) {retu…...

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…...

两数相加:链表操作的基础与扩展

两数相加&#xff1a;链表操作的基础与扩展 引言 链表&#xff08;Linked List&#xff09;是一种灵活且高效的数据结构&#xff0c;特别适用于动态增删操作。无论是初学者还是资深程序员&#xff0c;链表的基本操作都是算法学习中的重要一环。而 “两数相加” 问题则是链表操…...