您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center 汽车系统工程   模型库  
会员   
   
软件架构设计方法、案例与实践
10月15日-16日 北京+线上
车载系统功能开发方法与实践
10月25日-26日 北京+线上
SysML和EA进行系统设计与建模
11月19-20日 北京+线上
     
   
 订阅
如何训练你的大模型(LLM)
 
作者:智作工坊
  129   次浏览      7 次
 2025-9-29
 
编辑推荐:
本文介绍了如何训练大模型(LLM)相关内容。希望对你的学习有帮助。
本文来自于微信公众号智作工坊 ,由火龙果软件Alice编辑,推荐。

将一个能输出 “智能感” 的大语言模型(LLM)助手 “塑形”,可类比为一个迭代式的黏土雕塑创作过程:从一块原始黏土开始,先捏出基础结构,再逐步雕琢细节,直至接近最终形态。越接近成品,细微之处的处理越关键 —— 这正是区分 “杰作” 与 “恐怖谷效应产物” 的核心。

在完成前期塑形前,无法着手细节雕琢;同理,若不对 LLM 架构进行预训练,直接投入偏好优化与推理训练,也无法达到预期效果。模型需要具备足够的基础能力,才能获得最低限度的奖励信号,从而朝着合理可控的方向迭代。

这种 “塑形” 过程仍是当前的活跃研究领域,我们尚未完全实现 “超对齐(superaligned)的求真型智能助手” 这一终极目标,但在对 LLM 训练方法论的集体认知上,已取得了巨大进展。

Kimi 与 DeepSeek 的技术论文向业界披露了大量宝贵信息,涵盖 LLM 预训练、监督微调(SFT)与强化学习(RL)的叠加应用 —— 这些技术层的组合能持续提升 LLM 的实用价值。

作为参考,DeepSeek V3 的训练数据量达 14.8 万亿 token,约相当于 1.23 亿本平均篇幅的小说文本总量。从规模上看,谷歌在 2010 年曾估算,人类历史上累计创作的书籍总量约为 1.29 亿本。

上图为大语言模型端到端训练的通用流程。并非所有模型都需经历全部阶段,但最完整的训练流程通常会在预训练后,包含一个或多个训练后阶段与对齐步骤。

模型训练技术:LLM 的 “雕塑工具”

要让 LLM 具备链式推理(CoT)、工具使用等复杂能力,需通过三个相互关联的训练循环实现。

1. 自监督预训练

正如雕塑需先塑形,LLM 若未建立对人类语言的基础认知,便无法实现复杂推理。在引导模型生成对话式交互与推理内容前,需先让其从数据分布中学习生成连贯文本的能力。

第一个训练循环是预训练阶段:通过在跨领域数据上进行大规模自监督学习,为模型构建基础能力与通用先验。模型会摄入来自代码、百科全书、教科书、网页等多源的海量原始文本数据;通过 “文本填空” 式的自监督学习,模型需掌握补全文本的规律,进而理解人类语言的特性。

现代 LLM 训练栈会结合架构与系统层面的优化技巧:

混合专家模型(Mixture-of-Experts, MoE):在不增加稠密模型计算成本的前提下提升模型容量;

多头 latent 注意力(Multi-head Latent Attention, MLA):减少注意力机制的内存占用;

FP8/MuonClip:实现稳定的高吞吐量数值计算;

多 token 预测(Multi-Token Prediction, MTP):优化训练目标密度,支持更快的投机解码(speculative decoding)。

这一阶段的核心是 “规模化教会模型‘语言如何工作’”,同时通过工程优化避免 GPU 过载或损失曲线异常。

2. 训练后微调

第二个训练循环是训练后阶段:为基础模型赋予 “可控性” 与 “风格特性”。团队通常先通过监督微调(SFT) —— 在指令、JSON 格式、工具调用轨迹等数据上训练,让模型学会遵循指令、与用户交互。若不进行微调,LLM 只会无限续写文本、复述训练数据中的 token,无法形成简洁的用户交互;因此需构建 “脚本式对话数据集”,引导模型的 token 生成向 “指令响应” 格式靠拢,这一过程即 “指令微调(Instruction Fine-Tuning)”。

当模型具备对话式响应能力后,可进一步应用更精细的强化学习技术(如直接偏好优化 DPO、组相对策略优化 GRPO),塑造模型的语气、安全性与格式合规性 —— 这正是训练中的 “对齐环节”,目标是让模型输出符合人类需求的内容。

最终,还可针对特定行为施加强化学习:

可验证奖励强化学习

(适用于数学 / 代码 / 格式任务):通过自动评分器为模型的正确输出提供明确奖励;

链式推理(CoT)强化学习

(如 o1/R1 风格):引导模型生成类人类的思考过程与自我反思文本,通过更长的生成序列与推理时计算提升问题解决能力。

3. 工具使用训练

正如推理能力需通过强化学习引导,工具使用能力也是一种 “生成模式”—— 通过微调可让模型更自然地掌握这一能力。

