Gumbel-Softmax 技巧与带温度的 Softmax

数据挖掘 神经网络 深度学习 注意机制 软最大
2021-09-13 23:22:31

据我了解,Gumbel-Softmax技巧是一种使我们能够以可微分的方式对离散随机变量进行采样的技术(因此适用于端到端深度学习)。

许多论文和文章将其描述为一种在不使用不可微分的 argmax 函数的情况下选择输入中的实例(即“指针”)的方法。让我感到困惑的是,只需将Softmax 与 temperature 一起使用,就可以在没有随机性的情况下实现这种效果:

带温度的 Softmax

y𝑖=exp(𝑧𝑖τ)𝑗exp(𝑧𝑗τ)

Gumbel-Softmax

y𝑖=exp(log(π𝑖)+giτ)𝑗exp(log(πj)+gjτ)

我的问题

从实践和理论的角度来看,什么时候将 Gumbel 噪声纳入神经网络,而不是仅仅使用 Softmax 和温度?

几点观察:

  1. 当温度较低时,Softmax with temperature 和 Gumbel-Softmax 函数都将逼近 one-hot 向量。然而,在收敛之前,Gumbel-Softmax 可能会因为噪声而更突然地“改变”它的决定。
  2. 温度越高,Gumbel 噪声的显着性越大,分布越均匀。为什么需要这个?

我最好的猜测是,Gumbel 噪声的引入在收敛之前强制进行了更强的探索,但我不记得读过任何以此为动机来引入额外随机性的论文。

有没有人对此有任何经验或见解?也许我完全错过了 Gumbel-Softmax 的关键点 :)

4个回答

假设你有两个状态, X1X2,你有一个模型, M, 产生一个分数 M(Xi)对于每个状态(即 logits)。接下来,您可以使用 logits 来计算一些分布

P=softmax({M(X1),M(X2)})

并取概率最高的状态

X=argmaxXi(P)

但是如果你真的想从中取样怎么办 P而不是仅仅采用 argmax -你希望样本操作是可微的!这就是 Gumbel Trick 的用武之地——你计算而不是 softmax

 X=argmaxXi({M(Xi)+Zi})

在哪里 Zi是 iid Gumbel(0,1)。事实证明X 将等于 X1 关于 P(X1) 时代和 X2 关于 P(X2)的时代。换句话说,上面的等式样本来自P.

但由于 argmax 操作,它仍然不可微分。因此,我们将计算 Gumbel-Softmax 分布,而不是这样做。现在,如果温度足够低,那么 Gumbel-Softmax 将产生非常接近一个热向量的东西,其中预测标签的概率将为 1,而其他标签的概率为零。例如,如果 Gumbel-Softmax 给出的概率最高X1, 你可以做:

 X=xiPg(Xi)Xi=1X1+0X2=X1

在哪里 Pg是 Gumbel-Softmax 操作。不需要 argmax!因此,通过这个很酷的技巧,我们可以以可微分的方式从离散分布中采样。

从实践和理论的角度来看,什么时候将 Gumbel 噪声纳入神经网络,而不是仅仅使用 Softmax 和温度?

您不一定需要 Gumbel-Softmax 来获得“one-hot like”向量,或者通过索引机制进行区分的能力。

LSTM 架构和派生的变体就是这样的例子。他们使用确定性的 sigmoid 输出对“忘记/输入”门进行建模。“真正的”门控机制可能是 0 或 1,但为了使事物可区分,LSTM 放松了对 sigmoided 输出的约束。您会注意到这里没有“随机”输入,您仍然可以在此处应用直通技巧以使门真正离散(同时反向传播有偏梯度)。

Gumbel-Softmax 可用于您考虑使用非随机索引机制的任何地方(这是一个更通用的公式)。但当您想通过离散变量的随机样本进行反向传播时,它特别有用。

  • 具有 Gumbel-Softmax 或分类后验(编码器)分布的 VAE。值得注意的是,您不能在这里简单地使用确定性 softmax,因为它会将您的 VAE 变成标准的自动编码器。自动编码器缺乏从先前生成新样本的方法。
  • 具有 Gumbel-softmax 或 Categorical Actor 的 Actor-Critic 架构(大多数策略梯度实现假设您可以重新参数化从评论家到 Actor 的梯度,而无需使用评分函数估计器来估计黑盒梯度)。您不能在这里简单地替换确定性 softmax,因为存在类型不匹配:critic 将操作作为输入aA,而softmax表示条件策略分布 π(a|s)
  • 诸如 LSTM 之类的非随机量化的“概率”解释本质上是拟合密度时的模式搜索行为。你有接受分类决策的损失函数c,所以预期损失Ec[f(c)]通过学习一些分布来最小化p(c). 在不采样 Gumbel 噪声的情况下量化 softmax(例如,仅使用 sigmoid 或 softmax)类似于选择相同的c每次。对于一些f这没关系,对于其他f这是非常次优的(将分类 KL 散度视为损失)。

我最好的猜测是,Gumbel 噪声的引入在收敛之前强制进行了更强的探索,但我不记得读过任何以此为动机来引入额外随机性的论文。

这是一个有趣的想法,但是有很多方法可以将“探索”噪声注入您在函数逼近器中使用的参数集中。

对于 softmax 函数,无论温度是多少,它都不是精确的 one-hot 向量。如果您可以接受软版本,那就太好了。但是,如果您选择 argmax 作为其中之一,则它是不可微分的。反向传播梯度的另一种方法是使用直通估计器 (STE)[1] 技巧,并直接反向传播梯度 [2],梯度是不准确的近似值。

Gumbel Softmax [3] 的优点是它根据当前学习到的 π 分布对 one-hot 进行采样,它是 one-hot 并且是可微分的,并且采样 one-hot 向量的概率是根据 pi 的。

