背景篇
Special Token
与 pretrain 的区别
首先,sft 和 pretrain 在训练方式上没有任何区别,主要区别在于数据的组成形式上:
- pretrain 的每条数据都是满编 4K / 8K,sft 的每条数据原本多长就是多长;
- sft 会引入 pretrain 阶段未见过的 special_token,来让它们学习全新的语义;
- sft 会让模型见到最重要的 eos_token,pretrain 模型
- 因为没见过该 token 而无法停止生成;
- 借助 special_token,sft 会把语料切分成不同的角色,标配的有 system、user、assistant,根据业务需求也可以有“背景”、“旁白”、“事件”等等;
- sft 的 prompt 不做 loss,但这并不是说它不能做 loss。主要原因是 prompt 的同质化比较严重,不做 loss_mask 的话,同样的一句话会被翻来覆去的学,但如果你能保证你的每条 prompt 都是独一无二的,就完全可以省去 prompt 的 loss_mask 环节。对了,session 数据一定要想清楚是每一个 answer 都算 loss,还是只对最后一轮的 answer 算 loss。
数据篇
数据多样性
**重点来了,每一条 sft 训练数据必须要 task_type 类型,**千万别搞大杂烩,否则对后续的
case 分析简直是灾难性的伤害。在实际工作中,双层 task_type 都很常见,比如“逻辑推理 - 常识推理”,“逻辑推理 - cot
多步骤推理” 这种。至于每种 task_type 的数据量,别搞平均主义:难 task_type 酒数据多点,简单 task_type
就数据少点,也要结合自己的 base 模型能力动态调整。
task_type 的划分就是 sft 数据最重要的基建工作,没有之一。