序贯重要性采样:连接自由能与生成模型采样优化
1. 从自由能到序贯重要性采样一条被低估的技术线索第一次看到“Generative AI and Stochastic Thermodynamics”这个组合标题时我的直觉是这要么是物理学家跨界抢饭碗要么是搞生成模型的人终于开始认真对待配分函数了。等翻到第12章“序贯重要性采样”这个具体章节我才意识到这条线索其实埋得很深——它把统计物理里的自由能计算、随机热力学的涨落定理和现代生成模型里的采样难题串成了一条线。序贯重要性采样Sequential Importance SamplingSIS本身不是新东西它在粒子滤波、状态空间模型里已经用了三十多年。但把它放到生成式AI和随机热力学的交叉语境下重新审视你会发现一个很有意思的事实扩散模型、流匹配模型这些当前主流的生成框架本质上都在做一件事——沿着一条人为构造的随机轨迹把简单的先验分布逐步变换成复杂的数据分布。而这条轨迹的每一步都可以用重要性采样的语言来重新表述。这篇文章想做的事情很具体把序贯重要性采样这个工具从它原本的滤波语境里拎出来放到生成模型和自由能计算的框架下讲清楚它为什么重要、怎么用、以及在实际操作中会遇到哪些坑。适合正在做生成模型采样优化、自由能估计、或者对随机热力学与机器学习交叉方向感兴趣的读者。不需要你事先精通粒子滤波但需要对概率分布、马尔可夫链、以及基本的蒙特卡洛方法有概念性的理解。我自己的背景偏计算物理和概率推断过去几年在自由能微扰计算和扩散模型采样上踩过不少坑。这篇文章里的很多经验来自实际调试代码时的教训不是教科书上的标准答案。如果你正在被生成模型的采样效率问题困扰或者想理解为什么统计物理里的老工具在深度学习时代又焕发了新生下面的内容应该对你有用。2. 核心概念拆解自由能、随机热力学与生成模型的三角关系2.1 自由能为什么是生成模型的隐藏主角自由能在统计物理里的定义很直接F -kT ln Z其中Z是配分函数。但在生成模型的语境下这个量有了新的含义。假设你有一个数据分布p_data(x)和一个模型分布p_θ(x)两者之间的KL散度可以写成KL(p_data || p_θ) E_{p_data}[ln p_data(x)] - E_{p_data}[ln p_θ(x)]右边第二项就是模型的对数似然而第一项是数据分布的负熵。如果你把p_θ(x)写成Boltzmann形式p_θ(x) exp(-E_θ(x))/Z_θ那么对数似然就变成了-E_θ(x) - ln Z_θ。这里的ln Z_θ就是自由能。问题在于Z_θ通常不可计算。高维空间里的积分没有解析解数值积分在维度超过10以后基本失效。这就是为什么生成模型的训练和评估都绕不开自由能估计——你需要在不知道Z_θ的情况下估计它的值或者它的梯度。重要性采样在这里扮演的角色是用一组从简单分布q(x)中抽取的样本通过加权来近似p_θ(x)下的期望。权重就是p_θ(x)/q(x)而归一化常数Z_θ恰好出现在这个比值里。如果你只关心期望的比值Z_θ可以约掉但如果你需要绝对数值就必须估计Z_θ本身。2.2 随机热力学给了一个动态视角随机热力学研究的是小系统在非平衡过程中的热力学行为。它的核心结果之一是Jarzynski等式⟨exp(-W/kT)⟩ exp(-ΔF/kT)这里W是沿一条随机轨迹对系统做的功ΔF是初末态的自由能差。这个等式的惊人之处在于它允许你通过非平衡过程来估计平衡态的自由能差而不需要系统真的处于平衡态。把这件事翻译到生成模型的语言里如果你构造一条从先验分布到数据分布的随机轨迹比如扩散模型的前向过程反过来那么沿这条轨迹累积的“功”就对应着对数似然的某个估计量。Jarzynski等式告诉你对这些估计量取指数再平均就能得到自由能差的无偏估计。但这里有个实际操作中的大坑指数平均的方差极大。如果W的分布有重尾那么exp(-W/kT)的样本均值会被少数极端值主导收敛速度慢到令人绝望。这就是为什么序贯重要性采样变得关键——它通过逐步重加权和重采样把方差控制在可接受的范围内。2.3 马尔可夫链是连接两者的桥梁无论是扩散模型的反向过程还是退火重要性采样中的温度调度本质上都是一条马尔可夫链。链的每一步只依赖于当前状态转移核T(x|x)描述了状态如何演化。在生成模型里这条链的设计决定了采样的质量和效率。在随机热力学里链的不可逆性决定了熵产生和耗散。而在序贯重要性采样里链的每一步都伴随着权重的更新w_t w_{t-1} * (p_t(x_t)/p_{t-1}(x_t)) * (q_{t-1}(x_t|x_{t-1})/q_t(x_t|x_{t-1}))这个更新公式看起来复杂但逻辑很清晰你在每一步都用新的分布重新评估当前样本的重要性同时考虑提议分布的变化。如果提议分布和目标任务匹配得好权重就不会剧烈波动如果匹配得差权重会迅速退化少数样本占据几乎全部权重。注意权重退化是序贯重要性采样最核心的失败模式。有效样本数ESS低于总样本数的10%时估计量就不可靠了。重采样是缓解这个问题的主要手段但它会引入额外的方差需要权衡。3. 序贯重要性采样的实操框架从公式到代码3.1 算法骨架与关键参数选择序贯重要性采样的标准流程可以概括为三步循环传播、加权、重采样。传播步骤根据提议分布q(x_t|x_{t-1})生成新样本加权步骤根据目标分布和提议分布的比值更新权重重采样步骤在有效样本数过低时按照权重重新抽取样本并将权重重置为均匀。在实际实现中有几个参数需要仔细选择样本数N通常取1000到10000。太少会导致估计方差大太多则计算成本高。我的经验是如果ESS经常掉到N/10以下说明提议分布有问题增加N治标不治本。重采样阈值常用ESS N/2作为触发条件。阈值太高会导致频繁重采样增加计算量太低则权重退化严重。提议分布的温度调度如果目标分布是多峰的提议分布需要从宽到窄逐步过渡。温度调度太快会导致样本来不及探索所有模态太慢则计算浪费。下面是一个简化的Python实现框架展示了核心逻辑import numpy as np def sequential_importance_sampling(target_logpdf, proposal_sample, proposal_logpdf, n_particles, n_steps): particles proposal_sample(n_particles) log_weights np.zeros(n_particles) for t in range(n_steps): # 传播 particles proposal_sample(particles) # 加权 log_weights target_logpdf(particles, t) - proposal_logpdf(particles, t) # 归一化 log_weights - np.max(log_weights) weights np.exp(log_weights) weights / np.sum(weights) # 计算有效样本数 ess 1.0 / np.sum(weights**2) # 重采样 if ess n_particles / 2: indices np.random.choice(n_particles, sizen_particles, pweights) particles particles[indices] log_weights np.zeros(n_particles) return particles, weights这段代码省略了很多细节比如目标分布随步骤t的变化、提议分布的条件依赖等但核心逻辑是完整的。实际使用时target_logpdf和proposal_sample需要根据具体问题定制。3.2 与退火重要性采样的关系退火重要性采样Annealed Importance SamplingAIS可以看作是序贯重要性采样的一个特例其中提议分布是马尔可夫链的转移核目标分布通过温度参数逐步从先验过渡到后验。AIS在自由能估计里非常常用因为它天然适合处理多峰分布。AIS的关键设计是温度调度β_t从β_00先验到β_T1目标。每一步的中间分布是p_{β_t}(x) ∝ p_0(x)^{1-β_t} p_1(x)^{β_t}。权重更新变成ln w_t ln w_{t-1} (β_t - β_{t-1}) * [ln p_1(x_t) - ln p_0(x_t)]这个公式的妙处在于它把自由能差分解成了每一步的小贡献之和。如果β的步长足够小每一步的贡献都很小权重的方差就可控。我在实际项目里用过AIS来估计扩散模型的似然发现温度调度的设计比样本数更重要。一个经验规则是让相邻β之间的KL散度保持在0.1到0.5 nat之间。太大则方差高太小则步数多。3.3 重采样的变体与选择标准的多项式重采样会引入额外的随机性有时候会导致样本多样性下降。几种常见的改进方案重采样方法核心思想适用场景缺点多项式重采样按权重独立抽取通用方差较大系统重采样等间隔抽取低方差需求可能丢失小权重样本分层重采样分层后抽取平衡方差与多样性实现稍复杂残差重采样确定性复制随机补充计算资源受限需要额外处理我的建议是如果样本数超过5000用系统重采样如果样本数少且分布多峰用分层重采样。多项式重采样虽然简单但在高维问题里方差太大不推荐。实操心得重采样后不要立即丢弃旧样本。保留一份重采样前的样本集合用于诊断权重退化的原因。我通常会把每一步的ESS和权重分布画出来如果发现ESS在某个特定步骤骤降说明那个步骤的提议分布和目标分布严重不匹配。4. 在生成模型中的具体应用扩散模型与流匹配4.1 扩散模型的反向采样作为序贯重要性采样扩散模型的反向过程是一个马尔可夫链从纯噪声x_T逐步去噪到x_0。标准的DDPM采样等价于从提议分布q(x_{t-1}|x_t)中采样但这个提议分布是固定的没有考虑目标数据分布的信息。如果你把数据分布p_data(x_0)作为目标那么反向过程就可以用序贯重要性采样的框架来重新表述。每一步的权重更新需要考虑前向过程的转移概率q(x_t|x_{t-1})反向过程的提议分布p_θ(x_{t-1}|x_t)目标分布p_data(x_0)通过Tweedie公式的近似具体来说权重可以写成w_t w_{t-1} * [p_θ(x_{t-1}|x_t) / q(x_{t-1}|x_t)] * [p_data(x_0|x_t) / p_data(x_0|x_{t-1})]这个公式里的第二项是难点因为p_data(x_0|x_t)通常不可计算。实践中常用Tweedie估计量来近似或者用分类器引导来替代。我试过在CIFAR-10上跑这个方案发现权重退化非常快ESS在20步以内就掉到个位数。原因是扩散模型的反向过程本身是高度不可逆的每一步的KL散度都很大。解决方案是引入中间温度调度把反向过程拆成更细的步骤或者用SMCSequential Monte Carlo的变体在每一步都做重采样。4.2 流匹配模型的SIS视角流匹配模型Flow Matching构造的是一条确定性轨迹从先验到数据。但如果你在轨迹上加入噪声它就变成了随机轨迹可以用SIS来处理。流匹配的SIS版本有一个优势轨迹的构造更灵活你可以设计一条让权重方差最小的路径。这其实是一个最优控制问题——在满足端点约束的条件下最小化权重方差。我最近在做一个图像生成的项目用流匹配的SIS版本做条件采样。发现如果把条件信息编码到轨迹的漂移项里权重的方差可以降低一个数量级。具体做法是在训练时不仅学习速度场还学习一个重要性权重的预测网络然后在采样时用这个网络来指导重采样。4.3 自由能估计的实践细节用SIS估计自由能差时有几个细节决定成败第一提议分布的选择。如果提议分布太窄样本覆盖不了目标分布的高密度区域太宽则权重方差大。一个实用的策略是用目标分布的一个粗略近似作为提议分布比如用变分推断得到的近似后验。第二权重的数值稳定性。对数权重在累加时容易溢出或下溢。标准做法是每一步都减去最大对数权重然后再取指数。但这样会引入一个未知的归一化常数需要在最后用对数求和指数log-sum-exp来恢复。第三收敛诊断。除了ESS还可以看权重分布的重尾程度。如果最大权重和平均权重的比值超过100估计量就不可靠了。另一个诊断是看自由能估计随样本数的收敛曲线如果曲线还在明显下降说明样本不够。def log_sum_exp(log_weights): max_log np.max(log_weights) return max_log np.log(np.sum(np.exp(log_weights - max_log))) def estimate_free_energy(log_weights): return -log_sum_exp(log_weights) np.log(len(log_weights))这段代码估计的是自由能差ΔF -ln Z_1 ln Z_0。注意符号约定不同的文献可能用不同的定义实际操作时要统一。5. 常见问题与排查技巧实录5.1 权重退化太快怎么办权重退化是SIS最常遇到的问题。症状是ESS在几步之内就掉到N/10以下估计量方差爆炸。原因通常有三个提议分布和目标分布差距太大解决方案是增加中间步骤让每一步的分布变化更平缓。温度调度、退火路径、或者更细的时间离散化都可以。维度太高高维空间里重要性权重的方差随维度指数增长。这是SIS的根本困难。缓解方法是降维、或者用局部重要性采样。重采样频率太低如果ESS已经很低了还不重采样权重会继续退化。建议ESS N/2就触发重采样。我踩过的一个坑是在扩散模型的SIS里我一开始把重采样阈值设成N/10结果权重退化到ESS只有个位数才重采样估计量完全不可用。后来改成N/2虽然计算量增加了30%但估计量的偏差和方差都大幅下降。5.2 重采样导致样本多样性丧失重采样会复制高权重样本丢弃低权重样本。如果反复重采样样本会坍缩到少数几个点上失去多样性。这在多峰分布里尤其严重。解决方案有几种重采样后加扰动在重采样后的样本上加一个小的高斯噪声恢复一些多样性。噪声尺度需要仔细调太大会破坏分布太小则无效。使用残差重采样保留一部分低权重样本只对高权重样本做确定性复制。自适应重采样只在ESS低于阈值时重采样且重采样后立即做几步MCMC移动让样本重新分散。我在一个分子构象生成的项目里用过第一种方案发现噪声尺度取目标分布标准差的0.1倍效果最好。太大则生成的构象不合理太小则多样性恢复不够。5.3 自由能估计的偏差来源SIS估计的自由能是有偏的偏差主要来自两个方面权重归一化对数求和指数估计的是ln Z的随机下界样本数有限时偏差为正。样本数越大偏差越小但收敛速度是O(1/N)。重采样的偏差重采样引入了额外的随机性虽然不改变期望但增加了方差。如果重采样太频繁偏差也会累积。诊断偏差的一个实用方法是用不同的随机种子跑多次SIS看估计值的分布。如果分布的中心和理论值有明显偏移说明偏差不可忽略。另一个方法是和退火重要性采样的估计值对比两者应该在大样本下收敛到同一个值。注意自由能估计的偏差在样本数少时可能很大。如果N 1000建议用bootstrap来估计置信区间不要只报告点估计。5.4 常见问题速查表问题症状可能原因排查方法解决方案ESS骤降提议分布与目标不匹配检查每步的KL散度增加中间步骤调整温度调度估计量方差大权重重尾画权重分布直方图增加样本数改进提议分布样本多样性丧失重采样太频繁检查重采样触发次数降低重采样频率加扰动自由能估计有偏样本数不足多随机种子重复实验增加样本数用bootstrap计算速度慢每步都重采样分析ESS曲线只在ESS低时重采样6. 一些个人体会与后续方向序贯重要性采样在生成模型里的应用目前还处于比较早期的阶段。大部分工作集中在扩散模型的似然估计和条件采样上但我觉得更有意思的方向是把随机热力学的工具系统地引入到生成模型的训练和推理中。比如Jarzynski等式给出的自由能估计量虽然方差大但它有一个SIS不具备的优势它不需要知道提议分布的具体形式只需要能沿轨迹累积功。这在某些黑盒场景下可能更有用。另一个方向是把SIS和最优传输结合起来。最优传输给出的轨迹在某种意义下是最优的如果用它作为SIS的提议分布权重方差应该能显著降低。我最近在尝试这个想法初步结果看起来有希望但还需要更多实验验证。最后分享一个调试SIS的小技巧把每一步的权重分布、ESS、以及重采样触发情况都记录下来画成时间序列图。很多时候问题出在某个特定的步骤上而不是整个流程。我通常会用matplotlib画四张图权重直方图、ESS曲线、重采样标记、以及自由能估计的收敛曲线。这四张图基本能覆盖90%的调试需求。

