ysf
ysf
Published on 2026-05-23 / 22 Visits
2

大语言模型:从训练到推理

引言

2023年,我第一次使用ChatGPT时,就被它的生成能力、精准的上下文理解能力和多任务处理能力惊艳到了。它不仅能自然地回答问题、总结复杂信息,还能写文章、生成代码、分析 Bug,甚至在连续多轮对话中保持上下文一致性。它不像传统意义上的搜索引擎,也不像我过去接触过的任何自然语言处理模型,更像是在和一个真正理解语言的系统交流。

在这之前,我对自然语言处理的理解还停留在经典的任务范式上:分词、机器翻译、情感分类、命名实体识别……这些任务通常目标明确、边界清晰,模型往往针对某一具体任务设计和训练。

尽管我知道ChatGPT 基于 Transformer 架构,也了解Transformer是一种强大的序列建模方法:通过 Self-Attention 建立 token 之间的依赖关系,从而更好地捕获上下文信息。但我很难把这些对局部的技术理解与 ChatGPT 所展现出的强大能力联系起来。

在看了 Andrej Karpathy 在 Microsoft Build 2023 的分享后,我才对大语言模型的训练有了一个初步的整体认识。

Andrej Karpathy 将 GPT 的训练过程概括为四个关键阶段:

  • Pretraining(预训练)
  • Supervised Finetuning(监督微调)
  • Reward Modeling(奖励建模)
  • Reinforcement Learning(强化学习)

这四个阶段都需要不同规模的数据集及不同类型的算法,会产出不同类型的模型,所需要的资源也有非常大的差别。其中,后两个阶段(Reward Modeling 和 Reinforcement Learning)在后来被统称为 RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedback):先通过人类偏好数据训练奖励模型,再利用强化学习优化模型生成行为,使其输出更加符合人类预期。

image-RSNR.png

不过,构建一个可用的大语言模型产品,不止这四个阶段。

从工程落地的角度来看,它通常还包括大规模文本数据的收集与清洗(数据准备)、模型架构的设计、在海量数据上的预训练、针对具体任务的监督微调、基于人类偏好的对齐训练,以及最终的推理优化与服务部署。每一个环节都涉及复杂的工程权衡与技术细节,共同决定了模型的能力边界。

从海量文本中学习语言规律,到通过人工标注数据学会“听懂指令”,再到借助人类偏好不断调整生成行为——大语言模型的能力,正是在这一系列训练阶段中逐步构建出来的。

而更令人惊讶的是,这一切能力的起点,其实异常朴素:预测下一个 token。

正是这个看似简单的目标,在海量数据、超大规模参数和训练流程的共同作用下,催生了今天的大语言模型。

本文将从以下几个方面,分享我对大语言模型从构建到推理过程的理解:

  1. 数据准备与预处理
  2. 模型架构设计
  3. 模型训练
  4. 模型评估体系
  5. 模型推理与部署

数据准备与预处理

在预训练阶段,大语言模型从海量高质量文本数据中学习广泛的知识,随后这些知识存储在其模型参数当中。有效的预训练能够为大语言模型的能力奠定坚实的基础,通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,掌握较为广泛的世界知识,具备解决众多下游任务的性能潜力。因此,预训练语料的规模和质量对于提升大语言模型的能力至关重要。

数据来源

为了构建功能强大的大语言模型,需要从多元化的数据源中收集海量数据来进行训练。现有的大语言模型主要将各种公开的文本数据进行混合,作为预训练语料。语料来源主要包括:网页、书籍、代码、对话文本等。

根据来源的不同,预训练语料主要分为两种类型:

  • 通用文本数据:涵盖了网页、书籍和对话文本。
  • 专用文本数据:如多语言文本数据、科学文本数据和代码语料等。

由于通用文本数据规模较大、多样性强且易于获取,大多数大语言模型都会收集大量的通用文本数据,以增强模型的语言建模能力。此外,为了进一步提升大语言模型在特定专业任务上的表现,预训练预料的范围还扩展至更专业的专用数据集。专用数据集有助于提升大语言模型解决特定下游任务的能力。

数据预处理

