当前位置: 首页 > news >正文

大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF

写在前面

GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,包括数据收集、预处理、模型设计、训练策略、优化技巧以及后训练阶段(微调、对齐)等环节。

我们将先对 GPT 的训练方案进行一个简述,接着我们将借助 MiniMind 的项目,来完成我们自己的 GPT 的训练。

训练阶段概览

GPT 的训练过程大致分为以下几个阶段:

  • 数据准备(Data Preparation)
  • 预训练(Pretraining)
  • 指令微调(Instruction Tuning)
  • 对齐阶段(Alignment via RLHF 或 DPO)
  • 推理部署(Inference & Serving)

在这里插入图片描述

数据介绍

Tokenizer

分词器将单词从自然语言通过“词典”映射到0, 1, 36这样的数字,可以理解为数字就代表了单词在“词典”中的页码。 可以选择自己构造词表训练一个“词典”,代码可见./scripts/train_tokenizer.py(仅供学习参考,若非必要无需再自行训练,MiniMind已自带tokenizer)。
或者选择比较出名的开源大模型分词器, 正如同直接用新华/牛津词典的优点是token编码压缩率很好,缺点是页数太多,动辄数十万个词汇短语; 自己训练的分词器,优点是词表长度和内容随意控制,缺点是压缩率很低(例如"hello"也许会被拆分为"h e l l o" 五个独立的token),且生僻词难以覆盖。
“词典”的选择固然很重要,LLM的输出本质上是SoftMax到词典N个词的多分类问题,然后通过“词典”解码到自然语言。 因为MiniMind体积需要严格控制,为了避免模型头重脚轻(词嵌入embedding层参数在LLM占比太高),所以词表长度短短益善。

下面是常见的词表长度如下:
在这里插入图片描述
来自项目作者:
一些自言自语

尽管minimind_tokenizer长度很小,编解码效率弱于qwen2、glm等中文友好型分词器。
但minimind模型选择了自己训练的minimind_tokenizer作为分词器,以保持整体参数轻量,避免编码层和计算层占比失衡,头重脚轻,因为minimind的词表大小只有6400。
且minimind在实际测试中没有出现过生僻词汇解码失败的情况,效果良好。
由于自定义词表压缩长度到6400,使得LLM总参数量最低只有25.8M。
训练数据tokenizer_train.jsonl均来自于匠数大模型数据集,这部分数据相对次要,如需训练可以自由选择。

Pretrain数据

经历了MiniMind-V1的低质量预训练数据,导致模型胡言乱语的教训,2025-02-05 之后决定不再采用大规模无监督的数据集做预训练。 进而尝试把匠数大模型数据集的中文部分提取出来, 清洗出字符<512长度的大约1.6GB的语料直接拼接成预训练数据 pretrain_hq.jsonl,hq即为high quality(当然也还不算high,提升数据质量无止尽)。

文件pretrain_hq.jsonl 数据格式为:

{"text": "如何才能摆脱拖延症? 治愈拖延症并不容易,但以下建议可能有所帮助..."}

SFT数据

匠数大模型SFT数据集 “是一个完整、格式统一、安全的大模型训练和研究资源。 从网络上的公开数据源收集并整理了大量开源数据集,对其进行了格式统一,数据清洗, 包含10M条数据的中文数据集和包含2M条数据的英文数据集。” 以上是官方介绍,下载文件后的数据总量大约在4B tokens,肯定是适合作为中文大语言模型的SFT数据的。 但是官方提供的数据格式很乱,全部用来sft代价太大。 我将把官方数据集进行了二次清洗,把含有符号污染和噪声的条目去除;另外依然只保留了总长度<512 的内容,此阶段希望通过大量对话补充预训练阶段欠缺的知识。 导出文件为sft_512.jsonl(~7.5GB)。

Magpie-SFT数据集 收集了1M条来自Qwen2/2.5的高质量对话,我将这部分数据进一步清洗,把总长度<2048的部分导出为sft_2048.jsonl(9GB)。 长度<1024的部分导出为sft_1024.jsonl(~5.5GB),用大模型对话数据直接进行sft就属于“黑盒蒸馏”的范畴。
进一步清洗前两步sft的数据(只保留中文字符占比高的内容),筛选长度<512的对话,得到sft_mini_512.jsonl(~1.2GB)。

所有sft文件 sft_X.jsonl 数据格式均为

{"conversations": [{"role": "user", "content": "你好"},{"role": "assistant", "content": "你好!"},{"role": "user", "content": "再见"},{"role": "assistant", "content": "再见!"}]
}

RLHF数据

