MiniMind 实战:从预训练到 SFT 微调

项目地址https://github.com/jingyaogong/minimind

项目简介

MiniMind 是一个从零实现的小型语言模型训练项目,旨在以极低的算力成本(约 3 元人民币)完成一次完整的 LLM 训练流程。它涵盖了从数据准备、Tokenizer 训练、预训练(Pre-training)、有监督微调(SFT)、LoRA 微调到 DPO 对齐的完整 pipeline,非常适合学习大语言模型训练原理。

项目有以下亮点:

  • 极低的算力门槛:仅需单张消费级显卡(如 RTX 3060/4060)即可完成全部训练。
  • 完整的训练流程:覆盖 Tokenizer → Pretrain → SFT → LoRA → DPO 的端到端链路。
  • 可解释性强:代码结构清晰、模型规模小(约 26M 参数),非常适合初学者理解和调试。
  • 中文友好:训练数据以中文为主,支持中文对话。

环境搭建

在开始之前,请确保已安装 Python 3.8+ 并安装依赖:

# 克隆项目
git clone https://github.com/jingyaogong/minimind.git
cd minimind

# 安装依赖
pip install -r requirements.txt

主要依赖包括 torchtransformersdatasetstiktoken 等。建议使用 CUDA 版本的 PyTorch 以利用 GPU 加速。

数据准备

训练数据存放在 dataset/ 目录下。项目自带了一份精简的预训练语料 pretrain_t2t_mini.jsonl,你可以根据需要替换为自己的数据。数据格式为 JSONL,每行一个 JSON 对象,包含 text 字段。

提示:如果希望模型在特定领域(如医疗、法律、代码)有更好表现,可以在此阶段引入对应领域的语料进行预训练。


预训练(Pre-training)

预训练是让模型在海量文本上学习语言的统计规律和常识知识。MiniMind 采用类似 GPT 的自回归训练方式——给定前文,预测下一个 Token。

执行预训练

按官方链接指导,做好数据准备后,执行下述命令执行预训练,得到结果文件 out/pretrain_768.pth

python train_pretrain.py

关键训练参数(可在脚本中调整):

参数说明默认值
dim模型隐藏层维度768
n_layersTransformer 层数12
n_heads注意力头数12
max_seq_len最大序列长度512
epochs训练轮数3
batch_size批次大小32
learning_rate学习率5e-4

测试预训练模型

执行下述命令对预训练结果进行测试:

python eval_llm.py --weight pretrain

预训练前后对比

模型在预训练前是一个随机初始化的网络,输出基本是乱码;预训练后模型已经学会了基本的语言模式和词汇关联。对比效果如下图所示:

摘要如下:

预训练前(随机初始化)

推荐一些中国的美食
🧠: 中国的美食种类繁多,其中一些最具代表性的美食包括:

1. **粤食**:粤菜是一道源自广东的传统美食,以其独特的调味和丰富的口感而闻名。粤食包括粥、粥、粤米粥等,还有粤粮、粑粑粥等,这些食物不仅口感丰富,而且营养丰富,是广东菜系中非常受欢迎的食材。

2. **粤食**:粤菜的特点是鲜美多汁、口味独特。粤粑粥,如粥、粥、粥等,不仅搭配了多种蔬菜和肉类,还提供了丰富的蛋白质和维生素,是广东菜系中不可或缺的美食。粤粑粥,如粥、粥等,其主要原料包括豆芽、豆芽、蘑菇等,营养丰富,是广东地区饮食的必选食材。

3. **粤食**:粤菜属于湘菜,以其辣椒、花椒等调味料的丰富多彩而受到喜爱。粤粑粥,如粥、粥、粥等,通常使用淀粉或酸黄瓜等清淀粉进行腌制,味道浓郁。

4. **粤食**:粤菜的特点是麻辣、香、脆、多汁,以鱼、肉、海鲜等为主食,还有多种蔬菜、豆类等,如豌豆、豆皮等,是广东菜系中非常重要的食材。

5. **粤食**:粤菜的特点是麻辣鲜香,通常辣而不燥,有多种调料和特制酱料,如豆沙、葱、姜、蒜等,是广东菜系中不可或缺的美食。