在收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚至可能有害的数据。数据预处理主要包括以下内容:

  • 质量过滤
    • 语种过滤
    • 统计过滤
    • 关键词过滤
    • 分类器过滤
  • 敏感内容过滤
    • 有毒内容
    • 隐私内容
  • 数据去重
    • 句子级别
    • 文档级别
    • 数据集级别
  • 词元化(分词)
    • BPE分词
    • WordPiece分词
    • Unigram分词

质量过滤

质量过滤的主要目的是剔除低质量数据,确保训练集的可靠性和模型性能的有效性。作为数据预处理流程的一部分,质量过滤对于提升大语言模型训练阶段的训练质量和减少模型偏见有关键作用。目前主要使用以下两种质量过滤方法:

(1)基于启发式规则的方法

这种方法通过设计一系列规则或策略来识别和删除低质量的数据,这些规则或策略基于对数据特性的理解和分析,可以提高数据的质量和可用性。如基于语种的过滤,用于过滤掉非目标语言的文本数据;基于统计指标的过滤,使用语料种标点符号分布、符号与单词比率、句子长度等特征来过滤文本;基于关键词的过滤,结合相应的关键词集合,对文本进行扫描过滤;

(2)基于分类器的方法

基于分类器的方法从语料库种选取部分代表性的数据进行质量标注,以此训练出一个精准的文本质量分类器。在选取样本时,将高质量数据作为正样本,同时使用含有不良内容或低质量数据的样本作为负样本。利用这个文本分类器,可以精准的识别和过滤低质量数据,从而提升整个语料库的质量。但这种方法也存在一定的局限性,分类器可能会过滤掉方言、口语和社会文本种的高质量信息。

这种方法利用一个针对高质量文本训练的分类器来识别和排除低质量的数据。这个分类器通常使用从高质量数据源精选的数据作为正样本,将待评估的数据作为负样本,进而训练一个二分类器以生成评分用于衡量每个数据实例的质量。

敏感内容过滤

除了去除低质量内容,收集到的数据可能还包括有毒内容或隐私内容,需要进一步进行更为细致的过滤和处理。

(1)过滤有毒内容

为了精准过滤含有有毒内容的文本,可以采用基于分类器的方法。Jigsaw评论数据集提供了用于训练毒性分类器的数据。这个数据集种收集了近160K条评论数据,标注类别包括“有毒”、“严重有毒”、“有威胁”、“侮辱性”、“暴力”以及“身份仇恨”等。利用Jigsaw进行训练,可以构建出高效的毒性分类器。通过合理设置阈值,训练好的分类器能够有效识别并过滤含有有毒内容的文本。

(2)过滤隐私内容

预训练文本数据大多来自于互联网,其中可能包括用户生成的敏感信息或可识别的个人信息(Personally Identifiable Information,PII),如姓名、地址和电话号码等。如果这些信息不加处理,可能会有隐私泄露风险。在预处理阶段,需要去除这些可识别的个人信息。

数据去重

由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据种的重复模式,可能导致对于这些模式的过度学习。论文 Scaling Laws and Interpretability of Learning from Repeated Data 的研究发现,预训练语料种出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据,进而影响模型的性能。此外,这些数据也可能导致训练过程的不稳定(如训练损失震荡),可能导致训练过程崩溃。此外,为了避免数据集污染问题,还需要从预训练数据集中删除在测试集种可能出现的重复或相关文本,从而防止训练集和测试集之间的重叠。去重可以在句子级别、文档级别和数据集级别等多种粒度上进行。

数据对训练效果的影响

在训练大语言模型时,预训练数据的质量对模型能力的影响至关重要。已有的研究表明,基于含有噪音、有毒和重复数据的低质量语料库进行预训练,会严重损害模型性能。

(1)数据规模的影响

针对数据规模对大语言模型的影响可以参考下面两篇论文提出的两种扩展法则:

(2)数据质量的影响

词元化

词元化(Tokenization)是数据预处理过程种的一个关键步骤,目的是将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。

传统的自然语言处理通常以单词为基本处理单元,模型依赖于预先设定的词表 ​\mathbb{V} ,在对输入词序列编码时,这些词表示模型只能处理词表种存在的词。在使用时如果遇到不在词表种的未登录词(Out-of-Vocabulary,OOV)模型无法为其生成对应的表示,只能给予这些未登录词一个默认的通用表示。

