对角高斯策略详解

这份笔记将详细解释在强化学习中,什么是对角高斯策略,以及它的两种主流实现方式、采样方法和对数似然计算。

1. 基础概念:从多维高斯到对角高斯

  • 多维高斯分布 (Multivariate Gaussian Distribution): 一个通用的多维高斯分布由两个核心参数描述:

    1. 一个均值向量 $μ$,它表示分布的中心位置。
    2. 一个协方差矩阵 $Σ$,它描述了各个维度之间的相关性。
  • 对角高斯分布 (Diagonal Gaussian Distribution): 这是多维高斯分布的一个特例和简化

    • 在这种分布中,我们假设所有维度都是相互独立的
    • 这意味着它的协方差矩阵 $Σ$ 只有对角线上的元素(各个维度的方差)不为零,其余所有元素都为零。
    • 因此,我们不再需要一个完整的矩阵来表示它,只需要一个向量(例如,标准差向量 $σ$)就足够了。这个简化使得学习过程变得更加容易和高效。

2. 对角高斯策略的核心结构

在强化学习中,一个对角高斯策略总是包含一个神经网络。这个网络的核心任务是:

接收一个环境观察 (observation) $s$,并输出对应这个状态下的“最佳”平均动作,即均值向量 $μ_θ(s)$。

这里的下标 $θ$ 代表神经网络的参数。策略的学习过程就是调整 $θ$,使得网络输出的 $μ_θ(s)$ 越来越好。

3. 如何表示标准差 $σ$:两种主流方法

均值 $μ_θ(s)$ 由网络输出,但标准差 $σ$ (它决定了探索的范围) 是如何产生的呢?主要有两种方式:

方法一:与状态无关的对数标准差 (Standalone Parameters)
  • 核心思想: 网络的任务是计算均值 $μ_θ(s)$。标准差 $σ$ 与当前的状态 $s$ 无关,它是一个独立的、全局共享的可学习参数。
  • 具体实现:
    • 创建一个神经网络,将观察 $s$ 映射到均值动作 $μ_θ(s)$。
    • 另外,独立创建一个向量参数 $log σ$。这个向量的维度与动作空间维度相同,它会像网络权重一样,在训练过程中被优化器更新。
  • 特点: 无论智能体处于什么状态,其探索的“不确定性”或“随机性”程度都是固定的。
  • 应用: 这种方法简单且稳定,是 VPGTRPOPPO 等经典算法的标准实现方式。
方法二:由网络输出的、与状态相关的对数标准差
  • 核心思想: 标准差 $σ$ 也依赖于当前状态 $s$。这意味着智能体可以学会在不同的状态下采取不同程度的探索。
  • 具体实现:
    • 神经网络接收观察 $s$ 后,通常会有两个“输出头”(output heads)。
    • 一个头输出均值动作 $μ_θ(s)$。
    • 另一个头输出对数标准差 $log σ_θ(s)`。
    • 这两个头可以共享网络前面的大部分层(特征提取层)。
  • 特点: 策略更加灵活。例如,在熟悉的、安全的环境中,网络可以学会输出一个很小的 $σ$(低探索,高确定性);在陌生的、危险的环境中,则可以输出一个较大的 $σ$(高探索,高不确定性)。
  • 应用: SAC (Soft Actor-Critic) 等现代算法常采用此方法。

4. 关键技巧:为什么使用对数标准差 ($log σ$)?

这是一个非常重要的实现细节。我们让网络输出 $log σ$ 而不是直接输出 $σ$,原因如下:

  • 约束问题: 标准差 $σ$ 的定义要求它必须是非负数 ($σ ≥ 0$)。如果让神经网络直接输出 $σ$,我们就必须在网络的最后一层加一个激活函数(比如 ReLU 或 Softplus)来保证输出为正。这会给训练带来一些麻烦(比如梯度消失)。
  • log 技巧: 对数 $log σ$ 的取值范围是 $(-\infty, \infty)$。这正好是神经网络线性层输出的自然范围!因此可以让网络毫无约束地输出 $log σ$。
  • 恢复 $σ$: 当我们拿到网络输出的 $log σ$ 后,只需要做一个指数运算 $σ = \exp(log σ)$ 就可以得到真正的、为正数的 $σ$。指数函数 $\exp(x)$ 的值域永远是正数,所以这样得到的 $σ$ 就自动满足了大于零的约束。

这个技巧解除了对网络输出的约束,让训练过程更简单、更稳定。

5. 如何从策略中采样动作 (Reparameterization Trick)

一旦我们有了均值 $μ_θ(s)$ 和标准差 $σ_θ(s)$,就可以通过以下步骤来采样一个具体的动作 $a$:

  1. 从一个标准正态分布(均值为0,标准差为1)中采样一个与动作维度相同的噪声向量 $z$。即 $z \sim \mathcal{N}(0, I)$,其中 $I$ 是单位矩阵。
  2. 使用下面的公式计算最终的动作 $a$:
    $a = μ_θ(s) + σ_θ(s) \odot z$
    这里的 $\odot$ 表示逐元素相乘 (elementwise product)

这个方法被称为重参数化技巧 (Reparameterization Trick)。它的巨大优势在于,它将随机性(来自 $z$)与网络参数 $θ$ 分离开来,使得梯度能够顺利地从动作 $a$ 反向传播到网络参数 $θ$,这对训练至关重要。

在PyTorch中,你可以使用 torch.normal() 或者 torch.distributions.Normal 对象来轻松实现这一过程。

6. 计算对数似然 (Log-Likelihood)

在很多策略梯度算法中,我们需要计算在给定状态 $s$ 下,采取某个动作 $a$ 的对数概率 $log π_θ(a|s)$。对于一个 $k$ 维的对角高斯策略,其对数似然由以下公式给出:

$\log \pi_{\theta}(a|s) = -\frac{1}{2}\left(\sum_{i=1}^k \left(\frac{(a_i - \mu_i)^2}{\sigma_i^2} + 2 \log \sigma_i \right) + k \log 2\pi \right)$

这个公式直观上衡量了动作 $a$ 与分布中心 $μ$ 的“距离”(由 $σ$ 标准化后),并考虑了分布本身的“宽度”($log σ_i$ 项)。这个值在策略更新时至关重要。

对角高斯策略详解

http://example.com/RL/Gassian.html

作者

Jiamin Liu

发布于

2025-07-07

更新于

2025-07-07

许可协议

评论