news 2026/2/19 19:57:49

预训练数据清洗流程:去除重复与低质内容的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
预训练数据清洗流程:去除重复与低质内容的方法

预训练数据清洗流程:去除重复与低质内容的方法

在大模型时代,一个常被低估但决定成败的环节正悄然浮出水面——预训练数据的质量控制。我们常常惊叹于GPT、Qwen等模型的语言能力,却很少追问:它们到底“吃”了什么?当千亿参数遇上TB级语料,如果输入的是未经筛选的互联网“大杂烩”,再强大的架构也可能沦为噪声的复读机。

真实情况是,原始爬取数据中充斥着网页镜像、广告脚本、乱码片段和高度重复的内容。有研究指出,在Common Crawl这类公开语料库中,超过20%的网页属于完全复制或轻微改写版本。这意味着,若不做处理,模型每训练四步,就有一整步是在无效重复中打转。更严重的是,低质量文本会干扰注意力机制对语言结构的学习,甚至让模型“学会”生成拼写错误或语法混乱的句子。

面对这一挑战,以ms-swift为代表的现代训练框架开始将数据清洗前置为标准流水线。它不仅支持600+纯文本与300+多模态大模型的统一训练,更重要的是,其内置的数据预处理模块已实现去重、过滤、语言识别等功能的自动化集成。这背后的技术逻辑值得深挖。


从“去哪找数据”到“怎么用好数据”

过去几年,AI社区的关注点主要集中在模型结构创新与算力优化上,数据被视为“越多越好”的资源。然而,随着Scaling Law逐渐逼近瓶颈,人们开始意识到:数据质量可能是下一个性能跃迁的关键杠杆

高质量清洗带来的收益是实实在在的:
-节省算力成本:去重后可减少15%~30%的训练步数,直接降低GPU消耗;
-加快收敛速度:清除无意义样本后,模型能更快捕捉有效语言模式;
-提升生成可控性:剔除敏感或误导性内容,为后续RLHF对齐打下基础。

这些不是理论推测,而是工程实践中的共识。比如Hugging Face和ModelScope平台共享的大规模数据集,几乎都经过标准化清洗流程。而ms-swift这样的全链路框架,则进一步把这套流程封装成可配置组件,开发者只需几行YAML即可启用。

那么,具体是如何实现的?


去重不止是“删一样的”:文档级 vs 段落级策略

很多人以为去重就是简单比较两段文字是否完全相同,但实际上,真正的挑战在于如何高效识别“几乎一样”的内容。

文档级去重:用哈希指纹快速定位重复体

最直观的做法是对整篇文档计算唯一标识(即“指纹”),然后比对指纹是否一致。常用算法包括:

  • SHA-256:加密级哈希,保证相同输入必得相同输出,适合精确匹配;
  • SimHash:局部敏感哈希(LSH),能检测近似文本,适用于轻微修改后的抄袭内容。

例如,两个网页仅差一个时间戳更新,SHA-256会产生完全不同哈希值,而SimHash则可能判断其相似度高达98%。这种特性使其在处理网页镜像时尤为有用。

from hashlib import sha256 def compute_hash(example): text = example["text"] hash_value = sha256(text.encode("utf-8")).hexdigest() return {"hash": hash_value}

上述代码展示了基于datasets库的SHA-256去重流程。虽然适用于中小规模数据集,但在TB级语料面前仍显乏力。此时就需要引入分布式方案。

段落级去重:应对长文本切片中的冗余

在实际应用中,一篇万字文章常被切分为多个训练样本。若仅做文档级去重,无法发现跨文档的相似段落。这时需采用滑动窗口 + MinHash + LSH组合拳:

  1. 将每个文档切分为固定长度的n-gram;
  2. 使用MinHash估计Jaccard相似度;
  3. 利用LSH将高相似候选放入同一桶内,避免全量比对。

这种方法将时间复杂度从O(n²)降至接近O(n log n),可在Spark或Dask集群上并行运行,支撑PB级数据去重。

工程提示:对于增量更新场景,建议维护一个全局指纹库。新数据只需与其对比,无需重新扫描历史数据,极大提升效率。

