大模型训练流程以及核心微调方法
数据准备
预训练的目的是让模型学习海量的世界知识和语言统计规律。
核心难点不在于模型架构,而在于数据工程。
数据来源
预训练不是只喂一种数据。通常按比例混合:网页 (60%)、代码 (10%)、论文 (10%)、书籍 (10%)、数学 (10%)。
数据处理流程
数据质量直接决定模型智商,流程如下
格式优化
将HTML、PDF转化为纯文本、去除乱码,处理Unicode兼容性
语言过滤
- 使用分类器(如 fastText)过滤掉非目标语言。
fastText
其本质上是一个多分类任务
1.字符级N-gram
把词切块分为字符片段,不同语言字符组合规律非常明显,可以快速判断语种
2.线性分类器+层次Softmax
为了在类别中快速计算,fastText使用层次Softmax技术,降低计算复杂度
3.预训练模型
启发式过滤
- 关键词过滤:剔除色情、暴力等违规内容。
- 统计特征:剔除停止词占比过高、短语重复过多、句子过短的“垃圾文本”。
- 困惑度过滤:用一个小模型计算文本的流畅度,剔除逻辑不通的内容。
数据去重
-
精准去重:利用MD5或SHA256算法,删除完全相同的句子
进阶:处理数据量达到亿级
1.使用布隆过滤器:利用多个哈希函数映射到一个位数组中
2.外部排序:计算所有句子的哈希值,并将其写入硬盘,对哈希值排序,相同的哈希值相邻删除重读的 -
模糊去重:使用MinHash + LSH计算文档相似度,删除相似度高的文章
通过 MinHash 对文档进行“指纹化”降维,再通过 LSH 快速锁定可能相似的文档候选集,从而避免海量的两两比对。
Jaccard相似度:- 文档去重通常比较的是集合的相似度,假设文档A和B被切分为词集合,Jaccard相似度计算公式为:J(A,B) = |A∩B|/|A∪B|
- 相似度越接近 1,文章越接近
MinHash(指纹降维)
- 直接计算Jaccard相似度在海量数据下很慢(O(N2))
- 利用哈希函数特性,将巨大的文档集合压缩成一个短的签名向量
- 两个文档签名中相同元素的占比,在概率上等于它们的 Jaccard 相似度。这样我们就把“比对大文档”转变成了“比对短向量”
LSH(分桶索引)
- 即使有了短签名,两两比对依然很慢。
- LSH将签名向量切分成多个段,只要有两个文档在某一段上完全一致,就认为他们是“候选相似对”,丢进同一个桶里。
研究表明,去重不仅可以提升训练效率,还能显著减少模型的“背诵”现象,提高泛化能力
隐私脱敏
使用正则表达式或命名实体识别(NER)去除姓名、电话、地址等个人敏感信息
分词
将文本转化成Token。主流方法是Byte-Pair Encoding或SentencePiece
需要维护词表,通常大小再3k-15w之间
典型工作流:MD5精准去重、格式清洗、语言过滤、MinHash+LSH、质量打分
格式
文档打包: 预训练通常设置固定长度。如果一篇文档很短,直接输入会产生大量 Padding(填充),浪费算力。我们会将多篇文档拼接,中间用 <|endoftext|> 分隔,直到填满窗口。
模型预训练
- 目标:Next Token Prediction(预测下一个字)
- 架构:目前主流几乎全是 Decoder-only
- 学习内容:通过阅读数万亿级别的 Token,学习语法、事实知识和初步的推理逻辑。
预训练的关键支撑技术
- 混合精度训练:使用 FP16/BF16 半精度浮点数进行前向和反向传播,同时保留 FP32 的主权重副本,在保证训练稳定性的前提下将显存占用减半、计算速度翻倍。
- Flash Attention:通过分块和重计算技术,将注意力机制的内存复杂度从 O(N²) 降到 O(N),使得长序列训练成为可能,且不损失计算精度。
- 分布式训练:
- 数据并行:每个 GPU 持有一份完整模型副本,处理不同批次数据,梯度同步更新。
- 张量并行:将单个 Transformer 层的权重矩阵切分到多个 GPU 上并行计算。
- 流水线并行:将模型按层切分,不同 GPU 负责不同层,形成计算流水线。
- ZeRO:将优化器状态、梯度和参数分片到多个 GPU,极大降低单卡显存需求。
- 梯度检查点:在前向传播时只保留部分中间激活值,反向传播时重新计算被丢弃的部分,以时间换空间,显著降低显存占用。
指令微调
预训练后的模型是一个“复读机”,微调是为了让它变成“助手”
SFT 是训练流程中承上启下的核心环节——预训练模型虽然拥有海量知识,但不知道如何以对话形式与人交互,SFT 通过高质量示范数据教会模型"如何回答"。
- 数据形式:Prompt (指令) + Response (答案)
- 数据质量:微调不需要海量数据,但要求极高的准确性和格式一致性
- 核心目标:让模型学会听懂指令并以人类期望的格式和风格输出
- 数据构造方法:
- Self-Instruct:用大模型自动生成指令-回答对,低成本扩充训练数据。
- Evol-Instruct:对简单指令逐步增加复杂度,生成从易到难的指令链。
核心微调方法
预训练完成得到“基座模型”后,它只会根据概率手写,无法回答问题。我们需要微调来使其具备对话能力。
-
LoRA (Low-Rank Adaptation):
- 原理: 不改动原有的权重矩阵 W ,而是在旁边旁路添加两个低秩矩阵 A和B。
- 优点: 训练参数量仅为全量的 0.1%~1%,显存占用极低,且推理时可合并回原参数,无额外延迟。
大型语言模型体积庞大,由于 GPU 内存限制,在训练过程中更新所有模型权重可能会非常昂贵。
LoRA方法将权重变化ΔW分解为低秩表示。更准确地说,它不需要显式计算ΔW 。相反,LoRA在训练过程中直接学习ΔW的分解表示,这正是其节省计算量的原因。

