这段内容主要是关于《Build a Large Language Model From Scratch》这本书的补充代码,包含了一些练习的解答。下面是对其详细解释:
代码部分
- 包的导入和版本检查
from importlib.metadata import version
print("torch version:", version("torch"))
print("tiktoken version:", version("tiktoken"))
这部分代码导入了version
函数,用于获取torch
和tiktoken
这两个包的版本信息,并打印出来。
- Exercise 2.1
收起
python
import tiktoken
tokenizer = tiktoken.get_encoding("gpt2")
integers = tokenizer.encode("Akwirw ier")
print(integers)
for i in integers:
print(f"{i} -> {tokenizer.decode([i])}")
tokenizer.encode("Ak")
tokenizer.encode("w")
tokenizer.encode("ir")
tokenizer.encode("w")
tokenizer.encode(" ")
tokenizer.encode("ier")
tokenizer.decode([33901, 86, 343, 86, 220, 959])
这部分代码主要演示了如何使用tiktoken
库中的gpt2
编码对文本进行编码和解码。具体步骤如下:
- 导入
tiktoken
库。 - 获取
gpt2
编码的tokenizer
。 - 使用
tokenizer.encode
方法将文本"Akwirw ier"
编码为整数列表,并打印出来。 - 遍历编码后的整数列表,使用
tokenizer.decode
方法将每个整数解码为对应的字符,并打印出来。 - 分别对文本的各个部分进行编码,展示编码过程。
- 最后使用
tokenizer.decode
方法将给定的整数列表解码为文本。
- Exercise 2.2
import tiktoken
import torch
from torch.utils.data import Dataset, DataLoader
class GPTDatasetV1(Dataset):
def __init__(self, txt, tokenizer, max_length, stride):
self.input_ids = []
self.target_ids = []
# Tokenize the entire text
token_ids = tokenizer.encode(txt, allowed_special={"<|endoftext|>"})
# Use a sliding window to chunk the book into overlapping sequences of max_length
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(txt, batch_size=4, max_length=256, stride=128):
# Initialize the tokenizer
tokenizer = tiktoken.get_encoding("gpt2")
# Create dataset
dataset = GPTDatasetV1(txt, tokenizer, max_length, stride)
# Create dataloader
dataloader = DataLoader(dataset, batch_size=batch_size)
return dataloader
with open("the-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
max_len = 4
context_length = max_len
token_embedding_layer = torch.nn.Embedding(context_length, output_dim)
pos_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
dataloader = create_dataloader(raw_text, batch_size=4, max_length=2, stride=2)
for batch in dataloader:
x, y = batch
break
x
dataloader = create_dataloader(raw_text, batch_size=4, max_length=8, stride=2)
for batch in dataloader:
x, y = batch
break
x
这部分代码定义了一个自定义的数据集类GPTDatasetV1
和一个数据加载器创建函数create_dataloader
,用于处理语言模型训练的数据。具体步骤如下:
- 导入所需的库,包括
tiktoken
、torch
以及torch.utils.data
中的Dataset
和DataLoader
。 - 定义
GPTDatasetV1
类,继承自Dataset
。在__init__
方法中,对输入的文本进行编码,并使用滑动窗口将编码后的文本分割成固定长度的输入和目标序列。__len__
方法返回数据集的大小,__getitem__
方法返回指定索引位置的输入和目标序列。 - 定义
create_dataloader
函数,用于创建数据加载器。该函数接受文本、批量大小、最大长度和步长等参数,初始化tokenizer
,创建GPTDatasetV1
数据集,并使用DataLoader
将数据集包装成可迭代的对象。 - 读取文本文件
"the-verdict.txt"
的内容。 - 获取
gpt2
编码的tokenizer
,并对读取的文本进行编码。 - 定义一些模型相关的参数,如词汇表大小、输出维度、最大长度等。
- 创建
token_embedding_layer
和pos_embedding_layer
两个嵌入层。 - 使用
create_dataloader
函数创建两个不同参数设置的数据加载器,并从每个数据加载器中获取一个批次的数据,打印输入数据x
。
通过这些代码,读者可以学习如何使用tiktoken
进行文本编码,以及如何创建自定义的数据集和数据加载器来处理语言模型训练的数据。