Stein variational gradient descent(SVGD)

最近读了Liu Qiang组关于SVGD的几篇文章,和老师讨论了很久、查阅了很多文献后大概了解了它的思路。这篇文章整合一下我所理解的SVGD。由于太笨,不知道Katex怎么像Latex一样写公式标号····所以本文所有公式都没有标号Orz

近似推断被广泛用于概率机器学习与统计中,Stein variational gradient descent (SVGD)是由Liu Qiang等提出的一种近似推断算法。不同于MCMC,它是一种确定性的算法。不同于变分推断(VI),它采用粒子方法直接对目标概率分布进行逼近。

1.Stein’s Identity

首先Liu Qiang组关于SVGD的idea出发点都是Stein’s Identity。Stein’s Identity讲了这么一件事情:

Ep[xlogq(x)f(x)+xf(x)]=0   if   p(x)=q(x)\mathbb{E}_{p}\left[\nabla_{x} \log q(x) f(x)+\nabla_{x} f(x)\right]=0\ \ \ if\ \ \ p(x)=q(x)

我们考虑 Rd\mathbb{R}^{d}上两个光滑分布 ppqq,上式成立的充分条件是 p(x)=q(x)p(x)=q(x). 这一等式的成立非常好证,只需要将积分展开用分部积分法就可以证明(u(x)v(x)dx=u(x)v(x)u(x)v(x)dx\int u(x) v^{\prime}(x) d x=u(x) v(x)-\int u^{\prime}(x) v(x) d x).

那么,当 p(x)q(x)p(x) \neq q(x)时,上式是不等于0的,这就有些像一个距离度量,我们进一步想到上式是不是也可以像KL divergence一样衡量两个分布之间的距离呢?并且通过优化这个距离做一些事情呢?这就是Liu Qiang组的研究工作。

2.向量情况下的距离度量

根据Stein’s identity我们可以定义一种度量来衡量分布p和q之间的距离,首先考虑向量情况下的推导,即f(x)f(x)属于R1×1\mathbb{R}^{1×1}

我们定义算子 Apf(x)=sp(x)f(x)+xf(x)\mathcal{A}_{p} f(x)=s_{p}(x) f(x)+\nabla_{x} f(x),以及 sq=xlogq(x)\boldsymbol{s}_{q}=\nabla_{x} \log q(x),之前的Stein’s identity就可以写成:
Exp[Aqf(x)]=0  where  (q=p)\mathbb{E}_{x \sim p}\left[\mathcal{A}_{q} f(x)\right] =0\ \ where\ \ (q=p)

我们定义距离 S(p,q)=maxfF(Ep[Aqf(x)])2{S}(p, q)=\max _{f \in \mathcal{F}}\left(\mathbb{E}_{p}\left[\mathcal{A}_{q} f(x)\right]\right)^{2}

这里F\mathcal{F}是光滑函数的集合,但是从F\mathcal{F}中找到ff不是一件容易的事情,所以我们还需要别的trick(也就是kernel)。关于这里为什么是max,因为我们希望找到的度量,一定是在p(x)q(x)p(x) \neq q(x)时让这个距离值尽可能的大,这样才能在同一种度量下分的更开。

3.矩阵情况下的距离度量

下面我们尝试将Apf(x)\mathcal{A}_{p} f(x)推广到矩阵的形式,也就是f(x)f(x)推广到Rd×1\mathbb{R}^{d×1}的形式。

这里为了区分我们把f(x)f(x)属于Rd×1\mathbb{R}^{d×1}记作ϕ(x)\phi (x),令ϕ(x)=[ϕ1(x),,ϕd(x)]\phi(x)=\left[\phi_{1}(x), \cdots, \phi_{d}(x)\right]^{\top}. 也就是说ϕ(x)\phi (x)代表着一组光滑函数,是一个向量值函数。

此时, Apϕ(x)=sp(x)ϕ(x)+xϕ(x)\mathcal{A}_{p} \phi(x)=s_{p}(x) \phi^{\top}(x)+\nabla_{x} \phi(x)