要让 LLM 生成符合系统集成要求的工具调用输出,需进入智能体 / 工具训练循环:模型需学习 “在现实世界中执行任务”。实验室通常会扩大工具调用轨迹的覆盖范围、强制遵守严格格式,并在沙盒环境(浏览器、终端、代码仓库)中训练,填补 “认知” 与 “行动” 的差距。少量联合强化学习(joint RL)可提升工具调用成功率、降低延迟,但可靠性的核心仍依赖高质量轨迹数据与严谨的格式规范。

近期有报道称,OpenAI 的 o3 系列推理模型已成功结合 “工具调用训练循环” 与 “推理微调”,实现了 “推理文本与工具使用自发交替生成” 的能力。

开源领域的两个具体案例可提供实践参考:

DeepSeek-V3:采用 6710 亿参数 MoE 架构(每 token 激活约 370 亿参数),在 14.8 万亿 token 上预训练,结合 FP8 与 MTP 优化训练稳定性与推理速度;

Kimi K2:规模达 1.04 万亿参数 MoE(每 token 激活约 320 亿参数),预训练数据量 15.5 万亿 token,依赖 MuonClip 避免万亿参数 MoE 训练中的损失尖峰,同时通过大规模工具使用数据合成与联合强化学习,重点强化智能体能力。

实践总结:预训练让模型建立一致的语言理解,训练后微调则赋予模型工具使用、推理、对话角色扮演等行为属性。

微调 vs 提示工程

最后一个问题:既然可通过 “向指令微调后的模型提供完整指令集” 实现目标,为何还需额外微调?

核心原因是指令微调的能力存在上限:提示词中的潜在指令空间极其庞大,模型需平衡 “早期工具调用指令” 与 “新数据源的后续信息”,极易导致上下文混乱、注意力分配紧张。

若模型未学习 “如何合理理解所有信息” 及 “何时关注何种信息”,在智能体工具使用场景中会迅速失效。尽管可通过工程手段规避非工具调用模型的局限性,但从效率出发,直接使用 “在指令遵循、推理、工具使用联合场景中获得奖励” 的模型,通常是更优选择。

塑形的 “双手”:数据是什么样的?

LLM 训练中最关键的环节无疑是数据。要实现 “用数据建模语言”,需经历复杂流程:数据获取、存储、标注、切分为固定长度序列后输入模型。

结合我在生物信息学领域的经验,这一过程与 DNA 测序存在机制上的相似性:要读取 DNA 序列,需先通过冗长的预处理流程;测序仪对序列长度与质量也有特定要求,否则无法有效读取数据。

LLM 的数据处理与之类似:为提升效率,需将文本语料切分、质控、标注为固定长度序列,才能在训练中利用规模化并行计算。

上图为数据处理的端到端流程:从 “原始来源” 的多格式数据,到最终转换为 “可载入 Python DataLoader 的 token ID 固定长度序列”。

本文聚焦 “预训练前必需的关键数据处理阶段”:

数据获取(Sourcing):开发爬虫、购买授权、获取公开文本数据集。数据不会来自单一语料库,而是分散于多个来源;且需以 “时间快照” 形式捕获 —— 预训练开始后,模型仅能通过工具使用或上下文工程获取新信息。

提取、标准化与质量校验(Extraction, Normalization, QA):以尽可能高的质量提取文本,这是避免 “垃圾进、垃圾出” 的关键。通常会通过自动化算法从 PDF、HTML 网页、GitHub 代码等来源中提取文本,确保正文无噪声污染。完全无噪声无法实现,但需保证绝大多数数据逻辑通顺 —— 只有这样,模型才能在自监督学习下实现收敛(“稳定训练”)。

标注与结构化(Annotation and Structuring):通过自动化算法遍历清洗后的文本样本,进行标注与存储。通常会添加段落框架、文档长度、格式标注(Markdown、JavaScript、纯文本、HTML)等信息,这些标注既便于训练,也能为团队提供故障排查所需的统计摘要。

切分、分片与填充(Chunking, Sharding, Padding):将文本 “切割” 为带特殊标记的片段(如文档结束符<eod>),tokenize 为数值 ID 后进行填充,确保所有序列长度一致。等长序列便于批量对齐,可同时向训练循环输入多个样本,实现规模化并行训练。

示例 1:文档 schema


{
   "doc_id": "01J2Y2G2F6X9S7J3SYZ3QW6W0N", // ULID/UUID
   "source": {
      "type": "web|book|paper|code|forum|wiki|synthetic",
      "url": "https://example.com/post", // for web
      "repo": "github.com/org/repo", // for code
      "commit": "0f3c1a...", // for code
      "path": "src/utils/math.py" // for code
},
   "title": "A Gentle Intro to FFT",
   "lang": "en", // ISO 639-1
   "script": "Latn", // ISO 15924
   "license": "CC-BY-4.0", // SPDX id or policy bucket
   "created_at": "2023-04-12T09:21:37Z",
   "collected_at": "2025-07-25T14:03:11Z",

   "content": "Plaintext body with paragraphs...\n\n## Section\nText continues...",
      "structure": {
         "format": "markdown|plaintext|html|latex|rst",
         "segments": [
            {"start_char":0,"end_char":128,"type":"paragraph"},
            {"start_char":129,"end_char":180,"type":"heading","level":2},
            {"start_char":181,"end_char":420,"type":"code","lang_hint":"python"}
      ]
},

      "metadata": {
         "domain": "example.com",
         "topics": ["signal_processing","math"],
         "reading_level": 11.2,
         "length_chars": 4231,
         "length_tokens_est": 950
},

   "quality": {
      "ppl_small_lm": 28.7, // perplexity filter signal
      "toxicity": 0.004, // [0,1]
      "pii": {"email":1,"phone":0,"ssn":0}, // counts
      "watermark_prob": 0.01 // LLM-written detector
   },

   "dedup": {
      "raw_sha1": "0e5b4...8f",
      "text_sha1": "a1c2d...9a",
      "simhash": "9b7a3f12",
      "minhash": [121, 9981, 733, 4211, 5901] // 5× 64-bit or more
    },

   "policy_flags": {
       "nsfw": false,
      "copyright_sensitive": false,
      "allowed_for_training": true
   },

   "eval_overlap": {
      "mmlu": 0.0, "gsm8k": 0.0, "humaneval": 0.0 // n-gram/regex decontamination
   },

      "split": "train|val|test"
}

 

