大模型修炼秘籍 第一卷灵气采集 第二章:去芜存菁——数据清洗之术
·
第二章:去芜存菁——数据清洗之术

数据清洗如炼丹,去芜存菁莫等闲。
【本章导读】
采集而来的数据,如同刚从河中舀起的水,泥沙俱下,杂质众多。若不清洗,模型将学习到错误知识,产生有害输出。本章将揭示数据清洗的核心技术。
一、为何要清洗数据?
【数据污染之害】
劣质数据的危害:
| 污染类型 | 危害 | 举例 |
|---|---|---|
| 重复数据 | 过拟合,浪费算力 | 同一文章出现千次 |
| 低质内容 | 学习垃圾知识 | 广告、垃圾邮件 |
| 有害内容 | 输出有害信息 | 暴力、歧视内容 |
| 错误信息 | 学习错误知识 | 谣言、假新闻 |
| 个人隐私 | 隐私泄露风险 | 身份证号、电话 |
二、去重之道:避免走火入魔
【去重心法】
重复数据如同走火入魔,让模型反复学习相同内容,浪费修炼时间,且容易过拟合。
【去重方法】
1. 精确去重
直接比较文本是否完全相同:
def exact_dedup(data):
"""精确去重"""
seen = set()
unique = []
for text in data:
if text not in seen:
seen.add(text)
unique.append(text)
return unique
2. 近似去重
使用MinHash、SimHash等算法检测相似文档:
# MinHash近似去重原理
# 1. 将文档转换为特征集合(如n-gram)
# 2. 计算多个哈希函数的最小值
# 3. 比较MinHash签名相似度
# 4. 相似度超过阈值则视为重复
MinHash原理图解:
文档A: "大模型修炼秘籍" → 特征: {大模型, 模型修, 型修炼, 修炼秘, 炼秘籍}
↓ MinHash
签名: [3, 7, 1, 9, 2]
文档B: "大模型修炼心法" → 特征: {大模型, 模型修, 型修炼, 修炼心, 炼心法}
↓ MinHash
签名: [3, 7, 5, 8, 4]
相似度 = 相同签名数 / 总签名数 = 2/5 = 40%
3. 段落级去重
不仅去除完全重复的文档,还要去除文档内重复的段落。
【去重效果】
以GPT-3训练数据为例:
| 去重阶段 | 数据量 | 减少比例 |
|---|---|---|
| 原始数据 | 45TB | - |
| 文档去重后 | 38TB | 15.6% |
| 段落去重后 | 35TB | 7.9% |
三、质量筛选:只取精华
【筛选心法】
数据质量决定模型上限。宁可少而精,不可多而滥。
1. 启发式规则
基于简单规则快速过滤:
def heuristic_filter(text):
"""启发式质量过滤"""
# 过滤太短的文本
if len(text) < 100:
return False
# 过滤词频异常的文本(重复词太多)
words = text.split()
if len(set(words)) / len(words) < 0.3:
return False
# 过滤包含太多特殊字符的文本
special_chars = sum(1 for c in text if not c.isalnum() and not c.isspace())
if special_chars / len(text) > 0.3:
return False
return True
常用启发式规则:
| 规则 | 阈值 | 目的 |
|---|---|---|
| 文本长度 | >100字符 | 过滤碎片内容 |
| 平均词长 | 3-10字符 | 过滤异常文本 |
| 特殊字符比例 | <30% | 过滤乱码 |
| 数字比例 | <50% | 过滤表格数据 |
| 大写字母比例 | <80% | 过滤标题党 |
2. 语言模型打分
用训练好的语言模型评估文本质量:
def lm_quality_score(text, model):
"""语言模型质量打分"""
# 计算困惑度
perplexity = model.perplexity(text)
# 困惑度越低,质量越高
return 1 / perplexity
困惑度(Perplexity)解释:
困惑度衡量语言模型对文本的"惊讶程度":
- 困惑度低 → 模型不惊讶 → 文本符合语言规律 → 质量高
- 困惑度高 → 模型很惊讶 → 文本不符合语言规律 → 质量低
3. 分类器筛选
训练分类器识别高质量文本:
输入: 文本
↓
特征提取
↓
分类器(如FastText)
↓
输出: 高质量/低质量
训练数据来源:
- 正例:维基百科、高质量文章
- 负例:广告、垃圾内容、机器生成文本
四、有害内容过滤:驱除毒气
【有害内容类型】
| 类型 | 举例 | 危害 |
|---|---|---|
| 暴力内容 | 暴力描写、伤害指导 | 诱导暴力行为 |
| 色情内容 | 成人内容 | 不适合所有用户 |
| 仇恨言论 | 种族歧视、性别歧视 | 传播偏见 |
| 非法内容 | 犯罪指导、毒品制作 | 违法行为 |
| 个人隐私 | 身份证、电话、地址 | 隐私泄露 |
【过滤方法】
1. 关键词过滤
SENSITIVE_WORDS = [...] # 敏感词列表
def keyword_filter(text):
"""关键词过滤"""
for word in SENSITIVE_WORDS:
if word in text:
return False
return True
2. 分类器过滤
输入: 文本
↓
安全分类器
↓
输出: 安全/暴力/色情/仇恨/非法
3. 正则表达式过滤
import re
def privacy_filter(text):
"""隐私信息过滤"""
# 身份证号
text = re.sub(r'\d{17}[\dXx]', '[ID_REMOVED]', text)
# 手机号
text = re.sub(r'1[3-9]\d{9}', '[PHONE_REMOVED]', text)
# 邮箱
text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL_REMOVED]', text)
return text
五、数据增强:炼化提纯
【增强方法】
1. 回译增强
原文(中文)→ 翻译为英文 → 再翻译回中文 → 得到改写版本
2. 同义词替换
原文: "大模型修炼需要大量数据"
改写: "大模型训练需要海量语料"
3. 格式统一
- 统一编码格式(UTF-8)
- 统一换行符
- 去除HTML标签
- 标准化空白字符
六、清洗流程总览
【完整清洗流程】
原始数据
↓
┌─────────────────┐
│ 格式标准化 │ 统一编码、去除HTML
└─────────────────┘
↓
┌─────────────────┐
│ 去重处理 │ 精确去重、近似去重
└─────────────────┘
↓
┌─────────────────┐
│ 质量筛选 │ 启发式规则、模型打分
└─────────────────┘
↓
┌─────────────────┐
│ 有害内容过滤 │ 关键词、分类器
└─────────────────┘
↓
┌─────────────────┐
│ 隐私脱敏 │ 正则表达式替换
└─────────────────┘
↓
清洗后的高质量数据
七、本章心法总结
【口诀】
数据清洗如炼丹,去芜存菁莫等闲。
去重去劣驱毒气,质量为先记心间。
【要点回顾】
| 步骤 | 方法 | 目的 |
|---|---|---|
| 去重 | 精确去重、近似去重 | 避免过拟合 |
| 质量筛选 | 启发式规则、模型打分 | 提升数据质量 |
| 有害过滤 | 关键词、分类器 | 确保安全 |
| 隐私脱敏 | 正则表达式 | 保护隐私 |
【下一章预告】
清洗后的数据,如同提炼后的灵气,但仍需化为模型可吸收的形态。下一章,我们将学习Tokenization之术,将文本转化为模型可理解的基本单元。
更多推荐



所有评论(0)