数据准备

预训练的目的是让模型学习海量的世界知识和语言统计规律。
核心难点不在于模型架构,而在于数据工程。

数据来源

预训练不是只喂一种数据。通常按比例混合:网页 (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 通过高质量示范数据教会模型"如何回答"。

  1. 数据形式:Prompt (指令) + Response (答案)
  2. 数据质量:微调不需要海量数据,但要求极高的准确性和格式一致性
  3. 核心目标:让模型学会听懂指令并以人类期望的格式和风格输出
  4. 数据构造方法:
    • 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显存。
  • Prompt Tuning :

    • 在输入层添加可学习的 Embedding 向量,不改动模型内部参数。
      技术原理:
      输入重组:在真实Token前面拼接k个虚拟Token
      参数冻结:锁定权重不产生梯度更新
      可学习:唯独对这k个虚拟的Token对于的Embedding向量随机初始化并在反向传播中进行更新
      优点:极其轻量,每任务仅需存储k个Embedding向量(约几KB),适合多任务快速切换
      缺陷:Prompt Tuning 在超大规模模型(如 100B 参数以上)上效果极好,但在中小型模型上表现不如全量微调。
  • Prefix Tuning:
    技术原理:

    • 在Transformer每一层中,注意力机制计算需要三个矩阵在每一层的KV矩阵前,拼接一段可学习的前缀向量
    • 进行计算时,Query不仅会注意到原始句子的Token还会强制注意到这些可学习的前缀,从而引导模型生成特定任务的内容
      优点:相比 Prompt Tuning 只在输入层加向量,Prefix Tuning 在每层都注入任务信息,表达能力更强,中小模型上效果更好
      缺陷:可训练参数量大于 Prompt Tuning,推理时需额外处理前缀向量,多任务部署较繁琐

对齐阶段

微调后的模型虽然会回答问题,但它仍然存在两个致命问题:

  1. 幻觉与胡言乱语:它可能会一本正经地胡说八道。
  2. 安全性与偏见:它可能会教人制造危险品,或者表现出歧视。
    对齐阶段的目标就是让模型符合人类的价值观
RLHF (基于人类反馈的强化学习):

使用强化学习的方式直接优化带有人类反馈的语言模型
逻辑:既然人类很难写出完美的公式来定义什么是“好答案”,那就让人类来当评委,给模型的答案打分

RLHF 的三个阶段:

  1. 预训练语言模型

    • 收集人工撰写的高质量 (Prompt, Response) 示范数据
    • 对基座模型进行监督微调,使其初步具备对话能力
  2. 训练奖励模型:

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

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

2023 年以来的主流,通过直接优化模型在“好答案”和“坏答案”上的对数概率差,取代了复杂的 PPO。

不需要单独训练一个奖励模型,也不需要复杂的强化学习算法。通过数学推导,DPO 发现“奖励模型”的优劣可以直接反映在“策略模型(即我们要训练的模型)”生成答案的概率上。

  • 它的做法:
    1. 准备偏好数据:{Prompt, 好的回答 (Chosen), 坏的回答 (Rejected)}
    2. 优化目标:直接调整模型参数,使得模型生成“好回答”的概率变大,生成“坏回答”的概率变小
    3. 对比机制:为了防止模型跑偏,它会引入一个“参考模型”(即微调前的 SFT 模型)。如果新模型偏离老模型太远且没有带来更好的反馈,就会受到惩罚
DPO 的后续改进方法:

自 DPO 提出后,研究者进一步简化了对齐流程,以下是几个重要变体:

  • ORPO:
    • 核心创新:将 SFT 损失和偏好对齐损失合并为一个目标函数,无需单独的 SFT 阶段,也无需参考模型。
    • 做法:在 SFT 的交叉熵损失上直接叠加一个"胜率比"惩罚项,让模型在学会回答的同时自然偏向好答案、远离坏答案。
    • 优势:省掉了参考模型,训练更快、显存更省。
  • SimPO:
    • 核心创新:用生成序列的平均对数概率作为隐式奖励,完全不需要参考模型。
    • 做法:直接比较模型自己对 Chosen 和 Rejected 序列的概率差异,并引入长度归一化避免偏向短答案。
    • 优势:比 DPO 更简单,训练更稳定,在多个基准上超越了 DPO。
  • KTO:
    • 核心创新:不需要成对的偏好数据,仅需单条反馈(某个回答是"好"还是"坏")。
    • 原理:借鉴行为经济学中的前景理论,将人类对好坏的不对称感知建模到损失函数中。
    • 优势:数据收集成本大幅降低——不需要标注者比较两个回答的优劣,只需对单个回答做出判断。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