示例 2:打包填充后的序列 schema


{
   "sample_id": "01J2Y3AZ7X12P5...",
   "seq_len": 8192,
   "tokenizer": "sentencepiece_v5_en_32k",
   "input_ids": [1017, 42, 1337, "..."],
   "labels_n1": [42, 1337, 9001, "..."], // next-token labels
   "labels_mtp": { // optional for MTP
       "depth": 2,
      "n2": [1337, 9001, 7, "..."] // second-next token labels
   },
   "attn_mask": "...",
   "position_ids": "...",
   "doc_spans": [
      {"doc_id":"01J...W0N","start_tok":0,"end_tok":2500},
      {"separator":"<eod>"},
      {"doc_id":"01J...9KX","start_tok":100,"end_tok":5600},
      {"separator":"<eod>"},
      {"doc_id":"01J...2Q3","start_tok":0,"end_tok":92}
   ],
   "tags": ["web","math","code_block_present"],
   "mix_weight": 0.85, // used by sampler
   "long_context_bucket": 0 // e.g., 0:8k, 1:32k, 2:128k
}

 

预训练:捏塑黏土

我们将通过两个公开预印本案例(DeepSeek 与 Kimi),解析预训练实践。

案例 1:DeepSeek-V3

DeepSeek V3 是6710 亿参数的 MoE 模型,每 token 激活约 370 亿参数。其核心技术特点包括:

MLA 注意力:减少键值对(KV)内存占用,提升内存 / 延迟效率;

无辅助损失的负载均衡(aux-loss-free load balancing);

FP8 混合精度训练:在超大规模下验证稳定性。

该模型的预训练数据量达 14.8 万亿 token;通过架构与工程协同优化,端到端训练总成本(含预训练、上下文扩展、训练后阶段)约为 278.8 万 H800 GPU 小时。

案例 2:Kimi K2

Kimi K2 是1.04 万亿参数的 MoE 模型,每 token 激活约 320 亿参数。其技术亮点包括:

同样采用 MLA 注意力:提升内存效率;

384 个专家节点:每 token 选择 8 个专家激活;

128K 上下文窗口:原生支持长文本处理。

Kimi K2 的预训练数据量为 15.5 万亿 token,通过MuonClip(Muon + QK-Clip) 机制消除万亿参数 MoE 训练中的损失尖峰,并将 “token 效率” 作为核心缩放系数。

与 DeepSeek V3 不同,Kimi K2 的训练后阶段明确聚焦 “智能体能力”:通过大规模工具使用数据合成,在真实与模拟环境中进行联合强化学习。

上下文扩展:应对 “感官过载”

我曾在之前的文章中提到,DeepSeek V3 架构的注意力机制采用旋转位置编码(RoPE) ,用于传递 token 位置的相对信息 —— 这种位置编码是模型区分 “相同 token 在不同输入位置” 的关键。

但 “基于相对距离的训练机制” 也带来一个问题:若输入文本长度超出训练时的最大长度,模型将无法可靠地关注超出范围的文本。

这一问题通过上下文扩展(Context Extension) 解决,可理解为一种 “训练课程”:模型先从短序列(如 8K token)开始学习,再逐步调整以处理更长序列(16K、32K token 及以上)。

前沿模型通常通过 “分阶段课程”(从短到长)扩展至 128K 及更长上下文,过程中需调整位置编码 / 注意力机制,并通过 “针测试(needle test)” 避免长序列性能退化。DeepSeek V3 技术论文提到,其上下文扩展分两阶段:从 8K 到 32K,再到 128K。

Kimi K2 则是一个反例:截至 2025 年 7 月,其技术论文显示,通过 MLA、长序列 RoPE 与 MuonClip,可实现 “128K 上下文原生训练”,无需分阶段扩展。这一一年内的训练创新,可能使此前的长上下文预训练范式过时。

训练后微调:雕琢细节

模型的 “行为特性” 正是在 “训练后阶段” 形成的。训练前,模型只是一个 “文本续写工具”,能 autoregressive(自回归)生成文本、预测下一个 token;训练后,通过监督学习与强化学习,可强制模型形成训练数据中未包含的行为 —— 指令遵循、对话角色扮演、推理、工具使用等能力均在此阶段涌现。

1. 监督微调(SFT)

