KAN-GPT数据集处理:WebText与Tiny Shakespeare解析方法

KAN-GPT数据集处理:WebText与Tiny Shakespeare解析方法

【免费下载链接】kan-gpt The PyTorch implementation of Generative Pre-trained Transformers (GPTs) using Kolmogorov-Arnold Networks (KANs) for language modeling 【免费下载链接】kan-gpt 项目地址: https://gitcode.com/GitHub_Trending/ka/kan-gpt

你是否在训练语言模型时遇到过数据集准备的难题?从数据下载到格式转换,每个环节都可能耗费大量时间。本文将详细解析KAN-GPT项目中两种核心数据集(WebText和Tiny Shakespeare)的处理流程,帮助你快速掌握高效的数据准备方法。读完本文,你将能够:

  • 理解KAN-GPT数据集的基本架构
  • 掌握WebText和Tiny Shakespeare数据集的下载方法
  • 学会使用PyTorch Dataset类处理文本数据
  • 了解数据预处理对模型性能的影响

数据集概述

KAN-GPT项目采用两种不同类型的数据集进行语言模型训练:WebText和Tiny Shakespeare。这两种数据集各有特点,适用于不同场景的模型评估和训练。

WebText数据集包含从互联网上抓取的大量文本内容,适合训练通用语言模型;而Tiny Shakespeare则是一个小型数据集,包含莎士比亚的全部作品,适合快速原型开发和算法验证。

数据集处理的核心代码位于kan_gpt/dataset.py文件中,定义了两个主要的数据集类:WebTextDatasetTinyShakespeareDataset,均继承自PyTorch的Dataset类。

数据集下载方法

Tiny Shakespeare下载

Tiny Shakespeare数据集的下载脚本位于scripts/download_tinyshakespeare.sh,脚本内容如下:

#!/bin/bash
mkdir -p datasets/tinyshakespeare
cd datasets/tinyshakespeare
wget -c https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt

该脚本会创建datasets/tinyshakespeare目录,并下载单个文本文件input.txt,包含了所有莎士比亚的作品。

WebText下载

WebText数据集的下载脚本位于scripts/download_webtext.sh,脚本内容如下:

#!/bin/bash
mkdir -p datasets/webtext
cd datasets/webtext
wget -c https://openaipublic.blob.core.windows.net/gpt-2/output-dataset/v1/webtext.test.jsonl
wget -c https://openaipublic.blob.core.windows.net/gpt-2/output-dataset/v1/webtext.train.jsonl
wget -c https://openaipublic.blob.core.windows.net/gpt-2/output-dataset/v1/webtext.valid.jsonl

WebText数据集分为三个文件:训练集(train)、验证集(valid)和测试集(test),每个文件都是JSON Lines格式,包含大量网页文本内容。

WebText数据集处理详解

数据加载流程

WebTextDataset类实现了WebText数据集的加载和预处理,主要流程如下:

  1. 检查是否存在预处理后的数据集文件(.pkl格式)
  2. 如果不存在,则读取原始JSONL文件并进行tokenization
  3. 使用GPT2Tokenizer对文本进行编码
  4. 将处理后的数据保存为pickle文件,以便后续快速加载

核心代码如下:

class WebTextDataset(Dataset):
    def __init__(self, split, model_type, block_size=1024, vocab_size=50257):
        assert split in {"train", "test", "valid"}
        
        self.split = split
        self.block_size = block_size
        self.vocab_size = vocab_size
        self.tokenizer = GPT2Tokenizer.from_pretrained(model_type)
        
        self.tokenized_dataset_path = f"datasets/webtext/webtext.{split}.pkl"
        
        if not os.path.isfile(self.tokenized_dataset_path):
            # 数据加载和tokenization过程
            # ...
            with open(self.tokenized_dataset_path, "wb") as f:
                pickle.dump(self.tokenized_dataset, f)
                
        with open(self.tokenized_dataset_path, "rb") as f:
            self.tokenized_dataset = pickle.load(f)

数据分割与处理

