拒绝采样的核心是 “用简单分布(好采样)‘模拟’复杂分布(难采样)”,本质是通过 “先随机抽、再判断是否留下” 的逻辑,筛选出符合复杂分布规律的样本。我们用「抓兔子」的生活类比 + 分步拆解,帮你彻底理解:

先解决一个前提:为什么需要拒绝采样?

假设我们要研究 “北京早晚高峰的交通流量分布”(对应 目标分布 \(p(x)\),比如某个路段每小时的车流量概率),但这个分布的数学公式很复杂 —— 既不是常见的正态分布,也求不出 CDF 的反函数(没法用之前的 Inverse CDF 方法采样)。

这时候我们找一个 “简单替身”:比如用 “每小时车流量最多 1000 辆的均匀分布”(对应 建议分布 \(q(x)\)),这个分布很容易采样(直接随机抽 0-1000 的数就行)。但均匀分布和真实交通流量分布肯定不一样,怎么办?拒绝采样的思路就是:用均匀分布随机抽点,再通过 “筛选规则” 留下符合真实分布的点,去掉不符合的点

核心逻辑:用 “建议分布 + 常数” 罩住 “目标分布”

先明确两个关键角色:

  • 目标分布 \(p(x)\):我们真正想采样的复杂分布(比如真实交通流量分布,曲线可能 “早晚高、中午低”);
  • 建议分布 \(q(x)\):容易采样的简单分布(比如均匀分布,曲线是水平的);
  • 常数 k:一个足够大的数,确保 \(k \times q(x)\) 的曲线能 “完全罩住” \(p(x)\) 的曲线(比如均匀分布最大值是 1,选 \(k=5\) 让 \(5 \times q(x)\) 把 “早晚高峰峰值” 都盖住)。

你可以想象一张图:

  • 红色曲线是 \(p(x)\)(真实交通流量,早晚高、中午低);
  • 绿色曲线是k \times q(x)(放大后的均匀分布,一条水平直线,完全在红色曲线之上);
  • 所有采样都在这张图里进行,关键是 “判断采样点是否落在红色曲线下方”。

4 步理解采样过程:像 “筛沙子” 一样选样本

我们用 “采 1 个符合真实交通流量的样本” 为例,一步一步走:

步骤 1:从建议分布 \(q(x)\) 里 “随机抽 1 个 x”

比如从均匀分布(0-1000 辆)里抽到 \(x=800\)(代表 “某小时车流量 800 辆”)。这一步的本质是:先不管真实分布,用简单分布随便找一个 “候选样本”。

步骤 2:计算 “这个 x 是否该被接受” 的概率

接受概率的公式是:accept\ prob= \frac{p(x)}{k \times q(x)}

  • 分子 \(p(x)\):x=800 在真实分布中的 “概率密度”(比如早晚高峰时,800 辆的概率高,\(p(x)\) 大);
  • 分母 \(k \times q(x)\):x=800 在 “放大后的建议分布” 中的值(因为是均匀分布,这个值是固定的,比如 5)。

举个具体数值:如果 x=800 是早晚高峰,\(p(x)=4\),分母 \(k \times q(x)=5\),那么接受概率就是 \(4/5=0.8\)(80% 的概率留下这个样本);如果 x=800 是中午,\(p(x)=1\),接受概率就是 \(1/5=0.2\)(20% 的概率留下这个样本)。

这一步的逻辑是:真实分布中概率高的 x,接受概率也高;概率低的 x,接受概率也低—— 刚好符合我们想要的 “多采高概率样本、少采低概率样本”。

步骤 3:从均匀分布 (0,1) 里抽 1 个 “判断值 u”

比如抽到 \(u=0.6\)(这个值是完全随机的,0 到 1 之间每个数概率一样)。这一步相当于 “掷一个 0-1 的随机骰子”,用来判断 “是否执行接受”。

步骤 4:比较 u 和接受概率,决定 “留还是扔”
  • 如果u < \text{accept prob}:接受这个 x,作为符合 \(p(x)\) 的样本;比如刚才接受概率是 0.8,u=0.6<0.8,就留下 x=800(代表 “采到一个早晚高峰 800 辆的样本”)。
  • 如果 u \geq \text{accept prob}:拒绝这个 x,回到步骤 1 重新抽;比如中午 x=800 的接受概率是 0.2,若抽到 u=0.3>0.2,就扔掉这个 x,重新抽新的 x。

最关键的直观理解:为什么这样能 “模拟真实分布”?

我们用两个场景对比,你就懂了:

  1. 真实分布中概率高的 x(比如早晚高峰的 800 辆):接受概率是 0.8,意味着 80% 的情况下会留下这个 x—— 所以最终采到的 “早晚高峰 x” 会很多,和真实分布中 “早晚高峰概率高” 的规律一致。
  2. 真实分布中概率低的 x(比如中午的 800 辆):接受概率是 0.2,意味着 80% 的情况下会扔掉这个 x—— 所以最终采到的 “中午 x” 会很少,和真实分布中 “中午概率低” 的规律一致。

相当于我们用 “建议分布” 先 “广撒网”,再用 “接受概率” 这个筛子,把 “符合真实分布的样本” 筛出来 —— 筛完之后的样本,自然就遵循目标分布 \(p(x)\) 的规律了。

一句话总结

拒绝采样就是:用简单分布 “随便抽候选”,用 “真实分布 / 放大后的简单分布” 算接受概率,再用随机数判断是否留下 —— 本质是 “用拒绝低概率样本的方式,让留下的样本符合真实分布”

在大模型中的应用:

拒绝采样在大模型中主要用于数据筛选和优化,以提高训练数据的质量和模型的性能,具体应用如下:

  • 生成高质量训练数据:在大模型训练中,可从模型生成的结果中进行拒绝采样来收集监督微调(SFT)数据。如在推理导向的强化学习(RL)收敛后,利用模型检查点进行拒绝采样,生成推理数据。对于每个提示,模型会采样多个响应,然后通过规则过滤、奖励模型评分等方式,仅保留正确的响应,从而收集到高质量的推理相关训练样本,扩展数据集,增强模型在多种任务中的能力。
  • 优化模型输出结果:在大模型生成答案时,可让模型针对同一问题生成多个候选答案,再通过预设的评估标准对这些答案进行质量评分,仅保留得分最高的优质答案用于输出或后续训练,舍弃低质量或错误答案。例如在数学任务中,通过自动化工具比对模型输出与标准答案的数学等价性,在编程任务中通过编译器运行测试用例验证代码正确性,保留通过测试的输出,从而提升模型输出的准确性和可靠性。
  • 与奖励模型结合筛选样本:将大模型自身作为提议分布,目标分布则是理想的高质量语言模型分布。让大模型针对 prompt 生成多个候选 response,然后用奖励模型筛选出高质量的 response,这些被筛选出的样本既符合高质量语言模型的说话习惯,又不偏离原始模型的表达习惯,可用于再次训练,使模型更接近理想的语言模型。

参考:

https://blog.csdn.net/u010159842/article/details/78959515

https://xfyun.csdn.net/68a7c40d4e4959284dac1e23.html?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-3-145826594-blog-78959515.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-3-145826594-blog-78959515.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=6

如何理解拒绝采样中的常数M?

实际应用中,如何确定建议分布q(x)?

拒绝采样有哪些优缺点?

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