通俗理解拒绝采样
拒绝采样是一种通过简单分布模拟复杂分布的采样方法。其核心步骤是:先用建议分布q(x)生成候选样本,再根据目标分布p(x)与放大建议分布k×q(x)的比值计算接受概率,通过随机数决定是否保留样本。这种方法能确保保留的样本符合目标分布规律。在大模型中,该技术被用于生成高质量训练数据和优化模型输出,如通过奖励模型筛选响应样本。关键点包括:选择合适的常数k使k×q(x)完全覆盖p(x),建议分布应易于采样
拒绝采样的核心是 “用简单分布(好采样)‘模拟’复杂分布(难采样)”,本质是通过 “先随机抽、再判断是否留下” 的逻辑,筛选出符合复杂分布规律的样本。我们用「抓兔子」的生活类比 + 分步拆解,帮你彻底理解:
先解决一个前提:为什么需要拒绝采样?
假设我们要研究 “北京早晚高峰的交通流量分布”(对应 目标分布 \(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)\)(真实交通流量,早晚高、中午低);
- 绿色曲线是
(放大后的均匀分布,一条水平直线,完全在红色曲线之上);
- 所有采样都在这张图里进行,关键是 “判断采样点是否落在红色曲线下方”。
4 步理解采样过程:像 “筛沙子” 一样选样本
我们用 “采 1 个符合真实交通流量的样本” 为例,一步一步走:
步骤 1:从建议分布 \(q(x)\) 里 “随机抽 1 个 x”
比如从均匀分布(0-1000 辆)里抽到 \(x=800\)(代表 “某小时车流量 800 辆”)。这一步的本质是:先不管真实分布,用简单分布随便找一个 “候选样本”。
步骤 2:计算 “这个 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 和接受概率,决定 “留还是扔”
- 如果
:接受这个 x,作为符合 \(p(x)\) 的样本;比如刚才接受概率是 0.8,u=0.6<0.8,就留下 x=800(代表 “采到一个早晚高峰 800 辆的样本”)。
- 如果
:拒绝这个 x,回到步骤 1 重新抽;比如中午 x=800 的接受概率是 0.2,若抽到 u=0.3>0.2,就扔掉这个 x,重新抽新的 x。
最关键的直观理解:为什么这样能 “模拟真实分布”?
我们用两个场景对比,你就懂了:
- 真实分布中概率高的 x(比如早晚高峰的 800 辆):接受概率是 0.8,意味着 80% 的情况下会留下这个 x—— 所以最终采到的 “早晚高峰 x” 会很多,和真实分布中 “早晚高峰概率高” 的规律一致。
- 真实分布中概率低的 x(比如中午的 800 辆):接受概率是 0.2,意味着 80% 的情况下会扔掉这个 x—— 所以最终采到的 “中午 x” 会很少,和真实分布中 “中午概率低” 的规律一致。
相当于我们用 “建议分布” 先 “广撒网”,再用 “接受概率” 这个筛子,把 “符合真实分布的样本” 筛出来 —— 筛完之后的样本,自然就遵循目标分布 \(p(x)\) 的规律了。
一句话总结
拒绝采样就是:用简单分布 “随便抽候选”,用 “真实分布 / 放大后的简单分布” 算接受概率,再用随机数判断是否留下 —— 本质是 “用拒绝低概率样本的方式,让留下的样本符合真实分布”。
在大模型中的应用:
拒绝采样在大模型中主要用于数据筛选和优化,以提高训练数据的质量和模型的性能,具体应用如下:
- 生成高质量训练数据:在大模型训练中,可从模型生成的结果中进行拒绝采样来收集监督微调(SFT)数据。如在推理导向的强化学习(RL)收敛后,利用模型检查点进行拒绝采样,生成推理数据。对于每个提示,模型会采样多个响应,然后通过规则过滤、奖励模型评分等方式,仅保留正确的响应,从而收集到高质量的推理相关训练样本,扩展数据集,增强模型在多种任务中的能力。
- 优化模型输出结果:在大模型生成答案时,可让模型针对同一问题生成多个候选答案,再通过预设的评估标准对这些答案进行质量评分,仅保留得分最高的优质答案用于输出或后续训练,舍弃低质量或错误答案。例如在数学任务中,通过自动化工具比对模型输出与标准答案的数学等价性,在编程任务中通过编译器运行测试用例验证代码正确性,保留通过测试的输出,从而提升模型输出的准确性和可靠性。
- 与奖励模型结合筛选样本:将大模型自身作为提议分布,目标分布则是理想的高质量语言模型分布。让大模型针对 prompt 生成多个候选 response,然后用奖励模型筛选出高质量的 response,这些被筛选出的样本既符合高质量语言模型的说话习惯,又不偏离原始模型的表达习惯,可用于再次训练,使模型更接近理想的语言模型。
参考:
https://blog.csdn.net/u010159842/article/details/78959515
如何理解拒绝采样中的常数M?
实际应用中,如何确定建议分布q(x)?
拒绝采样有哪些优缺点?
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)