此外,内存使用也是关键考量。Bloom Filter等概率数据结构可在牺牲极少量准确率的前提下,将存储开销压缩数十倍,特别适合在线实时去重系统。


过滤低质内容:规则与模型的协同作战

如果说去重解决的是“数量冗余”问题,那低质内容过滤则直面“信息贫瘠”的根源。什么样的文本算“低质”?常见类型包括:

  • 过短文本(如标题、按钮文字)
  • 无意义字符序列(如“asdfghjkl”)
  • HTML标签残留或广告链接
  • 多语言混杂且无上下文
  • 标点/数字占比异常高的内容

这些片段本身不具备完整的语义结构,无法为语言建模提供有效信号,反而可能扰乱梯度更新。

规则引擎先行:低成本拦截明显垃圾

实践中,最高效的策略是先用规则层快速筛掉80%以上的低质样本。典型的硬性阈值包括:

指标推荐阈值
最小长度≥32字符
主语言占比>80%(中文/英文)
标点符号比例<30%
数字比例<20%
是否包含完整句子至少有一个句末标点

以下是一个轻量级过滤函数示例:

import re from langdetect import detect def is_high_quality_text(text: str) -> bool: if len(text.strip()) < 32: return False try: lang = detect(text) if lang not in ["zh", "en"]: return False except: return False total_chars = len(text) punct_count = len(re.findall(r'[^\w\s]', text)) digit_count = len(re.findall(r'\d', text)) punct_ratio = punct_count / total_chars digit_ratio = digit_count / total_chars if punct_ratio > 0.3 or digit_ratio > 0.2: return False if not re.search(r'[。.!!??]', text): return False return True

该方法无需训练模型,部署简单,适合大多数通用任务。但它也有局限:难以识别语法正确但语义空洞的内容(如“这个东西很好很好很好”)。

模型评分补位:捕捉隐含的语言质量信号

为了弥补规则盲区,部分系统引入轻量分类器进行二次打分。常见的选择包括:

  • FastText:基于n-gram的文本分类器,训练快、推理快;
  • TinyBERT:小型化预训练模型,能理解句法完整性;
  • Perplexity(困惑度):衡量语言模型对该文本的预测难度,越低表示越流畅。

这些模型通常在人工标注的质量数据集上微调,输出一个连续得分。开发者可根据训练阶段动态调整保留阈值——初期放宽以保留多样性,后期收紧以提高精度。

经验法则:混合式过滤(规则+模型)比单一方案鲁棒得多。规则负责“扫雷”,模型专注“精筛”,二者结合可兼顾效率与效果。


清洗流程如何嵌入训练管线?

在ms-swift这类现代化框架中,数据清洗不再是独立脚本,而是作为整个训练流水线的第一环存在。其典型架构如下:

[原始数据源] ↓ (下载/导入) [数据加载器 → Dataset对象] ↓ (预处理Pipeline) [去重模块 → SimHash/LSH] ↓ [质量过滤模块 → 规则+模型] ↓ [分词器Tokenizer] ↓ [模型输入Tensors] ↓ [训练/微调/对齐]

用户可通过声明式配置启用各项功能,例如:

data_args: do_deduplication: true dedup_algorithm: simhash dedup_threshold: 0.9 do_quality_filter: true min_length: 32 language_whitelist: ["zh", "en"] max_punct_ratio: 0.3

整个流程支持单机与分布式执行,尤其适合配合DeepSpeed或FSDP进行大规模预训练前的数据准备。

实际工作流拆解

完整的清洗流程通常包含以下步骤:

  1. 数据摄入:从本地、HuggingFace Hub或ModelScope加载原始语料;
  2. 格式标准化:统一编码(UTF-8)、清理HTML/XML标签、分割复合文档;
  3. 文档级去重:生成指纹并删除重复项;
  4. 段落切分:按语义或固定长度切片;
  5. 质量打分与过滤:逐条评估并剔除低质片段;
  6. 语言识别与分类:标记语言类型,便于后续采样平衡;
  7. 输出清洗后数据集:保存为Arrow或JSONL格式供训练使用。

工程实践中的关键考量

尽管工具链日趋成熟,但在真实项目中仍有不少“坑”需要注意:

去重粒度的选择艺术
  • 若用于通用预训练,推荐文档级去重,避免过度切割有效信息;
  • 若处理网页抓取数据,建议增加段落级模糊去重,防止“换皮不换骨”的改写内容逃逸;
清洗顺序影响性能

正确的顺序应该是:先去重,再过滤。因为重复样本只需处理一次,避免多次计算质量分数。对于超大规模数据,还可先抽样统计质量分布,再决定最终过滤阈值。

性能优化技巧
  • 使用内存映射文件(memory-mapped files)处理大体积数据;
  • 启用缓存机制(如datasets.load_from_cache_file)避免重复执行;
  • 分布式环境下通过torch.distributed同步去重指纹表;
  • 对高频操作(如正则匹配)使用向量化实现,提升百万级/秒处理速度。
可追溯性不可忽视

清洗不是“黑箱操作”。必须做到:
- 保留原始ID映射关系,便于后期审计;
- 记录详细日志(如被删样本数、原因分类),支持可视化分析;
- 提供反查接口,允许研究人员回溯某条数据为何被剔除。


写在最后:数据清洗正在成为基础设施

曾经,数据清洗是研究员手中的Python脚本集合;如今,它已成为大模型训练不可或缺的基础设施。ms-swift等框架的努力,正是要把这一过程从“手工活”变成“标准化服务”。

未来,随着自监督质量评估、语义去重(semantic deduplication)等技术的发展,清洗将更加智能化。例如,利用嵌入空间距离替代字符串匹配,识别语义重复而非字面重复;或者通过模型内部激活模式反推哪些样本提供了独特学习信号。

可以预见,未来的高质量语料构建,不再是“越多越好”,而是“越准越好”。而这一切的起点,正是今天我们在去重与过滤中所做的每一个细小决策。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 15:26:43

内部模型选型系统:基于评测结果的决策支持

内部模型选型系统&#xff1a;基于评测结果的决策支持 在大模型技术飞速演进的今天&#xff0c;企业面临的不再是“有没有模型可用”&#xff0c;而是“如何从数百个候选模型中快速选出最适合业务场景的那个”。尤其当团队需要在客服问答、金融投研、教育OCR等垂直领域落地AI能…

作者头像 李华
网站建设 2026/2/19 18:19:52

RS-LoRA随机子空间微调:降低过拟合风险的尝试

RS-LoRA随机子空间微调&#xff1a;降低过拟合风险的尝试 在大模型时代&#xff0c;如何以最小代价让预训练模型适应特定任务&#xff0c;已成为工业界和学术界的共同命题。全参数微调虽能充分挖掘模型潜力&#xff0c;但其动辄数百GB显存消耗与高昂算力成本&#xff0c;使其难…

作者头像 李华
网站建设 2026/2/19 6:43:15

云上GPU实例选购指南:匹配不同规模模型的需求

云上GPU实例选购指南&#xff1a;匹配不同规模模型的需求 在大语言模型&#xff08;LLM&#xff09;和多模态模型参数动辄上百亿的今天&#xff0c;一个开发者最常问的问题不再是“这个模型能不能跑”&#xff0c;而是&#xff1a;“我该用哪块GPU才能既不超预算又能跑起来&…

作者头像 李华
网站建设 2026/2/17 6:57:59

【C语言工业通信协议实战】:掌握设备间高效通信的5大核心技巧

第一章&#xff1a;工业通信协议在C语言中的核心地位在现代工业自动化系统中&#xff0c;设备间的高效、可靠通信是保障生产流程稳定运行的关键。C语言凭借其贴近硬件的操作能力、高效的执行性能以及广泛的平台支持&#xff0c;成为实现工业通信协议的首选编程语言。从PLC数据读…

作者头像 李华
网站建设 2026/2/20 0:28:04

国产启明910芯片适配迫在眉睫,C语言开发者该如何突围?

第一章&#xff1a;C 语言 启明 910 芯片适配在嵌入式系统开发中&#xff0c;将 C 语言程序适配到特定硬件平台是关键环节。启明 910 芯片作为一款高性能国产处理器&#xff0c;具备低功耗与高集成度特性&#xff0c;广泛应用于工业控制与边缘计算场景。为充分发挥其性能&#…

作者头像 李华