在训练语言模型(LLM)的过程中,生成一个有效的数据集至关重要,它关乎模型能否精准捕捉语言的细微差别。从挑选多样的文本来源,到进行预处理以及分割数据集,每一个步骤都需要细致对待。同时,平衡数据集的规模与复杂程度,对优化模型的学习进程也起着关键作用。精心策划一个结构良好的数据集,能为训练出精通且准确理解和生成自然语言的LLM奠定坚实基础。

一、基础知识与准备工作

  1. 知识储备:需要熟悉LLM的相关概念以及数据预处理技术。例如,了解语言模型如何从数据中学习语言模式,以及掌握像文本清洗、标记化等数据预处理方法,这对于后续工作至关重要。
  2. 数据来源:要获取干净、多样且相关的文本格式数据集。比如,在情感分析任务中,需要有包含不同情感倾向的文本数据。
  3. 工具准备:安装Python以及像pandas、numpy这样的库,还有TensorFlow或PyTorch等框架。这些工具将在数据处理和模型训练中发挥重要作用,例如pandas可用于数据的读取、清洗和整理。
  4. 存储资源:确保有足够的计算资源来处理大规模数据集。如果数据集非常大,没有足够的存储空间和计算能力,可能会导致数据处理失败。

二、数据集获取来源

  1. Kaggle:Kaggle拥有各个领域的众多数据集,对于自然语言处理(NLP)任务,像文本分类、情感分析等数据集都能在此找到。例如,你可以搜索到关于电影评论情感分析的数据集,用于训练模型判断评论的积极或消极情感。
  2. Hugging Face Datasets:专门为自然语言处理任务精心策划了大量数据集,并且与他们的transformers库集成方便进行模型训练。以BERT模型训练为例,Hugging Face提供了适配的数据集。
  3. Google Dataset Search:这是一个专门帮助研究人员查找免费在线数据的搜索引擎,在这里能找到各种用于语言建模任务的数据集。比如一些公开的新闻文本数据集,可用于训练语言模型理解新闻语言风格。
  4. UCI Machine Learning Repository:虽然并非专门针对NLP,但其中包含了可用于语言建模及相关任务的各类数据集。像一些包含文本信息的医疗数据集,经过处理后可用于特定领域的语言模型训练。
  5. GitHub:GitHub上有众多包含不同用途数据集的仓库,其中不乏NLP相关的。你可以根据特定任务或模型架构搜索相关仓库,例如针对特定语言的文本分类数据集仓库。
  6. Common Crawl:这是一个非营利组织,它爬取网页并免费向公众提供其档案和数据集,是收集语言建模文本数据的宝贵资源。例如,可以从中获取不同类型的网页文本,丰富数据集的多样性。
  7. OpenAI Datasets:OpenAI会定期发布用于研究目的的数据集,其中常常包含大规模文本语料库,可用于训练LLMs。比如GPT系列模型训练所使用的部分数据就来自类似的大规模语料库。

三、具体操作步骤

  1. 安装必要包:在Python环境中导入所需的包,如import pandas as pd import urllib.request import zipfile import os from pathlib import Path,这些包将在后续的数据获取、解压和处理中使用。
  2. 获取并解压原始数据集:通过指定的URL获取数据集压缩文件,并解压到指定路径。例如:
url = "https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip" 
data_zip_path = "sms_spam_collection.zip" 
data_extracted_path = "sms_spam_collection" 
data_file_path = Path(data_extracted_path) / "SMSSpamCollection.tsv"
  1. 下载并解压数据:使用with语句,既能打开URL获取数据,又能将数据写入本地文件,并解压文件。
with urllib.request.urlopen(url) as response: 
    with open(data_zip_path, "wb") as out_file: 
        out_file.write(response.read()) 
    with zipfile.ZipFile(data_zip_path, "r") as zip_ref: 
        zip_ref.extractall(data_extracted_path)
  1. 重命名文件:确保下载的文件正确重命名为 “.tsv” 文件格式。
original_file_path = Path(data_extracted_path) / "SMSSpamCollection" 
os.rename(original_file_path, data_file_path) 
print(f"File downloaded and saved as {data_file_path}")

执行完这段代码后,会得到 “File downloaded and saved as sms_spam_collection/SMSSpamCollection.tsv” 的提示信息。
5. 加载并探索数据:利用pandas库读取保存的数据集,并进一步探索数据。

raw_text_df = pd.read_csv(data_file_path, sep="\t", header=None, names=["Label", "Text"]) 
raw_text_df.head() 
print(raw_text_df["Label"].value_counts())

输出结果显示 “Label ham 4825 spam 747 Name: count, dtype: int64”,表明数据集中“ham”和“spam”标签的数量情况。
6. 生成平衡数据集:定义一个函数,先统计“spam”消息的数量,然后从“ham”消息中随机采样相同数量,以生成平衡数据集。

def create_balanced_dataset(df): 
    num_spam_inst = raw_text_df[raw_text_df["Label"] == "spam"].shape[0] 
    ham_subset_df = raw_text_df[raw_text_df["Label"] == "ham"].sample(num_spam, random_state = 123) 
    balanced_df = pd.concat([ham_subset_df, raw_text_df[raw_text_df["Label"] == "spam"]]) 
    return balanced_df 
balanced_df = create_balanced_dataset(raw_text_df)

通过print(balanced_df["Label"].value_counts())检查平衡后的数据,输出 “Label ham 747 spam 747 Name: count, dtype: int64”,说明数据集已平衡。接着将标签映射为数字,方便后续模型处理:balanced_df['Label'] = balanced_df['Label'].map({"ham": 1, "spam": 0})。
7. 随机分割数据集:定义一个函数将数据集随机分割为训练集、测试集和验证集。

def random_split(df, train_frac, valid_frac): 
    df = df.sample(frac = 1, random_state = 123).reset_index(drop = True) 
    train_end = int(len(df) * train_frac) 
    valid_end = train_end + int(len(df) * valid_frac) 
    train_df = df[:train_end] 
    valid_df = df[train_end:valid_end] 
    test_df = df[valid_end:] 
    return train_df, valid_df, test_df 
train_df, valid_df, test_df = random_split(balanced_df, 0.7, 0.1)

最后将分割后的数据集保存到本地:

train_df.to_csv("train_df.csv", index = None) 
valid_df.to_csv("valid_df.csv", index = None) 
test_df.to_csv("test_df.csv", index = None)

构建大型语言模型是一项复杂的任务,但随着人工智能领域的不断发展和新技术的涌现,难度正逐渐降低。从借助强大算法奠定基础,到微调超参数以及管理海量数据集,每一步对于创建一个能够理解和生成类人文本的模型都至关重要。而创建高质量数据集,包括获取多样且有代表性的文本语料库、预处理确保一致性和相关性,以及精心策划平衡数据集以避免偏差并提升模型性能,是训练LLMs的关键一环。通过本文的介绍,我们了解了从分隔文件创建分类数据集的方法,希望大家以此为基础,创建更复杂、优质的数据集。

更多推荐