如上图所示, ΔW的分解意味着我们将大矩阵ΔW分解为两个较小的 LoRA 矩阵A和B。如果A的行数与ΔW相同, B的列数与ΔW相同,则分解式可以写成ΔW = AB 。(AB是矩阵A和B的乘积)A和B无法捕捉到ΔW所能捕捉到的所有信息,但这正是设计使然。在使用 LoRA 时,我们假设模型需要W是一个满秩的大矩阵,才能捕捉到预训练数据集中的所有知识。然而,当我们微调 LLM 时,我们不需要更新所有权重,并且能够用比ΔW更少的权重捕捉到自适应所需的核心信息;因此,我们通过AB进行低秩更新。
-
QLoRA(量化 LoRA 的缩写):
- 是一种在微调过程中进一步降低内存使用量的技术。在反向传播过程中,QLoRA 将预训练权重量化到 4 位精度,并使用分页优化器来处理内存峰值。
分页优化器:利用GPU内存管理机制,在显存偶尔不足时自动调用内存,防止程序崩溃
双重量化:对量化后的系数再次进行量化,进一步节省几百MB显存。
- 是一种在微调过程中进一步降低内存使用量的技术。在反向传播过程中,QLoRA 将预训练权重量化到 4 位精度,并使用分页优化器来处理内存峰值。
-
Prompt Tuning :
- 在输入层添加可学习的 Embedding 向量,不改动模型内部参数。
技术原理:
输入重组:在真实Token前面拼接k个虚拟Token
参数冻结:锁定权重不产生梯度更新
可学习:唯独对这k个虚拟的Token对于的Embedding向量随机初始化并在反向传播中进行更新
优点:极其轻量,每任务仅需存储k个Embedding向量(约几KB),适合多任务快速切换
缺陷:Prompt Tuning 在超大规模模型(如 100B 参数以上)上效果极好,但在中小型模型上表现不如全量微调。
- 在输入层添加可学习的 Embedding 向量,不改动模型内部参数。
-
Prefix Tuning:
技术原理:- 在Transformer每一层中,注意力机制计算需要三个矩阵在每一层的KV矩阵前,拼接一段可学习的前缀向量
- 进行计算时,Query不仅会注意到原始句子的Token还会强制注意到这些可学习的前缀,从而引导模型生成特定任务的内容
优点:相比 Prompt Tuning 只在输入层加向量,Prefix Tuning 在每层都注入任务信息,表达能力更强,中小模型上效果更好
缺陷:可训练参数量大于 Prompt Tuning,推理时需额外处理前缀向量,多任务部署较繁琐
对齐阶段
微调后的模型虽然会回答问题,但它仍然存在两个致命问题:
- 幻觉与胡言乱语:它可能会一本正经地胡说八道。
- 安全性与偏见:它可能会教人制造危险品,或者表现出歧视。
对齐阶段的目标就是让模型符合人类的价值观
RLHF (基于人类反馈的强化学习):
使用强化学习的方式直接优化带有人类反馈的语言模型
逻辑:既然人类很难写出完美的公式来定义什么是“好答案”,那就让人类来当评委,给模型的答案打分
RLHF 的三个阶段:
-
预训练语言模型
- 收集人工撰写的高质量 (Prompt, Response) 示范数据
- 对基座模型进行监督微调,使其初步具备对话能力

