minimind/learning/day02/01_prereading.md

1.9 KiB
Raw Blame History

Day 2 Prereading: Tokenizer、数据格式、Label Mask

今日目标

你要理解数据怎样进入训练。MiniMind 里 pretrain 和 SFT 的训练循环很像,真正关键差异在 dataset 和 label mask。

必须掌握的基础概念

  • JSONL 数据:一行一个样本。
  • Pretrain 样本:{"text": "..."}
  • SFT 样本:{"conversations": [{"role": "...", "content": "..."}]}
  • Chat template:把多轮消息序列变成模型输入文本。
  • Label mask:哪些 token 参与 loss,哪些 token 不参与。
  • -100:PyTorch cross entropy 中忽略 label 的约定。

面试考点

  • SFT 为什么通常只对 assistant answer 计算 loss?
  • 如果 user prompt 也计算 loss,会有什么副作用?
  • max_seq_len 截断会造成什么训练问题?
  • 为什么 tool call 要通过 chat template 统一成特殊标签?
  • padding side 在训练和生成中有什么影响?

工业要求

  • 数据质量比模型小改动更重要。
  • 训练前必须抽样查看 tokenized 后的样本。
  • SFT 必须检查 assistant span mask 是否正确。
  • 长样本截断不能只看字符数,要看 token 数。
  • Tool call / reasoning / normal chat 混合数据要保持模板一致。

项目中要看的文件

  • dataset/lm_dataset.py
  • model/tokenizer.json
  • model/tokenizer_config.json
  • README.md 的数据章节

重点类:

  • PretrainDataset
  • SFTDataset
  • RLAIFDataset
  • AgentRLDataset

今日动手任务

  1. 下载或确认数据:
dataset/pretrain_t2t_mini.jsonl
dataset/sft_t2t_mini.jsonl
  1. 打印一条 pretrain 样本和一条 SFT 样本。

  2. 用 tokenizer 对一条 SFT 样本做 apply_chat_template,观察模板输出。

  3. 手动判断哪些 token 应该参与 loss。

训练注意事项

  • 今天仍然不需要完整训练。
  • 如果数据文件不存在,先只用 README 样例做理解。
  • 任何 SFT 训练异常,优先怀疑 label mask 和 chat template。