大模型训练数据清洗与预处理实战:文本去重、质量过滤与分词器训练配置

文本去重:MinHash与精确去重的工程实现

训练语料中的重复文本会导致模型对某些模式过拟合,浪费训练算力。去重分两层处理:文档级去重去除完全相同或高度相似的文章,段落级去重消除跨文档的重复片段。

文档级去重常用MinHash LSH算法。MinHash通过对文档特征矩阵进行多次哈希,生成固定长度的签名向量,再用Locality-Sensitive Hashing将相似签名分到同一桶中。以下是使用datasketch库实现MinHash去重的代码示例:

from datasketch import MinHash, MinHashLSH

def build_minhash(text, num_perm=128):
    m = MinHash(num_perm=num_perm)
    for word in text.split():
        m.update(word.encode('utf-8'))
    return m

lsh = MinHashLSH(threshold=0.8, num_perm=128)

documents = load_corpus()  # 加载语料
dedup_ids = []
for doc_id, text in documents:
    mh = build_minhash(text)
    result = lsh.query(mh)
    if not result:
        lsh.insert(doc_id, mh)
        dedup_ids.append(doc_id)

print(f"去重前: {len(documents)}, 去重后: {len(dedup_ids)}")

段落级去重采用精确哈希匹配,对每个段落计算MD5或SHA256哈希值,维护一个全局集合进行过滤。这种方法速度快,适合去除跨文档复制粘贴的重复内容。

质量过滤:启发式规则与分类器双管齐下

去重后的语料仍含大量低质量文本,需要进一步过滤。工业界通常采用启发式规则和机器学习分类器结合的方式。

启发式规则覆盖以下维度:

– 文本长度过滤:剔除字数过短的页面(如导航条、错误页),保留500字以上内容
– 语言识别:用fastText或cld3过滤非目标语言文本
– 特殊符号比例:统计非文字字符占比,超过30%的文本标记为低质量
– 困惑度过滤:用小型语言模型计算文本困惑度,过高或过低都可能代表低质量

质量分类器方面,FastText训练的二分类模型应用广泛。标注数万条正负样本后,模型能在毫秒级完成单条文本的质量打分:

import fasttext

# 训练质量分类器
model = fasttext.train_supervised(
    input='quality_train.txt',
    epoch=25,
    lr=0.5,
    wordNgrams=2,
    loss='softmax'
)

# 批量过滤
labels, probs = model.predict(corpus_texts)
filtered = [text for text, label, prob in zip(corpus_texts, labels, probs)
            if label == '__label__high' and prob > 0.9]

分词器训练:BPE算法配置与词表大小权衡

分词器(Tokenizer)将原始文本切分为子词单元,直接影响模型的词汇覆盖率和序列长度。Byte-Pair Encoding(BPE)是大模型最常用的分词算法,通过迭代合并高频字节对构建词表。

使用HuggingFace tokenizers库训练BPE分词器的配置如下:

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import ByteLevel

tokenizer = Tokenizer(BPE(unk_token="<unk>"))
tokenizer.pre_tokenizer = ByteLevel(add_prefix_space=False)

trainer = BpeTrainer(
    vocab_size=32000,
    special_tokens=["<pad>", "<unk>", "<s>", "</s>"],
    min_frequency=2,
    show_progress=True
)

tokenizer.train(files=["clean_corpus.txt"], trainer=trainer)
tokenizer.save("tokenizer.json")

词表大小是需要权衡的核心参数。较小的词表(如16K)会导致序列更长、训练时间增加,但泛化能力更强;较大的词表(如64K)能缩短序列长度、提升训练效率,但需要更多数据覆盖低频词。主流大模型的词表大小通常在32K到128K之间。

训练完成后,需要对分词器进行验证,检查覆盖率、压缩率(平均每词对应的字符数)和未见词处理能力。压缩率一般控制在3-4之间,过低说明词表偏小,过高则可能出现罕见词过度合并的问题。

数据配比与混合采样策略

清洗完成后,不同来源的数据需要按比例混合。常见配比为:网页文本50%、书籍20%、代码15%、学术论文10%、对话数据5%。混合时采用动态采样权重,对高质量数据源适当上采样,确保每个batch中各类数据分布均衡。

数据预处理的每个环节都需要建立可复现的pipeline,记录中间产物和过滤日志。这不仅是工程规范的要求,在排查模型异常行为时也能快速定位到数据层面的问题。大模型训练中,数据质量决定了模型能力的上限,清洗和预处理环节投入的精力,会在最终模型表现中得到直接回报。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-xun-lian-shu-ju-qing-xi-yu-yu-chu-li-shi-zhan/

(0)
小编小编
上一篇 18小时前
下一篇 17小时前

相关推荐