【注】:25年6月后,国内网络环境无法直连WandB,MiniMind项目默认转为使用SwanLab作为训练可视化工具(完全兼容WandB API),即import wandb改为import swanlab as wandb即可,其他均无需改动。
📌 数据介绍
Ⅰ Tokenizer
分词器将单词从自然语言通过“词典”映射到0, 1, 36这样的数字,可以理解为数字就代表了单词在“词典”中的页码。
可以选择自己构造词表训练一个“词典”,代码可见./trainer/train_tokenizer.py(仅供学习参考,若非必要无需再自行训练,MiniMind已自带tokenizer)。
或者选择比较出名的开源大模型分词器,
正如同直接用新华/牛津词典的优点是token编码压缩率很好,缺点是页数太多,动辄数十万个词汇短语;
自己训练的分词器,优点是词表长度和内容随意控制,缺点是压缩率很低(例如”hello”也许会被拆分为”h e l l o”
五个独立的token),且生僻词难以覆盖。
“词典”的选择固然很重要,LLM的输出本质上是SoftMax到词典N个词的多分类问题,然后通过“词典”解码到自然语言。
因为MiniMind体积需要严格控制,为了避免模型头重脚轻(词嵌入embedding层参数在LLM占比太高),所以词表长度短短益善。
👶: 请介绍一下自己。
🤖️: 作为人工智能,我没有实际的生活,也没有自我意识,所以没有自己的生活。我被设计成能够帮助用户解答问题、提供信息、进行对话等。我的设计和功能是由计算机科学、机器学习、人工智能技术和算法所构建的,我通过编程和算法实现。
👶: 推荐一些杭州的特色美食吧。
🤖️: 杭州有很多美味的特色美食,比如鸡肉串、鳗鱼头、水煮鱼、豆腐脑等。这些美食都非常美味,有着独特的风味和口感,绝对是值得一试的美食。
👶: 请为我讲解“大语言模型”这个概念。
🤖️: 大语言模型是一种人工智能技术,它使用大量的文本数据来训练模型,然后在不断的迭代中不断优化模型。它的目标是根据输入的数据来生成符合特定需求的文本,这些文本可以是任何你感兴趣的主题。
👶: Introduce the history of the United States, please.
🤖️: 您提到的“Introok's the believeations of theument." 这个名字来源于中国古代的"groty of of the change."
"大道至简"
中文 | English
🔗🍓推理模型 | 🔗🤖常规模型 | 🔗🎞️视频介绍
📌 Introduction
大语言模型(Large Language Model, LLM)的出现引发了全世界对AI的空前关注。 无论是ChatGPT、DeepSeek还是Qwen,都以其惊艳的效果令人叹为观止。 然而,动辄数百亿参数的庞大规模,使得它们对个人设备而言不仅难以训练,甚至连部署都显得遥不可及。 打开大模型的“黑盒子”,探索其内部运作机制,多么令人心潮澎湃! 遗憾的是,99%的探索只能止步于使用LoRA等技术对现有大模型进行少量微调,学习一些新指令或任务。 这就好比教牛顿如何使用21世纪的智能手机——虽然有趣,却完全偏离了理解物理本质的初衷。 与此同时,第三方的大模型框架和工具库,如transformers+trl,几乎只暴露了高度抽象的接口。 通过短短10行代码,就能完成“加载模型+加载数据集+推理+强化学习”的全流程训练。 这种高效的封装固然便利,但也像一架高速飞船,将开发者与底层实现隔离开来,阻碍了深入探究LLM核心代码的机会。 然而,“用乐高拼出一架飞机,远比坐在头等舱里飞行更让人兴奋!”。 更糟糕的是,互联网上充斥着大量付费课程和营销号,以漏洞百出、一知半解的内容推销AI教程。 正因如此,本项目初衷是拉低LLM的学习门槛,让每个人都能从理解每一行代码开始, 从零开始亲手训练一个极小的语言模型。是的,从零开始训练,而不是仅仅进行推理! 最低只需3块钱不到的服务器成本,就能亲身体验从0到1构建一个语言模型的全过程。 一起感受创造的乐趣吧!
Models List
项目包含
transformers、trl、peft等第三方主流框架。llama.cpp、vllm、ollama推理引擎或Llama-Factory训练框架。希望此开源项目可以帮助LLM初学者快速入门!
👉更新日志
2025-10-24
<tool_call>、<think>等)2025-04-26
<s></s>-><|im_start|><|im_end|>2025-02-09
jsonl格式杜绝数据集下载混乱的问题。More...
2024-10-05
2024-09-27
2024-09-17
2024-09-01
2024-08-27
📌 快速开始
分享本人的软硬件配置(仅供参考)
第0步
Ⅰ 测试已有模型效果
1.环境准备
2.下载模型
到项目根目录
(可选)命令行问答
(可选)启动WebUI
(可选)第三方推理框架
Ⅱ 从0开始自己训练
1.环境准备
注:提前测试Torch是否可用cuda
如果不可用,请自行去torch_stable 下载whl文件安装。参考链接
2.数据下载
从下文提供的数据集下载链接 下载需要的数据文件(创建
./dataset目录)并放到./dataset下注:数据集须知
默认推荐下载
pretrain_hq.jsonl+sft_mini_512.jsonl最快速度复现Zero聊天模型。数据文件可自由选择,下文提供了多种搭配方案,可根据自己手头的训练需求和GPU资源进行适当组合。
3.开始训练
目录位于
trainer💡 检查点暂停续训
所有训练脚本均自动保存检查点,只需添加
--from_resume 1参数即可自动检测加载&恢复训练:断点续训机制说明:
./checkpoints/目录保存完整检查点(模型、优化器、训练进度等)<权重名>_<维度>_resume.pth(如:full_sft_512_resume.pth)3.1 预训练(学知识)
3.2 监督微调(学对话方式)
注:训练须知
所有训练过程默认每隔100步保存1次参数到文件
./out/***.pth(每次会覆盖掉旧权重文件)。简单起见,此处只写明两个阶段训练过程。如需其它训练 (LoRA, 蒸馏, 强化学习, 微调推理等) 可参考下文【实验】小节的详细说明。
4.测试自己训练的模型效果
确保需要测试的模型
*.pth文件位于./out/目录下。 也可以直接去此处下载使用我训练的*.pth文件。注:测试须知
--weight参数指定权重名称前缀,可选:pretrain,full_sft,dpo,reason,ppo_actor,grpo,spo等其他常用参数:
--load_from: 模型加载路径(model=原生torch权重,其他路径=transformers格式)--save_dir: 模型权重目录(默认out)--lora_weight: LoRA权重名称(None表示不使用)--historys: 携带历史对话轮数(需为偶数,0表示不携带历史)--max_new_tokens: 最大生成长度(默认8192)--temperature: 生成温度(默认0.85)--top_p: nucleus采样阈值(默认0.85)使用方式直接查看
eval_llm.py代码即可。单机N卡启动训练方式 (DDP, 支持多机多卡集群)
注:其它须知
单机N卡启动训练 (DeepSpeed)可根据需要开启wandb记录训练过程(需可直连)
通过添加
--use_wandb参数,可以记录训练过程,训练完成后,可以在wandb网站上查看训练过程。通过修改wandb_project和wandb_run_name参数,可以指定项目名称和运行名称。【注】:25年6月后,国内网络环境无法直连WandB,MiniMind项目默认转为使用SwanLab作为训练可视化工具(完全兼容WandB API),即
import wandb改为import swanlab as wandb即可,其他均无需改动。📌 数据介绍
Ⅰ Tokenizer
分词器将单词从自然语言通过“词典”映射到
0, 1, 36这样的数字,可以理解为数字就代表了单词在“词典”中的页码。 可以选择自己构造词表训练一个“词典”,代码可见./trainer/train_tokenizer.py(仅供学习参考,若非必要无需再自行训练,MiniMind已自带tokenizer)。 或者选择比较出名的开源大模型分词器, 正如同直接用新华/牛津词典的优点是token编码压缩率很好,缺点是页数太多,动辄数十万个词汇短语; 自己训练的分词器,优点是词表长度和内容随意控制,缺点是压缩率很低(例如”hello”也许会被拆分为”h e l l o” 五个独立的token),且生僻词难以覆盖。 “词典”的选择固然很重要,LLM的输出本质上是SoftMax到词典N个词的多分类问题,然后通过“词典”解码到自然语言。 因为MiniMind体积需要严格控制,为了避免模型头重脚轻(词嵌入embedding层参数在LLM占比太高),所以词表长度短短益善。Tokenizer介绍
第三方强大的开源模型例如Yi、qwen、chatglm、mistral、Llama3的tokenizer词表长度如下:
Ⅱ Pretrain数据
经历了MiniMind-V1的低质量预训练数据,导致模型胡言乱语的教训,
2025-02-05之后决定不再采用大规模无监督的数据集做预训练。 进而尝试把匠数大模型数据集的中文部分提取出来, 清洗出字符<512长度的大约1.6GB的语料直接拼接成预训练数据pretrain_hq.jsonl,hq即为high quality(当然也还不算high,提升数据质量无止尽)。文件
pretrain_hq.jsonl数据格式为Ⅲ SFT数据
匠数大模型SFT数据集 “是一个完整、格式统一、安全的大模型训练和研究资源。 从网络上的公开数据源收集并整理了大量开源数据集,对其进行了格式统一,数据清洗, 包含10M条数据的中文数据集和包含2M条数据的英文数据集。” 以上是官方介绍,下载文件后的数据总量大约在4B tokens,肯定是适合作为中文大语言模型的SFT数据的。 但是官方提供的数据格式很乱,全部用来sft代价太大。 我将把官方数据集进行了二次清洗,把含有符号污染和噪声的条目去除;另外依然只保留了总长度
<512的内容,此阶段希望通过大量对话补充预训练阶段欠缺的知识。 导出文件为sft_512.jsonl(~7.5GB)。Magpie-SFT数据集 收集了
1M条来自Qwen2/2.5的高质量对话,我将这部分数据进一步清洗,把总长度9GB)。 长度<2048的部分导出为sft_2048.jsonl(<1024的部分导出为sft_1024.jsonl(~5.5GB),用大模型对话数据直接进行sft就属于“黑盒蒸馏”的范畴。进一步清洗前两步sft的数据(只保留中文字符占比高的内容),筛选长度
<512的对话,得到sft_mini_512.jsonl(~1.2GB)。所有sft文件
sft_X.jsonl数据格式均为Ⅳ RLHF数据
来自Magpie-DPO数据集 大约200k条偏好数据(均是英文)生成自Llama3.1-70B/8B,可以用于训练奖励模型,优化模型回复质量,使其更加符合人类偏好。 这里将数据总长度
<3000的内容重组为dpo.jsonl(~0.9GB),包含chosen和rejected两个字段,chosen为偏好的回复,rejected为拒绝的回复。文件
dpo.jsonl数据格式为Ⅴ Reason数据集:
不得不说2025年2月谁能火的过DeepSeek… 也激发了我对RL引导的推理模型的浓厚兴趣,目前已经用Qwen2.5复现了R1-Zero。 如果有时间+效果work(但99%基模能力不足)我会在之后更新MiniMind基于RL训练的推理模型而不是蒸馏模型。 时间有限,最快的低成本方案依然是直接蒸馏(黑盒方式)。 耐不住R1太火,短短几天就已经存在一些R1的蒸馏数据集R1-Llama-70B、R1-Distill-SFT、 Alpaca-Distill-R1、 deepseek_r1_zh等等,纯中文的数据可能比较少。 最终整合它们,导出文件为
r1_mix_1024.jsonl,数据格式和sft_X.jsonl一致。Ⅵ 更多数据集
目前已经有HqWu-HITCS/Awesome-Chinese-LLM 在收集和梳理中文LLM相关的开源模型、应用、数据集及教程等资料,并持续更新这方面的最新进展。全面且专业,Respect!
Ⅷ MiniMind训练数据集
MiniMind训练数据集下载地址: ModelScope | HuggingFace
将下载的数据集文件放到
./dataset/目录下(✨为推荐的必须项)注:各数据集简介
dpo.jsonl✨ –RLHF阶段数据集(已精简优化,适合快速训练)lora_identity.jsonl–自我认知数据集(例如:你是谁?我是minimind…),推荐用于lora训练(亦可用于全参SFT,勿被名字局限)lora_medical.jsonl–医疗问答数据集,推荐用于lora训练(亦可用于全参SFT,勿被名字局限)pretrain_hq.jsonl✨ –预训练数据集,整合自匠数科技(推荐设置max_seq_len≈320)r1_mix_1024.jsonl–DeepSeek-R1-1.5B蒸馏数据,每条数据字符最大长度为1024(推荐设置max_seq_len≈720)rlaif-mini.jsonl–RLAIF训练数据集,从SFT数据集中随机采样1万条高质量对话,用于PPO/GRPO/SPO等强化学习算法训练sft_1024.jsonl–整合自Qwen2.5蒸馏数据(是sft_2048的子集),每条数据字符最大长度为1024(推荐设置max_seq_len≈650)sft_2048.jsonl–整合自Qwen2.5蒸馏数据,每条数据字符最大长度为2048(推荐设置max_seq_len≈1400)sft_512.jsonl–整合自匠数科技SFT数据,每条数据字符最大长度为512(推荐设置max_seq_len≈350)sft_mini_512.jsonl✨ –极简整合自匠数科技SFT数据+Qwen2.5蒸馏数据(用于快速训练Zero模型),每条数据字符最大长度为512(推荐设置max_seq_len≈340)训练参数
max_seq_len目前指的是tokens长度,而非绝对字符数。 本项目tokenizer在中文文本上大约1.5~1.7 字符/token,纯英文的压缩比在4~5 字符/token,不同数据分布会有波动。 数据集命名标注的“最大长度”均为字符数,100长度的字符串可粗略换算成100/1.5≈67的tokens长度。例如:
白日依山尽5个字符可能被拆分为[白日,依,山,尽] 4个tokens;The sun sets in the west24个字符可能被拆分为[The,sun,sets,in,the,west] 6个tokens“推荐设置”给出了各个数据集上最大tokens长度的粗略估计。 须知max_seq_len可以激进/保守/均衡地调整,因为更大或更小均无法避免副作用:一些样本短于max_seq_len后被padding浪费算力,一些样本长于max_seq_len后被截断语意。
在
算力效率<—>语义完整性之间找到一个平衡点即可说明 & 推荐训练方案
MiniMind2 Series均经过共约20GB语料训练,大约4B tokens,即对应上面的数据组合训练结果(开销:💰💰💰💰💰💰💰💰,效果:😊😊😊😊😊😊)
想要最快速度从0实现Zero模型,推荐使用
pretrain_hq.jsonl+sft_mini_512.jsonl的数据组合,具体花销和效果可查看下文表格(开销:💰,效果:😊😊)推荐具备一定算力资源或更在意效果的朋友可以考虑前者完整复现MiniMind2;仅有单卡GPU或在乎短时间快速复现的朋友强烈推荐后者;
【折中方案】亦可选择例如
sft_mini_512.jsonl、sft_1024.jsonl中等规模数据进行自由组合训练(开销:💰💰💰,效果:😊😊😊😊)。📌 Model
Structure
MiniMind-Dense(和Llama3.1一样)使用了Transformer的Decoder-Only结构,跟GPT-3的区别在于:
MiniMind-MoE模型,它的结构基于Llama3和Deepseek-V2/3中的MixFFN混合专家模块。
MiniMind的整体结构一致,只是在RoPE计算、推理函数和FFN层的代码上做了一些小调整。 其结构如下图(重绘版):
修改模型配置见./model/model_minimind.py。 参考模型参数版本见下表:
Model Configuration
📋关于LLM的参数配置,有一篇很有意思的论文MobileLLM做了详细的研究和实验。 Scaling Law在小模型中有自己独特的规律。 引起Transformer参数成规模变化的参数几乎只取决于
d_model和n_layers。d_model↑ +n_layers↓ -> 矮胖子d_model↓ +n_layers↑ -> 瘦高个2020年提出Scaling Law的论文认为,训练数据量、参数量以及训练迭代次数才是决定性能的关键因素,而模型架构的影响几乎可以忽视。 然而似乎这个定律对小模型并不完全适用。 MobileLLM提出架构的深度比宽度更重要,「深而窄」的「瘦长」模型可以学习到比「宽而浅」模型更多的抽象概念。 例如当模型参数固定在125M或者350M时,30~42层的「狭长」模型明显比12层左右的「矮胖」模型有更优越的性能, 在常识推理、问答、阅读理解等8个基准测试上都有类似的趋势。 这其实是非常有趣的发现,因为以往为100M左右量级的小模型设计架构时,几乎没人尝试过叠加超过12层。 这与MiniMind在训练过程中,模型参数量在
d_model和n_layers之间进行调整实验观察到的效果是一致的。 然而「深而窄」的「窄」也是有维度极限的,当d_model<512时,词嵌入维度坍塌的劣势非常明显, 增加的layers并不能弥补词嵌入在固定q_head带来d_head不足的劣势。 当d_model>1536时,layers的增加似乎比d_model的优先级更高,更能带来具有”性价比”的参数->效果增益。作为参考,GPT3的参数设定见下表:
📌 Experiment
Ⅰ 训练开销
pretrain和sft_mini_512两个数据集的训练时间,其它耗时根据数据集大小估算(可能存在些许出入)。≈1.43¥
≈1.3¥
≈7.8¥
≈5.95¥
≈9.75¥
≈1.3¥
≈5.07¥
≈4.29¥
≈26¥
≈19.5¥
≈32.5¥
≈3.9¥
训练开销总结&预测
✨基于单卡NVIDIA 3090的
MiniMind-Zero从0训练仅需2小时+3块钱,实现ChatBot效果!✨PS:若采用8卡4090训练,总用时甚至可以压缩到10分钟以内!(由于时间更短,花费同样3元左右,与单卡成本相当)
✨以极低极低的门槛,实现人人可玩的大模型自由!这正是MiniMind系列的诞生初衷!
✨仅价值
3块钱成本的MiniMind-Zero并不是噱头!Chat测试:极速且初具效果,甚至仍然可以进一步压缩获取更小更优质的训练数据。 Zero模型权重保存为
full_sft_512_zero.pth(见下文MiniMind模型文件链接),如有兴趣可下载检验此模型效果。Ⅱ 主要训练(必须)
1. 预训练 (Pretrain):
LLM首先要学习的并非直接与人交流,而是让网络参数中充满知识的墨水,“墨水” 理论上喝的越饱越好,产生大量的对世界的知识积累。 预训练就是让Model先埋头苦学大量基本的知识,例如从Wiki百科、新闻、书籍整理大规模的高质量训练数据。 这个过程是“无监督”的,即人类不需要在过程中做任何“有监督”的校正,而是由模型自己从大量文本中总结规律学习知识点。 模型此阶段目的只有一个:学会词语接龙。例如输入”秦始皇”四个字,它可以接龙”是中国的第一位皇帝”。
2. 有监督微调 (Supervised Fine-Tuning):
经过预训练,LLM此时已经掌握了大量知识,然而此时它只会无脑地词语接龙,还不会与人聊天。 SFT阶段就需要把半成品LLM施加一个自定义的聊天模板进行微调。 例如模型遇到这样的模板【问题->回答,问题->回答】后不再无脑接龙,而是意识到这是一段完整的对话结束。 称这个过程为指令微调,就如同让已经学富五车的「牛顿」先生适应21世纪智能手机的聊天习惯,学习屏幕左侧是对方消息,右侧是本人消息这个规律。 在训练时,MiniMind的指令和回答长度被截断在512,是为了节省显存空间。就像学习写作时,会先从短的文章开始,当学会写作200字作文后,800字文章也可以手到擒来。 在需要长度拓展时,只需要准备少量的2k/4k/8k长度对话数据进行进一步微调即可(此时最好配合RoPE-NTK的基准差值)。
Ⅲ 其它训练阶段(可选)
3. 知识蒸馏 (Knowledge Distillation, KD)
在前面的所有训练步骤中,模型已经完全具备了基本能力,通常可以学成出师了。 而知识蒸馏可以进一步优化模型的性能和效率,所谓知识蒸馏,即学生模型面向教师模型学习。 教师模型通常是经过充分训练的大模型,具有较高的准确性和泛化能力。 学生模型是一个较小的模型,目标是学习教师模型的行为,而不是直接从原始数据中学习。 在SFT学习中,模型的目标是拟合词Token分类硬标签(hard labels),即真实的类别标签(如 0 或 6400)。 在知识蒸馏中,教师模型的softmax概率分布被用作软标签(soft labels)。小模型仅学习软标签,并使用KL-Loss来优化模型的参数。 通俗地说,SFT直接学习老师给的解题答案。而KD过程相当于“打开”老师聪明的大脑,尽可能地模仿老师“大脑”思考问题的神经元状态。 例如,当老师模型计算
1+1=2这个问题的时候,最后一层神经元a状态为0,神经元b状态为100,神经元c状态为-99… 学生模型通过大量数据,学习教师模型大脑内部的运转规律。这个过程即称之为:知识蒸馏。 知识蒸馏的目的只有一个:让小模型体积更小的同时效果更好。 然而随着LLM诞生和发展,模型蒸馏一词被广泛滥用,从而产生了“白盒/黑盒”知识蒸馏两个派别。 GPT-4这种闭源模型,由于无法获取其内部结构,因此只能面向它所输出的数据学习,这个过程称之为黑盒蒸馏,也是大模型时代最普遍的做法。 黑盒蒸馏与SFT过程完全一致,只不过数据是从大模型的输出收集,因此只需要准备数据并且进一步FT即可。 注意更改被加载的基础模型为full_sft_*.pth,即基于微调模型做进一步的蒸馏学习。./dataset/sft_1024.jsonl与./dataset/sft_2048.jsonl均收集自qwen2.5-7/72B-Instruct大模型,可直接用于SFT以获取Qwen的部分行为。此处应当着重介绍MiniMind实现的白盒蒸馏代码
train_distillation.py,由于MiniMind同系列本身并不存在强大的教师模型,因此白盒蒸馏代码仅作为学习参考。4. LoRA (Low-Rank Adaptation)
LoRA是一种高效的参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)方法,旨在通过低秩分解的方式对预训练模型进行微调。 相比于全参数微调(Full Fine-Tuning),LoRA 只需要更新少量的参数。 LoRA 的核心思想是:在模型的权重矩阵中引入低秩分解,仅对低秩部分进行更新,而保持原始预训练权重不变。 代码可见
./model/model_lora.py和train_lora.py,完全从0实现LoRA流程,不依赖第三方库的封装。非常多的人困惑,如何使模型学会自己私有领域的知识?如何准备数据集?如何迁移通用领域模型打造垂域模型? 这里举几个例子,对于通用模型,医学领域知识欠缺,可以尝试在原有模型基础上加入领域知识,以获得更好的性能。 同时,通常不希望学会领域知识的同时损失原有基础模型的其它能力,此时LoRA可以很好的改善这个问题。 只需要准备如下格式的对话数据集放置到
./dataset/lora_xxx.jsonl,启动python train_lora.py训练即可得到./out/lora/lora_xxx.pth新模型权重。医疗场景
自我认知场景
此时【基础模型+LoRA模型】即可获得医疗场景模型增强的能力,相当于为基础模型增加了LoRA外挂,这个过程并不损失基础模型的本身能力。 可以通过
eval_llm.py进行模型评估测试。小测试
PS:只要有所需要的数据集,也可以full_sft全参微调(需要进行通用知识的混合配比,否则过拟合领域数据会让模型变傻,损失通用性)
5. 训练推理模型 (Reasoning Model)
DeepSeek-R1实在太火了,几乎重新指明了未来LLM的新范式。 论文指出
>3B的模型经历多次反复的冷启动和RL奖励训练才能获得肉眼可见的推理能力提升。 最快最稳妥最经济的做法,以及最近爆发的各种各样所谓的推理模型几乎都是直接面向数据进行蒸馏训练, 但由于缺乏技术含量,蒸馏派被RL派瞧不起(hhhh)。 本人迅速已经在Qwen系列1.5B小模型上进行了尝试,很快复现了Zero过程的数学推理能力。 然而一个遗憾的共识是:参数太小的模型直接通过冷启动SFT+GRPO几乎不可能获得任何推理效果。MiniMind2第一时间只能坚定不移的选择做蒸馏派,日后基于0.1B模型的RL如果同样取得小小进展会更新此部分的训练方案。做蒸馏需要准备的依然是和SFT阶段同样格式的数据即可,数据集来源已如上文介绍。数据格式例如:
推理模型R1的回复模板是:
这在GRPO中通过设置规则奖励函数约束模型符合思考标签和回复标签(在冷启动靠前的阶段奖励值设置应该提高一些)
另一个问题是蒸馏过程虽然和SFT一样,但实验结果是模型难以每次都符合模板规范的回复,即脱离思考和回复标签约束。 这里的小技巧是增加标记位置token的损失惩罚,详见
train_reason.py:另另一个tips是由于推理数据由于只筛选了
<1024长度的数据,其中多轮对话和英文数据偏少, 因此r1_mix_1024.jsonl进行了大约10k条多轮对话+英文数据的混合,防止模型遗忘严重。脚本默认基于rlhf后的基模型做推理能力的蒸馏微调,下面直接启动训练即可:
测试一下:
IV 强化学习后训练
LLM里的强化学习方法可分两类:
二者本质上是一样的,都是通过强化学习的方式,利用某种形式的”反馈“来优化模型的行为。
除了反馈的来源不同,其他并无任何区别。
👀 PO算法的统一视角
在介绍实现具体算法之前,我先以个人理解的极简视角,阐述所有Policy Optimization (PO)算法的统一共性。
所有RL算法的本质都只是在优化一个期望:
JPO=Eq∼P(Q),o∼π(O∣q)⎣⎢⎡策略项f(rt)⋅优势项g(At)−正则项h(KLt)⎦⎥⎤
训练时,只需最小化负目标函数,即: LPO=−JPO
这个框架只包含三个核心组件:
(展开)符号说明
不同的xxPO算法本质上只是对这三个组件的不同设计的实例化!
6. 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback, RLHF)
在前面的训练步骤中,模型已经具备了基本的对话能力,但是这样的能力完全基于单词接龙,缺少正反样例的激励。 模型此时尚未知什么回答是好的,什么是差的。希望它能够更符合人的偏好,降低让人类不满意答案的产生概率。 这个过程就像是让模型参加新的培训,从优秀员工的作为例子,消极员工作为反例,学习如何更好地回复。
6.1 Direct Preference Optimization
直接偏好优化(DPO)算法,损失为:
LDPO=−E[logσ(β[logπref(yw∣x)πθ(yw∣x)−logπref(yl∣x)πθ(yl∣x)])]
其中:
特别地,
actor与ref两个模型,显存占用低、收敛稳定、实现简单。7. 基于AI反馈的强化学习 (Reinforcement Learning from AI Feedback, RLAIF)
相比RLHF依赖人类标注chosen/rejected偏好对,RLAIF则完全由AI来充当”裁判”。 所谓AI”裁判”可以是model-base的奖励大模型(Reward Model),也可以是R1一样设置规则函数进行校验,也可以是例如工具调用的环境反馈。 例如:数学题答案是否正确、工具调用执行代码能否通过测试用例、推理过程是否符合格式…都可以自动化判断。 RLAIF的最大优势在于可扩展性和On-Policy的特点——不需要昂贵的人工标注,可以生成海量的训练样本,让模型在在线大量试错中快速进化。
MiniMind 着手实现2+N种基本+前沿的RLAIF方法:
1️⃣ 数据集准备 (需要)
为了快速验证RLAIF的效果,这里从SFT数据集中随机采样了1万条高质量对话,构建约1MB大小的
rlaif-mini.jsonl(Huggingface)数据格式与SFT一致,但assistant并不需要内容,因为训练过程中完全由 Π 策略模型实时采样生成。因此形如:
RLAIF的训练过程中,模型会基于user的问题生成1或多个候选回答,然后由奖励函数/模型对回答打分, 分数高的回答会被鼓励(增加 Π 策略概率),分数低的回答会被抑制(降低 Π 策略概率)。这个”打分->调整”的循环就是强化学习的核心。
2️⃣ 奖励模型准备 (需要)
已知RLAIF训练需要“奖励模型 (Reward Model)”对生成的回答进行打分。
此处选取小型且高质量的InternLM2-1.8B-Reward (ModelScope | HuggingFace) 作为基础奖励模型。
下载奖励模型后需要放置在minimind项目的同级目录下,推荐结构如下:
奖励机制选择与MiniMind限制说明(点击展开)
1. 奖励机制的多样性
RLAIF中的”奖励信号”来源可以非常灵活:
Model-based奖励:可使用专门的Reward Model(如InternLM2-Reward),也可使用通用LLM+提示词进行打分(如Qwen3-as-a-Judge)。奖励模型规模和架构均可自由选择。
Rule-based奖励:可以基于规则函数构造奖励信号,例如:
Environment-based奖励:在Agent场景中,环境反馈本身即为天然奖励(如游戏得分、Research完整度、任务完成度)。
任何能够量化”回答质量”的机制都可作为RL的奖励来源。DeepSeek R1就是典型案例:使用规则函数验证数学答案正确性作为奖励,无需额外的Reward Model。
2. MiniMind限制:奖励稀疏问题
RLAIF训练既可以针对推理模型也可以针对非推理模型,区别仅在于格式。
然而对于MiniMind这种0.1B参数量极小能力弱的模型,在通用任务(如R1风格的数学数据集)上会遇到严重的奖励稀疏(Reward Sparsity)问题:
如同让小学生做高考数学题,无论尝试多少次都得零分,无法通过分数差异学习改进策略。因此这是RL算法的根本原理限制的。
为缓解此问题,MiniMind的实现选择了model-based的连续性奖励信号:
对于生产级大模型的Agentic RL场景:
在真实Agent系统(代码生成、工具调用、检索-规划-执行的多轮链路)中,奖励是“延迟整轮结算”的不同范式:
因此,Agentic RL更接近稀疏/延迟奖励设定:梯度回传在“整轮结束后”才发生,和非Agentic RL任务在对话单轮上“即时评分即时更新”有很大不同。 这也解释了Agent任务上更偏向环境反馈(environment-based reward),而非凭Reward Model进行静态打分。
7.1 Proximal Policy Optimization
PPO 是2017年OpenAI提出的非常经典强化学习算法,也是LLM RL通用的基线方法,甚至不需要加之一。
PPO损失:
LPPO=−E[min(rt⋅At,clip(rt,1−ε,1+ε)⋅At)]+β⋅E[KL]
其中:
对比DPO而言,
简单来说:
MiniMind的PPO实现包含了Actor模型(生成回答)和Critic模型(评估回答价值),以及完整的GAE(Generalized Advantage Estimation)优势函数计算。
训练方式:
从训练曲线可以看出,PPO存在reward提升缓慢的问题。私以为这主要源于PPO双网络联合优化方法:Critic需要逐步收敛以准确估计价值函数,而Actor的策略更新依赖Critic提供的优势估计,两者相互依赖形成复杂的优化过程。训练初期Critic估计不准会影响Actor梯度方向,导致整体收敛缓慢。此外,PPO需要同时维护两个网络,显存占用约为单网络方法的1.5-2倍。
7.2 Group Relative Policy Optimization
2025年初,DeepSeek-R1火爆出圈,同样火了的有来自DeepSeekMath论文的GRPO算法,也一跃成为最先进的RL算法之一。 然而AI半年=人间半个世纪,时至今日GRPO已经演变为各大XXPO大战(后面演变的DAPO、GSPO、CISPO等)的基线算法。 具体来说,一句话总结它的核心创新是”分组相对价值估计”。
GRPO损失:
LGRPO=−E[rt⋅At−β⋅KLt]
其中:
对于同一个问题,模型生成N个不同的回答(例如N=4),然后计算这N个回答的奖励分数。 接着把这N个回答的平均奖励作为baseline,高于baseline的回答被鼓励,低于baseline的回答被抑制。 用这种方式巧妙地避免了训练额外的critic网络。
只要是RL都必须面对的正反样本这个原理性限制,GRPO也不会例外,其更显著的问题是:退化组(Degenerate Groups)。 假设某个问题略难,导致N个回答的奖励分数几乎一样(大部分情况是一样烂而不是一样好),那么这一组的学习信号就无限接近0。 在MiniMind这种超小模型上,这个问题尤为明显,求解数学问题99.99%的情况下整组回答质量都很差,那么将无法学习。 因此必须为模型指定合理的domain,即必须限制在能力边界内。
训练方式:
从训练曲线可以看出,GRPO的reward呈现更加稳定的上升趋势,达到4左右,说明GRPO本身能更好地利用RLAIF信号。Policy Loss整体下降平稳,相比PPO的双网络优化,GRPO单网络架构训练更稳定且收敛上限更高。
7.3 ⏳⌛️🔥 更多RL拓展 (Exp)
7.3.1 Single-stream Policy Optimization
SPO是2025年9月腾讯提出的RL算法,针对GRPO的退化组问题进行改进。 论文认为,GRPO等算法”一个样本要依赖一组采样”显得别扭而不优雅:太容易或太难的题目,整组几乎学不到东西,学习效率先天受限。 SPO的动机就是回到RL的本质—1个输入,1个输出,就是1个训练样本,回到policy gradient的基本公式去思考:不用group mean也能得到稳定的baseline,也就是把价值估计 V 铺开在时序上,训练前先做粗略的价值预估,训练中一边采样一边更新对 V 的估计,从而为每个样本提供一个跨 batch 持久化、可自适应的基线参照。这种”单流”设计不再依赖同组样本,天然避免了退化组。
SPO损失:
LSPO=−E[logπθ(at∣s)⋅At−β⋅KLt]
其中:
落到实现层面:SPO采用无分组设计,用持久化的KL自适应value tracker替代组内baseline,优势函数在整个batch上全局归一化。这样每个样本独立处理,无需等待同组其他样本,且能为每个样本提供稳定的学习信号。 论文在Qwen3-8B的5个困难数学数据集上,SPO平均比GRPO高出3.4个百分点,其中BRUMO 25数据集+7.3pp、AIME 25数据集+4.4pp。
训练方式:
MiniMind2 (768dim) 训练曲线
从训练曲线来看,SPO的reward波动与PPO表现接近,弱于GRPO。实际推理测试发现模型输出质量不高,存在逻辑混乱和格式错误问题。
实验性说明:当前SPO手搓实现可能在value_tracker配置、reward归一化策略上还存在问题。尚需排查算法本身在小模型上的适应性/或是实现上存在差异。
RL算法小结
我们收束回“统一框架”, 重新整理所有不同PO算法只是对三个核心组件的不同实例化的表格:
RL是优美且自洽的
V 训练结果
训练完成-模型合集
① PyTorch原生模型
MiniMind2模型权重 (ModelScope | HuggingFace)
Torch文件命名对照
pretrain_512.pthfull_sft_512.pthdpo_512.pthreason_512.pthxxpo_512.pthlora_xxx_512.pthpretrain_640_moe.pthfull_sft_640_moe.pthdpo_640_moe.pthpretrain_768.pthfull_sft_768.pthdpo_768.pthreason_768.pthxxpo_768.pthlora_xxx_768.pth② Transformers模型
MiniMind系列 (ModelScope | HuggingFace)
📌 Eval
Ⅰ RLHF对比
测试基于
full_sft和dpo的MiniMind2系列模型对比,测试随机种子均固定[A] MiniMind2:full_sft_640
[B] MiniMind2:dpo_640
👉效果总结
full_sft模型在简洁性和信息准确性方面表现更好;rlhf模型在回答中倾向于提供更多的背景信息,但信息准确性有待改进。 总的来说RLHF后的模型倾向于学习:说更多有礼貌但无用的废话讨好“对话”本身,而对信息准确性则有轻微损失。 天下没有免费的午餐,还需要继续提升RLHF数据集的质量,也要接受模型能力无法避免的损失(程度有轻重)。 DPO和在线PPO的区别在于reject和chosen都是离线准备的,和minimind模型本身的输出必然存在很大的分布差异。 通俗地说DPO算法使模型观看乒乓球世界冠军的打法「录像」进行RL,而不是像PPO一样请reward模型做「教练」纠正自己的打法进行RL。
Ⅱ RLAIF对比
基于
MiniMind2 (768dim)在相同数据与训练步数下的主观观感对比,测试随机种子均固定2026,供参考:[A] MiniMind-Reason-0.1B (蒸馏)
[B] MiniMind-Reason-0.1B (PPO)
[C] MiniMind-Reason-0.1B (GRPO)
Ⅲ 其他模型对比
[A] MiniMind2 (0.1B)
[B] MiniMind2-MoE (0.15B)
[C] MiniMind2-Small (0.02B)
[D] minimind-v1-small(0.02B)
[E] minimind-v1-moe(0.1B)
[F] minimind-v1(0.1B)
[G] baby-llama2-chinese(0.2B)
[H] chatlm-mini-chinese(0.2B)
🙋直接把以上所有问题和模型的回答丢给DeepSeek-R1,让它帮忙点评和排名打分:
具体点评
评分标准:
点评:
A模型:
H模型:
C模型:
F模型:
D模型:
B模型:
E模型:
G模型:
总结:
打分排序
👉主观效果总结
个人主观评价与DeepSeek-R1基本相符,其中:
MiniMind系列的排序非常符合直觉,参数越大+训练数据越充分评分越高,幻觉和错误都会比小模型肉眼可见的好。
H模型的回答肉眼看起来是不错的,尽管存在些许幻觉瞎编的情况。
G模型可能训练数据不够完备,给出的权重经过测试效果不佳。
再复诵一遍经久不衰的Scaling Law: 参数越大,训练数据越多模型的性能越强。
Ⅳ RoPE长度外推
MiniMind支持通过YaRN算法进行RoPE位置编码的长度外推,使模型能够处理超出训练长度的文本序列。
原生torch模型在使用
eval_llm.py进行推理时,只需添加--inference_rope_scaling参数即可启用RoPE外推:对于Transformers格式的模型,可以在config.json中添加以下配置实现长度外推:
在MiniMind-Small模型上,测试输入不同长度的「西游记」白话文小说,评估RoPE scaling前后的困惑度(PPL)对比。 可以看出,启用YaRN外推后,模型在长文本上的PPL表现显著下降:
Ⅴ Objective Benchmark
下面就到喜闻乐见的benchmark测试环节,就不找乐子和Qwen、GLM级别的模型做对比了。 这里选取了一些微型模型进行横评比较, 测试集选择C-Eval、CMMLU、A-CLUE、TMMLU+这几个纯中文语言榜单。
测评框架
测评框架选择lm-evaluation, 安装后启动测试非常方便:
PS: 在这种全是选择题的测评集中,为了避免回复格式的难以固定的特点, 所以常用做法是直接把
A,B,C,D四个字母对应token的预测概率取出来,将其中概率最大的字母与标准答案计算正确率。 选择题1/4乱选的正确率是25%,然而这个量级的所有模型都集中在25附近,甚至很多时候不如瞎选,是不是像极了高中完形填空的滑铁卢正确率… MiniMind模型本身预训练数据集小的可怜,也没有针对性的对测试集做刷榜微调,因此结果纯娱乐:📌 Others
🔧 模型转换
torch / transformers模型的互相转换MiniMind2模型均默认为Transformers格式的模型,需提前t2t转换!🖥️ 基于MiniMind-API服务接口
./scripts/serve_openai_api.py完成了兼容openai-api的最简聊天接口,方便将自己的模型接入第三方UI 例如FastGPT、OpenWebUI、Dify等等。
从Huggingface下载模型权重文件,文件树:
启动聊天服务端
测试服务接口
API接口示例,兼容openai api格式
👨💻 更多
🔗从MiniMind-LLM微调扩散语言模型
🔗模型的generate方法说明
vLLM是极其流行的高效推理框架,支持大模型快速部署,优化显存利用与吞吐量。
以openai-serve形式启动 minimind2:
llama.cpp是一个C++库, 可以在命令行下直接使用,支持多线程推理,支持GPU加速。
目录结构:建议将llama.cpp与minimind放在同级目录下
0、参考
llama.cpp官方步骤进行install1、在
convert_hf_to_gguf.py的get_vocab_base_pre函数最后插入:2、转换自训练的minimind模型:huggingface -> gguf
3、量化此模型 (可选)
4、命令行推理测试
ollama是本地运行大模型的工具,支持多种开源LLM,简单易用。
1、通过ollama加载自定义的gguf模型
在
MiniMind2下新建minimind.modelfile,写入:2、加载并命名此模型为
minimind-local3、启动推理
📤 推送你的模型到 Ollama Hub
⭐️ 也可直接使用我提供的ollama模型一键启动:
MNN是面向端侧的AI推理引擎,支持多种开源LLM模型推理,轻量化、高性能。
模型转换
在Mac或手机上测试
或者下载APP测试
📌 Acknowledge
🤝贡献者
😊鸣谢
@ipfgao: 🔗训练步骤记录
@WangRongsheng: 🔗大型数据集预处理
@pengqianhan: 🔗一个简明教程
@RyanSunn: 🔗推理过程学习记录
@Nijikadesu: 🔗以交互笔记本方式分解项目代码
参考链接 & 感谢以下优秀的论文或项目
🫶支持者
🎉 Awesome Work using MiniMind
本模型抛砖引玉地促成了一些可喜成果的落地,感谢研究者们的认可:
ECG-Expert-QA: A Benchmark for Evaluating Medical Large Language Models in Heart Disease Diagnosis [arxiv]
Binary-Integer-Programming Based Algorithm for Expert Load Balancing in Mixture-of-Experts Models [arxiv]
LegalEval-Q: A New Benchmark for The Quality Evaluation of LLM-Generated Legal Text [arxiv]
On the Generalization Ability of Next-Token-Prediction Pretraining [ICML 2025]
《从零开始写大模型:从神经网络到Transformer》王双、牟晨、王昊怡 编著 - 清华大学出版社
FedBRB: A Solution to the Small-to-Large Scenario in Device-Heterogeneity Federated Learning [TMC 2025]
进行中…
🎓 Citation
If you find MiniMind helpful in your research or work, please cite:
License
This repository is licensed under the Apache-2.0 License.