SFT 本质是 “在精选对话与演示数据上进行教师强制(teacher-forced)的下 token 预测”。其 “奖励” 是隐性的:通过最小化 “期望输出 token” 的交叉熵损失,让模型生成与示例数据完全一致的文本时获得最大奖励。

通过以下方式控制模型的学习方向:

标签掩码

:指定哪些 token 需要标注(如按角色 / 字段掩码损失);

模式频率

:调整特定模式的出现频率(如混合权重、训练课程);

格式约束

:通过数据构建时的验证器,严格强制格式合规。

具体实践中,需将对话序列化为 token,并仅对 “希望模型模仿的部分” 计算损失 —— 通常是助手回复(及工具调用时的函数调用对象),而非用户文本或原始工具输出。

SFT 通常从指令微调开始:这是 SFT 的核心环节,目标是让模型具备 “助手属性”,遵循用户指令与系统提示。指令微调的 SFT 输入数据格式如下:


{
   "id": "sft-0001",
   "system": "You are a concise assistant.",
   "messages": [
      {"role": "user", "content": "Explain dropout in one paragraph."},
      {"role": "assistant", "content": "Dropout randomly zeros units ..."}
   ],
   "loss_mask": {
      "assistant": true, // label these tokens
      "user": false // don't compute loss here
   },
   "tags": ["instruction", "science.explain", "concise"]
}

训练时,结构化数据会被序列化为单一 token 序列,并对 “用户 token” 施加掩码 —— 让模型在对话中模仿助手的行为模式。

ChatML 风格的单字符串对话模板如下:


<BOS>
<|system|>
You are a concise assistant.
<|eot|>
<|user|>
Explain dropout in one paragraph.
<|eot|>
<|assistant|>
Dropout randomly zeros units ...
<|eot|>

需注意,“监督微调” 的命名源于:我们通过 “未掩码 token” 明确提供标签,要求助手生成与标签完全一致的 token,以最小化损失函数。

2. 偏好优化(低成本、稳定控制)

直接偏好优化(DPO) 是一种基于偏好的训练后方法,其学习目标是 “比较结果优劣”,而非 “学习标准答案”。

对每个提示,需提供 “优选回复(chosen)” 与 “弃选回复(rejected)”。训练目标是:让模型的策略(policy)下,优选回复的概率高于弃选回复 —— 且这一概率差需相对于 “固定参考策略(通常是 SFT checkpoint)” 有所扩大。此过程无需 Critic / 奖励模型,也无需 PPO 循环,仅依赖一个稳定的离线目标函数。

与 SFT“教模型‘说什么’” 不同,DPO“教模型‘哪类表达更好’”(如语气、安全性、简洁性、格式准确性)。其优势在于低成本、鲁棒性强、迭代高效。

由于稳定性、灵活性与成本优势,现代训练栈通常会在(或替代)完整的人类反馈强化学习(RLHF)前,优先使用 DPO(或其二元替代方案 KTO)。

DPO 的输入数据格式如下(每个样本):


{
   "id": "dpo-00421",
   "prompt": "<BOS>\n<|system|>\nYou are a concise assistant.\n<|eot|>\n<|user|>\nExplain dropout in one paragraph.\n<|eot|>\n",
   "chosen": "<|assistant|>\nDropout randomly masks units ... (clear, concise)\n<|eot|>\n",
   "rejected": "<|assistant|>\nDropout is a technique that was first... (rambling / off-spec)\n<|eot|>\n",
   "meta": {"reason": "conciseness/style", "source": "human_label"}
}

可见,DPO 基于指令微调的基础 —— 提示词采用模型已理解的 ChatML 序列化格式。

以下 Python 伪代码进一步拆解 DPO 的实现逻辑:


import torch
import torch.nn.functional as F

# This is pseudocode, but require that these exist for a real implementation:
# - dpo_loader: yields batches with fields .prompt_ids, .chosen_ids, .rejected_ids, .assistant_mask
# - policy: trainable model (θ)
# - reference_policy: frozen reference model (θ_ref), typically the SFT checkpoint
# - seq_logprob(model, prompt_ids, response_ids, mask, length_normalize=True): returns
# the sequence log-prob over ONLY the masked assistant tokens (optionally length-normalized)

beta = 0.1 # strength of preference separation

for batch in dpo_loader:
   prompt_ids = batch.prompt_ids # [B, T_prompt]
   chosen_ids = batch.chosen_ids # [B, T_answer]
   rejected_ids = batch.rejected_ids # [B, T_answer]
   assistant_mask = batch.assistant_mask # [B, T_answer] bool (loss only on assistant tokens)

   # --- Sequence log-probs under the current policy (θ) ---
   logp_chosen = seq_logprob(policy, prompt_ids,    chosen_ids, mask=assistant_mask)
   logp_rejected = seq_logprob(policy, prompt_ids, rejected_ids, mask=assistant_mask)

   # --- Sequence log-probs under the frozen reference (θ_ref) ---
   logp0_chosen = seq_logprob(reference_policy,    prompt_ids, chosen_ids, mask=assistant_mask).detach()
   logp0_rejected = seq_logprob(reference_policy,    prompt_ids, rejected_ids, mask=assistant_mask).detach()

   # --- DPO margin: encourage policy to widen    the chosen-vs-rejected gap relative to the reference ---
   margin_current = (logp_chosen - logp_rejected) # under θ
   margin_reference = (logp0_chosen - logp0_rejected) # under θ_ref (no grad)
   z = beta * (margin_current - margin_reference)

   # Numerically stable: -log σ(z) == BCEWithLogits(z, target=1)
   loss = F.binary_cross_entropy_with_logits(z, torch.ones_like(z))

   # Standard optimizer step
   policy.zero_grad(set_to_none=True)
   loss.backward()
   torch.nn.utils.clip_grad_norm_(policy.parameters(), max_norm=1.0) # optional but helpful
   for p in policy.parameters():
      if p.grad is not None and torch.isnan(p.grad).any():
         raise RuntimeError("NaN in gradients")
   policy.optimizer.step()