Stein’s identity可以写成:
Exp[Aqϕ(x)]=Exp[Aqϕ(x)Apϕ(x)]=Exp[(sq(x)sp(x))ϕ(x)]\mathbb{E}_{x \sim p}\left[\mathcal{A}_{q} \phi(x)\right]=\mathbb{E}_{x \sim p}\left[\mathcal{A}_{q} \phi(x)-\mathcal{A}_{p} \phi(x)\right]=\mathbb{E}_{x \sim p}\left[(s_q(x)-s_p(x)) \phi^{\top}(x)\right]

由于sq(x)s_q(x)属于Rd×1\mathbb{R}^{d×1}ϕ(x)\phi^{\top}(x)属于R1×d\mathbb{R}^{1×d},上式应该是一个d×dd×d的矩阵。但是我们想要的是距离度量,矩阵的期望是没有任何意义的,所以我们可以取标量为:

Ep[trace(Aqϕ(x))]=Ep[(sq(x)sp(x))ϕ(x)]\mathbb{E}_{p}\left[\operatorname{trace}\left(\mathcal{A}_{q}\phi(x)\right)\right]=\mathbb{E}_{p}\left[\left(\boldsymbol{s}_{q}(x)-\boldsymbol{s}_{p}(x)\right)^{\top} \phi(x)\right]

此时,sq(x)s_q^{\top}(x)属于R1×d\mathbb{R}^{1×d}ϕ(x)\phi(x)属于Rd×1\mathbb{R}^{d×1},我们得到了一个标量,这是我们所希望的距离值。同时,也可以很直接地看到我们取标量后的值其实就是原矩阵形式的迹。

总结一下,到现在为止,我们将Stein’s identity从向量形式拓展到了矩阵形式,在矩阵形式下,我们依旧可以将S(p,q){S}(p, q)写成一个标量,为之后kernel的引入做好了铺垫。

4.Kernel的引入

4.1 RKHS

在引入kernel到Stein’s identity之前,我们先回顾一下RKHS(reproducing kernel hilbert space)。

每一个函数都可以看做一个无限维的向量,那么二元函数K(x,y)K(x,y)就可以看做是一个无限维的矩阵。当K(x,y)K(x,y)满足正定性和对称性的时候我们把它叫做核函数。与矩阵特征值和特征向量类似,核函数存在特征值和特征函数 (将函数看做无限维向量)。也就是

K(x,y)ψ(x)dx=λψ(y)\int K(\mathrm{x}, \mathrm{y}) \psi(\mathrm{x}) d \mathrm{x}=\lambda \psi(\mathrm{y})

那么根据Mercer定理,我们有
K(x,y)=i=0λiψi(x)ψi(y)K(\mathrm{x}, \mathrm{y})=\sum_{i=0}^{\infty} \lambda_{i} \psi_{i}(\mathrm{x}) \psi_{i}(\mathrm{y})
这里一个核函数对应无穷个特征值{λi}i=1\left\{\lambda_{i}\right\}_{i=1}^{\infty}和无穷个特征方程{ψi}i=1\left\{\psi_{i}\right\}_{i=1}^{\infty}
{λiψi}i=1\left\{\sqrt{\lambda_{i}} \psi_{i}\right\}_{i=1}^{\infty}作为一组正交基构建一个希尔伯特空间 H\mathcal{H} 。这个空间中的任何一个函数(向量)都可以表示为这组基的线性组合。如f=(f1,f2,)HTf=\left(f_{1}, f_{2}, \ldots\right)_{\mathcal{H}}^{T}