对于您的发送问题:一开始,分布 \pi 没有任何先验知识,因此我们希望通过均匀采样 one-hot 向量(在此阶段,噪声很重要),并且分布将逐渐收敛到所需的分布(稍微尖锐)。当您训练更长的时期时,已经充分了解了分布的先验知识,逐渐降低温度 \tau 并使 \pi 收敛到离散分布。随着温度 \tau 的逐渐降低,噪声的影响会变小。

PS:句子不正确:

When the temperature is low, both Softmax with temperature and the Gumbel-Softmax functions will approximate a one-hot vector.

Gumbel-softmax 可以采样 one-hot 向量而不是近似值。您可以阅读 [4] 处的 PyTorch 代码。

[1] Binaryconnect:在传播过程中使用二进制权重训练深度神经网络

[2] LegoNet:具有 Lego 滤波器的高效卷积神经网络

[3] 使用 Gumbel-Softmax 进行分类重参数化

[4] https://github.com/pytorch/pytorch/blob/15f9fe1d92a5d1e86278ae25f92dd9677b4956dc/torch/nn/functional.py#L1237

我也一直在寻找这个问题的答案,我给出了我对 Gumbel softmax 的不同看法,只是因为我认为这是一个很好的问题。

从一般的角度来看:我们正常使用softmax是因为我们需要一个所谓的score,或者distribution π1..πn用于表示大小为 n 的分类变量的 n 个概率;我们使用 Gumbel-softmax 从这个分布中采样一个热样本[0..1..0]。

在更具体的示例中:通常在 NLP 网络中(将输出分类为不同的单词标记),softmax 用于计算当前文本位置的不同的分布,例如 5000 个单词选择。交叉熵损失,给出了关于softmax预测分布和真实词分布之间差异的度量;对于 Gumbel-softmax,它通常用于生成样本 one-hot 向量以构建以下网络,就像在一些基于 VAE 的模型中一样。这就是为什么温度因素τ 对于 Gumbel-softmax 来说是必须的,在大多数情况下在 softmax 中不需要。

至此,我们知道了它们用例的区别,现在是令人困惑的部分:两个公式如此相似,为什么它们做不同的事情?

第一个关键因素:不同之处在于giGumbel-softmax 公式中的术语。它表示从分布中采样的一个点Gumbel(0,1). 添加项log(πi) 和缩放项 τ 只是用来重新参数化它 Gumbel(log(πi),τ)(重新参数化技巧是为了使其可微)。这个 Gumbel 分布是在Gumbel-max方法中对分类变量进行采样的关键分布(因为存在 argmax,所以很难且不可微),这也是 Gumbel-softmax 中 Gumbel 名称的来源。每次我们使用 Gumbel-softmax 时,我们都需要从Gumbel(0,1) 并进行重新参数化技巧,这是与 softmax 最不同的部分。

我宁愿将它命名为soft-Gumbel-max,以表明它有动机制作 Gumbel-max 的软版本,而不是仅仅打算在 softmax 中添加 Gumbel 术语。

第二个最显着的区别:是使用τ. 在大多数神经网络中,softmax 不与这个术语耦合。因为我们通常需要一个分布,而不是一个近乎单一的向量。更重要的是,在某些情况下,比如束搜索,我们需要获得第二或第三个最可能的选择来探索全局最优搜索。在softmax中,τ通常会添加一些特定领域的知识以使分布更陡峭。更小τ并不总是意味着更好,我们需要调整它以最适合模型。然而对于 Gumbel-softmax,在模型训练的后期,我们需要 Gumbel-softmax 尽可能接近 one-hot 向量。这就是为什么我们需要在训练期间将其退火得越来越小。(τ在训练开始时不会太小,因为这会使训练更稳定)。在某些实现中,如torch.nn.functional.gumbel_softmax,它使用直通技巧hard - (detached soft) + soft将输出值保持为硬 Gumbel-max 中的单热向量,但具有明确定义的梯度,如软可微 Gumbel-softmax 中。

我不同意前面的答案的大部分是,Gumbel-softmax不会给你确切的 one-hot 向量。它仍然是一个热向量的估计。即使是直通,前向传播也是 Gumbel-max,只有后向传播是 Gumbel-softmax。

这几乎就是我对 Gumbel-softmax、Gumbel-max 和 softmax 的理解。如果有任何不清楚或不正确的地方,请发表评论。

MORE 如果你仍然困惑

写完这个答案后,我发现,虽然softmax和Gumbel-softmax的用例不同,但是我们仍然可以在应用Gumbel-softmax的地方强制应用softmax,而不会遇到任何算术问题,反之亦然。因为它们都是软的,不精确的,而且它们都是可微的。为了更清楚为什么这是一个问题。让我们举两个非常严重的滥用例子。

假设有一个网络需要一个样本而不是一个分类变量的分布,例如,一个网络需要一个分类变量来表示我想生成谁的演讲:奥巴马或特朗普。假设训练数据有 70% 的机会来自特朗普,30% 的时间来自奥巴马,那么 70% 的时间变量应该是 [0 1] 而 30% 的时间应该是 [1 0]。如果我们在这里改用softmax,变量将始终约为[0.3 0.7],因此它变成一个常数,因此可以被网络忽略。为了减轻训练损失损失,生成的网络很可能会产生混合声音,有点像奥巴马,有点像特朗普。更何况训练时的[0.7 0.3]在预测时从来不用,这也是域外预测的问题。

另一个例子是预测句子中“you”之后的下一个单词。假设只有两个选项:“are”和“have”。如果我们用 Gumbel-softmax 代替 softmax 来表示两个词的概率。只有在训练过程进行正确采样时,交叉熵损失才不会接近无穷大(-log0)。在这种情况下,训练过程很容易出现梯度爆炸。