对每个样本,训练中的模型会因以下行为获得最大奖励:

生成与 “优选回复” 完全一致的文本;

不生成与 “弃选回复” 一致的文本;

生成风格与 “初始参考模型(指令微调后的 SFT checkpoint)” 无过大偏差。

经过足够多样本训练后,新模型 checkpoint 会 “遵循用户偏好” 而非 “仅模仿监督训练数据”,同时保留指令微调习得的核心行为。

通常,融入用户输入对 “打造开放场景下的实用助手” 至关重要 —— 因为指令微调数据集往往是团队内部合成或开源研究的 “预制对话”,而用户输入能让模型更贴合真实需求。

3. 强化学习(RL)

现代训练栈中,强化学习主要应用于两类场景:

可验证目标任务

(数学 / 代码 / 格式):通过自动评分器评估输出;

长程推理任务

(o 系列 / R1 风格):优化推理过程。

为提升效率,两者通常采用 “组相对策略优化(GRPO)” 家族的方法 —— 无需完整的近端策略优化(PPO)+ 价值函数循环,而是通过 “无 Critic 的组相对更新” 实现。

(1)组相对策略优化(GRPO)

GRPO 的核心是 “让模型在自身生成的候选答案中自我评估”—— 通过奖励函数实现,无需提供特定标签。

与 PPO 不同,GRPO 无需单独的 Critic 模型评估性能:先让模型生成多个候选答案,通过自动检查器评分,对得分最高的答案给予奖励。检查器通常是 “作用于生成文本的函数”,例如检查 “是否包含精确答案”“是否通过单元测试”“是否符合数据格式”,有时也会加入 “长度 / 延迟惩罚” 等负奖励。

GRPO 的关键技巧是 “组内相对评分”:候选答案的得分在组内归一化,可 “免费” 获得低方差的优势信号(advantage signal)。无需额外 LLM 计算,因此相比 PPO 大幅降低计算成本。

PPO 风格的裁剪步骤(clipping)可将更新限制在 “信任域(trust region)” 内;序列级、长度归一化的对数概率确保 “整个生成过程” 而非 “仅最后 token” 获得奖励。最终形成一个简洁稳定的可扩展循环:增大组大小可提升信号清晰度,模型会逐步向 “持续通过检查器” 的输出靠拢。

以下 Python 伪代码帮助理解 GRPO 的具体逻辑:


# Hyperparams
group_size = 8 # K
clip_epsilon = 0.2
temperature = 0.8
top_p = 0.95

for prompt in prompt_batch:
    # 1) Propose K candidate completions from the *old* policy
   candidates = sample_candidates(old_policy, prompt, group_size,
temperature=temperature, top_p=top_p)

   # 2) Score each candidate with your programmatic reward function
   rewards = [compute_reward(prompt, completion) for completion in candidates]

   # 3) Group-relative advantages (z-score within the K samples)
   advantages = zscore(rewards) # (r_i - mean) / (std + eps)

   # 4) Policy-gradient update with PPO-style clipping (sequence-level, length-normalized)
   for completion, advantage in zip(candidates, advantages):
      logprob_new = sequence_logprob(policy, prompt, completion,
mask="assistant", length_normalize=True)
      logprob_old = sequence_logprob(old_policy, prompt, completion,
mask="assistant", length_normalize=True).detach()

      likelihood_ratio = torch.exp(logprob_new - logprob_old)
      loss += -torch.clamp(likelihood_ratio, 1 - clip_epsilon, 1 + clip_epsilon) * advantage

   optimizer.zero_grad()
   loss.backward()
   optimizer.step()

   # 5) Trust-region bookkeeping (standard PPO-style: refresh the old policy)
   old_policy.load_state_dict(policy.state_dict())

(2)可验证奖励强化学习

若能编写 “自动判断答案是否‘正确’的程序”,便可低成本、安全地规模化 RL。通常,万亿参数的前沿模型需数百万样本、数亿次尝试(“候选轨迹”)、万亿 token 生成量,才能显著改变行为 —— 这意味着 “人工检查每个训练轨迹” 完全不可行。“可验证奖励” 的核心是 “通过自动化方式判断模型模拟任务的完成情况”。

与 SFT/DPO(纯离线训练)不同,RL 任务由 “提示词 + 评分器” 构成:每个样本包含 “任务提示”(如完成任务、解决问题),其结果可通过程序验证。

