漫谈重参数:从正态分布到Gumbel Softmax
By 苏剑林 | 2019-06-10 | 230771位读者 |最近在用VAE处理一些文本问题的时候遇到了对离散形式的后验分布求期望的问题,于是沿着“离散分布 + 重参数”这个思路一直搜索下去,最后搜到了Gumbel Softmax,从对Gumbel Softmax的学习过程中,把重参数的相关内容都捋了一遍,还学到一些梯度估计的新知识,遂记录在此。
文章从连续情形出发开始介绍重参数,主要的例子是正态分布的重参数;然后引入离散分布的重参数,这就涉及到了Gumbel Softmax,包括Gumbel Softmax的一些证明和讨论;最后再讲讲重参数背后的一些故事,这主要跟梯度估计有关。
基本概念 #
重参数(Reparameterization)实际上是处理如下期望形式的目标函数的一种技巧:
\begin{equation}L_{\theta}=\mathbb{E}_{z\sim p_{\theta}(z)}[f(z)]\label{eq:base}\end{equation}
这样的目标在VAE中会出现,在文本GAN也会出现,在强化学习中也会出现($f(z)$对应于奖励函数),所以深究下去,我们会经常碰到这样的目标函数。取决于$z$的连续性,它对应不同的形式:
\begin{equation}\int p_{\theta}(z) f(z)dz\,\,\,\text{(连续情形)}\qquad\qquad \sum_{z} p_{\theta}(z) f(z)\,\,\,\text{(离散情形)}\end{equation}
当然,离散情况下我们更喜欢将记号$z$换成$y$或者$c$。
为了最小化$L_{\theta}$,我们就需要把$L_{\theta}$明确地写出来,这意味着我们要实现从$p_{\theta}(z)$中采样,而$p_{\theta}(z)$是带有参数$\theta$的,如果直接采样的话,那么就失去了$\theta$的信息(梯度),从而无法更新参数$\theta$。而Reparameterization则是提供了这样的一种变换,使得我们可以直接从$p_{\theta}(z)$中采样,并且保留$\theta$的梯度。(注:如果考虑最一般的形式,那么$f(z)$也应该带上参数$\theta$,但这没有增加本质难度。)
连续情形 #
简单起见,我们先考虑连续情形
\begin{equation}L_{\theta}=\int p_{\theta}(z) f(z)dz\label{eq:lianxu}\end{equation}
其中$p_{\theta}(z)$是具有显式概率密度表达式的分布,在变分自编码器中常见的是正态分布$p_{\theta}(z)=\mathcal{N}\left(z;\mu_{\theta},\sigma_{\theta}^2\right)$。
形式 #
从式$\eqref{eq:lianxu}$中知道,连续情形的$L_{\theta}$实际上就对应一个积分,所以,为了明确写出$L_{\theta}$,有两种途径:最直接的方式是精确地完成积分$\eqref{eq:lianxu}$,得到显式表达式,但这通常都是不可能的了;所以,唯一的办法是转化为采样形式$\eqref{eq:base}$,并试图在采样过程中保留$\theta$的梯度。
重参数就是这样的一种技巧,它假设从分布$p_{\theta}(z)$中采样可以分解为两个步骤:(1) 从无参数分布$q(\varepsilon)$中采样一个$\varepsilon$;(2) 通过变换$z=g_{\theta}(\varepsilon)$生成$z$。那么,式$\eqref{eq:base}$就变成了
\begin{equation}L_{\theta}=\mathbb{E}_{\varepsilon\sim q(\varepsilon)}[f(g_{\theta}(\varepsilon))]\label{eq:reparam}\end{equation}
这时候被采样的分布就没有任何参数了,全部被转移到$f$内部了,因此可以采样若干个点,当成普通的loss那样写下来了。
例子 #
一个最简单的例子就是正态分布:对于正态分布来说,重参数就是“从$\mathcal{N}\left(z;\mu_{\theta},\sigma_{\theta}^2\right)$中采样一个$z$”变成“从$\mathcal{N}\left(\varepsilon;0, 1\right)$中采样一个$\varepsilon$,然后计算$\varepsilon\times \sigma_{\theta} + \mu_{\theta}$”,所以
\begin{equation}\mathbb{E}_{z\sim \mathcal{N}\left(z;\mu_{\theta},\sigma_{\theta}^2\right)}\big[f(z)\big] = \mathbb{E}_{\varepsilon\sim \mathcal{N}\left(\varepsilon;0, 1\right)}\big[f(\varepsilon\times \sigma_{\theta} + \mu_{\theta})\big]\end{equation}
如何理解直接采样没有梯度而重参数之后就有梯度呢?其实很简单,比如我说从$\mathcal{N}\left(z;\mu_{\theta},\sigma_{\theta}^2\right)$中采样一个数来,然后你跟我说采样到5,我完全看不出5跟$\theta$有什么关系呀(求梯度只能为0);但是如果先从$\mathcal{N}\left(\varepsilon;0, 1\right)$中采样一个数比如$0.2$,然后计算$0.2 \sigma_{\theta} + \mu_{\theta}$,这样我就知道采样出来的结果跟$\theta$的关系了(能求出有效的梯度)。
总结 #
让我们把前面的内容重新整理一下。总的来说,连续情形的重参数还是比较简单的:连续情形下,我们要处理的$L_{\theta}$实际上是式$\eqref{eq:lianxu}$,由于精确的积分我们没有办法显式地写出来,所以需要转化为采样,而为了在采样的过程中得到有效的梯度,我们就需要重参数。
从数学本质来看,重参数是一种积分变换,即原来是关于$z$积分,通过$z=g_{\theta}(\varepsilon)$变换之后得到新的积分形式,
离散情形 #
为了突出“离散”,我们将随机变量$z$换成$y$,即对于离散情形要面对的目标函数是
\begin{equation}L_{\theta}=\mathbb{E}_{y\sim p_{\theta}(y)}[f(y)]=\sum_y p_{\theta}(y) f(y)\label{eq:lisan}\end{equation}
其中离散意味着一般情况$y$是可枚举的,换句话说$p_{\theta}(y)$此时是一个$k$分类模型:
\begin{equation}p_{\theta}(y)=softmax\big(o_1,o_2,\dots,o_k\big)=\frac{1}{\sum\limits_{i=1}^k e^{o_i}}\left(e^{o_1}, e^{o_2}, \dots, e^{o_k}\right)\label{eq:softmax}\end{equation}
其中各个$o_i$是$\theta$的函数。
分析 #
读者看到$\eqref{eq:lisan}$中的求和,第一反应可能是“求和?那就求呗,又不是求不了。”。
的确,这也是笔者当时看到它的第一反应。与连续情形的$\eqref{eq:lianxu}$不一样,式$\eqref{eq:lianxu}$如果直接硬杠的话需要完成积分(也可以看成无穷多个点的求和),我们没法做到这一点。但是对于离散的$\eqref{eq:lisan}$,只不过是有限项求和,理论上确实可以直接完成求和再去梯度下降。
但是,如果$k$特别大呢?举个例子,假设$y$是一个100维的向量,每个元素不是0就是1(二元变量),那么所有不同的$y$的总数目就是$2^{100}$,要对这样的$2^{100}$个单项进行求和,计算量是难以接受的;还有一个典型的例子是seq2seq的解码端(如果要做文本GAN就需要面对它),它的类别总数目是$|V|^l$,其中$|V|$是词表大小而$l$是句子长度。这样的情况下,直接完成精确的求和都是难以实现的。
形式 #
所以,还是需要回到采样上去,如果能够采样若干个点就能得到$\eqref{eq:lisan}$的有效估计,并且还不损失梯度信息,那自然是最好了。为此,需要先引入Gumbel Max,它提供了一种从类别分布中采样的方法。
假设每个类别的概率是$p_1,p_2,\dots,p_k$,那么下述过程提供了一种依概率采样类别的方案,称为Gumbel Max:
\begin{equation}\mathop{\text{argmax}}_i \Big(\log p_i - \log(-\log \varepsilon_i)\Big)_{i=1}^k,\quad \varepsilon_i\sim U[0, 1]\end{equation}
也就是说,先算出各个概率的对数$\log p_i$,然后从均匀分布$U[0,1]$中采样$k$个随机数$\varepsilon_1,\dots,\varepsilon_k$,把$-\log(-\log \varepsilon_i)$加到$\log p_i$上去,最后把最大值对应的类别抽取出来就行了。
后面我们会证明,这样的过程精确等价于依概率$p_1,p_2,\dots,p_k$采样一个类别,换句话说,在Gumbel Max中,输出$i$的概率正好是$p_i$。由于现在的随机性已经转移到$U[0,1]$上去了,并且$U[0,1]$不带有未知参数,因此Gumbel Max就是离散分布的一个重参数过程。
但是,我们希望重参数不丢失梯度信息,但是Gumbel Max做不到,因为$\mathop{\text{argmax}}$不可导,为此,需要做进一步的近似。首先,留意到在神经网络中,处理离散输入的基本方法是转化为one hot形式,包括Embedding层的本质也是one hot全连接(参考《词向量与Embedding究竟是怎么回事?》),因此$\mathop{\text{argmax}}$实际上是$\text{onehot}(\mathop{\text{argmax}}))$,然后,我们寻求$\text{onehot}(\mathop{\text{argmax}}))$的光滑近似,它就是$softmax$(参考《函数光滑化杂谈:不可导函数的可导逼近》)。
由此,我们得到Gumbel Max的光滑近似版本——Gumbel Softmax:
\begin{equation}softmax \Big(\big(\log p_i - \log(-\log \varepsilon_i)\big)\big/\tau\Big)_{i=1}^k,\quad \varepsilon_i\sim U[0, 1]\end{equation}
其中参数$\tau > 0$称为退火参数,它越小输出结果就越接近one hot形式(但同时梯度消失就越严重)。提示一个小技巧,如果$p_i$是softmax的输出,即$\eqref{eq:softmax}$的形式,那么大可不必先算出$p_i$再取对数,直接将$\log p_i$替换为$o_i$即可:
\begin{equation}softmax \Big(\big(o_i - \log(-\log \varepsilon_i)\big)\big/\tau\Big)_{i=1}^k,\quad \varepsilon_i\sim U[0, 1]\end{equation}
Gumbel Max的证明:
Gumbel Max的形式看上去有点复杂,远没有正态分布的重参数简单,但事实上只要鼓起勇气去看它,它连证明都不困难。我们想要证明Gumbel Max最后输出$i$的概率是$p_i$,不失一般性,这里我们证明输出1的概率是$p_1$。
注意,输出1意味着$\log p_1 - \log(-\log \varepsilon_1)$是最大的,这又意味着:
\begin{equation}\begin{aligned}
&\log p_1 - \log(-\log \varepsilon_1) > \log p_2 - \log(-\log \varepsilon_2) \\
&\log p_1 - \log(-\log \varepsilon_1) > \log p_3 - \log(-\log \varepsilon_3) \\
&\qquad \vdots\\
&\log p_1 - \log(-\log \varepsilon_1) > \log p_k - \log(-\log \varepsilon_k)
\end{aligned}
\end{equation}注意每个不等式都是独立的,也就是说$\log p_1 - \log(-\log \varepsilon_1)$与$\log p_2 - \log(-\log \varepsilon_2)$的关系如何,也不影响它跟$\log p_3 - \log(-\log \varepsilon_3)$的关系。这样我们只需要单独分析每一个不等式的概率。不失一般性,我们只分析第一个不等式,化简后得到:
\begin{equation}\varepsilon_2 < \varepsilon_1^{p_2 / p_1}\leq 1 \end{equation}
由于$\varepsilon_2\sim U[0,1]$,所以$\varepsilon_2 < \varepsilon_1^{p_2 / p_1}$的概率就是$\varepsilon_1^{p_2 / p_1}$,这就是固定$\varepsilon_1$的情况下,第一个不等式成立的概率。那么,所有不等式同时成立的概率是
\begin{equation}\varepsilon_1^{p_2 / p_1}\varepsilon_1^{p_3 / p_1}\dots \varepsilon_1^{p_k / p_1}=\varepsilon_1^{(p_2 + p_3 + \dots + p_k) / p_1}=\varepsilon_1^{(1/p_1)-1}\end{equation}
然后对所有$\varepsilon_1$求平均,就是
\begin{equation}\int_0^1 \varepsilon_1^{(1/p_1)-1}d\varepsilon_1 = p_1\end{equation}
这就是类别1出现的概率,它就是$p_1$。至此,我们完成了Gumbel Max采样过程的证明。
例子 #
跟连续情形一样,Gumbel Softmax就是用在需要求$\mathbb{E}_{y\sim p_{\theta}(y)}[f(y)]$、且无法直接完成对$y$求和的场景,这时候我们算出$p_{\theta}(y)$(或者$o_i$),然后选定一个$\tau > 0$,用Gumbel Softmax算出一个随机向量来$\tilde{y}$,代入计算得到$f(\tilde{y})$,它就是$\mathbb{E}_{y\sim p_{\theta}(y)}[f(y)]$的一个好的近似,且保留了梯度信息。
注意,Gumbel Softmax不是类别采样的等价形式,Gumbel Max才是。而Gumbel Max可以看成是Gumbel Softmax在$\tau \to 0$时的极限。所以在应用Gumbel Softmax时,开始可以选择较大的$\tau$(比如1),然后慢慢退火到一个接近于0的数(比如0.01),这样才能得到比较好的结果。
下面提供一个自己实现的离散隐变量的VAE例子:
https://github.com/bojone/vae/blob/master/vae_keras_cnn_gs.py
效果图:
溯源 #
Gumbel Max由来已久,但首次提出并应用Gumbel Softmax的是论文《Categorical Reparameterization with Gumbel-Softmax》,这篇论文主要探讨了部分隐变量是离散型变量的变分推断问题,比如基于VAE的半监督学习(方法上有点类似《变分自编码器(四):一步到位的聚类方案》)。其后,在文章《GANS for Sequences of Discrete Elements with the Gumbel-softmax Distribution》中,Gumbel Softmax首次被用在离散序列生成,但还不是文本生成,而是比较简单的人造字符序列。
其后,SeqGAN被提出,自那以后文本GAN模型一直以与强化学习结合的方式出现,基于Gumbel Softmax的纯深度学习和梯度下降的方法相对沉寂,直到RelGAN的出现。RelGAN是ICLR 2019提出的模型,它提出了新型的生成器和判别器结构,使得直接用Gumbel Softmax训练出的文本GAN大幅度超过了以往的各种文本GAN模型。关于RelGAN,我们后面有机会再谈。
总结 #
这部分内容主要介绍的是Gumbel Softmax,它是离散情形下$\eqref{eq:base}$型损失的一个重参数技巧。
理论上来说,离散情形的$\eqref{eq:base}$只是有限项求和,不一定需要重参数。但事实上,“有限”也可能是相当大的数字,因此遍历求和可能难以进行,所以还是要转化为采样形式,从而需要重参数技巧,这就是Gumbel Softmax,源于对Gumbel Max的光滑化。
除了上述视角外,还有一个辅助的视角:Gumbel Softmax通过$\tau\to 0$的退火来逐渐逼近one hot,相比直接用原始的Softmax进行退火,区别在于原始Softmax退火只能得到最大值位置为1的one hot向量,而Gumbel Softmax有概率得到非最大值位置的one hot向量,增加了随机性,会使得基于采样的训练更充分一些。
背后的故事 #
重参数就这样介绍完了吗?远远没有,重参数的背后,实际上是一个称为“梯度估计(gradient estimator)”的大家族,而重参数只不过是这个大家族中的一员。每年的ICLR、ICML等顶会上搜索gradient estimator、REINFORCE等关键词,可以搜索到不少文章,说明这是个大家还在钻研的课题。
要想说清重参数的来龙去脉,也要说些梯度估计的故事。
SF估计 #
前面我们分别讲了连续型和离散型的重参数,都是在“loss层面”讲述的,也就是说都是想办法把loss显式地定义好,剩下的交给框架自动求导、自动优化就是了。而事实上,就算不能显式地写出loss函数,也不妨碍我们对它求导,自然也不妨碍我们去用梯度下降了。比如
\begin{equation}\begin{aligned}\frac{\partial}{\partial\theta}\int p_{\theta}(z) f(z)dz=&\int f(z) \frac{\partial}{\partial\theta} p_{\theta}(z) dz\\
=&\int p_{\theta}(z)\times\frac{f(z)}{p_{\theta}(z)}\frac{\partial}{\partial\theta} p_{\theta}(z) dz\\
=&\mathbb{E}_{z\sim p_{\theta}(z)}\left[\frac{f(z)}{p_{\theta}(z)}\frac{\partial}{\partial\theta} p_{\theta}(z)\right]\\
=&\mathbb{E}_{z\sim p_{\theta}(z)}\Big[f(z)\frac{\partial}{\partial\theta} \log p_{\theta}(z)\Big]
\end{aligned}\label{eq:sf}\end{equation}
现在我们得到了梯度的一个估计式,称为“SF估计”,全称是Score Function Estimator,这是对原来损失函数的最朴素的估计,在强化学习中$z$代表着策略,那么上式就是一个最基本的策略梯度,所以有时候也直接称上述估计为叫REINFORCE。要注意,对离散情形的损失函数重新推导一遍,结果也是一样的,也就是说,上述结果是通用的,不区分$z$是连续变量还是离散变量。现在我们可以直接从$p_{\theta}(z)$中采样若干个点来估算式$\eqref{eq:sf}$的值了,不用担心会不会没梯度,因为式$\eqref{eq:sf}$本身就是梯度了。
梯度方差 #
看上去很美好,得到了一个连续和离散变量都适用的估计式,那为什么还需要重参数呢?
主要的原因是:SF估计的方差太大。式$\eqref{eq:sf}$是函数$f(z) \frac{\partial}{\partial\theta} \log p_{\theta}(z)$在分布$p_{\theta}(z)$下的期望,我们要采样几个点来算(理想情况下,希望只采样一个点),换句话说,我们想用下面的近似
\begin{equation}\mathbb{E}_{z\sim p_{\theta}(z)}\Big[f(z) \frac{\partial}{\partial\theta} \log p_{\theta}(z)\Big]\approx f(\tilde{z}) \frac{\partial}{\partial\theta} \log p_{\theta}(\tilde{z}),\quad \tilde{z}\sim p_{\theta}(z)\end{equation}
于是问题就来了:这样的梯度估计方差很大。
什么是方差很大?它有什么影响?举个简单的例子,假如$\alpha = avg([4, 5, 6]) = avg([0, 5, 10])$,也就是说,我们的目标$\alpha$是三个数的平均值,这三个数要不就是$4,5,6$,要不就是$0,5,10$,在精确估计的情况下,两者是等价的,但是如果每一组只能随机选其中一个数呢?第一组可能选到4,这也没什么,跟准确值5只差一点;但是第二组可能选到0,这跟准确值5差得就有点大了。也就是说,随机选一个的情况下,第二组估计的波动(方差)太大了。类似地,SF估计出来的梯度方差也是如此,这导致了我们用梯度下降优化的时候相当不稳定,非常容易崩。
降方差 #
从形式上看,式$\eqref{eq:sf}$是非常漂亮的,本身形式不复杂,而且对离散变量和连续变量都通用,还对$f$没有特别要求(相反,重参数要求$f$可导,但是在诸如强化学习的场景下,$f(z)$对应着奖励函数,很难做到光滑可导)。所以,很多文章探讨基于式$\eqref{eq:sf}$的降方差技巧,论文《Categorical Reparameterization with Gumbel-Softmax》就列举了一些,近几年来也有一些新发展,总之,还是那句话,大家搜索gradient estimator、REINFORCE等关键词,就有不少文章了。
重参数是另一种降方差技巧,为此,我们写出重参数后的$\eqref{eq:reparam}$的梯度表达式:
\begin{equation}\begin{aligned}\frac{\partial}{\partial\theta}\mathbb{E}_{\varepsilon\sim q(\varepsilon)}[f(g_{\theta}(\varepsilon))]=&\mathbb{E}_{\varepsilon\sim q(\varepsilon)}\left[\frac{\partial}{\partial\theta}f(g_{\theta}(\varepsilon))\right]\\
=&\mathbb{E}_{\varepsilon\sim q(\varepsilon)}\left[\frac{\partial f}{\partial g} \frac{\partial g_{\theta}(\varepsilon)}{\partial\theta}\right]
\end{aligned}\end{equation}
对比SF估计的式$\eqref{eq:sf}$,我们可以直观感知为什么上式方差更小了:
1、SF估计中包含了$\log p_{\theta}(z)$,我们知道,作为一个合理的概率分布,一般都在无穷远处(即$\Vert z\Vert \to \infty$)都会有$p_{\theta}(z)\to 0$,取了$\log$之后反而会趋于负无穷,换句话说,$\log p_{\theta}(z)$这一项实际上放大了无穷远处的波动,从而一定程度上增加了方差;
2、SF估计中包含的是$f$而重参数之后变成了$\frac{\partial f}{\partial g}$,$f$一般是神经网络,而通常我们定义的神经网络模型其实都是$\mathcal{O}(z)$级别的模型,从而我们可以预期它的梯度是$\mathcal{O}(1)$级别的(不严格成立,只能说在平均意义下基本成立),所以相对情况下更平稳一些,因此$f$的方差也比$\frac{\partial f}{\partial g}$的方差要大。
鉴于这两个理由,我们就可以得出,一般情况下重参数之后梯度估计的方差会比SF估计要小。注意,这里还是要强调“一般情况”,换言之,“重参数降低梯度估计的方差”这个结论不是绝对成立的,上述两个理由都是在一般情况下(我们面对的多数模型)成立,如果非要较劲,我们总能构造出重参数反而增加方差的例子。
文章小结 #
经过一番长篇大论,我们总算把重参数的故事基本上都捋清楚了。更深入地理解重参数技巧,是更好地理解VAE及文本GAN的必经之路。
从loss层面看,我们需要分连续和离散两种情形:连续情形下,重参数是用采样形式且不损失梯度地写出loss的方法;离散情形下,重参数有着跟连续情形一样的作用,不过更根本的原因是降低计算量(否则直接遍历求和也行)。从梯度估计层面看,重参数是降低梯度估计方差的一种有效手段,而同时还有其他的降低方差手段也被不少学者研究中。
总之,怎么看也不是个让人省心的玩意~
转载到请包括本文地址:https://kexue.fm/archives/6705
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Jun. 10, 2019). 《漫谈重参数:从正态分布到Gumbel Softmax 》[Blog post]. Retrieved from https://kexue.fm/archives/6705
@online{kexuefm-6705,
title={漫谈重参数:从正态分布到Gumbel Softmax},
author={苏剑林},
year={2019},
month={Jun},
url={\url{https://kexue.fm/archives/6705}},
}
February 28th, 2021
想问一下,RelGAN 还有机会被谈么?
不好意思,没有了~后来我尝试自己实现过RelGAN,发现并不收敛,可能也是我哪里实现不妥。再后来,根据自己的研究经验以及生成式预训练的模型不断发展,我越来越觉得文本生成中的GAN模型是没有价值的(也许只有水论文的价值),所以不再关注文本类GAN模型的工作了。
感谢回复。我也感觉文本类GAN模型肯定没有预训练的模型好,但是Gumbel Softmax不一定非要用在GAN里面吧,如果Gumbel Softmax用在预训练模型上呢?比如ELECTRA加上Gumbel Softmax效果会不会更好一些呢?
如果你关心Gumbel Softmax在NLP的应用,那么可能性有很多,只要设计模型中包含一些不可导模块,都有可能用Gumbel Softmax,这个我不怀疑。
至于ELECTRA是我极不看好的一个模型,这里就不讨论了(参考 https://kexue.fm/archives/7846 )。
April 22nd, 2021
您好,我不理解$(6)$式不能使用直接求和是因为类型数过大,因为使用了Gumble Softmax也会得到一个相应维数k的向量$\tilde{y}$,此时对于$f(\tilde{y})$的计算相较于之前就可以计算吗
单独一个$\tilde{y}$向量算$f(\tilde{y})$通常是可算的,比如Embedding层的输入本质上是one hot,现在变成了非one hot的$\tilde{y}$,那么只是一个矩阵乘法而已。
May 6th, 2021
苏神你好,问一个有点蠢的问题,请问$(1)$式和$(4)$式可以在数学上证明吗?我只能证明出在$p(x)$和$q(\varepsilon )$都是正态分布的时候$(1)$式和$(4)$确实相等,没有得到在任意分布下都相等的结论
$(1),(4)$相等意味着$p_{\theta}(z)=\int \delta(z - g_{\theta}(\varepsilon))q(\varepsilon)d\varepsilon$,$\delta(\cdot)$是狄拉克函数。
好的谢谢苏神!
June 14th, 2021
苏老师,式(15)成立的前提是 $f(z)$ 与 $\theta$ 无关?所以成立的前提是$f(z)$没有参数参与梯度下降优化,可以这样理解吗?
$(15)$只是以$f(z)$与$\theta$无关为例子,如果$f(z)$与$\theta$有关,那么仅仅是多了一项$\mathbb{E}_{z\sim p_{\theta}(z)}\Big[\frac{\partial}{\partial\theta} f(z)\Big]$,这一项的平凡的、不需要特殊技巧的,所以没有特别介绍。
June 17th, 2021
苏神你好,想请教几个问题:
1.由于类别数k可能比较大,所以无法通过累加求式(6)。但是后面的式(8)(9)(10)都枚举了k,这个地方复杂度会不会也很大?
2.式(9)(10)得到的也是一个概率向量,该概率向量与式(7)有什么区别?
3.Gumbel Softmax最后的采样结果式$\hat{y}$与式(10)是个什么关系?是直接用式(10)求出的概率向量对y的one-hot进行加权求和吗?如果是这样的话,能不能用式(7)的概率直接对y的one-hot进行加权求和?
感谢解答
1、$\sum\limits_y p(y)f(y)$难算不代表$p(y)$难算,多数时间我们会选择好算的$p(y)$;
2、多了随机性;
3、是加权求和,或者理解为用软标签代替one hot;至于相比$(7)$,区别还是多了随机性,而且$\hat{y}$是有理论保证的,而$y$只能算是一个直观想法。
September 18th, 2021
苏神你好,我正在使用强化学习做一个实验,最后一层的神经元个数为2,也就是判断做还是不做,如果做得话就将该样本输入到我的A模型中,否则就是B模型。这样我就是通过取argmax概率来判断样本应该输入到哪个模型。
我也使用了Gumbel Softmax,把温度设置了很低,确实得到了独热码的表示,但是是浮点形式的表示。
浮点型的表示在Pytorch中不支持直接取样,也就是说我不能通过[1.,0.]的形式进行取样,不知道您是否有解决办法呢。
这显然就是过度依赖于动态图导致的思维狭窄了,如果你一直用静态图,就不会有这个问题了。
这个问题的解法很简单,就是output = model_a(x) * t[0] + model_b(x) * t[1],其中t是你的二元表示
October 13th, 2021
牛
November 7th, 2021
大神大神啊,我最近在做多智能体强化学习,遇到了MADDPG算法要解决离散动作的问题,真的需要您的帮助!!我真的很疑惑,就算使用了Gumbel Softmax,比如我有三个动作,分别是0,1,2但是输出的结果仍然是几个类别所对应的概率啊?没有输出最后的精确值0或者1或者2 啊?我要怎么判断输出最后精确地一个类别啊?我举个例子,pytorch神经网络最后一个linear层输出了三个类别的得分 p=torch.tensor([2.0,3.0,5.0]),u=torch.rand_like(p),然后action = F.softmax(p - torch.log(-torch.log(u)), dim=0) 做后输出的action= tensor([0.0210, 0.0632, 0.9159]) ,这怎么判断是哪个类别?输出的哪个动作。。原谅我愚钝,大神帮帮我吧!!!!
首先你要知道模型是怎么处理离散输入的。
传统机器学习无外乎就是表达成one hot,深度学习多了个Embedding层的概念,事实上它们两者是完全等价的:https://kexue.fm/archives/4122
所以答案很简单,得到[0.0210, 0.0632, 0.9159]后,直接输入到模型就行了,能接受one hot输入,难道不能接受非one hot输入吗?
但是我的环境里面定义的 env.step(action),这里输入的action是离散的动作0或1或2,然后通过0或1或2进行操作就得到了下一个状态跟奖励值,那么现在所得到的[0.0210, 0.0632, 0.9159],您的意思是把它直接输入env.step(action)吗?这样的话不就没办法弄了吗哈哈。是不是应该把[0.0210, 0.0632, 0.9159]进行np.random.choice()操作然后得到最大的动作2,传入 env.step(action)?然后在反向传播的时候传播的是[0.0210, 0.0632, 0.9159],而不是取样出来的0或1或2.苏老师,您看我的理解对吗?实在是太麻烦了,这就是我研究生毕设目前遇到的问题,能得到您的解答感激不尽!!
看上去你是强化学习场景,那用好reinforce就是了,凑什么重参数的热闹~(捂脸)
December 4th, 2021
厉害了
December 16th, 2021
你好,有幸读到这篇博客
我对这句话不是很理解:如果能够采样若干个点就能得到(6)的有效估计
比如原来类别有5个,需要采样2的5次方个样本才能算loss;现在只需要采样1个,2个?就能算了?
直接计算是“遍历”2的5次方个候选结果,不叫采样。你说的这句话的意思主要是指采样估计(但不一定非常精确,只要保证是无偏估计)的基础上又保留梯度。