这些美食不仅烹饪精湛,而且在口味上也体现了中国饮食文化的丰富多样性,是了解和体验中国菜系多样性和风味的好去处。

可以看到,预训练前的模型输出完全不可用——内容重复啰嗦、逻辑混乱(如"粤菜属于湘菜")、事实错误严重。这是因为随机初始化的模型权重尚未从数据中学到任何有意义的语言模式。

预训练后

💬: 推荐一些中国的美食
🧠: 餐厅1. 四川火锅 - 著名的四川火锅店,有着正宗的四川火锅底料和浓郁的特色味道。2. 川味火锅 - 以川味火锅为主要特色,有麻辣的味道和丰富的口味。3. 鲁菜拼盘 - 以海鲜为主要特色,有很多口味各异的菜品,包括清炒时蔬、鱼香肉丝等。4. 京都烤肉店 - 由优酿的四川味道烤制而成,有多种口味和味道。5. 上海丰盛大餐厅 - 以粤菜为主要特色,有很多地方特色菜品,包括辣味鸡、生煎、炸酱面等。6. 豪华餐厅 - 以地方特色美食,例如北京炸酱面、老北京炸酱面等,提供多种不同菜品。7. 四季食堂 - 以海鲜为主要特色,有各种口味,如炸酱面、烤肉串等。8. 三潭楼火锅 - 以火锅为特色,有各种口味,如小笼包、牛肚子等,提供多种口味。9. 京味餐厅 - 以传统的京味料理为主要特色,有各种口味和口味,如炸酱面、煲仔饭、

预训练后模型已经开始生成相对连贯的中文文本,能够围绕"美食"主题展开作答。不过,输出结果明显受到训练数据分布的影响——训练数据 pretrain_t2t_mini.jsonl 中出现了多次"四川火锅",导致模型在回答中过度偏好"火锅"相关内容。

思考:这就是预训练阶段数据质量决定模型知识分布的典型现象。在真实场景中,需要通过数据配比、去重、去噪等手段来平衡模型的知识覆盖面。


有监督微调(SFT)

预训练让模型学会了"说话",但还不懂得如何"对话"。SFT(Supervised Fine-Tuning)通过在高质量问答对话数据上训练,让模型学会遵循指令、生成符合人类偏好的回复。

执行 SFT

执行下述命令执行微调,得到结果文件 out/sft_t2t_768.pth

python train_full_sft.py

SFT 阶段会在预训练权重的基础上,使用对话格式的数据进行全参数微调。与预训练不同,SFT 的 loss 通常只计算在 output(助手回复)部分。

数据片段:

测试 SFT 模型

执行下述命令对 SFT 结果进行测试:

python eval_llm.py --weight full_sft

SFT 前后对比

SFT 前后对比如下图所示:

摘要如下:

SFT 前(仅预训练)

推荐一些中国的美食
🧠: 中国的美食种类繁多,其中一些最具代表性的美食包括:

1. **粤食**:粤菜是一道源自广东的传统美食,以其独特的调味和丰富的口感而闻名。粤食包括粥、粥、粤米粥等,还有粤粮、粑粑粥等,这些食物不仅口感丰富,而且营养丰富,是广东菜系中非常受欢迎的食材。

2. **粤食**:粤菜的特点是鲜美多汁、口味独特。粤粑粥,如粥、粥、粥等,不仅搭配了多种蔬菜和肉类,还提供了丰富的蛋白质和维生素,是广东菜系中不可或缺的美食。粤粑粥,如粥、粥等,其主要原料包括豆芽、豆芽、蘑菇等,营养丰富,是广东地区饮食的必选食材。

3. **粤食**:粤菜属于湘菜,以其辣椒、花椒等调味料的丰富多彩而受到喜爱。粤粑粥,如粥、粥、粥等,通常使用淀粉或酸黄瓜等清淀粉进行腌制,味道浓郁。

4. **粤食**:粤菜的特点是麻辣、香、脆、多汁,以鱼、肉、海鲜等为主食,还有多种蔬菜、豆类等,如豌豆、豆皮等,是广东菜系中非常重要的食材。

5. **粤食**:粤菜的特点是麻辣鲜香,通常辣而不燥,有多种调料和特制酱料,如豆沙、葱、姜、蒜等,是广东菜系中不可或缺的美食。

