Data Efficacy: 用更好的数据组织让大模型运行更好

92 阅读3分钟

最近,来自 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 的你,不如不试试把所有样本排排队呢?