1. 项目概述从高斯噪声扰动到梯度与迹的无偏估计在机器学习和统计优化的世界里我们常常需要和梯度打交道。无论是训练一个深度神经网络还是在强化学习中寻找最优策略梯度都像是指引我们前行的“指南针”。然而这个指南针有时会失灵——当目标函数本身不可微或者我们只能通过采样、模拟等“黑盒”方式访问函数值时直接计算梯度就变得不可能。这时梯度估计技术就成了我们的“备用罗盘”。今天要聊的就是一种基于经典概率论工具——Stein引理——构建的、特别优雅且强大的梯度估计方法。它巧妙地利用了高斯分布的特性不仅能给出标量函数的梯度无偏估计还能进一步扩展到估计向量值函数雅可比矩阵的迹为高维优化和统计计算打开了一扇新窗。简单来说这个方法的核心思想是如果你想知道一个函数在某一点的梯度但又不能直接求导那就给它输入加一点微小的、符合高斯分布的随机噪声然后观察函数输出与这个噪声的某种相关性。这个相关性经过适当的数学变换恰恰就等于函数梯度的期望值。更妙的是对于向量函数这个方法还能用来估计其雅可比矩阵的迹这在许多高维统计问题如对数概率密度的梯度估计、散度计算中至关重要。它特别适合那些函数形式复杂、但可以高效进行前向计算即给定输入能算出输出的场景比如基于模拟的优化、变分推断或是某些物理引擎驱动的模型训练。2. 核心原理Stein引理与分部积分的魔法要理解这个方法为什么奏效我们需要深入其数学根基。它本质上是概率论中“分部积分”技巧在高维空间和期望运算下的一个漂亮应用而Stein引理则为其提供了严格的理论框架。2.1 一维情况的直观推导从期望到梯度让我们先从最简单的一维标量函数g(x)和一元高斯分布p(x) N(µ, σ²)开始。我们的目标是估计g(x)在xµ附近的梯度即导数∂g(x)/∂x的期望。核心的观察始于一个看似无关的期望E[g(x)(x-µ)]。我们对其进行计算E[g(x)(x-µ)] ∫ g(x)(x-µ) p(x) dx这里(x-µ)是高斯随机变量的中心化项。接下来我们施展“分部积分”的魔法。注意到高斯分布的概率密度函数p(x)有一个优美的性质它的导数∂p(x)/∂x满足∂p(x)/∂x -((x-µ)/σ²) p(x)。我们可以利用这一点进行改写E[g(x)(x-µ)] ∫ g(x) * [ -σ² * (∂p(x)/∂x) ] dx -σ² ∫ g(x) ∂p(x)/∂x dx现在对积分∫ g(x) ∂p(x)/∂x dx应用分部积分公式∫ u dv uv - ∫ v du。这里令u g(x),dv ∂p(x)/∂x dx 则du ∂g(x)/∂x dx,v p(x)。于是-σ² ∫ g(x) ∂p(x)/∂x dx -σ² { [g(x)p(x)]|_{x-∞}^{∞} - ∫ ∂g(x)/∂x p(x) dx }由于高斯分布p(x)在正负无穷远处都趋近于0第一项[g(x)p(x)]在边界处为0只要g(x)增长不太快这在多数实际应用中成立。因此上式简化为-σ² { 0 - ∫ ∂g(x)/∂x p(x) dx } σ² ∫ ∂g(x)/∂x p(x) dx σ² E[∂g(x)/∂x]于是我们得到了关键等式E[g(x)(x-µ)] σ² E[∂g(x)/∂x]这个等式的意义非凡函数g(x)与中心化随机变量(x-µ)的协方差因为E[x-µ]0等于其导数期望的σ²倍。如果我们特别关心在均值µ处的梯度并且扰动方差σ²很小那么x会高度集中在µ附近此时E[∂g(x)/∂x]就近似等于∂g(µ)/∂x。更一般地如果我们取µ就是我们想要估计梯度的目标点并令x µ ϵ其中ϵ ~ N(0, σ_ϵ²)那么上述推导直接给出了基于噪声扰动的梯度估计器。注意这个推导成立的关键假设是边界项为零。这要求函数g(x)在无穷远处的增长速度慢于高斯密度衰减的速度例如g(x)是多项式函数或有界函数。在实际的机器学习模型中激活函数通常是Sigmoid、ReLU等有界或增长可控的函数这一条件通常能满足。2.2 高维推广与Stein引理将一维的结论推广到高维就得到了Stein引理的精髓。设x是一个M维向量g: R^M - R是一个可微函数x ~ N(µ, Σ)是一个多元高斯分布。Stein引理指出E[g(x) (x - µ)] Σ E[∇g(x)]其中∇g(x)是g在x处的梯度向量。当协方差矩阵Σ是对角阵σ² I时上式简化为E[g(x) (x - µ)] σ² E[∇g(x)]这与我们一维的结论形式一致。现在考虑我们的梯度估计场景我们有一个目标点x可以视为固定的µ我们施加一个微小的扰动ϵ ~ N(0, σ_ϵ² I)构造扰动点x x ϵ。将Stein引理应用于以x为均值、σ_ϵ² I为协方差的分布p(ϵ)和函数g(xϵ)我们得到E_ϵ[g(xϵ) ϵ] σ_ϵ² E_ϵ[∇g(xϵ)]这里∇g(xϵ)是g在扰动点xϵ处的梯度。两边同时除以σ_ϵ²我们得到梯度估计的核心公式E_ϵ[ g(xϵ) * (ϵ / σ_ϵ²) ] E_ϵ[∇g(xϵ)]这个等式的左边就是我们的无偏梯度估计器。它的操作非常直观从高斯分布N(0, σ_ϵ² I)中采样一个噪声向量ϵ。计算扰动点x x ϵ处的函数值g(xϵ)。将函数值与归一化的噪声向量ϵ / σ_ϵ²相乘。这个乘积的期望值就等于函数梯度在扰动分布下的期望。在实际应用中我们无法计算精确的期望而是用蒙特卡洛方法进行近似仅需采样一个或少量噪声样本ϵ计算g(xϵ) * (ϵ / σ_ϵ²)即可作为真实梯度∇g(x)的一个无偏或近似无偏估计。当σ_ϵ很小时∇g(xϵ)会在∇g(x)附近波动因此这个估计是合理的。2.3 从梯度到迹估计处理向量值函数上述讨论针对标量函数g。如果g: R^M - R^N是一个向量值函数其梯度就推广为雅可比矩阵J_g(x)这是一个N x M的矩阵其中第(i, j)个元素是∂g_i(x)/∂x_j。此时Stein引理的高维形式需要稍作调整。对于向量值函数我们有E_ϵ[ g(xϵ)^T ϵ ] σ_ϵ² E_ϵ[ Tr(J_g(xϵ)) ]这里Tr(·)表示矩阵的迹对角线元素之和。注意等式左边是向量内积标量右边是雅可比矩阵的迹也是标量。更常用的形式是将其视为向量等式当N1时退化回标量梯度情况。对于估计整个梯度向量我们可以利用分量形式。但一个更强大的应用是直接估计雅可比矩阵的迹。对上述等式两边除以σ_ϵ²并重新排列注意对于向量值函数g(xϵ)与ϵ的乘积通常定义为外积或逐元素乘后求和具体取决于形式我们可以得到迹估计器Tr(J_g(x)) ≈ E_ϵ[ g(xϵ)^T (ϵ / σ_ϵ²) ]或者在σ_ϵ - 0的极限下有精确的等式Tr(J_g(x)) lim_{σ_ϵ↓0} E_ϵ[ g(xϵ)^T (ϵ / σ_ϵ²) ]这个估计器的威力在于要估计雅可比矩阵的迹你完全不需要计算这个可能非常庞大的矩阵M x M维的所有元素甚至不需要计算任何显式的导数。你只需要像之前一样采样噪声ϵ计算函数在扰动点的值g(xϵ)然后做一个内积运算。这对于高维问题M很大来说计算成本从O(M^2)降到了O(M)是巨大的效率提升。实操心得迹估计在机器学习中一个经典应用是估计对数概率密度的梯度即∇_x log p(x)。在变分推断和生成模型中这常常遇到。利用等式∇_x log p(x) ∇_x p(x) / p(x)以及∇_x p(x)的散度性质可以将其与雅可比矩阵的迹联系起来从而应用上述高效的估计方法这就是著名的“重参数化技巧”和“路径梯度估计器”背后的思想之一。3. 方法实现构建实用的估计器理解了原理我们来看看如何将其转化为可以运行的代码和具体的操作步骤。我们将分标量函数梯度估计和向量函数迹估计两种情况来讨论。3.1 标量函数的梯度估计实现假设我们有一个函数g(x)我们想在点x0处估计其梯度∇g(x0)。基于Stein引理的估计步骤如下选择扰动尺度方差σ_ϵ²这是一个关键的超参数。σ_ϵ不能太大否则泰勒展开的线性近似不成立估计偏差会增大也不能太小否则在有限精度计算中函数值的变化可能被数值误差淹没。通常σ_ϵ设置为x0尺度的一个小比例例如1e-3到1e-5乘以x0的典型范数。如果x0是零向量或接近零可以设置一个绝对小的值如1e-6。采样噪声向量从多元标准高斯分布采样一个随机向量ξ ~ N(0, I)然后构造扰动ϵ σ_ϵ * ξ。这样ϵ就服从N(0, σ_ϵ² I)。计算扰动点函数值计算x x0 ϵ并求函数值g_plus g(x)。计算梯度估计值梯度估计量为grad_estimate g_plus * (ϵ / σ_ϵ²)。注意这里ϵ / σ_ϵ² ξ / σ_ϵ。蒙特卡洛平均可选为了降低估计的方差可以独立重复上述步骤K次得到K个估计值然后取平均grad_estimate (1/K) * Σ_{k1}^K [g(x0ϵ_k) * (ϵ_k / σ_ϵ²)]。下面是一个简单的Python伪代码示例import numpy as np def stein_gradient_estimate(g, x0, sigma_eps1e-4, num_samples1): 使用Stein引理估计标量函数g在点x0处的梯度。 参数: g: 函数输入为向量输出为标量。 x0: 目标点numpy数组。 sigma_eps: 扰动噪声的标准差。 num_samples: 蒙特卡洛采样次数。 返回: 梯度估计值与x0形状相同的numpy数组。 dim x0.shape[0] grad_est np.zeros_like(x0) for _ in range(num_samples): # 采样噪声 xi np.random.randn(dim) # N(0, I) epsilon sigma_eps * xi # N(0, sigma_eps^2 I) # 扰动点及函数值 x_perturbed x0 epsilon g_value g(x_perturbed) # 累加估计量 grad_est g_value * (epsilon / (sigma_eps ** 2)) return grad_est / num_samples # 示例函数g(x) sin(x1) x2^2 def example_g(x): return np.sin(x[0]) x[1]**2 # 估计在点 [1.0, 2.0] 处的梯度 x0 np.array([1.0, 2.0]) true_grad np.array([np.cos(x0[0]), 2*x0[1]]) # 真实梯度[cos(1), 4] estimated_grad stein_gradient_estimate(example_g, x0, sigma_eps1e-5, num_samples100) print(f真实梯度: {true_grad}) print(f估计梯度: {estimated_grad}) print(f相对误差: {np.linalg.norm(estimated_grad - true_grad) / np.linalg.norm(true_grad):.2e})3.2 向量值函数的迹估计实现现在考虑向量值函数g: R^M - R^N我们希望估计其雅可比矩阵J_g(x)在点x0处的迹Tr(J_g(x0))。选择扰动尺度σ_ϵ²原则与梯度估计相同。采样噪声向量同样采样ξ ~ N(0, I_M)其中I_M是M维单位阵然后令ϵ σ_ϵ * ξ。计算扰动点函数值计算x x0 ϵ并求函数值向量g_plus g(x)其形状为(N,)。计算迹估计值迹估计量为trace_estimate g_plus^T (ϵ / σ_ϵ²)。这里ϵ是M维向量g_plus是N维向量。注意这个公式要求N1标量函数时退化为梯度估计或者更一般地要求g的输出维度N与ϵ的某种运算匹配。对于标准的迹估计我们通常考虑N1或者g的某个分量。对于完整的雅可比迹如果g是向量值其雅可比是N x M矩阵它的迹是N个分量函数各自梯度雅可比行向量对自己输入分量的偏导之和。因此更通用的方法是分别估计每个输出分量g_i(x)对输入x的梯度的迹这等价于g_i的拉普拉斯算子然后求和。但利用Stein引理的一个变体可以直接得到Tr(J_g(x)) ≈ E_ϵ[ (ϵ / σ_ϵ²)^T J_g(xϵ) ϵ ] 而通过自动微分或再次利用估计技巧可以避免显式计算J_g。一个更直接实用的版本是“Hutchinson迹估计器”它与Stein引理密切相关Tr(J_g(x)) ≈ E_ξ[ ξ^T J_g(x) ξ ]其中ξ是Rademacher或高斯随机向量。结合Stein引理和有限差分我们可以用g(xσ_ϵ ξ) - g(x)来近似J_g(x) (σ_ϵ ξ)从而得到无需求导的估计器。蒙特卡洛平均同样可以通过多次采样取平均来降低方差。下面是一个估计向量函数雅可比迹的示例这里我们采用一种更直接、与Stein引理等价且更稳定的实现方式通常称为“随机扰动迹估计”import numpy as np def stein_trace_estimate(g, x0, sigma_eps1e-4, num_samples1): 估计向量值函数g的雅可比矩阵在x0处的迹。 使用 Hutchinson 估计器结合随机扰动。 参数: g: 函数输入为M维向量输出为N维向量。这里为通用性我们估计整体雅可比的迹。 实际上对于向量值函数常估计其散度 div(g) Tr(J_g)这要求NM。 x0: 目标点numpy数组形状(M,)。 sigma_eps: 扰动噪声的标准差。 num_samples: 蒙特卡洛采样次数。 返回: 迹的估计值标量。 M x0.shape[0] trace_est 0.0 for _ in range(num_samples): # 采样随机向量通常使用Rademacher或高斯分布 v np.random.randn(M) # 高斯随机向量也可以使用 np.sign(np.random.randn(M)) 得到Rademacher向量 # 归一化并不是必须的但有时有助于稳定性 v v / np.linalg.norm(v) # 可选单位化 # 构造两个扰动点 x_plus x0 sigma_eps * v x_minus x0 - sigma_eps * v # 使用中心差分可以减少偏差 # 计算函数值 g_plus g(x_plus) g_minus g(x_minus) # 有限差分近似方向导数并计算内积 # (g(xσv) - g(x-σv)) / (2σ) ≈ J_g(x) v # 那么 v^T J_g(x) v ≈ v^T * [ (g_plus - g_minus) / (2*sigma_eps) ] # 而 E[v^T J_g(x) v] Tr(J_g(x))当v是零均值、协方差为I的随机向量时。 directional_derivative_approx (g_plus - g_minus) / (2 * sigma_eps) trace_est np.dot(v, directional_derivative_approx) return trace_est / num_samples # 示例函数g(x) [x1^2, sin(x2)]输入是2维输出是2维。其雅可比矩阵为 # J_g(x) [[2x1, 0], [0, cos(x2)]] 迹为 Tr 2x1 cos(x2) def example_vector_g(x): return np.array([x[0]**2, np.sin(x[1])]) # 在点 [1.5, 0.8] 处估计迹 x0 np.array([1.5, 0.8]) true_trace 2*x0[0] np.cos(x0[1]) # 2*1.5 cos(0.8) 3 0.6967 ≈ 3.6967 estimated_trace stein_trace_estimate(example_vector_g, x0, sigma_eps1e-5, num_samples500) print(f真实迹: {true_trace:.6f}) print(f估计迹: {estimated_trace:.6f}) print(f绝对误差: {abs(estimated_trace - true_trace):.2e})注意事项在迹估计的代码中我们使用了中心差分(g(xσv) - g(x-σv)) / (2σ)来近似方向导数J_g(x) v。这比前向差分(g(xσv) - g(x)) / σ具有更小的偏差误差为O(σ²)而非O(σ)。然而这需要两次函数评估。这种“随机有限差分”方法与Stein引理是内在一致的都是利用随机扰动来探明局部梯度信息。4. 参数选择与方差分析任何基于随机采样的估计方法其性能都受到偏差和方差的共同影响。理解如何平衡这两者对于在实际中用好Stein估计器至关重要。4.1 扰动大小σ_ϵ的权衡σ_ϵ是该方法最重要的超参数。偏差分析我们的估计器E[g(xϵ) (ϵ/σ_ϵ²)]实际上是 E[∇# 已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A.4 B.3 C.9 D.94已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A.4 B.3 C.9 D.94题目已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A. 4B. 3C. 9D.94答案∵函数fxx2axbab∈R的值域为[0∞∴fxx2axb0只有一个根即△a2-4b0则ba24不等式fxc的解集为mm6即为x2axa24c解集为mm6 则x2axa24-c0的两个根为mm6 ∴|m6-m|a2−4( | a24−c)6 解得c9故选C举一反三已知函数fxxgxalnxa∈R若曲线yfx与曲线ygx相交且在交点处有相同的切线求a的值和该切线方程我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好奥巴马演讲不用看稿子.为什么中国领导演讲要看?想找英语初三上学期的首字母填空练习……英语翻译最新试题热门考点© 2017-2019 超级试练试题库,All Rights Reserved.
基于Stein引理的高斯扰动梯度与迹估计原理与实践
1. 项目概述从高斯噪声扰动到梯度与迹的无偏估计在机器学习和统计优化的世界里我们常常需要和梯度打交道。无论是训练一个深度神经网络还是在强化学习中寻找最优策略梯度都像是指引我们前行的“指南针”。然而这个指南针有时会失灵——当目标函数本身不可微或者我们只能通过采样、模拟等“黑盒”方式访问函数值时直接计算梯度就变得不可能。这时梯度估计技术就成了我们的“备用罗盘”。今天要聊的就是一种基于经典概率论工具——Stein引理——构建的、特别优雅且强大的梯度估计方法。它巧妙地利用了高斯分布的特性不仅能给出标量函数的梯度无偏估计还能进一步扩展到估计向量值函数雅可比矩阵的迹为高维优化和统计计算打开了一扇新窗。简单来说这个方法的核心思想是如果你想知道一个函数在某一点的梯度但又不能直接求导那就给它输入加一点微小的、符合高斯分布的随机噪声然后观察函数输出与这个噪声的某种相关性。这个相关性经过适当的数学变换恰恰就等于函数梯度的期望值。更妙的是对于向量函数这个方法还能用来估计其雅可比矩阵的迹这在许多高维统计问题如对数概率密度的梯度估计、散度计算中至关重要。它特别适合那些函数形式复杂、但可以高效进行前向计算即给定输入能算出输出的场景比如基于模拟的优化、变分推断或是某些物理引擎驱动的模型训练。2. 核心原理Stein引理与分部积分的魔法要理解这个方法为什么奏效我们需要深入其数学根基。它本质上是概率论中“分部积分”技巧在高维空间和期望运算下的一个漂亮应用而Stein引理则为其提供了严格的理论框架。2.1 一维情况的直观推导从期望到梯度让我们先从最简单的一维标量函数g(x)和一元高斯分布p(x) N(µ, σ²)开始。我们的目标是估计g(x)在xµ附近的梯度即导数∂g(x)/∂x的期望。核心的观察始于一个看似无关的期望E[g(x)(x-µ)]。我们对其进行计算E[g(x)(x-µ)] ∫ g(x)(x-µ) p(x) dx这里(x-µ)是高斯随机变量的中心化项。接下来我们施展“分部积分”的魔法。注意到高斯分布的概率密度函数p(x)有一个优美的性质它的导数∂p(x)/∂x满足∂p(x)/∂x -((x-µ)/σ²) p(x)。我们可以利用这一点进行改写E[g(x)(x-µ)] ∫ g(x) * [ -σ² * (∂p(x)/∂x) ] dx -σ² ∫ g(x) ∂p(x)/∂x dx现在对积分∫ g(x) ∂p(x)/∂x dx应用分部积分公式∫ u dv uv - ∫ v du。这里令u g(x),dv ∂p(x)/∂x dx 则du ∂g(x)/∂x dx,v p(x)。于是-σ² ∫ g(x) ∂p(x)/∂x dx -σ² { [g(x)p(x)]|_{x-∞}^{∞} - ∫ ∂g(x)/∂x p(x) dx }由于高斯分布p(x)在正负无穷远处都趋近于0第一项[g(x)p(x)]在边界处为0只要g(x)增长不太快这在多数实际应用中成立。因此上式简化为-σ² { 0 - ∫ ∂g(x)/∂x p(x) dx } σ² ∫ ∂g(x)/∂x p(x) dx σ² E[∂g(x)/∂x]于是我们得到了关键等式E[g(x)(x-µ)] σ² E[∂g(x)/∂x]这个等式的意义非凡函数g(x)与中心化随机变量(x-µ)的协方差因为E[x-µ]0等于其导数期望的σ²倍。如果我们特别关心在均值µ处的梯度并且扰动方差σ²很小那么x会高度集中在µ附近此时E[∂g(x)/∂x]就近似等于∂g(µ)/∂x。更一般地如果我们取µ就是我们想要估计梯度的目标点并令x µ ϵ其中ϵ ~ N(0, σ_ϵ²)那么上述推导直接给出了基于噪声扰动的梯度估计器。注意这个推导成立的关键假设是边界项为零。这要求函数g(x)在无穷远处的增长速度慢于高斯密度衰减的速度例如g(x)是多项式函数或有界函数。在实际的机器学习模型中激活函数通常是Sigmoid、ReLU等有界或增长可控的函数这一条件通常能满足。2.2 高维推广与Stein引理将一维的结论推广到高维就得到了Stein引理的精髓。设x是一个M维向量g: R^M - R是一个可微函数x ~ N(µ, Σ)是一个多元高斯分布。Stein引理指出E[g(x) (x - µ)] Σ E[∇g(x)]其中∇g(x)是g在x处的梯度向量。当协方差矩阵Σ是对角阵σ² I时上式简化为E[g(x) (x - µ)] σ² E[∇g(x)]这与我们一维的结论形式一致。现在考虑我们的梯度估计场景我们有一个目标点x可以视为固定的µ我们施加一个微小的扰动ϵ ~ N(0, σ_ϵ² I)构造扰动点x x ϵ。将Stein引理应用于以x为均值、σ_ϵ² I为协方差的分布p(ϵ)和函数g(xϵ)我们得到E_ϵ[g(xϵ) ϵ] σ_ϵ² E_ϵ[∇g(xϵ)]这里∇g(xϵ)是g在扰动点xϵ处的梯度。两边同时除以σ_ϵ²我们得到梯度估计的核心公式E_ϵ[ g(xϵ) * (ϵ / σ_ϵ²) ] E_ϵ[∇g(xϵ)]这个等式的左边就是我们的无偏梯度估计器。它的操作非常直观从高斯分布N(0, σ_ϵ² I)中采样一个噪声向量ϵ。计算扰动点x x ϵ处的函数值g(xϵ)。将函数值与归一化的噪声向量ϵ / σ_ϵ²相乘。这个乘积的期望值就等于函数梯度在扰动分布下的期望。在实际应用中我们无法计算精确的期望而是用蒙特卡洛方法进行近似仅需采样一个或少量噪声样本ϵ计算g(xϵ) * (ϵ / σ_ϵ²)即可作为真实梯度∇g(x)的一个无偏或近似无偏估计。当σ_ϵ很小时∇g(xϵ)会在∇g(x)附近波动因此这个估计是合理的。2.3 从梯度到迹估计处理向量值函数上述讨论针对标量函数g。如果g: R^M - R^N是一个向量值函数其梯度就推广为雅可比矩阵J_g(x)这是一个N x M的矩阵其中第(i, j)个元素是∂g_i(x)/∂x_j。此时Stein引理的高维形式需要稍作调整。对于向量值函数我们有E_ϵ[ g(xϵ)^T ϵ ] σ_ϵ² E_ϵ[ Tr(J_g(xϵ)) ]这里Tr(·)表示矩阵的迹对角线元素之和。注意等式左边是向量内积标量右边是雅可比矩阵的迹也是标量。更常用的形式是将其视为向量等式当N1时退化回标量梯度情况。对于估计整个梯度向量我们可以利用分量形式。但一个更强大的应用是直接估计雅可比矩阵的迹。对上述等式两边除以σ_ϵ²并重新排列注意对于向量值函数g(xϵ)与ϵ的乘积通常定义为外积或逐元素乘后求和具体取决于形式我们可以得到迹估计器Tr(J_g(x)) ≈ E_ϵ[ g(xϵ)^T (ϵ / σ_ϵ²) ]或者在σ_ϵ - 0的极限下有精确的等式Tr(J_g(x)) lim_{σ_ϵ↓0} E_ϵ[ g(xϵ)^T (ϵ / σ_ϵ²) ]这个估计器的威力在于要估计雅可比矩阵的迹你完全不需要计算这个可能非常庞大的矩阵M x M维的所有元素甚至不需要计算任何显式的导数。你只需要像之前一样采样噪声ϵ计算函数在扰动点的值g(xϵ)然后做一个内积运算。这对于高维问题M很大来说计算成本从O(M^2)降到了O(M)是巨大的效率提升。实操心得迹估计在机器学习中一个经典应用是估计对数概率密度的梯度即∇_x log p(x)。在变分推断和生成模型中这常常遇到。利用等式∇_x log p(x) ∇_x p(x) / p(x)以及∇_x p(x)的散度性质可以将其与雅可比矩阵的迹联系起来从而应用上述高效的估计方法这就是著名的“重参数化技巧”和“路径梯度估计器”背后的思想之一。3. 方法实现构建实用的估计器理解了原理我们来看看如何将其转化为可以运行的代码和具体的操作步骤。我们将分标量函数梯度估计和向量函数迹估计两种情况来讨论。3.1 标量函数的梯度估计实现假设我们有一个函数g(x)我们想在点x0处估计其梯度∇g(x0)。基于Stein引理的估计步骤如下选择扰动尺度方差σ_ϵ²这是一个关键的超参数。σ_ϵ不能太大否则泰勒展开的线性近似不成立估计偏差会增大也不能太小否则在有限精度计算中函数值的变化可能被数值误差淹没。通常σ_ϵ设置为x0尺度的一个小比例例如1e-3到1e-5乘以x0的典型范数。如果x0是零向量或接近零可以设置一个绝对小的值如1e-6。采样噪声向量从多元标准高斯分布采样一个随机向量ξ ~ N(0, I)然后构造扰动ϵ σ_ϵ * ξ。这样ϵ就服从N(0, σ_ϵ² I)。计算扰动点函数值计算x x0 ϵ并求函数值g_plus g(x)。计算梯度估计值梯度估计量为grad_estimate g_plus * (ϵ / σ_ϵ²)。注意这里ϵ / σ_ϵ² ξ / σ_ϵ。蒙特卡洛平均可选为了降低估计的方差可以独立重复上述步骤K次得到K个估计值然后取平均grad_estimate (1/K) * Σ_{k1}^K [g(x0ϵ_k) * (ϵ_k / σ_ϵ²)]。下面是一个简单的Python伪代码示例import numpy as np def stein_gradient_estimate(g, x0, sigma_eps1e-4, num_samples1): 使用Stein引理估计标量函数g在点x0处的梯度。 参数: g: 函数输入为向量输出为标量。 x0: 目标点numpy数组。 sigma_eps: 扰动噪声的标准差。 num_samples: 蒙特卡洛采样次数。 返回: 梯度估计值与x0形状相同的numpy数组。 dim x0.shape[0] grad_est np.zeros_like(x0) for _ in range(num_samples): # 采样噪声 xi np.random.randn(dim) # N(0, I) epsilon sigma_eps * xi # N(0, sigma_eps^2 I) # 扰动点及函数值 x_perturbed x0 epsilon g_value g(x_perturbed) # 累加估计量 grad_est g_value * (epsilon / (sigma_eps ** 2)) return grad_est / num_samples # 示例函数g(x) sin(x1) x2^2 def example_g(x): return np.sin(x[0]) x[1]**2 # 估计在点 [1.0, 2.0] 处的梯度 x0 np.array([1.0, 2.0]) true_grad np.array([np.cos(x0[0]), 2*x0[1]]) # 真实梯度[cos(1), 4] estimated_grad stein_gradient_estimate(example_g, x0, sigma_eps1e-5, num_samples100) print(f真实梯度: {true_grad}) print(f估计梯度: {estimated_grad}) print(f相对误差: {np.linalg.norm(estimated_grad - true_grad) / np.linalg.norm(true_grad):.2e})3.2 向量值函数的迹估计实现现在考虑向量值函数g: R^M - R^N我们希望估计其雅可比矩阵J_g(x)在点x0处的迹Tr(J_g(x0))。选择扰动尺度σ_ϵ²原则与梯度估计相同。采样噪声向量同样采样ξ ~ N(0, I_M)其中I_M是M维单位阵然后令ϵ σ_ϵ * ξ。计算扰动点函数值计算x x0 ϵ并求函数值向量g_plus g(x)其形状为(N,)。计算迹估计值迹估计量为trace_estimate g_plus^T (ϵ / σ_ϵ²)。这里ϵ是M维向量g_plus是N维向量。注意这个公式要求N1标量函数时退化为梯度估计或者更一般地要求g的输出维度N与ϵ的某种运算匹配。对于标准的迹估计我们通常考虑N1或者g的某个分量。对于完整的雅可比迹如果g是向量值其雅可比是N x M矩阵它的迹是N个分量函数各自梯度雅可比行向量对自己输入分量的偏导之和。因此更通用的方法是分别估计每个输出分量g_i(x)对输入x的梯度的迹这等价于g_i的拉普拉斯算子然后求和。但利用Stein引理的一个变体可以直接得到Tr(J_g(x)) ≈ E_ϵ[ (ϵ / σ_ϵ²)^T J_g(xϵ) ϵ ] 而通过自动微分或再次利用估计技巧可以避免显式计算J_g。一个更直接实用的版本是“Hutchinson迹估计器”它与Stein引理密切相关Tr(J_g(x)) ≈ E_ξ[ ξ^T J_g(x) ξ ]其中ξ是Rademacher或高斯随机向量。结合Stein引理和有限差分我们可以用g(xσ_ϵ ξ) - g(x)来近似J_g(x) (σ_ϵ ξ)从而得到无需求导的估计器。蒙特卡洛平均同样可以通过多次采样取平均来降低方差。下面是一个估计向量函数雅可比迹的示例这里我们采用一种更直接、与Stein引理等价且更稳定的实现方式通常称为“随机扰动迹估计”import numpy as np def stein_trace_estimate(g, x0, sigma_eps1e-4, num_samples1): 估计向量值函数g的雅可比矩阵在x0处的迹。 使用 Hutchinson 估计器结合随机扰动。 参数: g: 函数输入为M维向量输出为N维向量。这里为通用性我们估计整体雅可比的迹。 实际上对于向量值函数常估计其散度 div(g) Tr(J_g)这要求NM。 x0: 目标点numpy数组形状(M,)。 sigma_eps: 扰动噪声的标准差。 num_samples: 蒙特卡洛采样次数。 返回: 迹的估计值标量。 M x0.shape[0] trace_est 0.0 for _ in range(num_samples): # 采样随机向量通常使用Rademacher或高斯分布 v np.random.randn(M) # 高斯随机向量也可以使用 np.sign(np.random.randn(M)) 得到Rademacher向量 # 归一化并不是必须的但有时有助于稳定性 v v / np.linalg.norm(v) # 可选单位化 # 构造两个扰动点 x_plus x0 sigma_eps * v x_minus x0 - sigma_eps * v # 使用中心差分可以减少偏差 # 计算函数值 g_plus g(x_plus) g_minus g(x_minus) # 有限差分近似方向导数并计算内积 # (g(xσv) - g(x-σv)) / (2σ) ≈ J_g(x) v # 那么 v^T J_g(x) v ≈ v^T * [ (g_plus - g_minus) / (2*sigma_eps) ] # 而 E[v^T J_g(x) v] Tr(J_g(x))当v是零均值、协方差为I的随机向量时。 directional_derivative_approx (g_plus - g_minus) / (2 * sigma_eps) trace_est np.dot(v, directional_derivative_approx) return trace_est / num_samples # 示例函数g(x) [x1^2, sin(x2)]输入是2维输出是2维。其雅可比矩阵为 # J_g(x) [[2x1, 0], [0, cos(x2)]] 迹为 Tr 2x1 cos(x2) def example_vector_g(x): return np.array([x[0]**2, np.sin(x[1])]) # 在点 [1.5, 0.8] 处估计迹 x0 np.array([1.5, 0.8]) true_trace 2*x0[0] np.cos(x0[1]) # 2*1.5 cos(0.8) 3 0.6967 ≈ 3.6967 estimated_trace stein_trace_estimate(example_vector_g, x0, sigma_eps1e-5, num_samples500) print(f真实迹: {true_trace:.6f}) print(f估计迹: {estimated_trace:.6f}) print(f绝对误差: {abs(estimated_trace - true_trace):.2e})注意事项在迹估计的代码中我们使用了中心差分(g(xσv) - g(x-σv)) / (2σ)来近似方向导数J_g(x) v。这比前向差分(g(xσv) - g(x)) / σ具有更小的偏差误差为O(σ²)而非O(σ)。然而这需要两次函数评估。这种“随机有限差分”方法与Stein引理是内在一致的都是利用随机扰动来探明局部梯度信息。4. 参数选择与方差分析任何基于随机采样的估计方法其性能都受到偏差和方差的共同影响。理解如何平衡这两者对于在实际中用好Stein估计器至关重要。4.1 扰动大小σ_ϵ的权衡σ_ϵ是该方法最重要的超参数。偏差分析我们的估计器E[g(xϵ) (ϵ/σ_ϵ²)]实际上是 E[∇# 已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A.4 B.3 C.9 D.94已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A.4 B.3 C.9 D.94题目已知函数fxx2axbab∈R的值域为[0∞若关于x的不等式fxc的解集为mm6则实数c的值为 A. 4B. 3C. 9D.94答案∵函数fxx2axbab∈R的值域为[0∞∴fxx2axb0只有一个根即△a2-4b0则ba24不等式fxc的解集为mm6即为x2axa24c解集为mm6 则x2axa24-c0的两个根为mm6 ∴|m6-m|a2−4( | a24−c)6 解得c9故选C举一反三已知函数fxxgxalnxa∈R若曲线yfx与曲线ygx相交且在交点处有相同的切线求a的值和该切线方程我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好奥巴马演讲不用看稿子.为什么中国领导演讲要看?想找英语初三上学期的首字母填空练习……英语翻译最新试题热门考点© 2017-2019 超级试练试题库,All Rights Reserved.