来自Magpie-DPO数据集 大约200k条偏好数据(均是英文)生成自Llama3.1-70B/8B,可以用于训练奖励模型,优化模型回复质量,使其更加符合人类偏好。 这里将数据总长度<3000的内容重组为dpo.jsonl(~0.9GB),包含chosen和rejected两个字段,chosen 为偏好的回复,rejected为拒绝的回复。
文件 dpo.jsonl 数据格式为:

{"chosen": [{"content": "Q", "role": "user"}, {"content": "good answer", "role": "assistant"}], "rejected": [{"content": "Q", "role": "user"}, {"content": "bad answer", "role": "assistant"}]
}

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训练数据集 (ModelScope | HuggingFace)
无需全部clone,可单独下载所需的文件
将下载的数据集文件放到./dataset/目录下(✨为推荐的必须项)

./dataset/
├── dpo.jsonl (909MB)
├── lora_identity.jsonl (22.8KB)
├── lora_medical.jsonl (34MB)
├── pretrain_hq.jsonl (1.6GB, ✨)
├── r1_mix_1024.jsonl (340MB)
├── sft_1024.jsonl (5.6GB)
├── sft_2048.jsonl (9GB)
├── sft_512.jsonl (7.5GB)
├── sft_mini_512.jsonl (1.2GB, ✨)
└── tokenizer_train.jsonl (1GB)

各数据集简介:
● dpo.jsonl --RLHF阶段数据集
● lora_identity.jsonl --自我认知数据集(例如:你是谁?我是minimind…),推荐用于lora训练(亦可用于全参SFT,勿被名字局限)
● lora_medical.jsonl --医疗问答数据集,推荐用于lora训练(亦可用于全参SFT,勿被名字局限)
● pretrain_hq.jsonl✨ --预训练数据集,整合自jiangshu科技
● r1_mix_1024.jsonl --DeepSeek-R1-1.5B蒸馏数据,每条数据字符最大长度为1024(因此训练时设置max_seq_len=1024)
● sft_1024.jsonl --整合自Qwen2.5蒸馏数据(是sft_2048的子集),每条数据字符最大长度为1024(因此训练时设置max_seq_len=1024)
● sft_2048.jsonl --整合自Qwen2.5蒸馏数据,每条数据字符最大长度为2048(因此训练时设置max_seq_len=2048)
● sft_512.jsonl --整合自匠数科技SFT数据,每条数据字符最大长度为512(因此训练时设置max_seq_len=512)
● sft_mini_512.jsonl✨ --极简整合自匠数科技SFT数据+Qwen2.5蒸馏数据(用于快速训练Zero模型),每条数据字符最大长度为512(因此训练时设置max_seq_len=512)
● tokenizer_train.jsonl --均来自于匠数大模型数据集,这部分数据相对次要,(不推荐自己重复训练tokenizer,理由如上)如需自己训练tokenizer可以自由选择数据集。

整体结构如下:
在这里插入图片描述

http://www.xdnf.cn/news/480709.html

相关文章:

  • 车道线检测----CLRKDNet
  • 【CanMV K230】AI_CUBE1.4
  • mac中加载C++动态库文件
  • RK3568-鸿蒙5.1镜像烧录与调试
  • 不同坐标系下MATLAB绘制阵列的方向图
  • Gen5 应用实例
  • Qwen3技术报告解读:训练秘籍公开,推理与非推理模型统一,大模型蒸馏小模型(报告详细解读)
  • H3C网络设备(交换机、路由器、防火墙)常用命令整理
  • 德劳内三角剖分原理
  • VSCode + Cline AI辅助编程完全指南
  • ubuntu环境下 基于Python 打包的 批量命令行可视化操作工具 GUI
  • 数字经济新范式:探秘国际数字影像产业园的园区服务
  • Gensim 是一个专为 Python 设计的开源库
  • 如何在 Windows 10 或 11 上使用命令提示符安装 PHP
  • 多模态大语言模型arxiv论文略读(七十八)
  • 【python基础知识】Day 27 函数专题2:装饰器
  • SAP ABAP 程序中归档数据读取方式
  • React Flow 节点类型详解与实战:内置节点使用与自定义组件开发
  • 排序算法之线性时间排序:计数排序,基数排序,桶排序详解
  • 怎么用idea分析hprof文件定位JVM内存问题
  • 米勒电容补偿的理解
  • JMeter 教程:编写 GET 请求脚本访问百度首页
  • 学习笔记(C++篇)--- Day 5
  • 激活函数全解析:定义、分类与 17 种常用函数详解
  • 奥运数据可视化:探索数据讲述奥运故事
  • VulnHub | Breach - 1
  • 顶层设计-IM系统架构
  • Leetcode刷题 | Day64_图论09_dijkstra算法
  • linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉
  • android vlc播放rtsp