K(x,)K(\mathrm{x}, \cdot)表示固定核函数的一个参数为xx,即矩阵第xx行的一元函数或无限维向量。那么,我们有
K(x,)=(λ1ψ1(x),λ2ψ2(x),)HTK(y,)=(λ1ψ1(y),λ2ψ2(y),)HT<K(x,),K(y,)>H=i=0λiψi(x)ψi(y)=K(x,y)\begin{array}{c} K(\mathrm{x}, \cdot)=\left(\sqrt{\lambda_{1}} \psi_{1}(\mathrm{x}), \sqrt{\lambda_{2}} \psi_{2}(\mathrm{x}), \ldots\right)_{\mathcal{H}}^{T} \\ K(\mathrm{y}, \cdot)=\left(\sqrt{\lambda_{1}} \psi_{1}(\mathrm{y}), \sqrt{\lambda_{2}} \psi_{2}(\mathrm{y}), \ldots\right)_{\mathcal{H}}^{T} \\ <K(\mathbf{x}, \cdot), K(\mathbf{y}, \cdot)>_{\mathcal{H}}=\sum_{i=0}^{\infty} \lambda_{i} \psi_{i}(\mathbf{x}) \psi_{i}(\mathbf{y})=K(\mathbf{x}, \mathbf{y}) \end{array}

这就是RKHS,核心思想就是核函数的分解与重构。

4.2 Kernelized Stein Discrepancy(KSD)

现在,在RKHS的基础上,我们将kernel引入Stein’s identity

定义距离kernelized Stein discrepancy(KSD):
S(p,q)=Ex,yp[(sq(x)sp(x))Tk(x,y)(sq(x)sp(x))]S(p, q)=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right)^{T} k(\mathbf{x}, \mathbf{y})\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right)\right]

此时的S(p,q)S(p, q)本质上就是上一节矩阵情况中最后式子的变换,k(x,y)(sq(x)sp(x))k(\mathbf{x}, \mathbf{y})\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right)可以看成ϕ(x)\phi(x),这一点从维度分析上易知。同时,我们还可以换一种理解方式,ϕ(x)\phi(x)原来是一组函数,我们要找这组函数,那么现在变成了k(x,y)(sq(x)sp(x))k(\mathbf{x}, \mathbf{y})\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right),我们同样要找的是xx固定时的一组列向量函数。

可行性证明

但是,这个时候出现了一个问题,我们原来的S(p,q)=maxfF(Ep[Aqf(x)])2{S}(p, q)=\max _{f \in \mathcal{F}}\left(\mathbb{E}_{p}\left[\mathcal{A}_{q} f(x)\right]\right)^{2}Ep\mathbb{E}_{p}内的式子只与qq有关,而引入了kernel后,S(p,q)S(p, q)Ep\mathbb{E}_{p}内的式子与q,pq,p都有关了,pp是我们不希望出现的,这会导致不可解。根据变换证明,这个问题是不存在的,引入kernel后的Ep\mathbb{E}_{p}中同样可以只与qq有关,证明如下:

S(p,q)=Ex,yp[(sqsp)Tk(x,y)(sqsp)]=Ex,yp[(sqsp)T(k(x,y)sq+yk(x,y)k(x,y)spyk(x,y))]=Ex,yp[(sqsp)Tv(x,y)]\begin{aligned} S(p, q) &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}-s_{p}\right)^{T} k(\mathbf{x}, \mathbf{y})\left(s_{q}-s_{p}\right)\right] \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}-s_{p}\right)^{T}\left(k(\mathbf{x}, \mathbf{y}) s_{q}+\nabla_{y} k(\mathbf{x}, \mathbf{y})-k(\mathbf{x}, \mathbf{y}) s_{p}-\nabla_{\mathbf{y}} k(\mathbf{x}, \mathbf{y})\right)\right] \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}-s_{p}\right)^{T} v(\mathbf{x}, \mathbf{y})\right] \end{aligned}

这里v(x,y)=k(x,y)sq(y)+yk(x,y)=Aqkx(y)v(\mathbf{x}, \mathbf{y})=k(\mathbf{x}, \mathbf{y}) s_{q}(\mathbf{y})+\nabla_{\mathbf{y}} k(\mathbf{x}, \mathbf{y})=\mathcal{A}_{q} k_{\mathbf{x}}(\mathbf{y})kx()=k(x,)k_{\mathbf{x}} (\cdot)=k(\mathbf{x}, \cdot)