代码任务:生成的函数需通过单元测试、代码检查等程序化验证;

数学任务:答案中需包含特定表达式(如方程、引理、证明解释)的精确匹配。

以下为数学与代码任务的最小 JSON 样本示例:

数学任务


{
   "id": "rl-math-0007",
   "prompt": "<BOS>\n<|system|>Answer with just the number.<|eot|>\n<|user|>What is 37*91?<|eot|>\n",
   "rewarders": [
      {"type": "exact_answer", "target": "3367"},
      {"type": "format_regex", "pattern": "^[0-9]+$"},
      {"type": "length_penalty", "alpha": 0.001}
   ]
}

代码任务


{
   "id": "rl-code-1031",
   "prompt": "<BOS>\n<|system|>Write a Python function solve() that reads stdin and prints the answer.<|eot|>\n<|user|>Given N, output the sum 1..N.<|eot|>\n",
   "rewarders": [
      {"type": "unit_tests", "tests":       ["tests/sum_to_n_*.txt"], "timeout_ms": 2000},
      {"type": "runtime_penalty", "beta_ms": 0.0005},
      {"type": "format_regex", "pattern": "def solve\\("}
   ],
      "sandbox": {"image": "py3.11", "mem_mb": 512}
}

奖励函数是 “作用于生成文本的程序”,目标是 “对符合人类预期的结果给予高奖励,对偏离预期的结果施加惩罚”。

需注意:模型对齐(model alignment) 研究的核心正是 “奖励函数与预期行为的匹配度”。实现 “真正对齐” 往往颇具挑战 —— 模型可能通过 “奖励黑客(reward hacking)” 获取高奖励,却未真正符合人类预期。例如:

数学任务中,模型仅记忆公式却不展示推导过程;

代码任务中,函数仅 “刚好通过单元测试”,但缺乏工程鲁棒性(如未处理边界情况)。

(3)链式推理强化学习(o 系列 / R1 风格)

要优化 “长程问题的最终正确性”(及基础格式约束),需让模型将 “深度内部计算” 内化为核心行为。实现方式是:仅对 “最终正确性” 给予奖励,让 LLM 自主学习复杂问题的结构化推理模式。

推理微调是 “可验证奖励 RL” 的子集 —— 不针对 “分步行为” 给予奖励,仅提供 “最终正确性信号”。这一阶段相当于 “撤去训练轮”:模型需自主学习 “如何到达最终奖励”,而非依赖分步指导。

通常会增加两个优化方向:

语言 / 格式奖励

:例如 “用英文回答;最后一行以‘Final Answer: ...’结尾”;

过程塑造(可选)

:对 “通过中间检查” 的行为给予小额奖励(如子目标完成、无工具推导),但推理时不暴露分步解决方案。

DeepSeek 的 R1 模型证明:基于 “强预训练基础”(无 SFT 冷启动)的纯推理 RL,可激发长程推理能力。后续团队通过 “小规模 SFT + 再一轮 RL” 优化模型,并将 R1 的推理能力蒸馏回对话模型。OpenAI 的 o1 系列模型也以 “大规模推理 RL” 为核心,强化隐性链式推理能力。

以下为 GRPO 框架下 CoT 训练的样本示例:


{
   "id": "rl-reason-2203",
    "prompt": "<BOS>\n<|system|>Provide only the final numeric answer after thinking.\n<|eot|>\n<|user|>If f(x)=..., compute ...<|eot|>\n",
   "rewarders": [
      {"type":"equality_modulo","target":"(2*sqrt(3))/5"},
      {"type":"format_regex","pattern":"^Final Answer: "},
      {"type":"language","lang":"en", "gamma": 0.05}
   ],
      "sampling": {"K": 8, "temp": 0.9}
}

可见,其 schema 与 “可验证奖励 RL” 相似,但任务难度更高 —— 需模型通过 “内部逻辑” 自主推导最终答案。在可验证奖励场景中,模型可能 “直接生成答案而不推理”;但推理训练的目标是 “设计非标准长程任务”,迫使模型通过 “推理独白” 获取奖励。LLM 从未被 “明确教授如何生成推理过程”,但为了在这类任务中获得奖励,推理过程会自然涌现。

这类任务的数据集需更精细的筛选,且模型每样本生成的 token 量通常远多于 “可验证奖励数据集”。

需注意:你可能已发现 “推理 RL” 与 “可验证奖励 RL” 的诸多相似性。超对齐(superalignment) 研究的一个分支正是 “不可验证奖励”—— 即如何为 “新颖发现与推理” 设计奖励,而这类任务无法通过简单程序验证。要在数亿次轨迹中为数百万样本实现这一目标,现有方法仍存在显著局限,这也是当前训练后研究的前沿方向。

让 LLM 与现实世界交互:工具使用

“工具使用对齐” 的核心工作发生在 RL 之前:先教会模型 “格式与轨迹”,再通过强化学习优化细节。

首先需在 SFT 阶段植入 “工具使用直觉”:添加 “需生成特定工具调用格式(通常为 XML 或 JSON)” 的样本,并在对话中新增 “工具角色”,用于捕获工具的现实反馈。

