| At line 53 changed one line |
| block_size:训练样本的最大token数 |
| block_size:训练样本的最大token数/如果数据集中数据量太少,而block_size太大,就无法进行分块,训练会出bug |
| At line 137 changed one line |
| __训练注意事项:__ |
| __3、训练注意事项:__ |
| At line 148 added 131 lines |
|
| 断点续训时,当前模型配置文件要与断点的配置文件参数一致,不能修改配置文件的参数,否则可能会出现张量形状不一致的错误; |
|
| 我们的大模型不需要验证集,因为验证集的作用就是监控模型预训练过程会不会过拟合或者没有泛化能力,不过作用也只能监控,无法通过调参彻底解决这个问题,这是以往大模型无法解决的问题,但是我们的损失设计就会迫使模型更“聪明”,而不是“死记硬背”,所以不如将验证集也放入预训练集中,让模型学习到更多的知识;而微调的时候需要验证集,就是防止模型在新的领域中过拟合或者失去泛化能力; |
|
| 训练的总token数=训练步数*有效批次数*序列长度 |
|
| __4、使用DeepSeek-R1的训练流程训练我们的模型__ |
|
| 注意:训练脚本只适用于Mandelbrot-V1模型的多层分词器架构 |
|
| 阶段一:训练R1-zero: |
|
| R1-zero是使用基于规则奖励的纯强化学习的方式,训练基座模型得到的。#lc_weight=0表示不加语言一致性奖励 |
|
| python R1/run_rl_grpo.py |
|
|
| --reward_mode rule |
| |
| |
| --policy_model_path <基座模型> |
| |
| |
| --tokenizer_root <多层tokenizer根目录(含layer0/layer1...)> |
| |
| |
| --train_file R1/sample_data_en/train_rl.jsonl |
| |
| |
| --output_dir outputs/r1_zero |
| |
| |
| --lc_weight 0 |
| |
| |
| |
| --log_samples |
| |
|
| 阶段二:R1-zero with Cold Start(直接生成一批冷启动推理 SFT 数据,然后再 SFT 一次) |
|
| 然后用 R1-Zero 作为初始化,做一次 SFT(冷启动): |
|
| python R1/run_sft.py |
|
| --model_path outputs/r1_zero |
| |
| --tokenizer_root <多层tokenizer根目录(含layer0/layer1...)> |
| |
| --train_file R1/cold_start_data_en/train_sft.jsonl |
| |
| --eval_file R1/cold_start_data_en/eval_sft.jsonl |
| |
| --output_dir outputs/cold_start_sft |
| |
| --mask_prompt |
|
| 再用 cold_start_sft 作为初始化,做一次 RL(GRPO): |
|
| 注意:论文中的冷启动的微调数据是使用R1-zero生成的,这里省略了这一步。 |
|
| python R1/run_rl_grpo.py |
|
| --reward_mode rule |
| |
| --policy_model_path outputs/cold_start_sft |
| |
| --tokenizer_root <多层tokenizer根目录(含layer0/layer1...)> |
| |
| |
| --train_file R1/sample_data_en/train_rl.jsonl |
| |
| --output_dir outputs/r1_zero_with_cold_start |
| |
| --lc_weight 0.5 |
| |
| --log_samples |
|
|
| 阶段三:最终 R1 的“混合 SFT”(推理数据 + 非推理数据) |
|
| 论文中最终 R1 会混合“推理/非推理”监督数据。最简单的做法是把两类样本合并成同一个 JSONL: |
|
| - 推理样本:`response` 里包含 `Reasoning:` 和 `Final answer:`(或自定义的 think/final 标签) |
|
| - 非推理样本:`response` 只包含简洁答案(不包含推理段) |
|
| 注意:论文中原流程是使用上一阶段训练的模型生成推理数据并进行拒绝采样,并且非推理数据也是用基座模型生成的,但由于我实验的模型参数规模很小,无法正常输出有效数据,所以就舍去了这一步,而是直接收集了数据。 |
|
| 合并后用 `run_sft.py` 再训一次基座模型: |
|
| python R1/run_sft.py |
|
| --model_path <基座模型> |
| |
| --tokenizer_root <多层tokenizer根目录(含layer0/layer1...)> |
| |
| --train_file <混合SFT训练集.jsonl> |
| |
| --eval_file <混合SFT验证集.jsonl> |
| |
| --output_dir outputs/final_sft |
| |
| --mask_prompt |
| |
|
| 最后再用强化学习训练一次得到最终的R1模型: |
|
| python R1/run_rl_grpo.py |
|
|
| --reward_mode rule |
| |
| |
| --policy_model_path <final_sft> |
| |
| |
| --tokenizer_root <多层tokenizer根目录(含layer0/layer1...)> |
| |
| |
| --train_file R1/sample_data_en/train_rl.jsonl |
| |
| |
| --output_dir outputs/r1_final |
| |
| |
| --lc_weight 0.5 |
| |
| |
| --log_samples |