当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > Hugging Face Datasets interleave_datasets 怎样按概率交错混合语料

Hugging Face Datasets interleave_datasets 怎样按概率交错混合语料

来源:17golang原创 2026-10-27 10:12:49 0浏览 收藏

多个语料源需要混成一条训练流时,datasets.interleave_datasets 可以按来源概率逐条选择样本。关键是把 probabilities、seed 和 stopping_strategy 分开理解:前者控制“下一条从谁取”,seed 控制随机序列是否可复现,停止策略则决定某个来源耗尽后是否结束或允许继续采样。

官方地址:https://huggingface.co/docs/datasets/en/package_reference/main_classes

想要可复现的按比例混合,先把概率列表与数据集列表一一对应,再固定 seed;默认策略遇到任一来源耗尽就停止,允许过采样时才改用 all_exhausted。

先确认概率列表代表什么

interleave_datasets 接收一个 Dataset 或 IterableDataset 列表。不给 probabilities 时,函数按来源轮换;传入概率后,每次从一个来源随机取一条。概率列表的顺序必须和数据集列表一致,且通常应表达相对权重,例如 [0.7, 0.2, 0.1] 表示 A 的选择机会高于 B 和 C,并不承诺最终输出中三类样本严格按 7:2:1 出现。

interleave_datasets 按 probabilities 和 seed 从三个语料源交错选择样本的结构图
图1:结构说明图,展示概率选择器如何从多个语料源交错取样;这是静态说明图,不是运行截图。

seed 只负责让随机选择序列可重复。它不会改变概率,也不会把不等长的来源自动补齐。检查时先问两个问题:概率是否与来源位置对应,下一次运行是否使用同一个 seed。

用最小示例观察交错结果

下面用三个很短的内存数据集演示按概率取样。示例故意固定 seed,并打印来源标签,方便把“选择来源”与“最终数量”区分开。

from datasets import Dataset, interleave_datasets

# 三个来源只放少量标签,便于观察交错顺序,而不是模拟真实语料规模。
news = Dataset.from_dict({"source": ["news-1", "news-2", "news-3"]})
code = Dataset.from_dict({"source": ["code-1", "code-2", "code-3"]})
qa = Dataset.from_dict({"source": ["qa-1", "qa-2", "qa-3"]})

# 概率列表按 [news, code, qa] 的位置对应,seed 让本次选择序列可复现。
mixed = interleave_datasets(
    [news, code, qa],
    probabilities=[0.7, 0.2, 0.1],
    seed=42,
)

# 默认 first_exhausted:任一来源耗尽时停止,输出长度不必等于三类的比例。
print(mixed["source"])

默认的 stopping_strategy 是 first_exhausted。因此,某个来源先被取完时,混合数据集就结束;概率较低的来源可能还没有取完,概率较高的来源也可能只消耗了一部分。不要把一次短样本输出当成长期分布统计。

三种停止策略怎么选

真正决定数据量和重复行为的是停止策略。官方文档列出三种值:first_exhausted、all_exhausted 和 all_exhausted_without_replacement。

interleave_datasets 三种 stopping_strategy 对比图
图2:边界说明图,对比三种 stopping_strategy 的输出生命周期;这是结果示意图,不是运行截图。
策略什么时候停止是否可能重复适合场景
first_exhausted任一来源耗尽就停止不会为了补齐而重复不希望短来源被过采样
all_exhausted每个来源都至少耗尽一次可能重复采样短来源希望尽量覆盖所有来源
all_exhausted_without_replacement按无放回方式完成取样每个样本只取一次不能接受重复样本

如果选择 all_exhausted,低概率来源可能需要很长时间才被抽到,输出规模也可能明显膨胀。这个策略适合明确接受过采样的任务,不适合把输出长度当成固定预算的任务。

from datasets import Dataset, interleave_datasets

# 两个来源长度不同,用于突出“过采样”和“无放回”的差异。
short = Dataset.from_dict({"text": ["short-1", "short-2"]})
long = Dataset.from_dict({"text": ["long-1", "long-2", "long-3", "long-4"]})

# all_exhausted 允许短来源在需要时再次被抽取,直到两个来源都被覆盖。
oversampled = interleave_datasets(
    [short, long],
    probabilities=[0.5, 0.5],
    seed=7,
    stopping_strategy="all_exhausted",
)

# 无放回策略不重复消费样本,适合把每条记录视为一次性输入的场景。
without_replacement = interleave_datasets(
    [short, long],
    probabilities=[0.5, 0.5],
    seed=7,
    stopping_strategy="all_exhausted_without_replacement",
)

print(oversampled["text"])
print(without_replacement["text"])

streaming 数据要额外检查什么

当输入是 IterableDataset 时,返回结果仍然是可迭代数据集。你不应该用 map-style Dataset 的随机索引方式检查它,而要通过迭代器逐条读取。官方文档还提醒,流式数据的分片数会取各来源中最小的那个,以便保持并行读取的一致性。

from datasets import interleave_datasets, load_dataset

# streaming=True 只建立迭代入口,不把完整语料一次性加载到内存。
zh = load_dataset("allenai/c4", "zh", split="train", streaming=True)
en = load_dataset("allenai/c4", "en", split="train", streaming=True)

# 流式混合仍然可以按概率选择来源;固定 seed 便于重复同一选择逻辑。
stream = interleave_datasets(
    [zh, en],
    probabilities=[0.6, 0.4],
    seed=42,
)

# 只读取前几条做流程检查,避免把无限或超大数据流全部消费掉。
for index, row in enumerate(stream):
    print(row["text"][:80])
    if index == 4:
        break

流式场景的重点不是把所有样本数预先算出来,而是确认分片、停止条件和消费方式。尤其在分布式或 DataLoader worker 中,停止策略按进程应用,最终总样本数可能比单进程直觉更少。

排查概率混合的四个检查点

  1. 先核对数据集列表与 probabilities 的位置,避免把标签和权重错配。
  2. 固定 seed 复现同一条选择序列,再分别改变权重,观察问题来自概率还是数据耗尽。
  3. 确认是否接受短来源重复:接受就考虑 all_exhausted,不接受就使用默认策略或无放回策略。
  4. streaming 场景只迭代有限样本做检查,不用随机索引,也不把一次迭代长度当作完整数据规模。

一句话记忆:probabilities 决定“从谁取”,seed 决定“能否重现”,stopping_strategy 决定“何时停以及是否允许补样”。三者分别配置,排查时也分别确认。

相关问题

不传 probabilities 会怎样?

函数会按来源轮换取样,而不是按随机概率选择。适合需要固定轮转的场景;如果要表达不同来源权重,就显式传入与数据集顺序对应的概率列表。

概率总和必须等于 1 吗?

应把它写成一组合法的相对概率并保持与来源一一对应。实践中直接使用和为 1 的浮点列表最容易读和排查,也避免把权重语义和来源顺序混在一起。

为什么设置概率后输出仍然不均匀?

概率描述的是每次选择来源的机会,不是小样本上的硬配额;同时,数据集长度和停止策略会截断输出。固定 seed 后增加样本量,再结合停止策略判断分布是否符合预期。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Zotero 怎样合并重复文献条目Zotero 怎样合并重复文献条目
上一篇
Zotero 怎样合并重复文献条目
Hugging Face Datasets flatten_indices 怎样整理筛选后的索引映射
下一篇
Hugging Face Datasets flatten_indices 怎样整理筛选后的索引映射
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    731次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    734次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    813次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    772次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    609次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码