🔥 大模型数据集从入门到实战:训练集、验证集、测试集一文搞懂

0 阅读6分钟

🔥 大模型数据集从入门到实战:训练集、验证集、测试集一文搞懂

在模型之上,是数据的艺术。在模型之下,是数据的地基。

前言

很多同学在入门大模型时,往往把注意力放在模型架构和算法上,却忽略了一个更核心的问题:LLM 的智能到底从哪里来?

答案其实很简单:数据 + 算力 + 算法,但最关键的是数据

本文将从数据集的基本概念出发,带你理解数据集的划分原理,并通过 ModelScope 实战演示如何加载和处理数据集。


一、LLM 的智能从哪里来?

1.1 三大要素

要素说明重要性
算力设备处理数据、完成运算任务的计算能力(显存、CUDA)⭐⭐⭐
算法Transformer 架构(Google 2017 年论文),以概率逻辑完成文本理解、生成与推理⭐⭐⭐
数据预训练数据,模型学习的"教材"⭐⭐⭐⭐⭐

💡 数据才是 LLM 智能的核心来源。没有高质量的数据,再强的算力和算法也只是"巧妇难为无米之炊"。

1.2 模型训练的本质

从 AI 模型训练的视角来看,大模型不是被"灌输"数据,而是通过学习、理解、验证、测试的过程来掌握知识。

这就像人类的学习过程:

  • 📖 书本学习 → 训练(80%)
  • 📝 课后作业 → 验证(10%)
  • 🎓 期中期末考试 → 测试(10%)

29bde219eb1a4a20a08cd4ef5c93cdec.png

二、数据集的三大分类

2.1 训练集(Train Dataset)

类比:学生用的教材,用于吸收知识。

作用:让模型去查找数据中的规律,学习输入与输出之间的映射关系。

2.2 验证集(Validation Dataset)

类比:课后作业,帮助学生查漏补缺。

作用:频繁地验证模型训练的好坏,帮助我们调整超参数(如学习率、层数等)。

2.3 测试集(Test Dataset)

类比:考试,测试学生的学习效果。

作用:验证训练好的模型在从未见过的数据上的泛化能力。

2.4 什么是"泛化能力"?

模型不是死记硬背训练数据,而是能对全新的、陌生的输入做出正确、符合逻辑的回答与判断的能力。

这就是为什么我们需要测试集——它模拟的是模型在真实世界中会遇到的"新题"。


三、交叉验证:让模型不"偏科"

3.1 为什么需要交叉验证?

如果只是静态地按照 8:1:1 划分数据集,容易让模型"偏科"——只擅长处理某类数据。

交叉验证让模型换个角度看数据,提升泛化能力。

3.2 K 折交叉验证

原理

  1. 把数据集分成 K 份(通常 K=10)
  2. 每次留一份作为验证集,剩余 K-1 份作为训练集
  3. K 次循环后,所有数据都被训练过且被验证过
第1折: [测试] [训练] [训练] ... [训练]
第2折: [训练] [测试] [训练] ... [训练]
...
第K折: [训练] [训练] [训练] ... [测试]

四、数据管理通路

数据从"原料"到"可用"需要经过完整的处理流程:

采集(爬取、收集)→ 清洗(解构清晰)→ 标注 → 管理
环节说明常见工具/方法
采集从互联网、数据库、API 等渠道获取原始数据爬虫、公开数据集、合作方数据
清洗去除噪声、缺失值、格式不一致等问题Pandas、正则表达式、去重算法
标注为数据打上标签,明确分类或属性人工标注、半自动标注工具
管理版本控制、存储、权限管理DVC、ModelScope、Hugging Face Hub

4.1 LLM 时代的动态数据管理

在大模型时代,数据管理不再是静态的,而是一个动态循环系统:

  • 循环利用数据:找出质量差的数据,进行重新采样和清洗
  • 动态验证集选择:在训练过程中动态选择验证集
  • 知识覆盖率分析:确保数据覆盖中英文、文科理科、文字图片等多种维度
  • 数据去重与污染检测:避免重复数据和数据泄露

