Gumbel distribution

感觉这个分布的含义很有用啊, 能预测‘最大’, 也就是自然灾害, 太牛了.

主要内容

定义

[Gumbel distribution-wiki](Gumbel distribution - Wikipedia)

其分布函数和概率密度函数分别为:
F ( x ; μ , β ) = e − e − ( x − μ ) / β , f ( x ; μ , β ) = 1 β e − [ e − ( x − μ ) / β + ( x − μ ) / β ] F(x; \mu, \beta) = e^{-e^{-(x-\mu)/\beta}}, \quad f(x;\mu,\beta) = \frac{1}{\beta} e^{-[e^{-(x-\mu)/\beta}+(x-\mu) / \beta]} F(x;μ,β)=ee(xμ)/β,f(x;μ,β)=β1e[e(xμ)/β+(xμ)/β]
标准Gumbel分布(即 μ = 0 , β = 1 \mu=0, \beta=1 μ=0,β=1):
F ( x ) = e − e − x , f ( x ) = e − ( x + e − x ) . F(x) = e^{-e^{-x}}, \quad f(x) = e^{-(x+e^{-x})}. F(x)=eex,f(x)=e(x+ex).

从Gumbel分布中采样, 只需:
x = F − 1 ( u ) = μ − β ln ⁡ ( − ln ⁡ ( u ) ) , u ∼ U n i f o r m ( 0 , 1 ) . x = F^{-1}(u) = \mu - \beta \ln (-\ln(u)), \quad u \sim \mathrm{Uniform}(0, 1). x=F1(u)=μβln(ln(u)),uUniform(0,1).
proof:
P ( F − 1 ( u ) ≤ x ) = P ( u ≤ F ( x ) ) = F ( x ) , P(F^{-1}(u) \le x) = P(u \le F(x)) = F(x), P(F1(u)x)=P(uF(x))=F(x),
F − 1 ( u ) F^{-1}(u) F1(u)的分布函数就是 F ( x ) F(x) F(x).

E [ x ] = μ + γ ⋅ β , \mathbb{E} [x] = \mu + \gamma \cdot \beta, E[x]=μ+γβ,

其中 γ \gamma γ是Euler-Mascherorni constant.

Gumbel-Max trick

假设我们有一个离散的分布 [ π 1 , π 2 , ⋯   , π k ] [\pi_1, \pi_2, \cdots, \pi_k] [π1,π2,,πk] k k k类, π i \pi_i πi表示为第 i i i类的概率, 则从该分布中采样 z z z等价于
z = arg ⁡ max ⁡ i [ g i + log ⁡ π i ] , g i ∼ G u m b e l ( 0 , 1 ) , i . i . d . z = \arg \max_i [g_i + \log \pi_i], \quad g_i \sim \mathrm{Gumbel}(0, 1), \mathrm{i.i.d}. z=argimax[gi+logπi],giGumbel(0,1),i.i.d.
proof:
P ( z = i ) = P ( g i + log ⁡ π i ≥ max ⁡ { g j + log ⁡ π j } j ≠ i ) = ∫ − ∞ + ∞ p ( x ) P ( x + log ⁡ π i ≥ { g j + log ⁡ π j } j ≠ i ) d x . P(z=i) = P(g_i + \log \pi_i \ge \max \{g_j + \log \pi_j\}_{j\not=i}) = \int_{-\infty}^{+\infty} p(x) P(x+\log \pi_i \ge \{g_j + \log \pi_j\}_{j\not=i}) \mathrm{d}x. P(z=i)=P(gi+logπimax{gj+logπj}j=i)=+p(x)P(x+logπi{gj+logπj}j=i)dx.

P ( x + log ⁡ π i ≥ { g j + log ⁡ π j } j ≠ i ) = ∏ j ≠ i P ( g j ≤ x + log ⁡ π i − log ⁡ π j ) = e − e − x ⋅ 1 − π i π i , P(x+\log \pi_i \ge \{g_j + \log \pi_j\}_{j\not=i}) = \prod_{j\not=i} P(g_j \le x + \log\pi_i - \log \pi_j) = e^{-e^{-x} \cdot \frac{1 - \pi_i}{\pi_i}}, P(x+logπi{gj+logπj}j=i)=j=iP(gjx+logπilogπj)=eexπi1πi,