总体目标是:让模型学会 “生成符合格式的结构化输出”,以与环境中的程序、集成系统或代码(即 “工具”)交互,并让这一能力泛化到 “任意工具与格式”。通过指令微调,模型需能基于 “用户自定义提示”,遵循特定业务场景的工具格式要求。

以下为 “外汇汇率查询” 工具的 SFT 样本示例(JSON 格式):


{
   "id": "sft-tool-0219",
   "system": "You can call tools. Prefer JSON answers.",
   "tools": [{"name":"fx.lookup","schema":"fx.lookup.input_schema"}],
   "messages": [
      {"role":"user","content":"What's the EUR→CAD rate right now?"},
      {"role":"assistant","tool_call":{"name":"fx.lookup","arguments":{"base":"EUR","quote":"CAD"}}},
      {"role":"tool","name":"fx.lookup","content":{"rate":1.47,"timestamp":"2025-08-09T10:22:01Z"}},
      {"role":"assistant","content":"{\"pair\":\"EUR/CAD\",\"rate\":1.47}"}
   ],
    "loss_mask": {
      "assistant.tool_call": true, // learn name+args JSON
      "assistant.text": true, // learn final summary/JSON
      "user": false,
      "tool.content": false // don't memorize raw tool output
   }
}

该样本会被序列化为以下格式,模型需精确学习 “助手消息” 的生成:

<BOS>
<|system|> You can call tools. Prefer JSON answers. <|eot|>
<|user|> What's the EUR→CAD rate right now? <|eot|>
<|assistant|><|tool_call|>{"name":"fx.lookup","arguments":{"base":"EUR","quote":"CAD"}}<|eot|>
<|tool|><|fx.lookup|>{"rate":1.47,"timestamp":"2025-08-09T10:22:01Z"}<|eot|>
<|assistant|>{"pair":"EUR/CAD","rate":1.47}<|eot|>

随后,通过 “沙盒环境中的 GRPO 强化学习” 优化细节:


{
   "id": "rl-tool-0817",
   "prompt": "<BOS>\n<|system|>Use tools only if needed. Respond in JSON.\n<|eot|>\n<|user|>What's the current EUR→USD rate?\n<|eot|>\n",
   "tools": ["fx.lookup"],
   "environment": {
      "sandbox": "http",
      "rate_limits": {"fx.lookup": 5},
      "secrets_policy": "none_leak"
    },
    "rewarders": [
      {"type":"tool_success", "name":"fx.lookup", "checker":"value_in_range", "range":[1.3,1.7], "weight":1.0},
      {"type":"schema_valid", "target":"assistant_json", "weight":0.2},
      {"type":"latency_penalty", "beta_ms":0.0003},
       {"type":"no_op_penalty", "delta":0.1}, // punish unnecessary calls
      {"type":"arg_semantics", "rule":"base!=quote", "weight":0.2}
   ],
   "limits": { "max_calls": 2, "max_tokens": 512 }
}

工具使用 RL 的最大挑战是 “为现实工具调用场景设计清晰可验证的奖励”—— 这并非总能实现。因此,奖励函数数量需增加,以 “约束模型行为”,使其符合人类对 “现实环境集成” 的预期。

现实世界的复杂性导致 “奖励黑客路径” 远多于 “合法完成路径”—— 用户常观察到模型的 “角色扮演式工具使用”:模型学会 “非真实路径获取奖励”,却未准确表达核心逻辑与环境约束。

这正是训练后研究的前沿:领域仍存在大量未知。个人观点是,AI 能力的下一次突破不会来自 “更多计算资源或预训练规模”,而在于 “持续优化训练后流程”—— 避免奖励黑客,引导模型通过 “对齐的真实路径” 获取奖励。

案例研究 1:DeepSeek-V3 的 RL 与蒸馏

DeepSeek-V3 是6710 亿参数 MoE 模型,每 token 激活约 370 亿参数,核心架构围绕 “多头 latent 注意力(MLA)” 设计,以实现内存高效的上下文处理,并采用 “多 token 预测(MTP)” 目标。MTP 的关键价值在于:模型可预测连续两个 token;投机解码时,第二个 token 的接受率约 85-90%,这意味着推理时的 token 生成速度可提升约 1.8 倍,且无质量损失。可类比为 “合法‘预判’未来 token,并兑现大部分收益”。

规模上,V3 的预训练数据量达 14.8 万亿 token,端到端训练总成本约 278.8 万 H800 GPU 小时(已包含长上下文扩展与训练后阶段)。训练栈采用 FP8 混合精度,在超大规模训练中平衡成本与稳定性。这并非简单 “调大参数”—— 论文强调 “训练稳定性”(无不可恢复的损失尖峰)与 “清晰的基础设施方案”,这是实现超大规模训练的关键。

训练后阶段是 V3 “个性与推理能力” 的来源:团队先进行监督微调与强化学习,再将 R1 系列模型的推理能力蒸馏回对话模型。具体流程是:直接在预训练基础模型上通过 RL 强化推理(无 SFT 冷启动),再将这些能力压缩回基础模型 —— 通过 “RL 优化基础模型→更优基础模型支持更复杂 RL” 的迭代循环,实现能力持续提升。

案例研究 2:Kimi K2 的智能体工具使用