五、实战:数据集加载与划分

接下来,我们通过 ModelScope 社区的实战案例,演示如何加载数据集并进行训练集/验证集/测试集的划分。

5.1 环境准备

# 安装 ModelScope
pip install modelscope

5.2 加载数据集

ModelScope 提供了专属的数据集加载工具 MsDataset

from modelscope.msdatasets import MsDataset

# 加载大众点评情感分析数据集
full_ms_ds = MsDataset.load(
    "DAMO_NLP/yf_dianping",  # 数据集ID
    subset_name="default",    # 该数据集只有一个子集
    split="train"             # 数据集只包含训练集 100% 所有数据
)

# 查看第一条数据
print(full_ms_ds[0])

输出示例

{
    'sentence': '味道还不错,粥的量还是挺多的,一家人要了好几种粥,最喜欢的应该就是紫薯燕麦粥了,微甜的味道,软软糯糯的...',
    'label': 1,  # 1=正面评价,0=负面评价
    'dataset': 'dianping'
}

5.3 数据集划分

将数据集转换为 Hugging Face Dataset 格式,并进行划分:

# 转换为 Hugging Face Dataset
full_hf_ds = full_ms_ds.to_hf_dataset()

# 第一次划分:90% 训练临时集 + 10% 测试集
split1 = full_hf_ds.train_test_split(test_size=0.1, seed=42)
train_temp_hf = split1["train"]
test_hf = split1["test"]

# 第二次划分:从训练临时集中划分 10% 作为验证集
split2 = train_temp_hf.train_test_split(test_size=0.1, seed=42)
train_hf = split2["train"]
val_hf = split2["test"]

# 输出各数据集大小
print(f"训练集 train: {len(train_hf)}")   # 36436
print(f"验证集 val: {len(val_hf)}")       # 4049
print(f"测试集 test: {len(test_hf)}")     # 4499

# 查看单条样本
print("\n单条样本:", train_hf[0])

输出结果

训练集 train: 36436
验证集 val: 4049
测试集 test: 4499

单条样本: {
    'sentence': '自从乐乐出生,N久没唱歌了偶;过年同学聚会,环境不怎么样了...',
    'label': 0,
    'dataset': 'dianping'
}

六、踩坑记录:ModelScope 缓存问题

6.1 问题现象

在 ModelScope DSW 环境中,使用 MsDataset.load() 加载数据集时,报错:

EmptyDataError: No columns to parse from file

6.2 根本原因

  1. 缓存损坏:ModelScope 默认优先读取本地缓存,缓存文件可能已损坏(0 字节或仅表头)
  2. NFS 死锁:DSW 底层使用 NFS 网络文件系统,文件句柄可能被占用,导致无法删除缓存
  3. 环境干扰:Notebook 和 Terminal 的命令书写习惯不同(! 前缀)

6.3 解决方案

使用 use_cache=False 参数,强制重新下载:

from modelscope.msdatasets import MsDataset

full_ms_ds = MsDataset.load(
    "DAMO_NLP/yf_dianping",
    subset_name="default",
    split="train",
    use_cache=False,                # 核心参数:无视本地缓存
    download_mode="force_redownload" # 双重保险
)

print(f"加载成功,数据量:{len(full_ms_ds)}")

七、总结

概念作用占比
训练集模型学习规律~80%
验证集调参、查漏补缺~10%
测试集评估泛化能力~10%

核心要点

  1. 数据是 LLM 智能的核心来源
  2. 训练集/验证集/测试集缺一不可
  3. 交叉验证能提升模型泛化能力
  4. 数据管理是一个动态循环的过程

参考资料


📢 如果觉得这篇文章对你有帮助,欢迎点赞 👍 收藏 ⭐ 评论 💬 三连支持!