-
训练奖励模型:
- 模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM
- 训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本
- 关于训练奖励数值方面,这里需要人工对 LM 生成的回答进行排名
- 对具体的排名方式,一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。

-
强化学习阶段(PPO 算法):
- 让 SFT 模型不断生成答案,奖励模型给它打分。
- 使用 PPO(近端策略优化)算法 根据分数更新模型参数。
- KL 散度约束
PPO 在优化时会引入一个"参考模型"(即微调前的 SFT 模型),计算新模型与参考模型输出分布之间的 KL 散度作为惩罚项。这是为了防止新模型为追求高奖励而"钻空子"——例如输出语法错误但恰好被奖励模型打高分的文本,或偏离原始语言能力太远。 - 难点:PPO 极其不稳定,对超参数非常敏感,且训练时需要同时加载 4 个模型(原模型、参考模型、奖励模型、评论员模型),显存压力极大。

DPO (Direct Preference Optimization):
2023 年以来的主流,通过直接优化模型在“好答案”和“坏答案”上的对数概率差,取代了复杂的 PPO。
不需要单独训练一个奖励模型,也不需要复杂的强化学习算法。通过数学推导,DPO 发现“奖励模型”的优劣可以直接反映在“策略模型(即我们要训练的模型)”生成答案的概率上。
- 它的做法:
- 准备偏好数据:{Prompt, 好的回答 (Chosen), 坏的回答 (Rejected)}
- 优化目标:直接调整模型参数,使得模型生成“好回答”的概率变大,生成“坏回答”的概率变小
- 对比机制:为了防止模型跑偏,它会引入一个“参考模型”(即微调前的 SFT 模型)。如果新模型偏离老模型太远且没有带来更好的反馈,就会受到惩罚
DPO 的后续改进方法:
自 DPO 提出后,研究者进一步简化了对齐流程,以下是几个重要变体:
- ORPO:
- 核心创新:将 SFT 损失和偏好对齐损失合并为一个目标函数,无需单独的 SFT 阶段,也无需参考模型。
- 做法:在 SFT 的交叉熵损失上直接叠加一个"胜率比"惩罚项,让模型在学会回答的同时自然偏向好答案、远离坏答案。
- 优势:省掉了参考模型,训练更快、显存更省。
- SimPO:
- 核心创新:用生成序列的平均对数概率作为隐式奖励,完全不需要参考模型。
- 做法:直接比较模型自己对 Chosen 和 Rejected 序列的概率差异,并引入长度归一化避免偏向短答案。
- 优势:比 DPO 更简单,训练更稳定,在多个基准上超越了 DPO。
- KTO:
- 核心创新:不需要成对的偏好数据,仅需单条反馈(某个回答是"好"还是"坏")。
- 原理:借鉴行为经济学中的前景理论,将人类对好坏的不对称感知建模到损失函数中。
- 优势:数据收集成本大幅降低——不需要标注者比较两个回答的优劣,只需对单个回答做出判断。
更多推荐




所有评论(0)