Step-01 准备数据

55 阅读1分钟

一、背景

图灵测试:图灵测试的本质是通过让机器与人类进行自然语言对话,判断机器是否能够表现出与人类无法区分的智能行为。 传统机器学习:依赖手动特征工程,模型简单,计算资源需求低,解释性强,适用于数据量较小的任务。 深度学习:自动特征学习,模型复杂,计算资源需求高,解释性差,适用于数据量大且特征不明确的任务。 简而言之,Data要丢给Algorithm!Data是foundation! 尽管DL的进步是干掉人为特征工程,但是Garbage In Garbage Out!

二、本质

LLM: 本质就是一个NN,而NN的本质就是一个非线性的数学函数(计算图)!没有足够、优质的Batch Data喂给这个函数做GD,是无法Optimize到一个最优的参数的!

三、最佳实践

graph TD  
    A[Data Collection] --> B(Data Cleaning)  
    B --> C(Data Annotation)  
    C --> D(Data Augmentation)  
    D --> E(Data Splitting)  
    E --> F(Data Formatting)  
    F --> G(Data Storage and Management)

四、快速开始

image.png

五、实际工作

class RagDataset(Dataset):
    def __init__(self, txt, tokenizer, max_length, stride):
        self.input_ids = []
        self.target_ids = []

        token_ids = tokenizer.encode(txt, allowed_special={"<|endoftext|>"})

        for i in range(0, len(token_ids) - max_length, stride):
            input_chunk = token_ids[i:i + max_length]
            target_chunk = token_ids[i + 1: i + max_length + 1]
            self.input_ids.append(torch.tensor(input_chunk))
            self.target_ids.append(torch.tensor(target_chunk))

    def __len__(self):
        return len(self.input_ids)

    def __getitem__(self, idx):
        return self.input_ids[idx], self.target_ids[idx]


def create_dataloader_v1(txt, batch_size=4, max_length=256, 
                         stride=128, shuffle=True, drop_last=True, num_workers=0):
    tokenizer = tiktoken.get_encoding("gpt2")

    dataset = RagDataset(txt, tokenizer, max_length, stride)

    dataloader = DataLoader(
        dataset, batch_size=batch_size, shuffle=shuffle, drop_last=drop_last, num_workers=num_workers)

    return dataloader


with open("test-qa-verdict.txt", "r", encoding="utf-8") as f:
    raw_text = f.read()

tokenizer = tiktoken.get_encoding("gpt2")
encoded_text = tokenizer.encode(raw_text)

vocab_size = 50257
output_dim = 256
context_length = 1024


token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
pos_embedding_layer = torch.nn.Embedding(context_length, output_dim)

max_length = 4
dataloader = create_dataloader_v1(raw_text, batch_size=8, max_length=max_length, stride=max_length)