为了让pp消失,将sps_p带入
S(p,q)=Ex,yp[sqTv(x,y)(xlnp(x))Tv(x,y)]=Ex,yp[sqTv(x,y)]dxdyp(x)p(y)(xlnp(x))Tv(x,y)=Ex,yp[sqTv(x,y)]+Ex,yp[trxv(x,y)]=Ex,yp[uq(x,y)]\begin{aligned} S(p, q) &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[s_{q}^{T} v(\mathbf{x}, \mathbf{y})-\left(\nabla_{\mathbf{x}} \ln p(\mathbf{x})\right)^{T} v(\mathbf{x}, \mathbf{y})\right] \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[s_{q}^{T} v(\mathbf{x}, \mathbf{y})\right]-\int d \mathbf{x} d \mathbf{y} p(\mathbf{x}) p(\mathbf{y})\left(\nabla_{\mathbf{x}} \ln p(\mathbf{x})\right)^{T} v(\mathbf{x}, \mathbf{y}) \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[s_{q}^{T} v(\mathbf{x}, \mathbf{y})\right]+\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\operatorname{tr} \nabla_{\mathbf{x}} v(\mathbf{x}, \mathbf{y})\right] \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[u_{q}(\mathbf{x}, \mathbf{y})\right] \end{aligned}

这里uq(x,y)=sq(x)Tk(x,y)sq(y)+sq(x)Tyk(x,y)+(xk(x,y))Tsq(y)+tr(xyk(x,y))u_{q}(\mathbf{x}, \mathbf{y})=s_{q}(\mathbf{x})^{T} k(\mathbf{x}, \mathbf{y}) s_{q}(\mathbf{y})+s_{q}(\mathbf{x})^{T} \nabla_{\mathbf{y}} k(\mathbf{x}, \mathbf{y})+\left(\nabla_{\mathbf{x}} k(\mathbf{x}, \mathbf{y})\right)^{T} s_{q}(\mathbf{y})+\operatorname{tr}\left(\nabla_{\mathbf{x}} \nabla_{\mathbf{y}} k(\mathbf{x}, \mathbf{y})\right)

虽然很长Orz但是只和q有关了ao。到现在为止,我们证明了引入kernel不影响求解,引入kernel后与引入前的原式形式等价。

易于求解证明

引入kernel自然是有引入的好处,好处在刚开始就已经说过了因为易与求解。光滑函数函数集F\mathcal{F}中直接找使距离最大的ff是很难做到的,但是引入kernel后我们就很容易找到了。我们下面来看为什么容易找到。

β(y)=Exp[Aqky(x)]=Exp[(sq(x)sp(x))ky(x)]\boldsymbol{\beta}(\mathbf{y})=\mathbb{E}_{\mathbf{x} \sim p}\left[\mathcal{A}_{q} k_{\mathbf{y}}(\mathbf{x})\right]=\mathbb{E}_{\mathbf{x} \sim p}\left[\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right) k_{\mathbf{y}}(\mathbf{x})\right]

根据RKHS的分析,我们可以将KSD写成
S(p,q)=Ex,yp[(sq(x)sp(y))Tk(x,y)(sq(x)sp(y))]=Ex,yp[(sq(x)sp(y))T<k(x,),k(,y)>H(sq(x)sp(y))]=i=1d<Exp[(sqi(x)spi(x))k(x,)],Eyp[(sqi(y)spi(y))k(y)]>H=i=1d<βi,βi>H=βHd2\begin{aligned} S(p, q) &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{y})\right)^{T} k(\mathbf{x}, \mathbf{y})\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{y})\right)\right] \\ &=\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{y})\right)^{T}<k(\mathbf{x}, \cdot), k(\cdot, \mathbf{y})>_{\mathcal{H}}\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{y})\right)\right] \\ &=\sum_{i=1}^{d}<\mathbb{E}_{\mathbf{x} \sim p}\left[\left(s_{q}^{i}(\mathbf{x})-s_{p}^{i}(\mathbf{x})\right) k(\mathbf{x}, \cdot)\right], \mathbb{E}_{\mathbf{y} \sim p}\left[\left(s_{q}^{i}(\mathbf{y})-s_{p}^{i}(\mathbf{y})\right) k(\cdot \mathbf{y})\right]>_{\mathcal{H}} \\ &=\sum_{i=1}^{d}<\beta_{i}, \beta_{i}>_{\mathcal{H}}\\ &=\|\boldsymbol{\beta}\|^2_{\mathcal{H}^{d}} \end{aligned}

