对角高斯策略详解
这份笔记将详细解释在强化学习中,什么是对角高斯策略,以及它的两种主流实现方式、采样方法和对数似然计算。
1. 基础概念:从多维高斯到对角高斯
多维高斯分布 (Multivariate Gaussian Distribution): 一个通用的多维高斯分布由两个核心参数描述:
- 一个均值向量 $μ$,它表示分布的中心位置。
- 一个协方差矩阵 $Σ$,它描述了各个维度之间的相关性。
对角高斯分布 (Diagonal Gaussian Distribution): 这是多维高斯分布的一个特例和简化。
- 在这种分布中,我们假设所有维度都是相互独立的。
- 这意味着它的协方差矩阵 $Σ$ 只有对角线上的元素(各个维度的方差)不为零,其余所有元素都为零。
- 因此,我们不再需要一个完整的矩阵来表示它,只需要一个向量(例如,标准差向量 $σ$)就足够了。这个简化使得学习过程变得更加容易和高效。
2. 对角高斯策略的核心结构
在强化学习中,一个对角高斯策略总是包含一个神经网络。这个网络的核心任务是:
接收一个环境观察 (observation) $s$,并输出对应这个状态下的“最佳”平均动作,即均值向量 $μ_θ(s)$。
这里的下标 $θ$ 代表神经网络的参数。策略的学习过程就是调整 $θ$,使得网络输出的 $μ_θ(s)$ 越来越好。
3. 如何表示标准差 $σ$:两种主流方法
均值 $μ_θ(s)$ 由网络输出,但标准差 $σ$ (它决定了探索的范围) 是如何产生的呢?主要有两种方式:
方法一:与状态无关的对数标准差 (Standalone Parameters)
- 核心思想: 网络的任务只是计算均值 $μ_θ(s)$。标准差 $σ$ 与当前的状态 $s$ 无关,它是一个独立的、全局共享的可学习参数。
- 具体实现:
- 创建一个神经网络,将观察 $s$ 映射到均值动作 $μ_θ(s)$。
- 另外,独立创建一个向量参数 $log σ$。这个向量的维度与动作空间维度相同,它会像网络权重一样,在训练过程中被优化器更新。
- 特点: 无论智能体处于什么状态,其探索的“不确定性”或“随机性”程度都是固定的。
- 应用: 这种方法简单且稳定,是 VPG、TRPO 和 PPO 等经典算法的标准实现方式。
方法二:由网络输出的、与状态相关的对数标准差
- 核心思想: 标准差 $σ$ 也依赖于当前状态 $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$:
- 从一个标准正态分布(均值为0,标准差为1)中采样一个与动作维度相同的噪声向量 $z$。即 $z \sim \mathcal{N}(0, I)$,其中 $I$ 是单位矩阵。
- 使用下面的公式计算最终的动作 $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$ 项)。这个值在策略更新时至关重要。