Kimi K2 的定位是 “智能体模型”,而非纯对话模型。其底层是1.04 万亿参数 MoE,每 token 激活约 320 亿参数,采用 MLA 注意力;架构通过 “稀疏性优化” 平衡吞吐量与性能 —— 专家节点总数增至 384 个(每 token 激活 8 个),注意力头数减至 64 个(相较于 V3),这一权衡在 “稀疏性缩放律” 下可降低吞吐量损失,同时改善验证损失。K2 的原生上下文窗口为 128K token。

K2 的核心创新是MuonClip:结合 Muon 机制与 QK-Clip(查询 / 键投影重缩放),避免注意力 logit 爆炸,使其能在 15.5 万亿 token 上完成预训练,且无损失尖峰。若你曾经历过 “万亿规模训练因少量注意力头异常导致崩溃”,便知这一务实优化的价值 —— 既保留 Muon 的 token 效率,又确保训练稳定。

训练后阶段的核心是 “规模化工具使用”:

构建大规模 “合成 / 真实智能体数据集” 流水线,生成工具规范、多轮轨迹、评分标准;

应用 “联合 RL”:结合 “可验证奖励”(调用是否成功?JSON 是否合规?)与 “自我评估标准”,塑造静态轨迹无法覆盖的行为。

团队还公开了 “函数调用 token 模板”,并描述了 “约束解码器(enforcer)”—— 可确保生成时的工具调用严格符合声明格式,这对 “解决工具调用格式脆弱性” 极具参考价值。

最终,K2 的交付形态接近产品级:开源了基础模型与指令微调模型的 checkpoint(块 FP8 格式),并提供 vLLM、SGLang、TensorRT-LLM 的部署示例,缩短了 “验证 / 生产部署” 的路径。若现有技术栈支持 OpenAI/Anthropic 风格 API,其仓库还提供了兼容性细节与温度参数映射方案。

一页可视化总结

总结

若将 LLM 比作雕塑,预训练是 “捏塑黏土基础”,训练后微调是 “雕琢细节与赋予个性”。构建 LLM 绝非易事:需充足资源、数据访问权限、计算能力与人力投入。

LLM 训练的完整流程可概括为:

从多源(网页、代码、百科、书籍)采集多样化数据;

进行质量校验与预处理,组装为带标注的片段;

预训练阶段:通过自回归自监督学习,赋予模型语言建模能力;

监督微调阶段:通过指令微调,赋予模型对话与工具使用行为;

强化学习阶段:通过可验证奖励(如数学、代码)优化性能;

推理强化学习阶段:聚焦 “最终结果”,强化复杂推理与高级工具使用能力。

通过 “迭代循环 + 蒸馏优化基础模型”,可实现 LLM 行为的持续改进与细化。

尽管流程复杂,仍存在显著局限:

奖励黑客普遍存在

:超大规模下,数百万样本的鲁棒监督难以实现。我们依赖 “可验证奖励” 塑造复杂行为,但现实世界中 “人类预期的低可量化任务” 仍大量存在,模型在这些任务中的表现往往不佳。

长程任务的推理一致性问题

:通过 “最终结果奖励” 强制推理时,模型未必采用 “逻辑一致的推理路径”。尽管 “链式推理” 是常见涌现模式,但研究显示(参考此处与此处),CoT 推理在 “分布外任务” 中易失效 —— 推理可能陷入循环、逻辑流程不一致,甚至 “通过错误理由得出正确结论”,而超大规模训练中难以全面评估这类问题。

不可验证奖励的挑战

:要让模型 “拓展人类知识边界”,需为 “新颖发现与推理” 设计奖励。但在数亿次轨迹中为数百万样本实现这一目标,现有方法仍存在显著不足 —— 这是超对齐研究的活跃方向。

人类在智能机器开发上已取得巨大进展:仅几年前,“能处理多样化人类文本输入的对话机器人” 仍难以想象。前方的挑战是 “在大量次优代理模型中找到真正的对齐”。

当前 AI 用户的核心痛点是 “模型缺乏人类的‘求真意图’”—— 人类会 “深入探究问题本质,通过确凿证据验证解决方案”,而模型尚未具备这一特质。如何 “规模化定义奖励”,激励模型实现这一行为,仍是极具挑战性的课题。

令人振奋的是,现有架构已具备 “建模多模态输入与多语言文本” 的复杂能力 —— 这表明我们已达到 “实现突破的规模门槛”。后续工作需依赖 “人类智慧的持续探索”,通过创新逐步缩小 “万亿维空间中的搜索范围”,最终找到最优策略。

   
129   次浏览       7 次
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践

最新活动计划
基于模型的数据治理与中台 11-11[北京]
软件架构设计方法、案例实践 11-13[北京]
OCSMP 认证培训课程 11-18[北京]
UML与面向对象分析设计 11-25[北京]
SysML和EA系统设计与建模 11-19[北京]
车载系统功能开发方法与实践 10-25[北京]
 
 
最新文章
AIGC技术与应用全解析
详解知识图谱的构建全流程
大模型升级与设计之道
自动驾驶和辅助驾驶系统
ROS机器人操作系统底层原理
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
成功案例
某综合性科研机构 人工智能与机器学习
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow
某领先数字地图提供商 Python数据分析
中国移动 人工智能、机器学习和深度学习