也就是说,我们可以将S(p,q)S(p,q)看成希尔伯特空间中β\beta函数的内积了。此时易知,任意的希尔伯特空间中的归一化(归一化目的:防止max导致无穷大)函数ϕ\phiβ\beta的内积都小于β\beta与自己的内积。那么,我们想找的max,就可以写成

βHd=S(p,q)=maxϕHd{Exp[tr(Aqϕ(x))], s.t. ϕHd1}\|\boldsymbol{\beta}\|_{\mathcal{H}^{d}}=S(p, q)=\max _{\mathbf{\phi} \in \mathcal{H}^{d}}\left\{\mathbb{E}_{\mathbf{x} \sim p}\left[\operatorname{tr}\left(\mathcal{A}_{q} \mathbf{\phi}(\mathbf{x})\right)\right], \quad \text { s.t. } \quad\|\mathbf{\phi}\|_{\mathcal{H}^{d}} \leq 1\right\}

此时最大值ϕ=β/βHd\mathbf{\phi}^{*}=\boldsymbol{\beta} /\|\boldsymbol{\beta}\|_{\mathcal{H}^{d}}

这也就是说我们用kernel可以直接导出想找的ϕ\phi

5.SVGD算法

那么有了KSD之后,我们能做什么呢?一个简单的想法是用它来优化KL散度,导师说这个式子ϵKL(q[T]p)ϵ=0=Exq[trace(Apϕ(x))]\left.\nabla_{\epsilon} \mathrm{KL}\left(q_{[T]} \| p\right)\right|_{\epsilon=0}=-\mathbb{E}_{x \sim q}\left[\operatorname{trace}\left(\mathcal{A}_{p} \phi(x)\right)\right]在learning领域是很常见的,也就是说KL散度变分求导是等于KSD的。所以我其实在想是不是这些论文都是根据KL散度反推回去的…其实它们都是拿结果往回推起源…然后再填充证明…

5.1 KL divergence的联系

下面我们来证明ϵKL(q[T]p)ϵ=0=Exq[trace(Apϕ(x))]\left.\nabla_{\epsilon} \mathrm{KL}\left(q_{[T]} \| p\right)\right|_{\epsilon=0}=-\mathbb{E}_{x \sim q}\left[\operatorname{trace}\left(\mathcal{A}_{p} \phi(x)\right)\right]

我们定义z=Tϵ(x)z={T}_{\epsilon}(x),Tϵ(x)=T(x){T}_{\epsilon}(x)=T(x),T(x)=x+ϵϕ(x){T}(x)=x+\epsilon \phi(x),当xqx \sim q时,q[T]q_{[T]}表示z的概率密度。

同样地,取反函数,当xpx \sim p时,p[T1]p_{[T^{-1}]}表示z=T1(x)z={T}^{-1}(x)的概率密度。

也可以理解成用微小扰动ϵϕ(x)\epsilon \phi(x)来让qq逼近pp

我们有
KL(q[T]p)=KL(qp[T1])ϵKL(q[T]p)=Exq[ϵlogp[T1](x)]\begin{array}{c} \mathrm{KL}\left(q_{[T]} \| p\right)=\mathrm{KL}\left(q \| p_{\left[T^{-1}\right]}\right) \\ \nabla_{\epsilon} \mathrm{KL}\left(q_{[T]} \| p\right)=-\mathbb{E}_{x \sim q}\left[\nabla_{\epsilon} \log p_{\left[T^{-1}\right]}(x)\right] \end{array}

