LLM数据集总览
--- title: "LLM数据集总览" description: "全面介绍大语言模型训练所需的数据集类型,包括预训练数据、指令微调数据和对齐数据" tags: ["数据集", "预训练数据", "指令微调数据", "对齐数据"] category: "llm" icon: "🧠"
LLM数据集总览
数据集在LLM中的重要性
数据是训练大语言模型的基础。高质量的数据集直接决定了模型的能力上限。LLM的训练通常分为三个阶段,每个阶段需要不同类型的数据集:
- 预训练:大规模通用文本数据,学习语言知识
- 指令微调:结构化的指令-响应对,学习遵循指令
- 对齐训练:人类偏好数据,学习与人类价值观对齐
预训练数据集
通用文本数据
# 预训练数据集示例结构
pretraining_data = {
"common_crawl": {
"size": "PB级",
"description": "互联网爬取数据",
"语言": "多语言"
},
"wikipedia": {
"size": "20GB",
"description": "维基百科全文",
"质量": "高"
},
"books": {
"size": "100GB",
"description": "书籍语料",
"特点": "长文本、高质量"
},
"code": {
"size": "1TB",
"description": "GitHub代码",
"用途": "代码理解能力"
}
}
主流预训练数据集
# 常用预训练数据集
datasets = {
"The Pile": {
"size": "825GB",
"来源": 22个子数据集,
"特点": "多样化、高质量",
"用途": "GPT-NeoX训练"
},
"RedPajama": {
"size": "1.2T tokens",
"来源": "Llama数据复现",
"特点": "开源、可复现",
"用途": "开源模型训练"
},
"RefinedWeb": {
"size": "5T tokens",
"来源": "精选网页数据",
"特点": "去重、过滤",
"用途": "Falcon训练"
},
"FineWeb": {
"size": "15T tokens",
"来源": "CommonCrawl精选",
"特点": "高质量网页",
"用途": "HuggingFace模型"
}
}
代码数据集
# 代码数据集结构
code_datasets = {
"The Stack": {
"size": "6.4TB",
"语言数": 358,
"许可证": "开源",
"用途": "代码生成模型"
},
"StarCoder数据": {
"size": "1TB",
"来源": "GitHub",
"过滤": "去重+质量过滤",
"用途": "StarCoder训练"
},
"CodeParrot": {
"size": "180GB",
"语言": "Python",
"特点": "精选Python代码",
"用途": "代码补全"
}
}
指令微调数据集
指令数据格式
# 指令微调数据的标准格式
instruction_sample = {
"instruction": "请解释什么是机器学习",
"input": "", # 可选的上下文输入
"output": "机器学习是人工智能的一个分支...",
"metadata": {
"domain": "technology",
"difficulty": "medium",
"language": "zh"
}
}
# 多轮对话格式
conversation_sample = {
"conversations": [
{"role": "user", "content": "什么是深度学习?"},
{"role": "assistant", "content": "深度学习是机器学习的一个子领域..."},
{"role": "user", "content": "它和传统机器学习有什么区别?"},
{"role": "assistant", "content": "主要区别在于特征工程..."}
]
}
主流指令数据集
# 指令微调数据集
instruction_datasets = {
"Alpaca": {
"规模": "52K条",
"来源": "Self-Instruct生成",
"语言": "英文",
"用途": "指令跟随能力"
},
"BELLE": {
"规模": "3.5M条",
"来源": "中文指令数据",
"语言": "中文",
"用途": "中文指令理解"
},
"ShareGPT": {
"规模": "90K条",
"来源": "用户分享对话",
"语言": "多语言",
"用途": "多轮对话"
},
"OASST": {
"规模": "160K条",
"来源": "Open Assistant",
"语言": "多语言",
"用途": "助手能力"
}
}
对齐数据集
人类偏好数据
# 偏好数据格式
preference_sample = {
"prompt": "解释量子计算",
"chosen": "量子计算利用量子力学原理...", # 优选响应
"rejected": "量子计算就是很快的计算...", # 劣质响应
"metadata": {
"annotator_id": "expert_1",
"agreement_score": 0.95
}
}
# 多响应排序数据
ranking_sample = {
"prompt": "写一首关于春天的诗",
"responses": [
{"text": "春风吹绿江南岸...", "rank": 1},
{"text": "春天来了花开了...", "rank": 2},
{"text": "天气变暖了...", "rank": 3}
]
}
主流对齐数据集
# 对齐训练数据集
alignment_datasets = {
"HH-RLHF": {
"规模": "170K条",
"来源": "Anthropic",
"类型": "偏好对",
"用途": "RLHF训练"
},
"UltraFeedback": {
"规模": "64K条",
"来源": "多模型响应",
"类型": "多维度评分",
"用途": "DPO训练"
},
"Chatbot Arena": {
"规模": "100K+条",
"来源": "用户投票",
"类型": "真实偏好",
"用途": "模型对齐"
}
}
数据集质量评估
质量评估指标
def evaluate_dataset_quality(dataset):
"""评估数据集质量"""
metrics = {
"多样性": calculate_diversity(dataset),
"一致性": calculate_consistency(dataset),
"完整性": calculate_completeness(dataset),
"准确性": calculate_accuracy(dataset),
"时效性": calculate_freshness(dataset)
}
return metrics
def calculate_diversity(dataset):
"""计算数据多样性"""
# 使用token级别n-gram多样性
from collections import Counter
all_tokens = []
for sample in dataset:
all_tokens.extend(sample["text"].split())
token_freq = Counter(all_tokens)
unique_ratio = len(token_freq) / len(all_tokens)
return unique_ratio
数据集选择指南
# 根据任务选择数据集
dataset_selection = {
"通用对话": ["ShareGPT", "OASST", "LMSYS-Chat"],
"代码生成": ["The Stack", "CodeAlpaca", "CodeContests"],
"数学推理": ["GSM8K", "MATH", "NuminaMath"],
"知识问答": ["Natural Questions", "TriviaQA", "HotpotQA"],
"创意写作": ["ROCStories", "WritingPrompts", "StoryCloze"]
}
数据集处理流程
def prepare_dataset_pipeline(raw_data, task_type):
"""数据集准备流程"""
# 1. 数据清洗
cleaned_data = clean_data(raw_data)
# 2. 去重
deduplicated = deduplicate(cleaned_data)
# 3. 质量过滤
filtered = quality_filter(deduplicated)
# 4. 格式化
formatted = format_for_task(filtered, task_type)
# 5. 分割数据集
train, val, test = split_dataset(formatted)
return {
"train": train,
"validation": val,
"test": test,
"stats": get_dataset_stats(formatted)
}
数据集使用最佳实践
数据配比策略
# 预训练数据配比
pretraining_mix = {
"网页文本": 0.60,
"书籍": 0.15,
"代码": 0.10,
"学术论文": 0.08,
"维基百科": 0.05,
"对话数据": 0.02
}
# 指令微调数据配比
instruction_mix = {
"通用指令": 0.40,
"代码指令": 0.20,
"数学指令": 0.15,
"创意指令": 0.15,
"专业指令": 0.10
}
数据增强技术
# 数据增强方法
augmentation_methods = {
"回译": "通过翻译增强多样性",
"同义词替换": "保持语义的词汇变换",
"指令改写": "改变指令表达方式",
"响应扩展": "扩展简短响应",
"对话合成": "生成多轮对话"
}
总结
LLM数据集是模型能力的基础。预训练数据提供语言知识,指令微调数据训练指令跟随能力,对齐数据确保模型与人类价值观一致。选择和处理高质量数据集是成功训练LLM的关键。