在基于深度学习的词表示模型中,会预先在词表中加入一个默认的 [UNK] 标识,表示未知词,并在训练时将 [UNK] 作为词表示矩阵的一部份一起训练,通过引入某些相应机制来更新 [UNK] 向量的参数。使用时,对全部未登录词使用 [UNK] 向量作为表示向量。不过这种使用固定词表的词表示模型对词表大小选择比较敏感,词表过小,未登录词比例较高,影响模型性能;词表过大,大量低频词出现在词表中,这些低频词的词向量很难得到充分学习。

为了缓解未登录词问题,一些工作通过利用亚词级别的信息构造词表示向量。一种直接的解决思路是为输入建立字符级别表示,并通过字符向量的组合获得每个单词的表示,以解决数据稀疏问题。不过,单词中的词根、词缀等构词模式往往跨越多个字符,基于字符表示的方法很难学习跨度较大的模式。为了充分学习这些构词模式,研究人员提出了子词词元化(Subword Tokenization)方法。

词元表示模型会维护一个词元表,其中既存在完整的单词,也存在形如 “c”、“re”、“ing”等单词的部分信息,称为子词(Subword)。词元表示模型将每个词拆成词表内的词元。例如将单词“reborn”拆分成“re”和“born”。模型随后查询每个词元的表示,将输入重新组成词元表示序列。当下游模型需要计算一个单词或词组的表示时,可以将对应范围内的词元表示合成需要的表示。因此词元表示模型能够较好的解决自然语言处理系统中未登录词的问题。词元化(Tokenization)就是将原始文本分割成词元序列的过程。词元切分也是数据预处理中关键的步骤。

常见的词元化方法有:

  • 字节对编码(Byte Pair Encoding,BPE)
  • 字节级别BPE(Byte-level BPE),是 BPE 的一种拓展,词元分割粒度更细。
  • WordPiece,谷歌内部非公开的分词算法,BERT就采用了这个分词算法。
  • Unigram

模型架构设计

当前,绝大多数大语言模型都采用类似GPT的架构,使用基于Transformer结构构建的仅由解码器组成的网络结构,采用自回归的方式构建语言模型,但是在位置编码、层归一化位置、激活函数等细节上各有不同。

近年来的所有大语言模型几乎都基于Transformer架构,其主要可以分为:

  • Encoder-Decoder:以 T5、BART 为代表。Encoder 负责双向理解输入,Decoder 负责单向自回归生成。虽然在翻译、文本摘要等特定任务上表现优异,但由于结构相对复杂,在超大规模参数下的训练效率和零样本(Zero-shot)泛化能力不及纯 Decoder 架构。
  • Encoder-Only:以 BERT、RoBERTa 为代表。其核心是掩码语言模型(MLM),擅长文本理解、分类和抽取任务,但由于缺乏自回归生成能力,无法胜任目前主流的对话与创作交互
  • Decoder-Only:以 GPT 系列、Llama、Qwen 为代表。目前大语言模型绝对的主流范式。

Decoder-Only是当前大语言模型中的绝对主流。Decoder-Only架构在多任务上下文学习(In-Context Learning)和零样本泛化上展现出了更强的涌现能力,并且能够在一定程度上简化KV Cache的管理复杂度,使得模型在大规模并发推理时能够获得更高的吞吐量。

混合专家模型

随着稠密模型(Dense Model)遭遇模型容量瓶颈,混合专家模型(Mixture Of Experts,MoE)在当前顶尖大模型中占据了主导地位。

MoE是一种采用多专家协同架构的大语言模型技术。该架构旨在通过模块化的设计,在显著降低训练与推理成本的同时,实现更大的模型参数规模与更高效的推理速度。目前,包括 GPT-4、DeepSeek 系列以及通义千问在内的多个主流大语言模型均采用了 MoE 架构。