ϵlogp[T1](x)\nabla_{\epsilon} \log p_{\left[T^{-1}\right]}(x)展开得到
ϵlogp[T1](x)=sp(T(x))ϵT(x)+trace((xT(x))1ϵxT(x))\nabla_{\epsilon} \log p_{\left[T^{-1}\right]}(x)=s_{p}(\boldsymbol{T}(x))^{\top} \nabla_{\epsilon} \boldsymbol{T}(x)+\operatorname{trace}\left(\left(\nabla_{x} \boldsymbol{T}(x)\right)^{-1} \cdot \nabla_{\epsilon} \nabla_{x} \boldsymbol{T}(x)\right)

当扰动ϵ\epsilon很小,ϵ=0\epsilon=0的时候
T(x)=x,ϵT(x)=ϕ(x),xT(x)=I,ϵxT(x)=xϕ(x)\boldsymbol{T}(x)=x, \quad \nabla_{\epsilon} \boldsymbol{T}(x)=\boldsymbol{\phi}(x), \quad \nabla_{x} \boldsymbol{T}(x)=I, \quad \nabla_{\epsilon} \nabla_{x} \boldsymbol{T}(x)=\nabla_{x} \boldsymbol{\phi}(x).

代入上式可得ϵlogp[T1](x)=trace(Apϕ(x))\nabla_{\epsilon} \log p_{\left[T^{-1}\right]}(x)=\operatorname{trace}\left(\mathcal{A}_{p} \phi(x)\right)

所以有ϵKL(q[T]p)ϵ=0=Exq[trace(Apϕ(x))]\left.\nabla_{\epsilon} \mathrm{KL}\left(q_{[T]} \| p\right)\right|_{\epsilon=0}=-\mathbb{E}_{x \sim q}\left[\operatorname{trace}\left(\mathcal{A}_{p} \phi(x)\right)\right]

即证明了KL散度变化最快的方向就是KSD所对应的向量函数ϕ=β/βHd\mathbf{\phi}^{*}=\boldsymbol{\beta} /\|\boldsymbol{\beta}\|_{\mathcal{H}^{d}}

5.2 Algorithm

有了梯度方向,有了kernel,我们就可以设计算法了,就是SVGD的实现。
算法流程如下所示:
在这里插入图片描述

算法的实现比较清晰明了,相比之前的kernel引入推导更容易快速理解一些。 p(x)p(\mathbf{x}) 是我们想要逼近的 Rd\mathbb{R}^{d} 分布, 我们想要用若干粒子来做 p(x)p(\mathbf{x})上的采样。选取粒子群 {xi}i=1nRd\left\{\mathbf{x}_{i}\right\}_{i=1}^{n} \subset \mathbb{R}^{d} . 使用梯度下降法,设置学习率为ϵ\epsilon, 每一步的梯度为 ϕ(xi)\phi\left(\mathbf{x}_{i}\right).不断迭代直至ll达到指定次数或梯度变化达到阈值。

总的来说,这个idea感觉很赞,我觉得从Exp[(sq(x)sp(x))ϕ(x)]\mathbb{E}_{x \sim p}\left[(s_q(x)-s_p(x)) \phi^{\top}(x)\right]看到Ex,yp[(sq(x)sp(x))Tk(x,y)(sq(x)sp(x))]\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim p}\left[\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right)^{T} k(\mathbf{x}, \mathbf{y})\left(s_{q}(\mathbf{x})-s_{p}(\mathbf{x})\right)\right]这一步真的很强,毕竟是ICML、NeurIPS连着中的组(

5.实验

关于实验部分,A General Purpose Bayesian Inference Algorithm这篇中做了三个SVGD应用的实验,高斯分布逼近,逻辑回归以及贝叶斯神经网络的训练。效果好像都不错。

Github实现代码在这里:https://github.com/DartML/Stein-Variational-Gradient-Descent

关于一维分布拟合的迭代过程如下:

在这里插入图片描述






References
[1]Liu Q , Wang D . Stein Variational Gradient Descent: A General Purpose Bayesian Inference Algorithm[C]// 2016.
[2]Liu Q , Jason D.Lee . A Kernelized Stein Discrepancy for Goodness-of-fit Tests[C]// 2016.
[3]Liu Q , Stein Variational Gradient Descent as Gradient Flow[C]// 2016.
[4]Stein variational gradient descent https://zhuanlan.zhihu.com/p/114489837