数据飞轮:协同训练中的数据循环

各位同学,今天我们来聊一个很有意思的话题——数据飞轮。说白了,就是让SFT数据和RLHF数据互相“喂”对方,形成一个正向循环。

我在做第一个大模型项目时,犯过一个典型的错误:把SFT和RLHF当成两个完全独立的阶段。SFT数据收集一批,训完就扔了;RLHF再重新收集偏好数据。结果呢?两套数据之间没有任何关联,模型学到的知识是割裂的。后来我意识到,这其实是在浪费数据价值。

为什么需要数据飞轮?

先想一个问题:SFT阶段我们教模型“怎么回答”,RLHF阶段我们教模型“什么回答更好”。这两个目标其实高度相关。

  • SFT数据:告诉模型“正确的输出长什么样”
  • RLHF数据:告诉模型“多个输出中哪个更优”

你想想看,如果能把RLHF中发现的“好回答”反哺给SFT,或者把SFT中模型容易犯错的地方收集起来做RLHF的偏好数据,是不是就能事半功倍?

核心观点:数据飞轮的本质,是让两个训练阶段的数据产生“化学反应”,而不是各自为战。

数据飞轮的核心流程

我习惯把数据飞轮分成四个步骤,你可以把它想象成一个闭环流水线:

  1. SFT数据生成:人工标注或从高质量语料中提取问答对
  2. 模型初训:用SFT数据训练基础模型
  3. RLHF数据采集:让模型生成多个回答,人工或自动排序
  4. 数据回流:将RLHF中的优质回答转化为SFT数据,将SFT中的困难样本转化为RLHF偏好数据

嗯,这里要注意:第4步是关键。很多团队做到第3步就停了,觉得RLHF训完就结束了。其实真正的价值在第4步。

如何用SFT数据增强RLHF?

我在项目中遇到过这样一个场景:SFT阶段我们有一批高质量的客服对话数据,但RLHF阶段需要的是“多个回答的偏好排序”。直接拿SFT数据做RLHF?不行,因为SFT数据只有“正确答案”,没有“错误答案”。

那怎么办?我分享一个我常用的方法:

# 伪代码:从SFT数据生成RLHF偏好数据
def generate_preference_from_sft(sft_data, model):
    preference_pairs = []
    for question, correct_answer in sft_data:
        # 让模型生成多个候选回答
        candidates = model.generate(question, num_return_sequences=5)
        # 用正确回答作为“好回答”
        good_answer = correct_answer
        # 从候选回答中选一个差异大的作为“差回答”
        bad_answer = select_most_different(candidates, good_answer)
        preference_pairs.append((question, good_answer, bad_answer))
    return preference_pairs

说白了,就是把SFT中的“标准答案”当作RLHF中的“正样本”,再让模型自己生成一些“负样本”。这样一套SFT数据就能同时服务两个阶段。

小技巧:选择负样本时,不要选太差的,否则模型学不到细微差别。我一般选排名中间偏下的回答作为负样本。

如何用RLHF数据增强SFT?

反过来,RLHF数据也能反哺SFT。我曾经遇到一个情况:RLHF阶段我们发现,模型在某些问题上总是生成“正确但啰嗦”的回答。人工标注员给这些回答打了低分,但SFT阶段我们从来没教过模型“简洁也是一种美德”。

解决方案很简单:把RLHF中得分最高的回答,直接加入SFT数据集。这样SFT阶段就能学到“什么是更好的回答”。

# 伪代码:从RLHF数据提取优质回答加入SFT
def extract_good_responses_from_rlhf(rlhf_data, top_k=0.1):
    # 按偏好得分排序
    sorted_data = sorted(rlhf_data, key=lambda x: x.score, reverse=True)
    # 取前10%作为新的SFT数据
    new_sft_data = [(item.question, item.best_answer) for item in sorted_data[:int(len(sorted_data)*top_k)]]
    return new_sft_data

你想想看,这样做的好处是什么?RLHF数据是“经过人类偏好筛选”的,质量往往比原始SFT数据更高。用这些数据扩充SFT数据集,相当于给模型喂了更多“精品”。

数据飞轮的迭代策略

在实际项目中,我一般会做3-5轮数据飞轮迭代。每轮迭代的流程如下:

迭代轮次 SFT数据来源 RLHF数据来源 预期效果
第1轮 人工标注 从SFT数据生成 基础能力达标
第2轮 第1轮RLHF优质回答 模型生成+人工排序 回答质量提升
第3轮 第2轮RLHF优质回答 模型生成+自动排序 效率大幅提升
第4轮 线上真实用户数据 线上用户反馈 对齐真实需求
第5轮 所有历史优质数据 全量数据重排序 模型达到最优

我记得第一次做第3轮迭代时,模型的效果提升特别明显。因为自动排序可以处理海量数据,比人工标注快得多。

避坑指南:我曾经在第2轮迭代时,直接把所有RLHF优质回答都加入SFT,结果模型过拟合了。后来我学乖了,每次只加10%-20%的新数据,并且做数据去重。

数据飞轮中的质量监控

数据飞轮跑起来之后,最怕的是什么?数据质量下降。我见过一个团队,飞轮跑了5轮之后,模型反而变差了。原因就是数据质量在迭代中逐渐劣化。

我建议你在飞轮中设置几个监控点:

  • 数据多样性:新加入的数据是否覆盖了足够多的领域?
  • 数据难度:新数据是否太简单或太难?
  • 数据一致性:不同轮次的数据是否存在矛盾?

嗯,这里我分享一个我常用的质量检查方法:每轮迭代后,随机抽取100条新数据,人工检查质量。如果合格率低于90%,这一轮的数据就不加入训练集。

数据飞轮的自动化

当飞轮跑顺之后,你可以考虑自动化。我团队目前的做法是:

  1. 模型上线后,收集用户反馈(点赞/点踩)
  2. 自动将点赞的回答加入SFT数据集
  3. 自动将点踩的回答作为RLHF负样本
  4. 每周自动触发一次增量训练

说白了,就是让数据飞轮自己转起来,不需要人工干预。当然,初期还是需要人工把关的。

总结一下:数据飞轮不是锦上添花,而是协同训练的“发动机”。SFT和RLHF的数据互相增强,才能让模型越训越好。

数据飞轮核心流程 SFT数据 人工标注/高质量语料 模型初训 SFT训练 RLHF数据 偏好排序 数据回流 优质回答/困难样本 训练数据 生成回答 偏好排序 优质回答回流 困难样本回流 迭代3-5轮,数据质量持续提升

最后说一句:数据飞轮不是一次性工作,而是需要持续维护的工程。我团队现在每周都会检查一次数据质量,确保飞轮在正确的轨道上运行。

专注资料整理