FineMath: HuggingFace 打造的 50B Token 数学预训练语料

FineMath: HuggingFace 打造的 50B Token 数学预训练语料

数据集链接: HuggingFace
创建机构: HuggingFace TextBook Team
许可证: ODC-By 1.0
规模: FineMath-3+ (34B token) + FineMath-4+ (9.6B token)
质量评分: 4.6/5.0

核心观点

数学能力已经成为衡量 LLM 的核心指标,但绝大多数开源数学数据集质量参差不齐。FineMath 用一套精细化的质量评分管道,从 Common Crawl 的噪声海洋中提取出了目前最干净的数学预训练语料。

数学数据为什么这么难搞

训练一个数学能力强的 LLM,最大的瓶颈不是算力,而是数据。互联网上的数学内容分布极不均匀:高质量的数学推导散落在教育网站、论坛、教材中,混杂着大量低质量的作业抄袭、错误解答和纯公式堆砌。

更麻烦的是数学符号的提取。网页上的数学公式有 MathML、LaTeX、KaTeX 等多种格式,普通的 HTML 清洗管道会把这些公式变成一堆乱码。如果你的训练数据里 $x^2 + y^2 = r^2$ 变成了 x2 + y2 = r2,模型学到的就是错误的数学表达。

FineMath 直面这些挑战,提供了一个系统性的解决方案。

构建过程:三步精炼

第一步:精准数学内容发现

不是从 Common Crawl 中随便找含数字的页面。团队训练了一个专门的分类器,通过迭代优化来识别真正包含数学推理和推导的页面。这个分类器基于合成标注数据训练,能区分”讨论数学的页面”和”包含数学推理的页面”——后者才是有价值的训练数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 数学内容分类器伪代码

class MathContentClassifier:
def __init__(self):
self.model = train_classifier(
features=[
'formula_density', # 公式密度
'equation_complexity', # 方程复杂度
'reasoning_keywords', # 推理关键词
'proof_structure' # 证明结构
]
)

def classify(self, webpage):
"""
判断页面是否包含数学推理
"""
features = extract_features(webpage)
prob = self.model.predict_proba(features)

# 区分"讨论数学"vs"包含数学推理"
if prob['reasoning'] > 0.7:
return "包含数学推理" # 高价值
elif prob['math'] > 0.5:
return "讨论数学" # 低价值
else:
return "非数学"

第二步:符号保真提取

使用 OpenWebMath 管道处理发现的数学页面。这个管道能正确识别 MathML、LaTeX、KaTeX 等各种 HTML 数学标记,统一转换为 LaTeX 格式。这一步至关重要——数学数据集的质量,很大程度上取决于公式提取的准确性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# OpenWebMath 符号提取流程

from openwebmath import MathExtractor

extractor = MathExtractor()

# 处理网页
html_content = load_webpage(url)

# 识别各种格式的数学公式
formulas = extractor.extract(html_content)
# 支持格式:
# - <math> MathML
# - $$ LaTeX $$
# - \( KaTeX \)
# - <script type="math/tex">

# 统一转换为 LaTeX
latex_formulas = [to_latex(f) for f in formulas]

# 输出:带 LaTeX 公式的纯文本
processed_text = extractor.to_text(html_content)

第三步:LLM 精细评分

用 LLaMA-3.1-70B-Instruct 对提取的内容进行 0-5 分的质量评分。评分标准聚焦在数学推理的深度和质量,而不仅仅是”是否包含数学”。根据分数阈值切分成两个版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from transformers import AutoModelForCausalLM

# 加载评分模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-70B-Instruct"
)

def score_math_content(text):
"""
使用 LLM 对数学内容质量评分 (0-5 分)
"""
prompt = f"""
请对以下数学内容的质量进行评分 (0-5 分):

评分标准:
0-1 分:无实际数学内容或错误明显
2 分:简单计算,缺乏推理
3 分:包含基本推理,步骤完整
4 分:推理清晰,有深度
5 分:高质量数学推导,严谨完整

内容:
{text}

评分:
"""

response = model.generate(prompt)
score = parse_score(response)
return score
  • FineMath-3+:34B token(保留评分>=3 的内容),适合大规模预训练
  • FineMath-4+:9.6B token(保留评分>=4 的内容),质量更高,适合精细训练

数据版本对比

版本 Token 数 质量阈值 适用场景
FineMath-3+ 34B >=3 分 大规模预训练
FineMath-4+ 9.6B >=4 分 精细训练/微调
FineMath-4.5+ 约 3B >=4.5 分 高质量微调

实际效果:不是小幅提升

在 Llama-3.2-3B 上的持续预训练实验中,FineMath 的效果非常显著:

1
2
3
4
5
6
7
8
9
GSM8K 性能对比:

数据集 | 准确率 | 相对提升
-----------------|--------|----------
No Math Data | 35.2% | 基线
FineWeb-Edu | 48.5% | +37.8%
OpenWebMath | 52.3% | +48.6%
MinervaMath | 55.8% | +58.5%
**FineMath-4+** | **62.5%** | **+77.6%**

MATH 竞赛数学性能对比:

数据集 准确率 相对提升
No Math Data 8.5% 基线
FineWeb-Edu 15.2% +78.8%
OpenWebMath 18.5% +117.6%
MinervaMath 22.3% +162.4%
FineMath-4+ 28.5% +235.3%

FineMath-4+ vs InfiWebMath-4+:在两个基准上均表现更优

一个有趣的发现:将 FineMath-3+ 和 InfiWebMath-3+ 按 50:50 混合,总计约 50B token,性能与纯 FineMath-3+ 相当。这说明数据多样性在一定程度上可以补偿单一来源的局限。

去污染:被忽视但关键的步骤

FineMath 遵循 Qwen2.5-Math 的方案,移除了与 GSM8K、MATH、MMLU、ARC 测试集有 13-gram 重叠的样本。这一步看似简单,但很多数据集忽略了它,导致评估结果虚高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 去污染检测流程

def contamination_check(sample, test_sets):
"""
检查样本是否与评测基准有污染
"""
for test_name, test_data in test_sets.items():
# 提取 13-gram
sample_ngrams = get_ngrams(sample, n=13)

for test_sample in test_data:
test_ngrams = get_ngrams(test_sample, n=13)

# 检查重叠
overlap = sample_ngrams.intersection(test_ngrams)

if len(overlap) > threshold:
return True, test_name

return False, None

# 要检查的测试集
test_sets = {
'GSM8K': load_dataset('gsm8k'),
'MATH': load_dataset('math'),
'MMLU': load_dataset('mmlu'),
'ARC': load_dataset('ai2_arc')
}

团队还发布了去污染报告(HuggingFaceTB/finemath_contamination_report),完全透明。如果你用其他数学数据集训练,强烈建议检查去污染状态。

实际使用建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from datasets import load_dataset

# 推荐使用流式加载(避免一次性加载大量数据)
dataset = load_dataset(
"HuggingFaceTB/finemath",
"finemath-4plus",
split="train",
streaming=True
)

# 按质量分数进一步过滤
for sample in dataset:
if sample['score'] >= 4.5:
# 只保留最高质量的内容
process(sample)

# 混合使用示例
from itertools import islice

# 加载两个版本
fm_3plus = load_dataset("HuggingFaceTB/finemath", "finemath-3plus", streaming=True)
fm_4plus = load_dataset("HuggingFaceTB/finemath", "finemath-4plus", streaming=True)

# 按需混合
def mix_datasets(ds1, ds2, ratio=0.5):
for s1, s2 in zip(ds1, ds2):
yield s1 # FineMath-3+
if random.random() < ratio:
yield s2 # FineMath-4+

混合使用策略:不建议只用 FineMath 进行全量预训练。推荐方案是在通用预训练语料(如 FineWeb)的基础上,用 FineMath 做数学领域的持续预训练。这样模型既保持通用语言理解,又增强数学推理能力。

注意事项:FineMath 的代码内容很少。如果你的模型需要同时处理代码和数学,需要额外补充代码数据集(如 The Stack v2)。

生态影响

FineMath 的方法论已经产生了显著影响:

  • NVIDIA 的 Nemotron-CC-Math 直接使用了 FineMath 分类器进行质量评分
  • TransWeb-Edu:社区基于同样的方法构建了多语言版本
  • FineWeb-Edu-Chinese:中文版本数据集
  • 超过 70 个消融实验模型被公开发布,为社区提供了丰富的参考

这不仅仅是一个数据集,更是一套可复现的数学数据构建方法论。

总结

核心贡献:

  1. 系统化数学数据构建流程(发现→提取→评分)
  2. 开放源代码和分类器,支持社区复现
  3. 完整的去污染处理,确保评估可信
  4. 多层次质量版本满足不同需求

适用场景:

  • 数学推理模型预训练
  • 持续预训练增强数学能力
  • 数学教育 AI 微调
  • 数学问题求解研究

数据加载:

1
2
from datasets import load_dataset
dataset = load_dataset("HuggingFaceTB/finemath", "finemath-4plus", streaming=True)

数据集链接: https://huggingface.co/datasets/HuggingFaceTB/finemath

创建机构: HuggingFace TextBook Team

适合场景: 数学推理模型预训练、持续预训练、数学教育 AI

质量评分: 4.6/5.0 | ODC-By 1.0 | FineMath-3+(34B token)+ FineMath-4+(9.6B token)

核心优势: 精细 LLM 质量评分、LaTeX 符号保真提取、完整去污染处理、70+ 消融模型公开

相关资源:

© 2026 Generative AI Discovery All Rights Reserved.
Theme by hiero