Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.5.1 预训练目标与数据构成

学习导航

  • 本章主题:2.5.1 预训练目标与数据构成
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:41-61 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

大模型训练的第一阶段是预训练。核心任务不是“学会某个单一任务”,而是通过海量数据学习通用表示与条件生成能力。

2.5.1.1 自回归目标与多模态扩展

语言模型最常见目标是 next-token prediction:

\[ \mathcal{L}{\text{AR}}(\theta) = -\sum{t=1}^{T}\log p_\theta(x_t\mid x_{<t}). \]

在 VLA 场景中,可以把文本、视觉 token、动作 token 拼接成统一序列,仍然使用相同的自回归损失。这样做的好处是训练目标统一,坏处是不同模态的统计特性差异很大,容易出现“强模态压制弱模态”(通常是文本压制动作)。

2.5.1.2 数据混合策略(Data Mixture)

预训练数据通常由多来源组成:

  1. 通用文本语料。
  2. 图文对齐数据。
  3. 机器人示教轨迹与状态-动作序列。

常见做法是设置混合权重:

\[ \mathcal{L} = \lambda_{\text{text}}\mathcal{L}{\text{text}} + \lambda{\text{vl}}\mathcal{L}{\text{vl}} + \lambda{\text{act}}\mathcal{L}_{\text{act}}. \]

工程上不要只看总 loss。建议分别记录每个子损失与每类样本占比,否则很难定位“模型退化到底来自哪一类数据”。

2.5.1.3 数据质量控制

预训练阶段,数据质量常比模型结构更关键。建议最少做三类清洗:

  1. 去重:减少重复样本导致的过拟合和记忆偏差。
  2. 规则过滤:去除损坏样本、错配图文、越界动作。
  3. 分布校验:保证任务、机器人、场景覆盖不过度偏斜。

2.5.2 训练基础设施与稳定性

当模型规模上升后,“能否稳定训练”本身就是主要挑战。

2.5.2.1 全局批量、学习率与 warmup

大模型通常使用较大的全局 batch,并配合 warmup + 衰减调度。一个常见策略是:

  1. 前若干 step 线性 warmup 到目标学习率。
  2. 中后期使用 cosine decay 或分段衰减。

如果 batch、学习率、梯度累计步数不一致地变动,训练曲线会明显抖动,甚至出现 loss 突然发散。

2.5.2.2 混合精度与分布式训练

在大模型训练中,BF16/FP16 与分布式并行几乎是必需项:

  1. 数据并行:提升吞吐。
  2. 张量并行:切分大矩阵计算。
  3. 流水线并行:切分层级降低显存峰值。

无论采用何种并行方式,都建议固定记录以下信息:

  1. 有效 tokens/s。
  2. 每卡显存峰值。
  3. 梯度范数与 loss scale。

2.5.2.3 稳定训练的最小防线

最常见的稳定性手段:

  1. 梯度裁剪:

\[ g \leftarrow g \cdot \min\left(1, \frac{\tau}{|g|}\right) \]

  1. 激活与 loss 的 NaN 监控。
  2. 周期性 checkpoint 与自动恢复。

在机器人场景中,训练稳定性直接影响后续真实部署安全性。离线训练阶段若存在不稳定区间,往往会在在线推理时放大为异常动作。


2.5.3 指令微调与参数高效微调

预训练得到的是“通用能力”,微调阶段才决定它“听谁的话、做什么事”。

2.5.3.1 监督微调(SFT)

SFT 的核心是用高质量指令-响应(或观测-动作)对模型进行任务对齐:

\[ \mathcal{L}{\text{SFT}} = -\sum_t \log p\theta(y_t\mid y_{<t}, x). \]

其中 (x) 可以是文本指令、图像与状态,(y) 可以是文本动作描述或离散动作 token。

2.5.3.2 LoRA / QLoRA

LoRA 将权重更新写成低秩分解:

\[ \Delta W = BA, \]

其中 (A\in\mathbb{R}^{r\times d})、(B\in\mathbb{R}^{k\times r}),(r\ll\min(k,d))。

优势:

  1. 可训练参数少。
  2. 显存压力小。
  3. 可快速多任务切换(不同 adapter)。

QLoRA 在低比特量化基座模型上做 LoRA,可进一步降低资源消耗,适合实验室级 GPU 资源。

2.5.3.3 微调数据的设计原则

比“数据量大”更重要的是“任务边界清晰”:

  1. 指令表达尽量一致,减少同义混乱。
  2. 失败样本要保留并标注,避免模型只学习“理想轨迹”。
  3. 多机器人数据要显式带 embodiment 条件。

2.5.4 偏好对齐与安全约束

SFT 之后,模型通常还需要偏好对齐,减少“看起来合理但不安全”的输出。

2.5.4.1 偏好学习基本范式

常见方式是收集成对偏好样本 ((y^+, y^-)),让模型更偏好高质量行为。

两条主路线:

  1. 奖励模型 + RL(RLHF)。
  2. 直接偏好优化(如 DPO)。

2.5.4.2 DPO 直观理解

DPO 可以在不显式训练奖励模型的情况下,直接优化偏好对比目标。它在实现复杂度与稳定性上通常优于完整 RLHF 流程,适合工程落地。

对机器人系统而言,偏好并不只包含“任务完成”,还应包含:

  1. 动作平滑。
  2. 安全距离。
  3. 对约束指令的服从性。

2.5.4.3 安全数据与红队测试

对齐阶段建议单独构建安全集:

  1. 危险指令样本。
  2. 传感器异常样本。
  3. 边界动作样本(速度/力矩/关节限位附近)。

上线前应做红队测试:用“高风险输入组合”反复压测,而不是只看常规 benchmark 分数。


2.5.5 评测、压缩与部署前准备

训练结束不代表可部署。最后一步是验证“性能、成本、安全”三者平衡。

2.5.5.1 分层评测指标

建议分三层评测:

  1. 离线指标:困惑度、token 准确率、回归误差。
  2. 仿真指标:任务成功率、轨迹质量、恢复能力。
  3. 在线指标:延迟、稳定性、异常率、安全触发率。

2.5.5.2 模型压缩与蒸馏

常见压缩路径:

  1. 量化(8bit/4bit)。
  2. 蒸馏(teacher-student)。
  3. 结构裁剪(层数/宽度/头数)。

实践中通常先蒸馏再量化,避免精度损失过大。

2.5.5.3 部署前检查清单

建议在部署前完成以下清单:

  1. 固定随机种子可复现。
  2. 关键实验可一键重跑。
  3. 推理延迟满足控制频率预算。
  4. 安全过滤器与急停策略已联调。
  5. 失败案例库已建立并可回放。

到这一步,2.5 章节的核心目标才算达成:你不仅“训练了一个大模型”,而且建立了可复现、可评测、可部署的完整微调流水线。


2.5 小结

  1. 预训练阶段决定上限,微调阶段决定行为边界。
  2. 训练稳定性、数据质量、偏好对齐是三根主线。
  3. 真实机器人部署前,必须把性能指标和安全指标同等对待。

2.5.6 参考阅读(集中)

  1. Transformer 原始论文:https://arxiv.org/abs/1706.03762
  2. LoRA:https://arxiv.org/abs/2106.09685
  3. QLoRA:https://arxiv.org/abs/2305.14314
  4. DPO:https://arxiv.org/abs/2305.18290
  5. RLHF 概览:https://arxiv.org/abs/2203.02155

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。