最近,来自 Microsoft Research 的一篇新论文 "Data Efficacy for Language Model Training",揭示了训练大语言模型时一个常被忽视的问题:
训练数据本身的排序,对于模型效果的影响有多大?
尽管大多数旧有研究都集中在“数据效率 (data efficiency)”上,却少有对“数据效能 (data efficacy)”进行深入探索。而这次,论文提出了一种新的经验策略和基础框架— DELT (Data Efficacy for LM Training),用于最大化训练效果而不增加计算或数据量。
一、论文总览
论文提出:当大模型训练次数并不多 (e.g. 1 epoch),那么数据的 排序和组织方式,就展现出极大的优化空间。
为此,论文提出一个经典框架 DELT(Data Scoring → Data Selection → Data Ordering):
- ✏️ Data Scoring: 给每个样本打分,基于难度、质量、多样性或可学性
- ✏️ Data Selection (optional): 可选场景下,优先选出最有效样本
- ✏️ Data Ordering: 按分数排序,并用 Folding Ordering 替代随机打乱
二、两大核心技术细节
1) Learnability-Quality Scoring (LQS)
新的样本打分方法,经考虑:
- 可学性 Learnability: 样本随训练推进而降低 loss 的能力
- 质量 Quality: 样本的梯度方向是否符合全局目标
LQS 总结为一个分数,用于指导后续的 selection 和 ordering。
2) Folding Ordering
进化版 curriculum learning:考虑不是单次排序,而是将排序给分成 L 个 fold,往处均包括高低分数样本,避免:
- 模型遗忘 (总看难题)
- 数据分布偏向
- 重复样本带来的 overfitting
三、实际应用场景
| 场景 | 应用意义 |
|---|---|
| 【预训练】资源缺降时 | 提升训练效率,降低epoch数要求 |
| 【微调】指令应答、编程等 | 使少量数据展现更好效果 |
| 【多域/多任务】 | 避免某一域数据支配全场 |
| 【数据混杂】含有 AI 生成 | 缓解 AI self-contamination 效应 |
| 【RLHF/偏好学习】 | 从精制样本开始学,澄清形成偏好 |
四、最小可运行 demo (基于 PyTorch)
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, Dataset
import numpy as np
# 1. 构造虚拟数据
class ToyDataset(Dataset):
def __init__(self):
self.data = [(torch.randn(10), torch.tensor([1.0])) for _ in range(100)]
def __len__(self): return len(self.data)
def __getitem__(self, idx): return self.data[idx]
# 2. 简单 MLP 模型
model = nn.Sequential(
nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1)
)
# 3. LQS 打分:根据样本的随时挑战性 (跑几次 forward+backward)
@torch.no_grad()
def compute_lqs(model, dataset):
scores = []
for x, y in dataset:
x = x.unsqueeze(0)
model.zero_grad()
y_pred = model(x)
loss = (y_pred - y).pow(2).mean()
grad = torch.autograd.grad(loss, model.parameters(), retain_graph=False, create_graph=False, allow_unused=True)
total_grad_norm = sum(g.norm().item() for g in grad if g is not None)
scores.append(total_grad_norm)
return scores
# 4. 排序 + Folding
scores = compute_lqs(model, ToyDataset())
sorted_indices = np.argsort(scores)
folded_order = np.concatenate([sorted_indices[i::3] for i in range(3)]) # L=3 folding
# 5. 按 folded_order 进行训练
train_data = ToyDataset()
folded_loader = DataLoader([train_data[i] for i in folded_order], batch_size=16)
optimizer = torch.optim.Adam(model.parameters())
for epoch in range(3):
for x, y in folded_loader:
pred = model(x)
loss = (pred - y).pow(2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
结论
这篇论文认真对待一个常被忽视的经验问题:训练数据的排序方式。DELT 框架和其里面的 LQS 和 Folding 技术,在不增加数据或计算成本的前提下,进一步提升了 LLM 的训练效果。
对于正在训练或微调自己 LLM 的你,不如不试试把所有样本排排队呢?