相关新闻

智谱GLM-5.2实测:黑洞诞生动画之后,我把ZCode的Base URL改到TaoToken

智谱GLM-5.2实测:黑洞诞生动画之后,我把ZCode的Base URL改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:35:46 阅读更多 →
Petalinux QSPI FLASH启动全链路实战指南

Petalinux QSPI FLASH启动全链路实战指南

1. 项目概述:为什么非得用QSPI FLASH启动,而不是SD卡或JTAG?在Zynq-7000或Zynq UltraScale MPSoC这类Xilinx异构SoC上跑Linux,新手第一反应永远是插张SD卡烧个boot.bin进去——简单、直观、失败了拔卡重来。但真正在工业现场、电力…

2026/10/2 17:34:46 阅读更多 →
eMMC擦除原理与实战:从TRIM到SECURE_ERASE的全链路解析

eMMC擦除原理与实战:从TRIM到SECURE_ERASE的全链路解析

1. eMMC数据擦除不是“删文件”那么简单:从物理层到用户态的全链路认知重建很多人第一次听说eMMC数据擦除,第一反应是“不就是rm -rf嘛”或者“格式化一下不就清干净了?”——这恰恰是踩坑的起点。我2016年在做车载终端固件安全审计时&#x…

2026/10/2 17:34:46 阅读更多 →

