大语言模型数据清洗 · 论文笔记(一)

CCNet Extracting High Quality Monolingual Datasets from Web Crawl Data

CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data

ArXiv1911.00359 CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data

Github facebookresearch/cc_net: Tools to download and cleanup Common Crawl data

概述

  • 为保证数据质量,倾向于通过维基百科等高质量数据来源合成ad-hoc datasets(专门构建的数据集),但是低资源语言不好做
  • paper从CC数据集出发,执行了FastText所提出的pipeline,但不同之处:
    • 保留文档级别的结构,支持Bert等需要段落级别的模型训练
      • 之前的方法切成单个句子,只关心局部上下文,切分成了n-gram
    • 增加一个可选的单语言过滤
      • 针对目标语言进行筛选
      • 筛选出接近维基百科风格的文档
        • 在目标语言的维基百科等语料上训练一个语言模型
        • 通过困惑度进行文档打分,只保留那些 perplexity 较低的文档
  • 与传统方法相比:
    • 传统方法:多数只适用于英语的特殊方法,手动设置规则
    • paper:通用性强,适用于多种语言

Method

Figure 1

  • 下载网页快照的.WET文件,为每个段落生成哈希值,转化为.bin的二进制文件
  • 独立处理每个WET下的文档,通过哈希进行去重,识别语言,计算困惑度
  • 按照语言和困惑度得分重新分组,保存为 JSON 格式的文件

预处理

  • 每个快照包含大约 20 到 30TB 的未压缩纯文本
  • 将 WET 文件分组为每个 5GB 的分片(shard),转化为json格式
  • json中的每一条entry:记录了url、文本等信息,代表了一个网页的内容
    • 文本中含有段落
    • 所以这里的逻辑是:快照(.WET) > shard > entry > 段落

去重

需要删除不同网页之间的重复段落(占了70%),为方便去重:

  • 标准化

    • 字符全部小写

    • 所有数字变成0

    • 删除所有Unicode的Punctuation Marks(标点符号)、Accent Marks(重音符号),完成段落标准化

  • 标点

    • 英文标点:.,!?;:"'()[]{}-–—…@#$%^&*
    • 中文标点:,。!?;:“”‘’()【】《》……
    • 法语标点:«»
    • 阿拉伯语标点:،؛؟
    • 日文标点:、。,・「」『』
  • Accent:表示发音变化或区分拼写

    • 法语:à, é, ô, ù, ç
    • 西班牙语:ñ, á, é
    • 德语:ä, ö, ü
    • 波兰语:ą, ę, ś, ź
    • 希腊语:ά, έ, ό
  • 计算哈希
    • 对每个shard的每个段落计算SHA哈希值(160位),保存为二进制文件.bin
    • 每个段落的前64位作为其id便于维护
    • 对每个段落,查询处理过的**一些(见后文)**shard的二进制文件,若出现过则舍弃,否则保存在本shard二进制文件中

由于很多步骤都是独立的,因此支持并行

  • 对于网页数据,需要去掉导航栏、cookie、联系信息等

语言识别

  • FastText模型,基于 Wikipedia、Tatoeba 和 SETimes 数据集进行训练
  • 支持176种语言,为每一种语言输出0-1的置信度(总和为1)
  • 若某语言得分超过0.5则进行确认,否则舍弃(无法识别语言)

语言模型过滤

  • 对每种语言,训练了一个tokenizer和语言模型
    • KenLM 库实现的5-gram模型(处理大量数据效率高)
  • 使用tokenizer对每一个entry进行分词,使用语言模型计算每个段落的困惑度

消融实验

  • 先去重再语言识别
    • 可以去除一些英文的Cookie警告,防止误识别为英文
    • 去重跨越的shard越多去除内容越多,去重效果越好,但是自然开销变大
      • 选择50均衡了资源与性能

最终数据集的指标

  • 使用训练好的语言模型对段落进行困惑度(perplexity)评分,作为衡量文本质量的代理指标。
  • 结果发现:
    • 高质量内容(如新闻、写作规范的内容)通常位于数据集的“头部”(head)
    • 含有关键词列表或与 Wikipedia 差异较大的口语化内容会落在“尾部”(tail)
  • 不同语言的困惑度分布差异较大,这主要是由于训练语言模型所使用的 Wikipedia 数据大小不同,而不是某些语言本身缺乏高质量内容。
  • 因此,为每种语言设置了不同的困惑度阈值,将语料库划分为三个部分:
    • Head(头部) :高质量段落
    • Middle(中部)
    • Tail(尾部) :较低质量段落

为了验证数据集的质量,作者使用 fastText 和 BERT 模型进行实验:

fastText 实验

  • 对英语和波兰语的不同质量子集(head、mid、tail)训练词向量
  • 在标准的类比任务数据集(Mikolov et al., 2013)上评估性能
  • 结果表明 :随着从 tail 到 head 的变化,模型性能逐步提升,说明基于困惑度的过滤方法能有效提升数据质量
子集 英语总分 波兰语总分
head 77.9 65.3
mid 74.2 62.8
tail 62.0 59.9

BERT 实验

  • 分别使用 Wikipedia 和 CCNet 提取的 head 数据训练 BERT-BASE 模型
  • 训练语言包括:英语(en)、俄语(ru)、中文(zh)、乌尔都语(ur)
  • 使用 XNLI 任务评估模型表现
语言 Wikipedia 准确率 CCNet 准确率 提升幅度
en 82.8 85.0 +2.2
ru 73.3 76.4 +3.1
zh 77.0 77.9 +0.9
ur 57.3 64.3 +7.0 ✅(显著提升)

特别是对于低资源语言乌尔都语(ur),Wikipedia 数据太小导致模型几乎无效,而使用 CCNet 提取的数据训练后,准确率提升了 7 个百分点 ,证明了该数据集对低资源语言预训练的重要性。

维基百科的数据不足,CCNet从CC中提取了高质量语言专用的数据,效果显著

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计