MoE 的核心思想源于“分而治之”(Divide and Conquer)策略,通过将复杂任务分解为多个子任务,由不同的“专家”模块并行处理。其架构主要包含以下三个核心组件与机制:

  1. 专家网络(Experts):MoE 将传统 Transformer 中单一的、计算密集的前馈神经网络(FFN)层替换为多个并行的 FFN 网络(即“专家”)。每个专家网络在训练过程中会针对特定类型的数据或任务进行专业化建模,从而提升模型在特定领域的准确性与表达能力。
  2. 门控网络/路由器(Gating Network / Router):这是一个负责动态决策的轻量级网络。当输入向量(Token)进入 MoE 层时,门控网络会根据输入特征计算每个专家的匹配权重(路由分数),从而决定将当前的 Token 分配给哪些专家进行处理。
  3. 稀疏激活与 Top-K 路由(Sparse Activation & Top-K Routing):这是 MoE 架构实现计算效率质变的关键。门控网络并非激活所有专家,而是通过 Top-K 机制,仅筛选出得分最高的 K 个专家(通常 K 取值为 1 或 2)参与当前的前向传播计算。这意味着,尽管模型的总参数量(所有专家参数之和)极其庞大,但每次推理实际激活的计算量(FLOPs)仅占极小比例。

模型模块

归一化方法

大语言模型训练过程中经常会出现不稳定的问题。为了应对这一问题,深度学习方法通常采用归一化策略来加强神经网络训练过程的稳定性。归一化技术可以有效的缓解模型训练过程中潜在的不稳定、收敛速度慢等问题。原始的Transformer 使用的是层归一化(Layer Normalization,LN),随着研究的不断深入,后续又出现了其他归一化方法,如均方根层归一化(Root Mean Square Layer Normalization,RMSNorm)、DeepNorm等。

(1)LayerNorm

在早起的深度学习模型中,广泛采用的是批次归一化(Batch Normalization,BN),然而,BN难以处理可变长度的序列数据和小批次数据。因此,相关研究提出了层归一化这一技术,针对数据进行逐层归一化。具体而言,层归一化会计算每一层中所有激活值的均值 ​\mathbf{\mu} 和方差 ​\mathbf{\sigma},从而重新调整激活值的中心和缩放比例:

\begin{aligned} \text{LayerNorm}(\mathbf{x}) &= \frac{\mathbf{x-\mu}}{\mathbf{\sigma}}\cdot \mathbf{\gamma} +\mathbf{\beta} \\ \mathbf{\mu} &= \frac{1}{H}\sum_{i=1}^{H}x_i \\ \mathbf{\sigma} &= \sqrt{\frac{1}{H}\sum_{i=1}^H(x_i-\mu)^2} \end{aligned}

其中,​H 代表特征的维度,​x_i 代表该层中第 ​i 个特征的数值。

(2)RMSNorm

为了提高层归一化的训练速度,RMSNorm进利用激活值总和的均方根 ​\text{RMS}(\mathbf{x}) 对激活值进行重新缩放。使用RMSNorm 的Transformer 模型相较于之前LayerNorm训练的模型在训练速度和性能上具有一定优势。其计算公式如下:

\begin{aligned} \text{RMSNorm}(\mathbf{x}) &= \frac{\mathbf{x}}{\text{RMS}(\mathbf{x})}\cdot \gamma \\ \text{RMS}(\mathbf{x}) &= \sqrt{\frac{1}{H}\sum_{i=1}^{H}x_i^2} \end{aligned}

(3)DeepNorm

DeepNorm由微软提出,旨在稳定深层Transformer的训练。具体而言,DeepNorm在LayerNorm的基础上,在残差连接中对之前的激活值 ​\mathbf{x} 按照一定比例 ​\alpha 进行放缩。通过这一简单操作,Transformer的层数可以被成功地扩展至1000层,进而有效提升了模型性能与训练稳定性。其计算公式如下:

\text{DeepNorm}(\mathbf{x}) = \text{LayerNorm}(\mathbf{\alpha\cdot x}+\text{Sublayer}(\mathbf{x}))

其中,Sublayer 表示 Transformer 层中前馈神经网络或自注意力模块。

归一化模块位置

为了加强大语言模型训练过程的稳定性,除了归一化方法外,归一化模块的位置也具有重要的影响。归一化模块的位置通常有三种选择:

  • 层后归一化(Post-Layer Normalization,Post-Norm)
  • 层前归一化(Pre-Layer Normalization,Pre-Norm)
  • 夹心归一化(Sandwich-Layer Normalization,Sandwich-Norm)