最新新闻

DM表空间与数据文件管理

DM表空间与数据文件管理

一 表空间基础概念 1.1 表空间定义 表空间是 DM8 数据库最大的逻辑存储单元,是所有数据库对象的统一归属容器,数据库中所有用户表、索引、系统元数据、回滚事务数据、临时运算数据,都必须存储在对应的表空间中。 表空间核心作用:实…

2026/10/2 18:12:07 阅读更多 →
【信息科学与工程学】信息科学领域工程——第十一篇 数据库基础101 数据库的知识体系04

【信息科学与工程学】信息科学领域工程——第十一篇 数据库基础101 数据库的知识体系04

模块263:第一范式 1NF 项目 内容 学科知识类别​ 数据库设计与建模 / 范式理论 知识模块​ 第一范式 First Normal Form 1NF 核心知识点​ 原子性Atomic Value、列不可再分、单值约束Single-valued、重复组消除Remove Repeating Groups、规范化起点 其他知识点列表​ …

2026/10/2 18:12:07 阅读更多 →
DeepSeek    LeetCode 143. 重排链表 Python3实现

DeepSeek LeetCode 143. 重排链表 Python3实现

LeetCode 143「重排链表」要求将链表 L0→L1→…→Ln-1→Ln 重新排列为 L0→Ln→L1→Ln-1→L2→Ln-2→…,且不能只改变节点值。思路:三步走(O(1) 空间) 找中点:快慢指针,慢指针最终指向前半部分的最后一个节…