这些美食不仅烹饪精湛,而且在口味上也体现了中国饮食文化的丰富多样性,是了解和体验中国菜系多样性和风味的好去处。

SFT 后

💬: 推荐一些中国的美食
🧠: 中国的美食种类繁多,各有千秋,但以下是一些广受欢迎的美食类型:

1. **京味**:京味是京味的代表,以其独特的北京风味和丰富的食材而闻名。京味包括麻辣火锅、麻婆豆腐、豆皮等传统川味菜肴。

2. **麻辣**:麻辣是一种广为人知的美食,由麻、辣、鲜、咸等多种风味组合而成。麻辣通常以肉末、鸡肉、鱼肉等为主要食材,口感丰富。

3. **火锅**:火锅是中华美食的代表,其制作过程包括火锅的准备、火锅的调料选择、食材的选择等。

4. **粤菜**:粤菜通常指的是以粤菜为主,结合了多种食材,如红烧肉、清炒时蔬、广东肉片等,以增加口感和营养价值。

5. **徽菜**:徽菜不仅是食材的选择,也是制作和食用菜肴的好方法。徽菜的制作过程较为复杂,需要经过精心的切割和烹饪,以保证食材的鲜美和营养价值。

6. **粤菜**:粤菜是中国传统菜系之一,以粤菜为主,是家庭菜肴的常见菜肴。常见的粤菜包括清蒸鲈鱼、清蒸鲈鱼、糖醋里脊等。

7. **湘菜**:湘菜通常以"鱼肉"为主,制作过程相对简单,但味道鲜美。湘菜的特点是色泽红亮、香味浓郁。

8. **粤菜**:粤菜是中国南方地区非常受欢迎的传统烹饪方式,以蒸、煮、炖、炖等多种烹饪方式为特色。

9. **粤菜**:粤菜主要由糯米、豆皮、豆瓣酱等原料组成,强调食材的鲜美和食用体验。

10. **粤菜**:粤菜是北京地区的特色小吃,以"麻辣香"和"红豆汤"为主,以鲜美和浓郁的口味著称。

每种类型的美食都有其独特的魅力,尝试不同的食材和烹饪方法,可以让你的味蕾大开,味觉体验更丰富。

结果分析

SFT 后的模型相比纯预训练阶段有了显著改善:

  1. 结构化输出:能够以编号列表形式组织内容,回复更加清晰易读。
  2. 多样性提升:从预训练阶段过度偏好"火锅",到覆盖京味、麻辣、粤菜、徽菜、湘菜等多种类型。
  3. 语言流畅度:语句更加通顺,逻辑更连贯。

但仍然存在一些不足:

  • 事实混淆:如"京味"的描述中混入了川味菜肴(麻辣火锅、麻婆豆腐),说明模型对不同菜系的知识边界还比较模糊。
  • 内容重复:多次出现"粤菜"条目,且部分描述趋于同质化。
  • 描述泛化:许多条目的描述比较空洞,缺乏具体的菜品和特色细节。

改进方向:这些问题的根源在于训练数据量较小(模型仅 26M 参数,训练语料有限)。要进一步提升效果,可以:(1) 扩大预训练语料规模和质量;(2) 增加 SFT 数据的多样性和准确性;(3) 引入 RLHF/DPO 等对齐技术进一步优化。


后续进阶

MiniMind 还支持以下高级训练模式,可根据需要尝试:

训练方式脚本说明
LoRA 微调train_lora.py低秩适应,仅训练少量参数,显存友好
DPO 对齐train_dpo.py基于偏好对数据进行人类偏好对齐
蒸馏训练train_distillation.py用大模型蒸馏小模型,提升小模型性能

查看项目 README 了解更多细节。


总结

通过本次实战,我们完整走通了 MiniMind 从预训练到 SFT 微调的流程:

  1. 预训练使模型具备了基本的语言理解和生成能力,但输出内容受训练数据分布影响较大。
  2. SFT 微调显著改善了模型的指令遵循能力和回复质量,使输出更加结构化和多样化。
  3. 由于模型规模较小(26M 参数),效果有限但足以体现 LLM 训练的核心原理——数据驱动 + 分阶段训练

对于想要深入理解大语言模型训练原理的同学,MiniMind 是一个非常优秀的学习项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十正

来人一两

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值