LayerNorm.svg

(1)Post-Norm

Post-Norm 是在原始Transformer 中使用的一种归一化方法,归一化模块放置于残差计算之后

\text{Post-Norm}(\mathbf{x}) = \text{Norm}(\mathbf{x}+\text{Sublayer}(\mathbf{x}))

在能够顺利收敛的前提下,Post-Norm 的模型最终性能通常比 Pre-Norm 稍微好一点点。但它的缺点是训练难度大,在深层网络中容易导致梯度消失或爆炸,因此必须依赖精心设计的学习率预热等技巧才能正常训练。

(2)Pre-Norm

Pre-Norm 将归一化模块放在每个子层之前

\text{Pre-Norm}(\mathbf{x}) = \mathbf{x} + \text{Sublayer}(\text{Norm}(\mathbf{x}))

Pre-Norm 在模型初始化时就能带来更稳定的梯度,即使不使用复杂的学习率预热(learning rate warm-up)策略,模型通常也能正常训练。梯度可以通过归一化后的激活值更直接地反向传播。

(3)Sandwich-Norm

在Pre-Norm 的基础上,Sandwich-Norm 在残差连接之前增加了额外的 LayerNorm,避免Transformer层的输出出现数值爆炸的情况。

\text{Sandwich-Norm}(\mathbf{x}) = \mathbf{x} +\text{Norm}(\text{Sublayer}(\text{Norm}(\mathbf{x})))

本质上,Sandwich-Norm 可以看作是 Pre-Norm 和 Post-Norm 两种方法的组合。

激活函数

激活函数主要是为神经网络引入非线性变化,从而提升神经网络的模型能力。在大语言模型中,常用的激活函数有:

  • ReLU
  • GeLU
  • Swish
  • SwiGLU
  • GeGLU

其数学形式分别为:

\begin{aligned} \text{ReLU}(\mathbf{x}) &= \max(\mathbf{x,0})\\ \text{GeLU}(\mathbf{x}) &= 0.5\mathbf{x} \otimes \left[1 + \text{erf}\left(\frac{\mathbf{x}}{\sqrt{2}}\right)\right], \quad \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-t^2} dt \\ \text{Swish}(\mathbf{x}) &= \mathbf{x} \otimes \text{sigmoid}(\mathbf{x}) \\ \text{SwiGLU}(\mathbf{x}) &= \text{Swish}(\mathbf{x}_1) \otimes \mathbf{x}_2 \\ \text{GeGLU}(\mathbf{x}) &= \text{GeLU}(\mathbf{x}_1) \otimes \mathbf{x}_2 \\ \end{aligned}

其中,​\otimes 表示逐元素乘法,​\text{erf} 表示误差函数

注意力机制

注意力机制是Transformer 的核心技术,它能够针对序列中的词元对构建交互关系,聚合来自不同位置的语义信息。常见的注意力机制有以下几种:

  • 自注意力机制(Self-Attention):在原始Transformer 中使用的注意力机制。
  • 稀疏注意力机制,如滑动窗口注意力机制(Sliding Window Attention,SWA)。自注意力机制具有较强的建模能力,但是它的计算复杂度较高​O(n^2),在处理长序列时有较大的计算和存储开销。
  • 多查询/分组查询注意力:为了提升注意力机制的效率,多查询注意力提出针对不同的头共享相同的键和值变换矩阵。这种方法减少了访存量,提高了计算强度,能够实现更快的解码速度。

位置编码

参考:

Attention 机制本身对顺序不敏感,具有置换不变性,仅使用注意力机制无法捕捉序列中的顺序关系,因此需要引入位置编码以显式告诉模型 token 的位置信息。

常用的位置编码方式有:

  • 绝对位置编码(Absolute Positional Encoding)
  • 相对位置编码(Relative Positional Encoding)
  • 旋转位置编码(Rotary Position Positional Encoding,RoPE)
  • 基于注意力偏置的位置编码(Attention With Linear Biases,ALiBi)

模型训练

预训练