2026/10/2 18:12:07 阅读更多 →
Shell变量与参数详解:环境变量、位置参数、特殊变量

Shell变量与参数详解:环境变量、位置参数、特殊变量

Shell变量与参数详解:环境变量、位置参数、特殊变量上一篇把变量怎么定义讲了个大概。真到写脚本时,你会立刻遇到三个问题:变量怎么传给子进程、脚本怎么接收调用者传进来的参数、以及那些 $?、$#、$ 到底代表什么。这一篇把环境变量、位置参…

2026/10/2 18:12:07 阅读更多 →
经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析

经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析

经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析 经济学毕业论文最容易出现的问题,是数据很多、图表很多,但真正的经济问题并不清楚。GDP、消费、投资、就业、房价、人口等指标做成趋势图以后,如果只是写…

2026/10/2 18:12:07 阅读更多 →
YOLOv8猴子检测权重训练:从数据集标注到模型部署全流程

YOLOv8猴子检测权重训练:从数据集标注到模型部署全流程

简介:一套面向目标检测场景的猴子识别资源,包含YOLOv8预训练权重与配套数据集。资源整合了6000余张标注为Monkey的猴子图像,已按train、val、test划分完毕,并附有data.yaml配置文件和TXT格式的标签,可直接对接YOLOv5、…

2026/10/2 18:11:06 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →