minimind/learning/day02/01_prereading.md

66 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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. 下载或确认数据:
```text
dataset/pretrain_t2t_mini.jsonl
dataset/sft_t2t_mini.jsonl
```
2. 打印一条 pretrain 样本和一条 SFT 样本。
3. 用 tokenizer 对一条 SFT 样本做 `apply_chat_template`,观察模板输出。
4. 手动判断哪些 token 应该参与 loss。
## 训练注意事项
- 今天仍然不需要完整训练。
- 如果数据文件不存在,先只用 README 样例做理解。
- 任何 SFT 训练异常,优先怀疑 label mask 和 chat template。