从0到1:揭秘LLM预训练前的海量数据清洗全流程

读完这篇文章,你将用监督微调(SFT)把一个 1.5B 规模的数学模型在 GSM8K 上的零样本推理正确率从 1.56% → 62.9%,同时把输出格式遵循率从 18.9% → 100%。我们将完整走通数据集下载、Prompt 架构、训练配置和评估方法,所有代码均来自本仓库 alignment 文件夹,保证可复现与透明。

本文将深入剖析 llm-from-scratch 仓库中 alignment 模块,展示 SFT 的完整流程。

引言

大语言推理模型常见的两个痛点:一是“答不对”,二是“答不规范”。前者意味着推理链条断裂或迁移失效,后者则让后续评估与系统对接步步惊心。

在这篇 How‑to 指南里,我们用 GSM8K 的标准数据与明确的评估规则,让 Qwen/Qwen2.5-Math-1.5B 通过 SFT 后,能力迁移到不同的数据集上, 学会“思考→作答”的结构化输出:不仅更常答对,也更懂规范。结果来自实测,正确率由 1.56% 提升到 62.9%,格式遵循由 18.9% 提升到 100%.


为什么零样本推理和“格式遵循”都很难?

  • 零样本推理难在“迁移”:模型虽见过大量文本,但缺少对“分步算术、单位处理、等式化简”的系统化经验,容易在多步推理或细节规范上出错。
  • 格式遵循难在“约束学习”:即使模型知道答案,若不按系统约定的输出协议(例如必须有 <think>...</think> <answer>...</answer>),评估与下游解析都会失败。
  • 两者耦合:不遵循格式会直接“判零分”,即使答案正确;而缺少分步推理(think)又会影响最终答案(answer)的稳定性。

一个好比喻:把模型想象成一个聪明但散漫的学生。零样本时,它能“蒙”对少数题;SFT 就像班主任的“规范化带教”,教它先写草稿()再交最终答案(),且必须按卷面格式来——这样既能提高质量,也能让阅卷更可靠。


核心概念与评估口径

  • 监督微调(SFT):用标注样本(这里是 GSM8K 的“问题 + 推理过程 + 最终答案”)对模型做下一 token 预测训练。通过标签掩码,只对“推理与答案”部分计算损失,指导模型输出完整的思维链与答案。
  • Prompt 架构:我们采用 R1 风格模板,强制输出 <think><answer> 标签,保证格式可解析:
    • <think> ... </think>:推理过程
    • <answer> ... </answer>:最终答案
  • 训练目标(Loss Target):标准自回归语言模型(next-token LM)损失,但只在“回应(think+answer)”区间计算,避免模型学习到重复的“系统提示与问题”的 token 序列。
  • 评估指标:
    • “推理准确率”:按每条样本的 答案是否正确(数学同值、LaTeX 等价、数值等价,详见 grader)计分 0/1,最后取平均。
    • “格式遵循率”:按每条样本 是否包含合法的 <think>...</think> <answer>...</answer> 标签计分 0/1,最后取平均。

我们在 alignment/drgrpo_grader.py 中实现了严格的格式检查与宽容但可靠的数学等价判断(符号化、数值化与 LaTeX 解析的组合),是本文准确率与格式遵循的核心评估逻辑。


方案与架构

本文的流水线架构如下:从 GSM8K JSONL 到 Prompt 构造,再到 SFT 训练与 vLLM 推理评估,最后汇总指标(准确率/格式遵循)。

### 大型语言模型预训练数据清洗技术与最佳实践 #### 数据源的选择与管理 对于大型语言模型(LLM),高质量的数据源至关重要。通常使用的数据源包括网页、维基百科、书籍以及代码片段等[^2]。为了高效管理和处理这些海量数据,应建立有效的数据管理系统,这可能涉及使用诸如PostgreSQL或MongoDB这样的数据库系统来存储和快速检索用于模型训练的数据[^1]。 #### 去重操作 重复的内容不仅浪费计算资源而且会影响最终模型的质量。因此,在构建语料库之应当执行严格的去重流程。通过哈希算法或其他相似度匹配的方法可以有效地识别并移除冗余条目。 #### 过滤不相关内容 并非所有的抓取内容都适合用来训练LLMs;一些低质量或是无关紧要的信息可能会干扰学习过程。为此,需设计一套过滤机制去除那些不符合特定标准的文章段落——比如含有过多拼写错误的文字、广告性质强烈的页面或者是版权受限材料等等。 #### 文本规范化处理 在准备阶段还需对原始文本实施一系列标准化措施,例如转换成统一编码格式(UTF-8)、删除HTML标签和其他元字符标记、调整大小写字母的一致性等。此外,针对某些特殊领域还可以考虑加入专门术语表来进行更精细的清理工作。 #### 分词与词汇表创建 考虑到中文等非英文语言的特点,在实际应用中往往需要先进行分词处理再进入后续步骤。采用字节对编码(Byte Pair Encoding,BPE)是一种流行的做法,它可以根据频率统计动态生成子字符串单位从而形成紧凑而高效的表示形式。经过这样一轮加工之后便能建立起规模约为15万词条左右的基础词典供进一步分析利用。 ```python from tokenizers import ByteLevelBPETokenizer tokenizer = ByteLevelBPETokenizer() # 训练 tokenizer 使用自定义参数... ``` #### 加权训练策略 当面对多样的资料集合时,简单混合未必总能得到最优效果。相反地,根据不同类型的贡献程度赋予相应的权重因子有助于提升整体性能表现。具体而言就是让更加重要或者更具代表性的部分获得更高的关注度,以此促进更好的泛化能力发展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值