WebText数据集天然分为训练集、验证集和测试集三个文件,在初始化WebTextDataset时通过指定split参数来选择相应的数据集。

tokenization过程使用Hugging Face的GPT2Tokenizer,将文本转换为模型可接受的token序列:

for _, row in tqdm(self.data.iterrows(), desc="Tokenizing", total=len(self.data)):
    text = row["text"]
    tokenized = self.tokenizer.encode(text=text, add_special_tokens=False)
    tokenized_data.append(tokenized)
    tokenized_lengths.append(len(tokenized))
    self.tokenized_dataset += tokenized

数据访问接口

__getitem__方法实现了数据的访问接口,返回长度为block_size的输入序列x和对应的目标序列y

def __getitem__(self, idx):
    x = self.tokenized_dataset[idx : idx + self.block_size]
    y = self.tokenized_dataset[idx + self.block_size : idx + 2 * self.block_size]
    
    assert len(x) == self.block_size, f"Unexpected len: {len(x)}"
    assert len(y) == self.block_size, f"Unexpected len: {len(y)}"
    
    x = torch.tensor(x, dtype=torch.long)
    y = torch.tensor(y, dtype=torch.long)
    
    return x, y

Tiny Shakespeare数据集处理详解

数据加载流程

TinyShakespeareDataset类实现了Tiny Shakespeare数据集的加载和预处理,与WebText的处理流程类似,但有一些关键区别:

class TinyShakespeareDataset(Dataset):
    TRAIN = 0.8
    VALID = 0.1
    TEST = 0.1
    
    def __init__(self, split, model_type, block_size=1024, vocab_size=50257):
        # 初始化代码
        # ...

数据分割策略

与WebText不同,Tiny Shakespeare原始数据是一个单一文件,因此需要在代码中进行数据集分割:

if self.split == "train":
    self.data = self.data[: int((1 - (self.VALID + self.TEST)) * len(self.data))]
elif self.split == "val":
    self.data = self.data[int((1 - (self.VALID + self.TEST)) * len(self.data)) : int(((1 - (self.VALID + self.TEST))) * len(self.data)) + int((1 - (self.TEST)) * len(self.data))]
elif self.split == "test":
    self.data = self.data[int(((1 - (self.VALID + self.TEST))) * len(self.data)) :]

默认的分割比例为:训练集80%,验证集10%,测试集10%。

数据处理与访问

Tiny Shakespeare的tokenization和数据访问方式与WebText类似,都是将文本转换为token序列并保存为pickle文件,以便后续快速加载。

数据集处理效果评估

数据集处理的质量直接影响模型训练效果。KAN-GPT项目提供了训练结果的可视化分析,包括损失(Loss)、交叉熵(Cross Entropy)和困惑度(Perplexity)等关键指标。

训练损失结果

交叉熵结果

困惑度结果

从这些结果可以看出,使用本文介绍的数据集处理方法,模型能够稳定收敛,取得较好的语言建模效果。详细的结果分析可以参考docs/results.md

总结与最佳实践

本文详细介绍了KAN-GPT项目中WebText和Tiny Shakespeare两种数据集的处理方法,包括数据下载、加载、预处理和访问等关键步骤。以下是一些最佳实践建议:

  1. 优先使用预处理后的pickle文件,避免重复tokenization
  2. 根据模型需求调整block_size参数,平衡序列长度和计算效率
  3. 训练前检查数据分布,确保训练集、验证集和测试集的分布一致性
  4. 定期清理和重新生成预处理数据,避免数据过期或损坏

通过本文的介绍,相信你已经掌握了KAN-GPT数据集的处理方法。如果对数据集处理还有疑问,可以参考项目的官方文档贡献指南

点赞、收藏本文,关注项目更新,获取更多关于KAN-GPT的技术细节和使用技巧!

【免费下载链接】kan-gpt The PyTorch implementation of Generative Pre-trained Transformers (GPTs) using Kolmogorov-Arnold Networks (KANs) for language modeling 【免费下载链接】kan-gpt 项目地址: https://gitcode.com/GitHub_Trending/ka/kan-gpt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值