预训练(Pretraining)阶段需要利用海量的训练数据(数据来自互联网网页、维基百科、书籍、GitHub、论文、问答网站等),构建包含数千亿甚至数万亿单词的具有多样性的内容。利用由数千块高性能GPU和高速网络组成的超级计算机,花费数十天完成神经网络参数训练,构建基础模型(Base Model)。基础模型对长文本进行建模,使模型具有语言生成能力,根据输入的提示词,模型可以生成文本补全句子。

预训练任务

在进行模型的大规模预训练时,往往需要设计合适的自监督预训练任务,使得模型能够从海量无标注数据中学习到广泛的语义知识与世界知识。目前,常用的预训练任务主要分为三类:

  • 语言建模(Language Modeling,LM)
  • 去噪自编 码(Denoising Autoencoding,DAE)
  • 混合去噪器(Mixture-of-Denoisers,MoD)

语言建模

语言建模任务是目前绝大部分大语言模型广泛采用的预训练任务。该任务的核心在于“预测下一个词元”,并且经常被应用于训练 Decoder-only 的大语言模型。给定一个词元序列 ​\mathbf{u} =\{u_1,\cdots,u_T\},语言建模任务的目标定义为词元的预测任务:基于序列中当前位置之前的词元序列 ​\mathbf{u}_{<t} ,采用自回归的方式对于目标词元​u_t进行预测。在训练过程中,模型通常根据以下的损失函数进行优化:

\mathcal{L}_{LM}(\mathbf{u}) = \sum_{t=1}^{T}\log P(u_t |\mathbf{u}_{<t})

尽管这种对下一个词元的预测看似简单,但当于训练数据足够庞大和丰富时,大语言模型便能够学习到自然语言的生成规律与表达模式。

去噪自编码

去噪自编码任务被广泛应用于预训练语言模型,如BERT、T5等。在去噪自编码任务中,输入文本经过一系列随机替换或删除操作,形成损坏的文本​\mathbf{u}/\tilde{\mathbf{u}}。模型的目标是根据这些损坏的文本恢复出被替换或删除的词元片段​\tilde{\mathbf{u}},去噪自编码的损失函数可以用以下数学公式表示:

\mathcal{L}_{DAE}(\mathbf{u}) = \log P(\tilde{\mathbf{u}}|\mathbf{u}/\tilde{\mathbf{u}})

与语言建模相比,去噪自编码任务的实现更为复杂,需要设定额外的优化策略,如词元替换策略、替换片段长度、替换词元比例等。这些策略的选择会直接影响模型的训练效果。

混合去噪器

混合去噪器(Mixture-of-Denoisers, MoD),也被称为 UL2 损失(UL2 loss),是大语言模型预训练中一种先进的统一预训练目标。它的核心思想是将传统的“语言建模”和“去噪自编码”这两大类预训练任务,统一视为不同类型的去噪任务,从而让模型在一次预训练中学习到更全面的能力。

混合去噪器主要定义了三种不同的“去噪器”,让模型在预训练时随机切换学习:

  • S-去噪器(S-Denoising/顺序去噪):其目标与前缀语言建模一致,要求模型根据给定的前缀文本,自回归地生成后续合理的后缀文本。主要训练模型预测下一个词的生成能力。
  • R-去噪器(R-Denoising/常规去噪):类似于标准的去噪自编码任务,它会随机屏蔽输入序列中的词元,且每个被屏蔽的词元片段较短。模型需要利用双向上下文来还原这些被损坏的短跨度信息。
  • X-去噪器(X-Denoising/极端去噪):是一种难度更高的去噪自编码任务,它采用更长的屏蔽词元片段或更高的文本损坏比例。这种高强度的文本数据损坏迫使模型必须学习更深层、更全面的文本表示才能精准还原原始信息。

混合去噪器的一个巧妙设计是引入了“模式切换”的概念。在预训练时,输入文本前会加上特定的哨兵令牌(如 [S][R][X])来告诉模型当前使用的是哪种去噪器。
经过预训练后,模型能够根据下游任务的需求,自适应地在 R、S 和 X 去噪模式之间动态切换,从而在面对不同类型的任务(如文本生成、文本理解、完形填空等)时都能表现出色。

监督微调

如果把大语言模型的预训练比做让模型读万卷书,使其拥有了海量的世界知识和语言基础能力,那么监督微调(Supervised Fine Tuning,SFT),也称为指令微调,就是教它“怎么说话”和“怎么做事”。

