重要提示

您正在查看 NeMo 2.0 文档。此版本引入了对 API 和新库 NeMo Run 的重大更改。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

下游任务去污染/去重#

背景#

训练后,大型语言模型通常通过其在由未见过的测试数据组成的下游任务上的性能来评估。当处理大型数据集时,存在此测试数据泄漏到模型的训练数据集中的可能性。因此,NeMo Curator 遵循 OpenAI GPT3Microsoft Turing NLG 530B 的方法,以删除数据集中存在于下游任务中的文档部分。

用法#

TaskDecontamination 模块提供了 NeMo Curator 中的核心功能。让我们检查一下这个小例子

import nemo_curator as nc
from nemo_curator.datasets import DocumentDataset
from nemo_curator.utils.file_utils import get_all_files_paths_under
from nemo_curator.tasks import Winogrande, Squad, TriviaQA,

files = get_all_files_paths_under("books_dataset/")
books = DocumentDataset.read_json(files, add_filename=True)

downstream_tasks = [
    Winogrande(),
    Squad(),
    TriviaQA(),
]

task_decontaminate = nc.TaskDecontamination(downstream_tasks)

decontaminated_books = task_decontaminate(books)

decontaminated_books.to_json("decontaminated_books/", write_to_filename=True)

如果您希望更细粒度地控制任务去污染过程,NeMo Curator 提供了几个可以手动应用的 CLI 工具。您可以使用 prepare_task_datafind_matching_ngramsremove_matching_ngrams 脚本,以便删除可能包含在您的训练数据中的任何任务数据(即“污染”)。您将需要下游任务列表来修改 任务配置 (lm_tasks.yaml)。如果您的任务尚未作为类存在,您将需要构造一个扩展 nemo_curator.tasks.DownstreamTask 的类。

然后,您可以首先使用 prepare_task_data 模块从任务文档中构建 n-gram。此模块需要一个输入配置文件,其中包含描述如何从感兴趣的任务数据形成 N-gram 的不同模块。配置文件的示例在 config/lm_tasks.yaml 中提供。许多任务已经在 NeMo Curator 中实现,可以在 nemo_curator.tasks 中找到。如果用户希望添加自己的任务,他们可以编写自己的类,类似于 nemo_curator.tasks 中定义的类。一旦计算出所有 N-gram,它们将作为字典的键写入,该字典将写入 pickle 文件。此步骤每个任务集只需完成一次。此 pickle 文件可以在共享相同下游任务的数据集之间重用。

prepare_task_data \
    --task-config-file=./config/lm_tasks.yaml \
    --output-task-ngrams=./data/task_ngrams.pkl

一旦用户计算出任务 N-gram,他们就可以使用 find_matching_ngrams 模块,以便在其语料库中搜索匹配项。此模块任务作为输入,输入包含 JSONL 文件的用户数据集的路径以及预计算的任务 N-gram,并作为输出提供一个 pickle 文件,其中包含特定任务 N-gram 在训练集中出现的次数计数。此 N-gram 计数将用于最后一步,以确定是否应拆分文档并删除 N-gram。

find_matching_ngrams \
    --input-data-dir=<Path to the input directory containing jsonl files> \
    --input-task-ngrams=./data/task_ngrams.pkl \
    --output-matched-ngram-data=./data/matched_ngrams.pkl

作为任务去污染过程的最后一步,与匹配的 N-gram 关联的计数用于确定是否应从训练语料库中删除特定的 N-gram。如果 N-gram 的计数高于用户定义的阈值,则不考虑它。否则,将考虑它并将从语料库中删除。当从语料库中删除 N-gram 时,从 N-gram 在两个方向上延伸的用户定义的字符窗口也将从语料库中删除。此外,文档将被拆分为两个单独的文档。如果拆分后的文档太短,则将其删除。此外,拆分次数超过用户定义次数的文档也会从语料库中删除。有关任务去污染过程的更多信息,请参阅 Brown et al., 2020Smith et al., 2021

remove_matching_ngrams \
    --input-data-dir=<Path to the input directory containing jsonl files> \
    --input-matched-ngrams=./data/matched_ngrams.pkl \
    --output-task-deduped-dir=<Output directory containing task-deduped jsonl files>