ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

TSULA算法:驯化次梯度Langevin采样,突破非光滑非凸优化难题

2026/8/28 2:57:14 拓冰建站 浏览量
TSULA算法:驯化次梯度Langevin采样,突破非光滑非凸优化难题 这次我们来看一个偏理论、但非常有工程参考价值的采样与优化算法Tamed Subgradient Unadjusted Langevin Algorithm简称 TSULA。简单说它解决的是一个很具体的问题当目标函数既不可微、又不满足凸性假设时Langevin 型算法还能不能稳定收敛并且得到一个像样的采样结果。先把名字拆开看Tamed 是“驯化”或“限幅”Subgradient 是“次梯度”Unadjusted Langevin Algorithm 就是大家熟知的 ULA即不做 Metropolis-Hastings 修正、直接离散化 Langevin 动力学的那种迭代算法。三个词对应三件事对迭代中的过大幅度做抑制、在不可导点使用次梯度、用带随机噪声的更新同时完成优化与采样。它面向的典型场景包括 L1 正则化模型、ReLU 神经网络、带稀疏约束的统计推断以及各种非光滑非凸损失函数。这篇文章会做四件事拆解 TSULA 的算法构成说明它和 ULA、Subgradient ULA、MYULA 的区别给出一个可执行的一维数值验证流程再谈谈这类算法在工程上的适用边界。需要先说明本文不是论文原文的逐条翻译后续涉及的定理假设、常数和收敛率细节应以原始论文为准但算法结构与验证思路可以独立理解。1. 核心概念速览项目说明算法名称Tamed Subgradient Unadjusted Langevin Algorithm简称 TSULA算法构成次梯度更新 Taming 缩放因子 Langevin 噪声项核心目标对非光滑、非凸目标函数做稳定采样与优化理论基础非凸分析、非光滑分析、Wasserstein 距离下的收敛性估计典型适用问题L1 正则化推断、ReLU 网络损失、稀疏贝叶斯采样、非凸统计模型工程形态纯迭代更新规则不依赖深度学习框架CPU 即可跑通验证与普通 ULA 的差异允许目标函数不可导并通过 taming 避免次梯度爆炸导致发散与 MYULA 的差异不调用 prox 算子更新成本更低但需要更谨慎设计步长硬件门槛极低单机 CPU 足够做合成实验验证开源情况需要按论文作者主页或项目仓库确认本文不预设仓库地址2. Langevin 动力学与 ULA采样和优化的统一框架TSULA 的起点是 Langevin 动力学它是一条连续时间的随机微分方程dX_t -∇f(X_t) dt √2 dW_t其中 W_t 是标准布朗运动f 是目标函数。这条 SDE 有一个非常重要的性质在很宽的条件下它的平稳分布正比于 exp(-f(x))。换句话说如果我们能长期跟踪这条随机微分方程得到的样本分布会逐渐逼近目标分布。这种“让随机轨迹自然趋向目标分布”的思路是 Langevin 型采样算法的理论基础。ULA 是这条 SDE 的欧拉离散化。给定步长 γ迭代格式是x_{k1} x_k - γ ∇ f(x_k) √(2γ) z_k其中 z_k 是标准高斯随机向量。这里的更新由两部分组成第一项 -γ∇f(x_k) 在推着 x 沿梯度下降方向移动第二项 √(2γ)z_k 注入随机扰动。如果去掉噪声项就退化成确定性梯度下降保留噪声项就能在极小值附近持续探索最终得到采样分布。工程上最常见的使用场景是贝叶斯推断。假设我们有先验分布 p(θ) 和似然 p(D|θ)让 f(θ) -log p(θ) - log p(D|θ)那么 exp(-f(θ)) 就正比于后验分布。用 Langevin 迭代采样就相当于在不计算精确后验、不做共轭推断的情况下得到一个近似后验样本集合。经典的 ULA 分析通常要求 f 具有足够好的光滑性例如梯度满足 Lipschitz 条件并且分布满足 log-concavity 或强凸性。但现实中的机器学习目标函数很少全都满足这些条件。于是出现了两个方向的扩展一是非光滑化把导数放宽为次导数二是非凸化把凸假设替换成更弱的条件。TSULA 正好站在两个方向的交叉点上。3. 为什么需要次梯度非光滑目标无处不在实际损失函数里不可导点非常常见。最典型的是 L1 正则化项 |x|它在 x0 处不可导ReLU 函数 max(0, x) 在 x0 处也不可导带 L1L2 组合惩罚的 Elastic Net、支持向量机的 Hinge Loss同样存在不可导区域。对这些函数直接计算梯度会发现梯度在某些点不存在。数学上的处理方式是引入次梯度。对于凸函数 f点 x 处的次梯度 g 满足f(y) ≥ f(x) g, y - x对所有 y直观上g 是目标函数在 x 处所有“有效下降方向”的集合中的一个元素。如果 f 在 x 处可导次梯度集合就退化为单点即普通梯度。如果 f 存在尖角比如 |x| 在 0 附近次梯度可以是 [-1, 1] 区间内的任意值。对于非凸函数次梯度的定义更复杂通常会使用 Clarke 次梯度或某种广义次梯度。Clarke 次梯度可以理解为在 x 附近取光滑化函数的梯度极限。它不要求 f 是凸的因此适合 TSULA 这类面向非凸目标的方法。用次梯度替换梯度之后迭代更新仍然可以写为x_{k1} x_k - γ v_k √(2γ) z_k其中 v_k 是目标函数在 x_k 处选定的次梯度。这里立刻出现一个新的问题次梯度虽然存在但在不可导点附近可能非常不稳定。比如 f(x) |x| 的次梯度在 0 处可以在 [-1, 1] 之间跳跃再叠加非凸项之后次梯度的大小可能在某个区域内突然变得很大。若步长 γ 固定γv_k 就会产生巨大位移采样轨迹直接发散。这就是 Taming 机制存在的核心原因。4. Taming 机制用缩放因子压制爆炸“Taming”这个名字很形象意思是给过大的更新量套上缰绳。它的动机来自于一个看似矛盾的现象Langevin 算法的连续时间方程是稳定的但离散化之后如果目标函数变化剧烈显式欧拉方法的轨迹可能发散。在非光滑问题上这个现象尤其严重因为次梯度的数值可能没有上界或者上界非常大。Taming 的典型做法是在更新前对梯度项施加一个缩放因子最常见的两种形式类似下面这样x_{k1} x_k - γ * v_k / (1 γ ||v_k||) √(2γ) z_k或者写成等价形式x_{k1} x_k - γ * min(1, 1 / (γ ||v_k||)) * v_k √(2γ) z_k两种写法都体现了同一个思路当次梯度范数 ||v_k|| 很大时整体更新幅度被限制在 O(1) 量级而不是随 ||v_k|| 线性放大当次梯度范数很小时缩放因子接近 1算法退回普通次梯度 Langevin 更新。这个方法可以看成一种“自适应的梯度裁剪”但它和深度学习里常见的 gradient clipping 有细微区别。Gradient clipping 通常是设定一个固定阈值超过就缩放Taming 则是根据当前步长 γ 和梯度范数自动调整理论分析上更容易控制离散化误差。它也不是 Adam 那样的逐坐标自适应缩放而是对整个次梯度向量做全局限幅因此保留了原始方向只控制步长幅度。对非光滑非凸目标来说Taming 几乎是必需的。因为非凸目标函数可能包含尖峰或悬崖区域次梯度在这些区域不像光滑函数那样能连续变化。没有 Taming随机噪声和次梯度叠加之后数值可能直接冲过目标函数定义域导致整个采样过程失去统计意义。5. TSULA 的算法构造与更新规则把“次梯度”和“Taming”装进 ULA 框架就得到了 TSULA 的通用迭代格式。在每一轮迭代中计算当前点 x_k 处的次梯度 v_k如果该点不可导选取一个合法的次梯度元素计算 Taming 缩放系数 s_k min(1, 1 / (γ ||v_k||))用缩放后的次梯度做确定性下降注入 √(2γ) z_k 的 Langevin 噪声。写成数学形式v_k ∈ ∂f(x_k) s_k min(1, 1 / (γ ||v_k||)) x_{k1} x_k - γ s_k v_k √(2γ) z_k这里 ∂f(x_k) 表示次微分集合v_k 是该集合中的一个元素。对于非凸函数通常需要假设存在某种有界性或弱凸性确保次梯度的性质足够好让算法在理论上可以给出非渐近收敛保证。也就是说TSULA 不是简单地把导数换成次导数里面每一步选择都需要有理论支撑。下面给出一个 Python 伪代码示例展示了 TSULA 的完整迭代过程。这里使用一个既有非凸性又有非光滑性的测试目标函数f(x) (x^2 - 1)^2 |x - 0.3|第一项 (x^2 - 1)^2 是非凸四次函数有两个极小值点分布在 x -1 和 x 1 附近第二项 |x - 0.3| 在 x 0.3 处不可导是非光滑项。import numpy as np from numpy.random import default_rng rng default_rng(42) def f(x): return (x**2 - 1)**2 np.abs(x - 0.3) def subgrad_f(x): # 第一项在 x 处可导导数为 4x(x^2 - 1) g 4 * x * (x**2 - 1) # 第二项 |x - 0.3| 的次梯度 if x 0.3: g 1.0 elif x 0.3: g - 1.0 else: # 在不可导点选择次梯度集合中的一个元素 # 这里选择 0 作为合法次梯度实际可以换成其他取值 g 0.0 return g def tsula_step(x, gamma): g subgrad_f(x) s min(1.0, 1.0 / (gamma * abs(g) 1e-12)) noise np.sqrt(2 * gamma) * rng.normal() return x - gamma * s * g noise x 0.0 history [] for k in range(50000): gamma 0.005 x tsula_step(x0 if k 0 else x, gamma) history.append(x) print(样本均值:, np.mean(history[-10000:])) print(样本标准差:, np.std(history[-10000:]))这段代码展示的是“次梯度 Taming 噪声”的通用迭代结构。真实论文中的 v_k 选择规则、步长序列 γ_k 的形式、理论分析中使用的是哪类次梯度都可能更加复杂。放到工程验证里第一步是先确认轨迹不会发散第二步才是统计样本分布是否符合预期。6. beyond convexity非凸情境下的理论分析思路TSULA 标题里的 “beyond convexity” 是全文最核心的理论关键词。为什么凸性这么重要凸性意味着目标函数只有一个全局最小点分布 exp(-f) 是 log-concave 的这时 Langevin 型算法的收敛性证明相对成熟。一旦去掉凸性目标函数可能出现多个局部极小值平稳分布也可能多模态常规证明思路就不成立了。非凸场景下分析通常会引入几个替代条件弱凸性weak convexity函数虽然不凸但可以写成“凸函数减去一个二次项”的形式或者满足类似 f(y) ≥ f(x) g, y - x - L/2 ||y-x||^2 的不等式。它允许函数有局部下凹但下凹程度受到限制。分布层面的不等式例如对数 Sobolev 不等式或 Poincaré 不等式。这些不等式能帮助把迭代分布的收敛转化为某个可计算的泛函递减。几何遍历性用 Wasserstein 距离或全变差距离刻画迭代分布与目标平稳分布的差距随时间 t 的衰减速度。在非凸前提下TSULA 的目标一般不是“保证收敛到全局最优”而是“保证迭代过程接近某个平稳状态并且不发散”。对于多模态分布算法通常需要在步长和噪声强度之间做权衡噪声太小无法跳出局部极小区域噪声太大分布弥散严重采样精度下降。Taming 在这里的作用是确保即使次梯度在非凸区域出现大幅变化整体更新路径仍是可控的。实际看理论结果时可以重点看三个量一是步长 γ 的取值范围二是迭代次数 T 与误差的关系三是目标函数满足的条件。如果论文给出的是 Wasserstein-2 距离下的非渐近上界那就意味着在给定步长下误差会随迭代次数递减。工程上这类误差界可以当作“跑多少步能满足精度”的参考。7. TSULA 与相邻方法的对比要理解 TSULA 的定位最好的办法是和几个常见变体放在一起对比方法对梯度的要求支持非光滑目标支持非凸目标额外计算代价ULA需要可导梯度不支持有限无Subgradient ULA只需要次梯度支持有限无TU La需要可导梯度额外加 Taming不支持支持极低MYULA需要梯度用 Moreau-Yosida 包络处理非光滑项支持有限需计算 prox 算子TSULA只需要次梯度额外加 Taming支持支持极低这里不是要给出精确的定理比较而是提供一个直观定位。ULA 是最容易理解的基线版本适合光滑凸目标Subgradient ULA 把梯度放宽为次梯度但缺少对爆炸的抑制TULA 引入了 Taming却仍然要求目标函数可导MYULA 通过 Moreau-Yosida 包络和 prox 算子处理非光滑项理论性质很好但每次迭代需要求解一个近端问题计算成本更高。TSULA 的思路比较直接我不想计算 prox也不要求目标可导那我就在次梯度的基础上加 Taming。这样既保留了次梯度方法的简单性又能避免离散化导致的数值发散。代价是非凸非光滑条件下的理论分析会比凸光滑情况复杂得多这也正是论文题目强调 “beyond convexity” 的原因。工程上选型时如果目标函数可以拆成“光滑部分 prox 友好的非光滑项”MYULA 或近端 SGLD 仍然是更稳妥的选择如果非光滑部分比较复杂或者 pro x 计算不便宜TSULA 这一类方法则更有吸引力。8. 如何设计验证实验一维合成目标上的通用流程对于理论算法我们需要在实际代码里确认三件事是否发散、分布是否合理、与不带 Taming 的版本相比是否更稳定。这里给出一个和论文无直接关系的通用验证流程重点在于展示测试思路。8.1 测试目标选择一维测试函数可以同时包含非凸性和非光滑性例如f(x) (x^2 - 1)^2 |x - 0.3|这个函数有两个局部极小区域同时在 x 0.3 处有不可导点适合考察算法对非光滑非凸目标的适应性。8.2 对照实验设计建议跑三组对照普通梯度下降x_{k1} x_k - γ∇f(x_k)观察是否停在某个局部极小点次梯度 ULAx_{k1} x_k - γv_k √(2γ)z_k观察是否因为次梯度过大而发散TSULAx_{k1} x_k - γ s_k v_k √(2γ)z_k观察稳定性。通过三组实验可以很直观地看出 Taming 在数值稳定性上的作用。8.3 观察指标采样算法是否合理不能只看最终均值。建议观察样本轨迹是否在某个区间内稳定波动不存在持续发散历史样本的直方图是否呈现出多模态形态而不是被束缚在单一峰值后段样本均值、标准差、分位数是否保持平稳如果存在参考分布可以用一维 Wasserstein 距离估计误差。一维 Wasserstein 距离可以用 SciPy 快速计算from scipy.stats import wasserstein_distance # 假设 samples_tsula 是 TSULA 的采样序列 # 假设 reference_samples 是某种参考分布样本 dist wasserstein_distance(samples_tsula[-10000:], reference_samples) print(Wasserstein 距离:, dist)8.4 如何判断算法成功判断标准不应只是“均值接近某个值”而应该是迭代轨迹不发散数值范围合理样本分布能覆盖多个局部极小区域而不是被一个极小点锁死与不带 Taming 的次梯度 ULA 相比轨迹更稳定随着迭代次数增加Wasserstein 距离或某种误差估计呈现下降趋势。如果轨迹发散优先检查步长 γ 是否过大再检查次梯度 v_k 的实现是否正确最后确认 Taming 缩放因子是否真的被用上了。8.5 一维测试的局限一维测试只是验证算法工程实现是否有基本问题不足以反映高维非凸目标的真实困难。高维情形下多模态结构更复杂步长选择更难状态空间探索也更慢。真实应用中还需要在高维目标函数上测试混合速度、自相关时间、批次运行稳定性等指标。9. 工程价值与适用边界TSULA 不是某个开箱即用的深度学习工具但它有明确的工程参考价值。第一它给“非光滑损失函数 Langevin 采样”提供了一个可落地的更新形式。如果你在实现贝叶斯神经网络、稀疏贝叶斯回归或带 L1 正则的深度学习模型同时又用 SGLD 或 ULA 做推断那么目标函数的不可导点迟早会带来数值问题。TSULA 的 Taming 策略可以作为一个通用预处理模块直接加到现有更新中。第二它不需要额外计算 prox 算子。对于那些非光滑项来自数据增强、对抗正则或复杂模型结构、无法写出显式 prox 的问题TSULA 更省事。Python 里计算一个次梯度通常只是几行代码而实现一个 prox 需要针对每个正则项单独推导。第三它是理论研究和工程实现之间的桥梁。论文给出的收敛性分析可以作为算法选择的依据当目标函数的非凸性强、又不满足光滑条件时TSULA 在理论上有更明确的保证比“先跑一下看能不能收敛”更可靠。但也要注意边界TSULA 不保证在任意非凸目标上找到全局最优它面向的是达到平稳分布或近似平稳状态非凸非光滑的收敛率通常对步长更敏感实际使用需要做步长调参它仍然需要目标函数的次梯度可计算如果次梯度本身不可用算法无法直接实施对高维多模态问题马尔可夫链的混合速度仍然是瓶颈单纯换算法未必能解决问题。如果要把 TSULA 用在真实数据上务必确认数据授权和隐私边界。Langevin 采样本质上是对后验分布的近似模型参数可能间接记忆训练数据信息发布模型或对外提供采样接口时应评估隐私风险必要时采用差分隐私、数据脱敏或本地化处理方案。10. 总结与下一步建议TSULA 最值得关注的点不是它比普通 ULA 快多少而是它把“非光滑”和“非凸”这两个实际工程中经常碰到又很难处理的因素同时放进了 Langevin 型迭代里并用 Taming 机制解决了离散化爆炸问题。对这种偏理论的算法第一次接触时不要急着读完整证明先跑通一维数值实验把次梯度、Taming 因子、Langevin 噪声三项的相互作用看清楚再去读论文的收敛性定理。最容易踩的坑有两个一是次梯度的选取随意导致迭代方向不稳定二是步长 γ 设置过大Taming 因子频繁触发最终算法退化成“几乎没有梯度更新”的纯噪声过程。实际调试时可以先用很小的 γ 验证方向正确再逐步增大观察临界点。后续如果想要深入扩展可以沿着三个方向看近端 SGLD 与 MYULA 如何处理非光滑凸目标、模拟退火 Langevin 算法如何增强非凸问题中的全局探索能力以及条件采样版本如何在扩散模型和生成模型中发挥作用。如果让我做下一步我会先在一维合成目标上跑三组对照分别是不带 Taming 的次梯度 ULA、带固定阈值裁剪的次梯度 ULA、以及 Tamed 版本。这三组实验跑完基本就能理解为什么论文要引入 Taming也能在自己实现 Langevin 采样时多一个防发散的工具。