在预训练阶段,模型的核心优化目标是“预测下一个词元”,因此当你向一个纯预训练基础模型(Base Model)提问时,它可能会顺着你的话继续向下续写或编造,而不是回答问题。例如,你对Base Model 提问“北京的天气怎么样”时,它很可能不是在回答你,而是在推测“天气怎么样”这句话之后最可能出现的文本——比如“天气怎么样是很多人关心的话题”或者继续编造一段天气预报。

SFT 的核心目标,就是通过高质量的“指令-回答”数据对,让模型学会遵循人类指令: 当用户输入一段文本时,判断这是一个需要回答的问题还是一个需要执行的任务,然后给出有用、准确的回答。

SFT 的核心流程

SFT流程通常包括以下四个核心步骤:

  1. 基座模型选择:选取一个充分预训练的模型作为训练起点。
  2. 数据收集与格式化:收集特定领域或通用的高质量问答数据,并将其整理成模型能理解的格式。常见的格式有:
    • Alpaca格式:包含 instruction(指令)、input(可选的输入文本)和 output(期望的回答)
    • 对话格式(ChatML):包含多轮对话的角色(如 systemuserassistant)和对应内容,贴近真实聊天场景。
  3. 监督微调训练:将格式化后的数据输入模型进行训练。在计算训练损失时,通常只对模型生成的回答部分计算损失,而不计算用户的指令部分,以此引导模型精准输出期望的回答。
  4. 评估与优化:使用验证集评估模型在特定任务上的表现,并根据结果调整超参数。

监督微调利用少量的高质量数据集,通过有监督训练使模型具备问题回答、翻译、写作等能力。监督微调的数据包含用户输入的提示词和对应的理想输出结果。用户输入包括问题、闲聊对话、任务指令等多种形式和任务。

例如:

提示词:Java 的基本数据类型有哪几种?
理想输出:Java 有 8 种基本数据类型,分为 4 大类:整数类型( byte、short、int、long);浮点类型(float、double);字符类型(char)和布尔类型(boolean)。这些类型直接存储值而非对象引用,占用固定内存空间且取值范围明确,是 Java 作为强类型语言的核心基础。

利用这些有监督数据,使用与预训练阶段相同的语言模型训练算法,在基础模型的基础上进行训练,得到监督微调模型(SFT 模型)。SFT模型具备初步的指令理解能力和上下文理解能力,能够完成开放领域问答、阅读理解、翻译、生成代码等任务,也具备了一定的对未知任务的泛化能力。

由于监督微调阶段所需的训练数据量较少,其计算资源消耗也相对较低。根据模型的规模和训练数据量,通常只需要数十块GPU,花费数天时间可完成训练。SFT 模型具备了初步的任务完成能力,可以开放给用户使用。

当前的一些研究表明,监督微调阶段的数据选择对SFT模型效果有非常大的影响,因此构造少量且高质量的训练数据是监督微调阶段的研究重点。

主流微调方法

(1)全参数微调(Full Fine-Tuning)

全参数微调会更新模型的所有参数,这种方法的效果通常最好,但对显存和算力要求较高。

(2)参数高效微调(Parameter Efficient Fine-Tuning,PEFT)

PEFT冻结模型的大部分参数,只训练极少量的新增参数。常见的PEFT方法有LoRA、QLoRA、AdaLoRA、Adapter Tuning、Prefix Tuning、Prompt Tuning。

目前,基于LoRA的方法应用最为广泛,因为LoRA不会显著增加模型的推理延迟。

image-HrEa.png

人类偏好对齐与安全优化

经过预训练(Pretraining)和监督微调(SFT),大语言模型虽然已经具备了强大的通用任务解决能力和指令遵循能力,但这仅仅是让模型学会了“听懂指令”并规范输出。本质上,这两个阶段的训练目标始终是基于上下文预测下一个词元,模型并未真正理解人类的价值观或偏好。因此,它极有可能从海量数据中继承甚至放大不符合人类期望的生成模式,例如生成带有偏见、冒犯性甚至事实错误的文本内容。