带入计算得:

P ( z = i ) = ∫ − ∞ + ∞ e − ( x + e − x ⋅ 1 π i ) d x = ∫ − ∞ + ∞ π i ⋅ e − [ ( x − log ⁡ 1 π i ) + e − ( x − log ⁡ 1 π i ) ] d x = π i . \begin{array}{ll} P(z=i) & = \int_{-\infty}^{+\infty} e^{-(x+e^{-x} \cdot \frac{1}{\pi_i})} \mathrm{d}x \\ & = \int_{-\infty}^{+\infty} \pi_i \cdot e^{-[(x-\log\frac{1}{\pi_i})+e^{-(x - \log \frac{1}{\pi_i})}]} \mathrm{d}x \\ & = \pi_i. \end{array} P(z=i)=+e(x+exπi1)dx=+πie[(xlogπi1)+e(xlogπi1)]dx=πi.

Gumbel trick 用于归一化

我们时常会碰到这样的问题:
p ( x ; θ ) = f ( x ; θ ) Z , p(x;\theta) = \frac{f(x;\theta)}{Z}, p(x;θ)=Zf(x;θ),
其中 Z = ∑ i = 1 K f ( x i ; θ ) Z=\sum_{i=1}^K f(x_i;\theta) Z=i=1Kf(xi;θ) 是归一化常数, 那么怎么计算 Z Z Z呢?

构建随机变量 T T T:
T = max ⁡ i [ ln ⁡ f ( x i ) + g i ] , g i ∼ G u m b e l ( − c , 1 ) , i . i . d . T = \max_i [\ln f(x_i) + g_i], \quad g_i \sim \mathrm{Gumbel}(-c, 1), \mathrm{i.i.d.} T=imax[lnf(xi)+gi],giGumbel(c,1),i.i.d.

T ∼ G u m b e l ( − c + ln ⁡ Z ) T \sim \mathrm{Gumbel}(-c + \ln Z) TGumbel(c+lnZ)
proof:

P ( T ≤ t ) = P ( max ⁡ i [ ln ⁡ f ( x i ) + g i ] ≤ t ) = ∏ i P ( g i ≤ t − ln ⁡ f ( x i ) ) = e − e − ( t + c − ln ⁡ Z ) = F ( t ; − c + ln ⁡ Z , 1 ) . P(T \le t) = P(\max_i [\ln f(x_i) + g_i] \le t) = \prod_{i} P(g_i \le t - \ln f(x_i)) = e^{-e^{-(t+c-\ln Z)}} = F(t;-c+\ln Z ,1). P(Tt)=P(imax[lnf(xi)+gi]t)=iP(gitlnf(xi))=ee(t+clnZ)=F(t;c+lnZ,1).

因为
E [ T ] = − c + ln ⁡ Z + γ , \mathbb{E}[T] = -c + \ln Z + \gamma, E[T]=c+lnZ+γ,
故我们只需估计 E [ T ] ≈ ∑ j T j \mathbb{E}[T] \approx \sum_j T_j E[T]jTj 即可估计 Z Z Z
Z = exp ⁡ ( ∑ j T j + c − γ ) . Z = \exp (\sum_{j}T_j + c - \gamma). Z=exp(jTj+cγ).
所以必须要求离散的 x x x?

代码

[scipy-gumbel](scipy.stats.gumbel_r — SciPy v1.6.3 Reference Guide)

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gumbel_r

fig, ax = plt.subplots(1, 1)
# mean, var, skew, kurt = gumbel_r.stats(moments='mvsk')
# print(mean, var, skew, kurt)

x = np.linspace(gumbel_r.ppf(0.01), gumbel_r.ppf(0.99), 100)
ax.plot(x, gumbel_r.pdf(x), 'r-', lw=5, alpha=0.6, label="gumbel_r pdf")
r = gumbel_r.rvs(size=1000, loc=0, scale=1)
ax.hist(r, density=True, histtype="stepfilled", alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()

image-20210526174047331

### Gumbel-Softmax在SAC中的离散化实现 #### 背景介绍 软演员-评论家(Soft Actor-Critic, SAC)是一种基于最大熵框架的强化学习算法,适用于连续动作空间的任务。然而,在面对离散动作空间时,传统的SAC无法直接应用,因为其核心依赖于对动作分布进行梯度计算的操作。为了克服这一限制,可以采用Gumbel-Softmax技巧将离散分布转化为可微分的形式。 Gumbel-Softmax的核心思想是在softmax函数的基础上引入噪声项,从而使得原本不可导的离散采样过程变得平滑且可微分[^2]。这种方法允许我们通过反向传播优化神经网络参数,即使目标涉及离散决策。 --- #### Gumbel-Softmax的工作机制 Gumbel-Softmax通过对logits加上经过缩放的Gumbel噪声来模拟离散采样的效果。具体而言: 1. **定义Logits**: 假设输入的动作概率由 logits $\pi(a|s)$ 表示,则对于每个可能的动作 $a_i$ 的 logit 记作 $z_i$。 2. **加入Gumbel噪声**: 对每个 $z_i$ 加上独立抽样的Gumbel随机变量 $g_i \sim Gumble(0, 1)$,得到新的值: $$ y_i = z_i + g_i $$ 3. **应用Softmax**: 将上述加噪后的值送入 softmax 函数中,形成一个松弛化的概率分布: $$ p_i = \frac{\exp(y_i / \tau)}{\sum_j \exp(y_j / \tau)} $$ 其中 $\tau > 0$ 是温度超参数,控制分布的锐利程度。当 $\tau \to 0$ 时,该分布逐渐逼近 one-hot 编码;而较大的 $\tau$ 则会使分布更加平坦。 4. **近似Argmax**: 使用最终的概率分布作为动作的选择依据,或者进一步取 argmax 来获得具体的离散动作。 这种技术不仅保留了原始策略的学习能力,还能够兼容 SAC 中所需的梯度估计操作。 --- #### 在SAC中的集成方式 以下是将Gumbel-Softmax融入SAC的具体步骤说明以及相应的PyTorch代码片段: ##### 步骤描述 - 政策网络输出未经激活的 logits 向量; - 应用Gumbel-Softmax转换这些 logits 成为光滑的概率分布; - 根据所得分布执行探索行为或评估期望回报。 下面是完整的Python实现例子: ```python import torch from torch.distributions import Categorical def sample_gumbel(shape, eps=1e-20): """Sample from the Gumbel distribution.""" U = torch.rand(shape).cuda() # or .cpu() return -torch.log(-torch.log(U + eps) + eps) def gumbel_softmax_sample(logits, temperature): """Draw a sample from the Gumbel-Softmax distribution.""" y = logits + sample_gumbel(logits.size()) return torch.softmax(y / temperature, dim=-1) def gumbel_softmax(logits, temperature, hard=False): """ Sample from the Gumbel-Softmax distribution and optionally discretize. Args: logits: [..., n_classes] unnormalized log-probs temperature: non-negative scalar hard: if True, take argmax; otherwise use soft samples Returns: [..., n_classes] tensor of probabilities """ y = gumbel_softmax_sample(logits, temperature) if not hard: return y shape = y.size() _, ind = y.max(dim=-1) y_hard = torch.zeros_like(y).view(-1, shape[-1]) y_hard.scatter_(1, ind.view(-1, 1), 1) y_hard = y_hard.view(*shape) return (y_hard - y).detach() + y ``` 在此基础上构建actor部分即可完成整个系统的搭建工作[^3]。 --- #### 关键差异分析 需要注意的是,尽管标准 Softmax 和 Gumbel-Softmax 都会产生某种形式的概率质量分配,但由于后者额外包含了随机扰动成分,因此两者之间必然存在区别。尤其体现在极端情况下——比如非常低温条件下($\tau → 0$)—前者趋向均匀分布,而后者的输出则更接近真实样本点位置处的高度集中形态。 至于为何 `argmax(Gumbel-Softmax)` 不总是等于 `argmax(Softmax)` ,这是因为即便两者的理论峰值相同,实际数值仍会受到不同初始化条件的影响而导致细微偏差出现。这种情况属于正常现象,并不会影响整体性能表现。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值