这些潜在的有害行为一旦在下游应用中被恶意利用,将产生严重的安全风险与社会危害。为了规避这些风险,研究人员提出了“人类对齐(Human Alignment)”这一关键概念。其核心目的,就是确保模型的行为与人类的真实意图、社会伦理及价值观保持高度一致,即遵循 HHH原则:回答要有用(Helpful)、诚实(Honest)且无害(Harmless)。

目前,人类偏好对齐主要有两个技术范式

  • 基于人类反馈的偏好对齐(Reinforcement Learning from Human Feedback,RLHF)
  • 直接偏好对齐(Direct Preference Optimization,DPO)

RLHF

为了加强大语言模型与人类价值观的一致性,基于人类反馈的强化学习旨在利用收集到的人类反馈数据指导大语言模型进行微调,从而使得大语言模型在多个标准(例如有用性、诚实性和无害性)上实现与人类的对齐。

RLHF 的标准流程通常包含三个严密的阶段:

  1. 监督微调(SFT):首先,使用高质量的“指令-回答”数据对预训练模型进行微调,让模型初步具备遵循指令、听懂人话的能力。
  2. 训练奖励模型(Reward Model, RM):针对同一个问题(Prompt),让 SFT 模型生成多个不同的回答。由人类标注员对这些回答进行排序或打分(比如回答 A 优于回答 B)。利用这些“谁好谁坏”的偏好数据,训练一个独立的奖励模型(RM)。这个 RM 就像一个阅卷老师,它的任务是学会人类的品味,给任意回答打出一个标量分数。
  3. 强化学习微调(通常使用 PPO、GRPO等算法):将 SFT 模型作为“策略网络(Actor)”,把刚刚训练好的 RM 作为“环境/裁判”。模型生成回答后,RM 给出分数。通过 PPO、GRPO等强化学习算法,根据分数来更新模型的参数,鼓励它生成更高分的回答。

RLHF的优缺点:

  • 优点:效果极其强大且稳定,能够精细地控制模型的行为和价值观,是目前工业界的黄金标准。
  • 缺点:工程极其复杂。需要同时加载 Actor、Critic、Reward、Reference 4 个模型,显存占用极大;且 PPO 算法的超参数非常难调,训练过程不稳定且计算资源消耗巨大。

DPO

由于 RLHF 太过复杂,学术界和工业界开始寻找更高效的替代方案,其中 DPO(Direct Preference Optimization) 是目前最成功的简化范式。

DPO 的核心突破在于:它通过精妙的数学推导,绕过了“训练奖励模型”和“复杂的强化学习(PPO)”这两个繁琐的步骤。

  • 核心原理:DPO 证明了最优的语言模型策略与奖励函数之间存在精确的数学映射关系。因此,我们不再需要一个独立的奖励模型来打分,而是直接利用“好回答(chosen)”和“坏回答(rejected)”的成对数据,通过一个简单的分类损失函数来更新模型参数。
  • 训练流程:DPO 的训练流程和普通的监督微调(SFT)几乎一样。它只需要维护两个模型:正在训练的 Actor 和冻结的 Reference(参考模型,即 SFT 模型)。训练时,模型会直接对比好回答和坏回答的概率差异,让模型生成好回答的概率变大,生成坏回答的概率变小。

DPO 的优缺点:

  • 优点:训练极其稳定,计算开销小(和普通的 SFT 差不多,只需 2 个模型),不需要调 PPO 那些复杂的超参数,复现门槛低,性价比极高。
  • 缺点:由于跳过了显式的奖励模型和在线探索,它对偏好数据的质量要求极高。如果数据中有噪声,会直接写入模型策略中;且在面对极其复杂的推理任务时,能力上限通常不如 RLHF(PPO/GRPO)。

模型评估体系

通用能力评测:MMLU, GSM8K, HumanEval等基准测试。

安全与伦理评估:偏见检测、红队测试、隐私泄露风险

推理与部署

模型压缩技术
量化:INT8/INT4量化与GPTQ算法。
剪枝:结构化剪枝与非结构化剪枝。
知识蒸馏:从教师模型到学生模型的迁移。

推理引擎与服务化
PagedAttention:KV Cache的内存分页管理。
连续批处理与流式输出。

参考资料: